aboutsummaryrefslogtreecommitdiffstats
path: root/src/kernel_iface.c
diff options
context:
space:
mode:
authorBjoern B. Brandenburg <bbb@cs.unc.edu>2011-07-28 01:16:04 -0400
committerBjoern B. Brandenburg <bbb@cs.unc.edu>2011-07-28 01:16:04 -0400
commit01c0aefb3de19b0cf66a947c60bece866dc9e565 (patch)
treed69fa5635b85df2d6294e073dcc4912c83cbc09e /src/kernel_iface.c
parenta706d3b803c949b60e1ee91d911f1c607a6bc22a (diff)
Switch to new np-section protocol.
Everything is in one 32-bit word now.
Diffstat (limited to 'src/kernel_iface.c')
-rw-r--r--src/kernel_iface.c10
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)
55void enter_np(void) 57void 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
64void exit_np(void) 66void 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