diff options
| author | Bjoern B. Brandenburg <bbb@cs.unc.edu> | 2011-07-28 01:16:04 -0400 |
|---|---|---|
| committer | Bjoern B. Brandenburg <bbb@cs.unc.edu> | 2011-07-28 01:16:04 -0400 |
| commit | 01c0aefb3de19b0cf66a947c60bece866dc9e565 (patch) | |
| tree | d69fa5635b85df2d6294e073dcc4912c83cbc09e /src | |
| parent | a706d3b803c949b60e1ee91d911f1c607a6bc22a (diff) | |
Switch to new np-section protocol.
Everything is in one 32-bit word now.
Diffstat (limited to 'src')
| -rw-r--r-- | src/kernel_iface.c | 10 |
1 files changed, 7 insertions, 3 deletions
diff --git a/src/kernel_iface.c b/src/kernel_iface.c index 1426795..69e306b 100644 --- a/src/kernel_iface.c +++ b/src/kernel_iface.c | |||
| @@ -43,6 +43,8 @@ int init_kernel_iface(void) | |||
| 43 | int err = 0; | 43 | int err = 0; |
| 44 | long page_size = sysconf(_SC_PAGESIZE); | 44 | long page_size = sysconf(_SC_PAGESIZE); |
| 45 | 45 | ||
| 46 | BUILD_BUG_ON(sizeof(union np_flag) != sizeof(uint32_t)); | ||
| 47 | |||
| 46 | err = map_file(LITMUS_CTRL_DEVICE, (void**) &ctrl_page, CTRL_PAGES * page_size); | 48 | err = map_file(LITMUS_CTRL_DEVICE, (void**) &ctrl_page, CTRL_PAGES * page_size); |
| 47 | if (err) { | 49 | if (err) { |
| 48 | fprintf(stderr, "%s: cannot open LITMUS^RT control page (%m)\n", | 50 | fprintf(stderr, "%s: cannot open LITMUS^RT control page (%m)\n", |
| @@ -55,7 +57,7 @@ int init_kernel_iface(void) | |||
| 55 | void enter_np(void) | 57 | void enter_np(void) |
| 56 | { | 58 | { |
| 57 | if (likely(ctrl_page != NULL) || init_kernel_iface() == 0) | 59 | if (likely(ctrl_page != NULL) || init_kernel_iface() == 0) |
| 58 | ctrl_page->np_flag++; | 60 | ctrl_page->sched.np.flag++; |
| 59 | else | 61 | else |
| 60 | fprintf(stderr, "enter_np: control page not mapped!\n"); | 62 | fprintf(stderr, "enter_np: control page not mapped!\n"); |
| 61 | } | 63 | } |
| @@ -63,11 +65,13 @@ void enter_np(void) | |||
| 63 | 65 | ||
| 64 | void exit_np(void) | 66 | void exit_np(void) |
| 65 | { | 67 | { |
| 66 | if (likely(ctrl_page != NULL) && --ctrl_page->np_flag == 0) { | 68 | if (likely(ctrl_page != NULL) && --ctrl_page->sched.np.flag) { |
| 67 | /* became preemptive, let's check for delayed preemptions */ | 69 | /* became preemptive, let's check for delayed preemptions */ |
| 68 | __sync_synchronize(); | 70 | __sync_synchronize(); |
| 69 | if (ctrl_page->delayed_preemption) | 71 | if (ctrl_page->sched.np.preempt) { |
| 72 | ctrl_page->ts_syscall_start = (uint64_t) get_cycles(); | ||
| 70 | sched_yield(); | 73 | sched_yield(); |
| 74 | } | ||
| 71 | } | 75 | } |
| 72 | } | 76 | } |
| 73 | 77 | ||
