diff options
author | Bjoern Brandenburg <bbb@mpi-sws.org> | 2017-07-12 16:57:41 -0400 |
---|---|---|
committer | Bjoern Brandenburg <bbb@mpi-sws.org> | 2017-07-12 16:57:41 -0400 |
commit | 4acc377593580e7d04ad8b42b258e8c2b39030ee (patch) | |
tree | d050f7ccc3d55e6b5b984329561d32b8db889f5a | |
parent | 3d009fa7e7475ca8d72776aa83dd9796bb44f9d2 (diff) |
LITMUS^RT core: use absolute synchronous release times
To allow userspace to determine when exactly a synchronous release
should occur.
-rw-r--r-- | litmus/ctrldev.c | 2 | ||||
-rw-r--r-- | litmus/sync.c | 18 |
2 files changed, 10 insertions, 10 deletions
diff --git a/litmus/ctrldev.c b/litmus/ctrldev.c index 3fc769c573a5..cc74c5afa5c6 100644 --- a/litmus/ctrldev.c +++ b/litmus/ctrldev.c | |||
@@ -133,7 +133,7 @@ asmlinkage long sys_litmus_lock(int lock_od); | |||
133 | asmlinkage long sys_litmus_unlock(int lock_od); | 133 | asmlinkage long sys_litmus_unlock(int lock_od); |
134 | asmlinkage long sys_wait_for_job_release(unsigned int job); | 134 | asmlinkage long sys_wait_for_job_release(unsigned int job); |
135 | asmlinkage long sys_wait_for_ts_release(void); | 135 | asmlinkage long sys_wait_for_ts_release(void); |
136 | asmlinkage long sys_release_ts(lt_t __user *__delay); | 136 | asmlinkage long sys_release_ts(lt_t __user *__when); |
137 | 137 | ||
138 | static long litmus_ctrl_ioctl(struct file *filp, | 138 | static long litmus_ctrl_ioctl(struct file *filp, |
139 | unsigned int cmd, unsigned long arg) | 139 | unsigned int cmd, unsigned long arg) |
diff --git a/litmus/sync.c b/litmus/sync.c index 941545a05383..123cefd68a36 100644 --- a/litmus/sync.c +++ b/litmus/sync.c | |||
@@ -130,23 +130,23 @@ asmlinkage long sys_wait_for_ts_release(void) | |||
130 | return ret; | 130 | return ret; |
131 | } | 131 | } |
132 | 132 | ||
133 | #define ONE_MS 1000000 | 133 | #define ONE_MS 1000000ULL |
134 | #define ONE_SECOND (ONE_MS * 1000) | ||
134 | 135 | ||
135 | asmlinkage long sys_release_ts(lt_t __user *__delay) | 136 | asmlinkage long sys_release_ts(lt_t __user *__when) |
136 | { | 137 | { |
137 | long ret; | 138 | long ret; |
138 | lt_t delay; | ||
139 | lt_t start_time; | 139 | lt_t start_time; |
140 | lt_t now; | ||
140 | 141 | ||
141 | /* FIXME: check capabilities... */ | 142 | /* FIXME: check capabilities... */ |
142 | 143 | ||
143 | ret = copy_from_user(&delay, __delay, sizeof(delay)); | 144 | ret = copy_from_user(&start_time, __when, sizeof(start_time)); |
144 | if (ret == 0) { | 145 | if (ret == 0) { |
145 | /* round up to next larger integral millisecond */ | 146 | now = litmus_clock(); |
146 | start_time = litmus_clock(); | 147 | if (lt_before(start_time, now)) |
147 | do_div(start_time, ONE_MS); | 148 | start_time = now + ONE_SECOND; |
148 | start_time *= ONE_MS; | 149 | ret = do_release_ts(start_time); |
149 | ret = do_release_ts(start_time + delay); | ||
150 | } | 150 | } |
151 | 151 | ||
152 | return ret; | 152 | return ret; |