aboutsummaryrefslogtreecommitdiffstats
path: root/kernel
diff options
context:
space:
mode:
authorJonathan Herman <hermanjl@cs.unc.edu>2011-10-08 17:06:48 -0400
committerJonathan Herman <hermanjl@cs.unc.edu>2011-10-08 17:06:48 -0400
commit5a2b8be93c93f2c66edee2a8aff1554778959e35 (patch)
tree931b54656e800f89b5479be520b9a9ca29ed6030 /kernel
parent61ce17e3edbf33e49adb5536c9904b735e58c774 (diff)
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.
Diffstat (limited to 'kernel')
-rw-r--r--kernel/hrtimer.c5
1 files changed, 4 insertions, 1 deletions
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)
1072 info = list_entry(pos, struct hrtimer_start_on_info, list); 1072 info = list_entry(pos, struct hrtimer_start_on_info, list);
1073 TRACE("pulled timer 0x%x\n", info->timer); 1073 TRACE("pulled timer 0x%x\n", info->timer);
1074 list_del(pos); 1074 list_del(pos);
1075 hrtimer_start(info->timer, info->time, info->mode); 1075 if (atomic_read(&info->state) != HRTIMER_START_ON_INACTIVE)
1076 hrtimer_start(info->timer, info->time, info->mode);
1077 if (atomic_read(&info->state) == HRTIMER_START_ON_INACTIVE)
1078 hrtimer_cancel(info->timer);
1076 } 1079 }
1077} 1080}
1078 1081