diff options
author | Jonathan Herman <hermanjl@cs.unc.edu> | 2011-10-08 17:06:48 -0400 |
---|---|---|
committer | Jonathan Herman <hermanjl@cs.unc.edu> | 2011-10-08 17:06:48 -0400 |
commit | 5a2b8be93c93f2c66edee2a8aff1554778959e35 (patch) | |
tree | 931b54656e800f89b5479be520b9a9ca29ed6030 /kernel | |
parent | 61ce17e3edbf33e49adb5536c9904b735e58c774 (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.c | 5 |
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 | ||