hrtimer: update timer->state with 'pinned' information
'Pinned' information would be required in migrate_hrtimers() now, as we can migrate non-pinned timers away without a hotplug (i.e. with cpuset.quiesce). And so we may need to identify pinned timers now, as we can't migrate them. This patch reuses the timer->state variable for setting this flag as there were enough number of free bits available in this variable. And there is no point increasing size of this struct by adding another field. Change-Id: If3b3770e547971809e789ea7c8033c48ec2aa92d Signed-off-by: Viresh Kumar <viresh.kumar@linaro.org> [forward port to 3.18] Signed-off-by: Santosh Shukla <santosh.shukla@linaro.org> [ohaugan@codeaurora.org: Port to 4.4] Git-commit: 62feaf1ed0b64c04868d143d8bdb92d60dc3189b Git-repo: git://git.linaro.org/people/mike.holmes/santosh.shukla/lng-isol.git Signed-off-by: Olav Haugan <ohaugan@codeaurora.org>
This commit is contained in:
committed by
Syed Rameez Mustafa
parent
9536efe77a
commit
68944065e8
@@ -53,6 +53,7 @@ enum hrtimer_restart {
|
||||
*
|
||||
* 0x00 inactive
|
||||
* 0x01 enqueued into rbtree
|
||||
* 0x02 timer is pinned to a cpu
|
||||
*
|
||||
* The callback state is not part of the timer->state because clearing it would
|
||||
* mean touching the timer after the callback, this makes it impossible to free
|
||||
@@ -72,6 +73,8 @@ enum hrtimer_restart {
|
||||
*/
|
||||
#define HRTIMER_STATE_INACTIVE 0x00
|
||||
#define HRTIMER_STATE_ENQUEUED 0x01
|
||||
#define HRTIMER_PINNED_SHIFT 1
|
||||
#define HRTIMER_STATE_PINNED (1 << HRTIMER_PINNED_SHIFT)
|
||||
|
||||
/**
|
||||
* struct hrtimer - the basic hrtimer structure
|
||||
|
||||
@@ -870,7 +870,7 @@ static int enqueue_hrtimer(struct hrtimer *timer,
|
||||
|
||||
base->cpu_base->active_bases |= 1 << base->index;
|
||||
|
||||
timer->state = HRTIMER_STATE_ENQUEUED;
|
||||
timer->state |= HRTIMER_STATE_ENQUEUED;
|
||||
|
||||
return timerqueue_add(&base->active, &timer->node);
|
||||
}
|
||||
@@ -890,11 +890,9 @@ static void __remove_hrtimer(struct hrtimer *timer,
|
||||
u8 newstate, int reprogram)
|
||||
{
|
||||
struct hrtimer_cpu_base *cpu_base = base->cpu_base;
|
||||
u8 state = timer->state;
|
||||
|
||||
timer->state = newstate;
|
||||
if (!(state & HRTIMER_STATE_ENQUEUED))
|
||||
return;
|
||||
if (!(timer->state & HRTIMER_STATE_ENQUEUED))
|
||||
goto out;
|
||||
|
||||
if (!timerqueue_del(&base->active, &timer->node))
|
||||
cpu_base->active_bases &= ~(1 << base->index);
|
||||
@@ -911,6 +909,13 @@ static void __remove_hrtimer(struct hrtimer *timer,
|
||||
if (reprogram && timer == cpu_base->next_timer)
|
||||
hrtimer_force_reprogram(cpu_base, 1);
|
||||
#endif
|
||||
|
||||
out:
|
||||
/*
|
||||
* We need to preserve PINNED state here, otherwise we may end up
|
||||
* migrating pinned hrtimers as well.
|
||||
*/
|
||||
timer->state = newstate | (timer->state & HRTIMER_STATE_PINNED);
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -992,6 +997,10 @@ void hrtimer_start_range_ns(struct hrtimer *timer, ktime_t tim,
|
||||
|
||||
timer_stats_hrtimer_set_start_info(timer);
|
||||
|
||||
/* Update pinned state */
|
||||
timer->state &= ~HRTIMER_STATE_PINNED;
|
||||
timer->state |= !!(mode & HRTIMER_MODE_PINNED) << HRTIMER_PINNED_SHIFT;
|
||||
|
||||
leftmost = enqueue_hrtimer(timer, new_base);
|
||||
if (!leftmost)
|
||||
goto unlock;
|
||||
|
||||
Reference in New Issue
Block a user