aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBjoern Brandenburg <bbb@mpi-sws.org>2017-07-12 16:57:41 -0400
committerBjoern Brandenburg <bbb@mpi-sws.org>2017-07-12 16:57:41 -0400
commit4acc377593580e7d04ad8b42b258e8c2b39030ee (patch)
treed050f7ccc3d55e6b5b984329561d32b8db889f5a
parent3d009fa7e7475ca8d72776aa83dd9796bb44f9d2 (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.c2
-rw-r--r--litmus/sync.c18
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);
133asmlinkage long sys_litmus_unlock(int lock_od); 133asmlinkage long sys_litmus_unlock(int lock_od);
134asmlinkage long sys_wait_for_job_release(unsigned int job); 134asmlinkage long sys_wait_for_job_release(unsigned int job);
135asmlinkage long sys_wait_for_ts_release(void); 135asmlinkage long sys_wait_for_ts_release(void);
136asmlinkage long sys_release_ts(lt_t __user *__delay); 136asmlinkage long sys_release_ts(lt_t __user *__when);
137 137
138static long litmus_ctrl_ioctl(struct file *filp, 138static 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
135asmlinkage long sys_release_ts(lt_t __user *__delay) 136asmlinkage 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;