From 5a2b8be93c93f2c66edee2a8aff1554778959e35 Mon Sep 17 00:00:00 2001 From: Jonathan Herman Date: Sat, 8 Oct 2011 17:06:48 -0400 Subject: Fixed timer issue and atomic remove issue in level A domain. Timers had an issue where they couldn't be cancelled before they migrated. Now when you set the start_on_info to inactive, it will prevent a timer from being armed. When a task is being blocked and preempted concurrently, the blocking code needs to be able to prevent the task from being scheduled on another CPU. This did not work for CE domains. Added a per-domain remove function which, for ce domains, will prevent a task from being returned by the domain. --- kernel/hrtimer.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) (limited to 'kernel') diff --git a/kernel/hrtimer.c b/kernel/hrtimer.c index cb49883b64e5..3f0bf6c4653c 100644 --- a/kernel/hrtimer.c +++ b/kernel/hrtimer.c @@ -1072,7 +1072,10 @@ void hrtimer_pull(void) info = list_entry(pos, struct hrtimer_start_on_info, list); TRACE("pulled timer 0x%x\n", info->timer); list_del(pos); - hrtimer_start(info->timer, info->time, info->mode); + if (atomic_read(&info->state) != HRTIMER_START_ON_INACTIVE) + hrtimer_start(info->timer, info->time, info->mode); + if (atomic_read(&info->state) == HRTIMER_START_ON_INACTIVE) + hrtimer_cancel(info->timer); } } -- cgit v1.2.2