1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33#include <linux/mm.h>
34#include <linux/interrupt.h>
35#include <linux/slab.h>
36#include <linux/time.h>
37#include <linux/mutex.h>
38
39#include <asm/uaccess.h>
40#include <linux/list.h>
41#include <linux/init.h>
42#include <linux/compiler.h>
43#include <linux/idr.h>
44#include <linux/posix-timers.h>
45#include <linux/syscalls.h>
46#include <linux/wait.h>
47#include <linux/workqueue.h>
48#include <linux/module.h>
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71static struct kmem_cache *posix_timers_cache;
72static struct idr posix_timers_id;
73static DEFINE_SPINLOCK(idr_lock);
74
75
76
77
78
79#if SIGEV_THREAD_ID != (SIGEV_THREAD_ID & \
80 ~(SIGEV_SIGNAL | SIGEV_NONE | SIGEV_THREAD))
81#error "SIGEV_THREAD_ID must not share bit with other SIGEV values!"
82#endif
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134static struct k_clock posix_clocks[MAX_CLOCKS];
135
136
137
138
139static int common_nsleep(const clockid_t, int flags, struct timespec *t,
140 struct timespec __user *rmtp);
141static void common_timer_get(struct k_itimer *, struct itimerspec *);
142static int common_timer_set(struct k_itimer *, int,
143 struct itimerspec *, struct itimerspec *);
144static int common_timer_del(struct k_itimer *timer);
145
146static enum hrtimer_restart posix_timer_fn(struct hrtimer *data);
147
148static struct k_itimer *lock_timer(timer_t timer_id, unsigned long *flags);
149
150static inline void unlock_timer(struct k_itimer *timr, unsigned long flags)
151{
152 spin_unlock_irqrestore(&timr->it_lock, flags);
153}
154
155
156
157
158#define CLOCK_DISPATCH(clock, call, arglist) \
159 ((clock) < 0 ? posix_cpu_##call arglist : \
160 (posix_clocks[clock].call != NULL \
161 ? (*posix_clocks[clock].call) arglist : common_##call arglist))
162
163
164
165
166
167
168
169
170
171static inline int common_clock_getres(const clockid_t which_clock,
172 struct timespec *tp)
173{
174 tp->tv_sec = 0;
175 tp->tv_nsec = posix_clocks[which_clock].res;
176 return 0;
177}
178
179
180
181
182static int common_clock_get(clockid_t which_clock, struct timespec *tp)
183{
184 ktime_get_real_ts(tp);
185 return 0;
186}
187
188static inline int common_clock_set(const clockid_t which_clock,
189 struct timespec *tp)
190{
191 return do_sys_settimeofday(tp, NULL);
192}
193
194static int common_timer_create(struct k_itimer *new_timer)
195{
196 hrtimer_init(&new_timer->it.real.timer, new_timer->it_clock, 0);
197 return 0;
198}
199
200static int no_timer_create(struct k_itimer *new_timer)
201{
202 return -EOPNOTSUPP;
203}
204
205static int no_nsleep(const clockid_t which_clock, int flags,
206 struct timespec *tsave, struct timespec __user *rmtp)
207{
208 return -EOPNOTSUPP;
209}
210
211
212
213
214static inline int invalid_clockid(const clockid_t which_clock)
215{
216 if (which_clock < 0)
217 return 0;
218 if ((unsigned) which_clock >= MAX_CLOCKS)
219 return 1;
220 if (posix_clocks[which_clock].clock_getres != NULL)
221 return 0;
222 if (posix_clocks[which_clock].res != 0)
223 return 0;
224 return 1;
225}
226
227
228
229
230static int posix_ktime_get_ts(clockid_t which_clock, struct timespec *tp)
231{
232 ktime_get_ts(tp);
233 return 0;
234}
235
236
237
238
239static int posix_get_monotonic_raw(clockid_t which_clock, struct timespec *tp)
240{
241 getrawmonotonic(tp);
242 return 0;
243}
244
245
246static int posix_get_realtime_coarse(clockid_t which_clock, struct timespec *tp)
247{
248 *tp = current_kernel_time();
249 return 0;
250}
251
252static int posix_get_monotonic_coarse(clockid_t which_clock,
253 struct timespec *tp)
254{
255 *tp = get_monotonic_coarse();
256 return 0;
257}
258
259static int posix_get_coarse_res(const clockid_t which_clock, struct timespec *tp)
260{
261 *tp = ktime_to_timespec(KTIME_LOW_RES);
262 return 0;
263}
264
265
266
267static __init int init_posix_timers(void)
268{
269 struct k_clock clock_realtime = {
270 .clock_getres = hrtimer_get_res,
271 };
272 struct k_clock clock_monotonic = {
273 .clock_getres = hrtimer_get_res,
274 .clock_get = posix_ktime_get_ts,
275 .clock_set = do_posix_clock_nosettime,
276 };
277 struct k_clock clock_monotonic_raw = {
278 .clock_getres = hrtimer_get_res,
279 .clock_get = posix_get_monotonic_raw,
280 .clock_set = do_posix_clock_nosettime,
281 .timer_create = no_timer_create,
282 .nsleep = no_nsleep,
283 };
284 struct k_clock clock_realtime_coarse = {
285 .clock_getres = posix_get_coarse_res,
286 .clock_get = posix_get_realtime_coarse,
287 .clock_set = do_posix_clock_nosettime,
288 .timer_create = no_timer_create,
289 .nsleep = no_nsleep,
290 };
291 struct k_clock clock_monotonic_coarse = {
292 .clock_getres = posix_get_coarse_res,
293 .clock_get = posix_get_monotonic_coarse,
294 .clock_set = do_posix_clock_nosettime,
295 .timer_create = no_timer_create,
296 .nsleep = no_nsleep,
297 };
298
299 register_posix_clock(CLOCK_REALTIME, &clock_realtime);
300 register_posix_clock(CLOCK_MONOTONIC, &clock_monotonic);
301 register_posix_clock(CLOCK_MONOTONIC_RAW, &clock_monotonic_raw);
302 register_posix_clock(CLOCK_REALTIME_COARSE, &clock_realtime_coarse);
303 register_posix_clock(CLOCK_MONOTONIC_COARSE, &clock_monotonic_coarse);
304
305 posix_timers_cache = kmem_cache_create("posix_timers_cache",
306 sizeof (struct k_itimer), 0, SLAB_PANIC,
307 NULL);
308 idr_init(&posix_timers_id);
309 return 0;
310}
311
312__initcall(init_posix_timers);
313
314static void schedule_next_timer(struct k_itimer *timr)
315{
316 struct hrtimer *timer = &timr->it.real.timer;
317
318 if (timr->it.real.interval.tv64 == 0)
319 return;
320
321 timr->it_overrun += (unsigned int) hrtimer_forward(timer,
322 timer->base->get_time(),
323 timr->it.real.interval);
324
325 timr->it_overrun_last = timr->it_overrun;
326 timr->it_overrun = -1;
327 ++timr->it_requeue_pending;
328 hrtimer_restart(timer);
329}
330
331
332
333
334
335
336
337
338
339
340
341
342void do_schedule_next_timer(struct siginfo *info)
343{
344 struct k_itimer *timr;
345 unsigned long flags;
346
347 timr = lock_timer(info->si_tid, &flags);
348
349 if (timr && timr->it_requeue_pending == info->si_sys_private) {
350 if (timr->it_clock < 0)
351 posix_cpu_timer_schedule(timr);
352 else
353 schedule_next_timer(timr);
354
355 info->si_overrun += timr->it_overrun_last;
356 }
357
358 if (timr)
359 unlock_timer(timr, flags);
360}
361
362int posix_timer_event(struct k_itimer *timr, int si_private)
363{
364 struct task_struct *task;
365 int shared, ret = -1;
366
367
368
369
370
371
372
373
374
375
376
377 timr->sigq->info.si_sys_private = si_private;
378
379 rcu_read_lock();
380 task = pid_task(timr->it_pid, PIDTYPE_PID);
381 if (task) {
382 shared = !(timr->it_sigev_notify & SIGEV_THREAD_ID);
383 ret = send_sigqueue(timr->sigq, task, shared);
384 }
385 rcu_read_unlock();
386
387 return ret > 0;
388}
389EXPORT_SYMBOL_GPL(posix_timer_event);
390
391
392
393
394
395
396
397
398static enum hrtimer_restart posix_timer_fn(struct hrtimer *timer)
399{
400 struct k_itimer *timr;
401 unsigned long flags;
402 int si_private = 0;
403 enum hrtimer_restart ret = HRTIMER_NORESTART;
404
405 timr = container_of(timer, struct k_itimer, it.real.timer);
406 spin_lock_irqsave(&timr->it_lock, flags);
407
408 if (timr->it.real.interval.tv64 != 0)
409 si_private = ++timr->it_requeue_pending;
410
411 if (posix_timer_event(timr, si_private)) {
412
413
414
415
416
417 if (timr->it.real.interval.tv64 != 0) {
418 ktime_t now = hrtimer_cb_get_time(timer);
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442#ifdef CONFIG_HIGH_RES_TIMERS
443 {
444 ktime_t kj = ktime_set(0, NSEC_PER_SEC / HZ);
445
446 if (timr->it.real.interval.tv64 < kj.tv64)
447 now = ktime_add(now, kj);
448 }
449#endif
450 timr->it_overrun += (unsigned int)
451 hrtimer_forward(timer, now,
452 timr->it.real.interval);
453 ret = HRTIMER_RESTART;
454 ++timr->it_requeue_pending;
455 }
456 }
457
458 unlock_timer(timr, flags);
459 return ret;
460}
461
462static struct pid *good_sigevent(sigevent_t * event)
463{
464 struct task_struct *rtn = current->group_leader;
465
466 if ((event->sigev_notify & SIGEV_THREAD_ID ) &&
467 (!(rtn = find_task_by_vpid(event->sigev_notify_thread_id)) ||
468 !same_thread_group(rtn, current) ||
469 (event->sigev_notify & ~SIGEV_THREAD_ID) != SIGEV_SIGNAL))
470 return NULL;
471
472 if (((event->sigev_notify & ~SIGEV_THREAD_ID) != SIGEV_NONE) &&
473 ((event->sigev_signo <= 0) || (event->sigev_signo > SIGRTMAX)))
474 return NULL;
475
476 return task_pid(rtn);
477}
478
479void register_posix_clock(const clockid_t clock_id, struct k_clock *new_clock)
480{
481 if ((unsigned) clock_id >= MAX_CLOCKS) {
482 printk("POSIX clock register failed for clock_id %d\n",
483 clock_id);
484 return;
485 }
486
487 posix_clocks[clock_id] = *new_clock;
488}
489EXPORT_SYMBOL_GPL(register_posix_clock);
490
491static struct k_itimer * alloc_posix_timer(void)
492{
493 struct k_itimer *tmr;
494 tmr = kmem_cache_zalloc(posix_timers_cache, GFP_KERNEL);
495 if (!tmr)
496 return tmr;
497 if (unlikely(!(tmr->sigq = sigqueue_alloc()))) {
498 kmem_cache_free(posix_timers_cache, tmr);
499 return NULL;
500 }
501 memset(&tmr->sigq->info, 0, sizeof(siginfo_t));
502 return tmr;
503}
504
505#define IT_ID_SET 1
506#define IT_ID_NOT_SET 0
507static void release_posix_timer(struct k_itimer *tmr, int it_id_set)
508{
509 if (it_id_set) {
510 unsigned long flags;
511 spin_lock_irqsave(&idr_lock, flags);
512 idr_remove(&posix_timers_id, tmr->it_id);
513 spin_unlock_irqrestore(&idr_lock, flags);
514 }
515 put_pid(tmr->it_pid);
516 sigqueue_free(tmr->sigq);
517 kmem_cache_free(posix_timers_cache, tmr);
518}
519
520
521
522SYSCALL_DEFINE3(timer_create, const clockid_t, which_clock,
523 struct sigevent __user *, timer_event_spec,
524 timer_t __user *, created_timer_id)
525{
526 struct k_itimer *new_timer;
527 int error, new_timer_id;
528 sigevent_t event;
529 int it_id_set = IT_ID_NOT_SET;
530
531 if (invalid_clockid(which_clock))
532 return -EINVAL;
533
534 new_timer = alloc_posix_timer();
535 if (unlikely(!new_timer))
536 return -EAGAIN;
537
538 spin_lock_init(&new_timer->it_lock);
539 retry:
540 if (unlikely(!idr_pre_get(&posix_timers_id, GFP_KERNEL))) {
541 error = -EAGAIN;
542 goto out;
543 }
544 spin_lock_irq(&idr_lock);
545 error = idr_get_new(&posix_timers_id, new_timer, &new_timer_id);
546 spin_unlock_irq(&idr_lock);
547 if (error) {
548 if (error == -EAGAIN)
549 goto retry;
550
551
552
553
554 error = -EAGAIN;
555 goto out;
556 }
557
558 it_id_set = IT_ID_SET;
559 new_timer->it_id = (timer_t) new_timer_id;
560 new_timer->it_clock = which_clock;
561 new_timer->it_overrun = -1;
562
563 if (copy_to_user(created_timer_id,
564 &new_timer_id, sizeof (new_timer_id))) {
565 error = -EFAULT;
566 goto out;
567 }
568 if (timer_event_spec) {
569 if (copy_from_user(&event, timer_event_spec, sizeof (event))) {
570 error = -EFAULT;
571 goto out;
572 }
573 rcu_read_lock();
574 new_timer->it_pid = get_pid(good_sigevent(&event));
575 rcu_read_unlock();
576 if (!new_timer->it_pid) {
577 error = -EINVAL;
578 goto out;
579 }
580 } else {
581 event.sigev_notify = SIGEV_SIGNAL;
582 event.sigev_signo = SIGALRM;
583 event.sigev_value.sival_int = new_timer->it_id;
584 new_timer->it_pid = get_pid(task_tgid(current));
585 }
586
587 new_timer->it_sigev_notify = event.sigev_notify;
588 new_timer->sigq->info.si_signo = event.sigev_signo;
589 new_timer->sigq->info.si_value = event.sigev_value;
590 new_timer->sigq->info.si_tid = new_timer->it_id;
591 new_timer->sigq->info.si_code = SI_TIMER;
592
593 error = CLOCK_DISPATCH(which_clock, timer_create, (new_timer));
594 if (error)
595 goto out;
596
597 spin_lock_irq(¤t->sighand->siglock);
598 new_timer->it_signal = current->signal;
599 list_add(&new_timer->list, ¤t->signal->posix_timers);
600 spin_unlock_irq(¤t->sighand->siglock);
601
602 return 0;
603
604
605
606
607
608
609out:
610 release_posix_timer(new_timer, it_id_set);
611 return error;
612}
613
614
615
616
617
618
619
620
621static struct k_itimer *lock_timer(timer_t timer_id, unsigned long *flags)
622{
623 struct k_itimer *timr;
624
625
626
627
628
629 spin_lock_irqsave(&idr_lock, *flags);
630 timr = idr_find(&posix_timers_id, (int)timer_id);
631 if (timr) {
632 spin_lock(&timr->it_lock);
633 if (timr->it_signal == current->signal) {
634 spin_unlock(&idr_lock);
635 return timr;
636 }
637 spin_unlock(&timr->it_lock);
638 }
639 spin_unlock_irqrestore(&idr_lock, *flags);
640
641 return NULL;
642}
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660static void
661common_timer_get(struct k_itimer *timr, struct itimerspec *cur_setting)
662{
663 ktime_t now, remaining, iv;
664 struct hrtimer *timer = &timr->it.real.timer;
665
666 memset(cur_setting, 0, sizeof(struct itimerspec));
667
668 iv = timr->it.real.interval;
669
670
671 if (iv.tv64)
672 cur_setting->it_interval = ktime_to_timespec(iv);
673 else if (!hrtimer_active(timer) &&
674 (timr->it_sigev_notify & ~SIGEV_THREAD_ID) != SIGEV_NONE)
675 return;
676
677 now = timer->base->get_time();
678
679
680
681
682
683
684 if (iv.tv64 && (timr->it_requeue_pending & REQUEUE_PENDING ||
685 (timr->it_sigev_notify & ~SIGEV_THREAD_ID) == SIGEV_NONE))
686 timr->it_overrun += (unsigned int) hrtimer_forward(timer, now, iv);
687
688 remaining = ktime_sub(hrtimer_get_expires(timer), now);
689
690 if (remaining.tv64 <= 0) {
691
692
693
694
695 if ((timr->it_sigev_notify & ~SIGEV_THREAD_ID) != SIGEV_NONE)
696 cur_setting->it_value.tv_nsec = 1;
697 } else
698 cur_setting->it_value = ktime_to_timespec(remaining);
699}
700
701
702SYSCALL_DEFINE2(timer_gettime, timer_t, timer_id,
703 struct itimerspec __user *, setting)
704{
705 struct k_itimer *timr;
706 struct itimerspec cur_setting;
707 unsigned long flags;
708
709 timr = lock_timer(timer_id, &flags);
710 if (!timr)
711 return -EINVAL;
712
713 CLOCK_DISPATCH(timr->it_clock, timer_get, (timr, &cur_setting));
714
715 unlock_timer(timr, flags);
716
717 if (copy_to_user(setting, &cur_setting, sizeof (cur_setting)))
718 return -EFAULT;
719
720 return 0;
721}
722
723
724
725
726
727
728
729
730
731
732SYSCALL_DEFINE1(timer_getoverrun, timer_t, timer_id)
733{
734 struct k_itimer *timr;
735 int overrun;
736 unsigned long flags;
737
738 timr = lock_timer(timer_id, &flags);
739 if (!timr)
740 return -EINVAL;
741
742 overrun = timr->it_overrun_last;
743 unlock_timer(timr, flags);
744
745 return overrun;
746}
747
748
749
750static int
751common_timer_set(struct k_itimer *timr, int flags,
752 struct itimerspec *new_setting, struct itimerspec *old_setting)
753{
754 struct hrtimer *timer = &timr->it.real.timer;
755 enum hrtimer_mode mode;
756
757 if (old_setting)
758 common_timer_get(timr, old_setting);
759
760
761 timr->it.real.interval.tv64 = 0;
762
763
764
765
766 if (hrtimer_try_to_cancel(timer) < 0)
767 return TIMER_RETRY;
768
769 timr->it_requeue_pending = (timr->it_requeue_pending + 2) &
770 ~REQUEUE_PENDING;
771 timr->it_overrun_last = 0;
772
773
774 if (!new_setting->it_value.tv_sec && !new_setting->it_value.tv_nsec)
775 return 0;
776
777 mode = flags & TIMER_ABSTIME ? HRTIMER_MODE_ABS : HRTIMER_MODE_REL;
778 hrtimer_init(&timr->it.real.timer, timr->it_clock, mode);
779 timr->it.real.timer.function = posix_timer_fn;
780
781 hrtimer_set_expires(timer, timespec_to_ktime(new_setting->it_value));
782
783
784 timr->it.real.interval = timespec_to_ktime(new_setting->it_interval);
785
786
787 if (((timr->it_sigev_notify & ~SIGEV_THREAD_ID) == SIGEV_NONE)) {
788
789 if (mode == HRTIMER_MODE_REL) {
790 hrtimer_add_expires(timer, timer->base->get_time());
791 }
792 return 0;
793 }
794
795 hrtimer_start_expires(timer, mode);
796 return 0;
797}
798
799
800SYSCALL_DEFINE4(timer_settime, timer_t, timer_id, int, flags,
801 const struct itimerspec __user *, new_setting,
802 struct itimerspec __user *, old_setting)
803{
804 struct k_itimer *timr;
805 struct itimerspec new_spec, old_spec;
806 int error = 0;
807 unsigned long flag;
808 struct itimerspec *rtn = old_setting ? &old_spec : NULL;
809
810 if (!new_setting)
811 return -EINVAL;
812
813 if (copy_from_user(&new_spec, new_setting, sizeof (new_spec)))
814 return -EFAULT;
815
816 if (!timespec_valid(&new_spec.it_interval) ||
817 !timespec_valid(&new_spec.it_value))
818 return -EINVAL;
819retry:
820 timr = lock_timer(timer_id, &flag);
821 if (!timr)
822 return -EINVAL;
823
824 error = CLOCK_DISPATCH(timr->it_clock, timer_set,
825 (timr, flags, &new_spec, rtn));
826
827 unlock_timer(timr, flag);
828 if (error == TIMER_RETRY) {
829 rtn = NULL;
830 goto retry;
831 }
832
833 if (old_setting && !error &&
834 copy_to_user(old_setting, &old_spec, sizeof (old_spec)))
835 error = -EFAULT;
836
837 return error;
838}
839
840static inline int common_timer_del(struct k_itimer *timer)
841{
842 timer->it.real.interval.tv64 = 0;
843
844 if (hrtimer_try_to_cancel(&timer->it.real.timer) < 0)
845 return TIMER_RETRY;
846 return 0;
847}
848
849static inline int timer_delete_hook(struct k_itimer *timer)
850{
851 return CLOCK_DISPATCH(timer->it_clock, timer_del, (timer));
852}
853
854
855SYSCALL_DEFINE1(timer_delete, timer_t, timer_id)
856{
857 struct k_itimer *timer;
858 unsigned long flags;
859
860retry_delete:
861 timer = lock_timer(timer_id, &flags);
862 if (!timer)
863 return -EINVAL;
864
865 if (timer_delete_hook(timer) == TIMER_RETRY) {
866 unlock_timer(timer, flags);
867 goto retry_delete;
868 }
869
870 spin_lock(¤t->sighand->siglock);
871 list_del(&timer->list);
872 spin_unlock(¤t->sighand->siglock);
873
874
875
876
877 timer->it_signal = NULL;
878
879 unlock_timer(timer, flags);
880 release_posix_timer(timer, IT_ID_SET);
881 return 0;
882}
883
884
885
886
887static void itimer_delete(struct k_itimer *timer)
888{
889 unsigned long flags;
890
891retry_delete:
892 spin_lock_irqsave(&timer->it_lock, flags);
893
894 if (timer_delete_hook(timer) == TIMER_RETRY) {
895 unlock_timer(timer, flags);
896 goto retry_delete;
897 }
898 list_del(&timer->list);
899
900
901
902
903 timer->it_signal = NULL;
904
905 unlock_timer(timer, flags);
906 release_posix_timer(timer, IT_ID_SET);
907}
908
909
910
911
912
913void exit_itimers(struct signal_struct *sig)
914{
915 struct k_itimer *tmr;
916
917 while (!list_empty(&sig->posix_timers)) {
918 tmr = list_entry(sig->posix_timers.next, struct k_itimer, list);
919 itimer_delete(tmr);
920 }
921}
922
923
924int do_posix_clock_nosettime(const clockid_t clockid, struct timespec *tp)
925{
926 return -EINVAL;
927}
928EXPORT_SYMBOL_GPL(do_posix_clock_nosettime);
929
930int do_posix_clock_nonanosleep(const clockid_t clock, int flags,
931 struct timespec *t, struct timespec __user *r)
932{
933#ifndef ENOTSUP
934 return -EOPNOTSUPP;
935#else
936 return -ENOTSUP;
937#endif
938}
939EXPORT_SYMBOL_GPL(do_posix_clock_nonanosleep);
940
941SYSCALL_DEFINE2(clock_settime, const clockid_t, which_clock,
942 const struct timespec __user *, tp)
943{
944 struct timespec new_tp;
945
946 if (invalid_clockid(which_clock))
947 return -EINVAL;
948 if (copy_from_user(&new_tp, tp, sizeof (*tp)))
949 return -EFAULT;
950
951 return CLOCK_DISPATCH(which_clock, clock_set, (which_clock, &new_tp));
952}
953
954SYSCALL_DEFINE2(clock_gettime, const clockid_t, which_clock,
955 struct timespec __user *,tp)
956{
957 struct timespec kernel_tp;
958 int error;
959
960 if (invalid_clockid(which_clock))
961 return -EINVAL;
962 error = CLOCK_DISPATCH(which_clock, clock_get,
963 (which_clock, &kernel_tp));
964 if (!error && copy_to_user(tp, &kernel_tp, sizeof (kernel_tp)))
965 error = -EFAULT;
966
967 return error;
968
969}
970
971SYSCALL_DEFINE2(clock_getres, const clockid_t, which_clock,
972 struct timespec __user *, tp)
973{
974 struct timespec rtn_tp;
975 int error;
976
977 if (invalid_clockid(which_clock))
978 return -EINVAL;
979
980 error = CLOCK_DISPATCH(which_clock, clock_getres,
981 (which_clock, &rtn_tp));
982
983 if (!error && tp && copy_to_user(tp, &rtn_tp, sizeof (rtn_tp))) {
984 error = -EFAULT;
985 }
986
987 return error;
988}
989
990
991
992
993static int common_nsleep(const clockid_t which_clock, int flags,
994 struct timespec *tsave, struct timespec __user *rmtp)
995{
996 return hrtimer_nanosleep(tsave, rmtp, flags & TIMER_ABSTIME ?
997 HRTIMER_MODE_ABS : HRTIMER_MODE_REL,
998 which_clock);
999}
1000
1001SYSCALL_DEFINE4(clock_nanosleep, const clockid_t, which_clock, int, flags,
1002 const struct timespec __user *, rqtp,
1003 struct timespec __user *, rmtp)
1004{
1005 struct timespec t;
1006
1007 if (invalid_clockid(which_clock))
1008 return -EINVAL;
1009
1010 if (copy_from_user(&t, rqtp, sizeof (struct timespec)))
1011 return -EFAULT;
1012
1013 if (!timespec_valid(&t))
1014 return -EINVAL;
1015
1016 return CLOCK_DISPATCH(which_clock, nsleep,
1017 (which_clock, flags, &t, rmtp));
1018}
1019
1020
1021
1022
1023static int common_nsleep_restart(struct restart_block *restart_block)
1024{
1025 return hrtimer_nanosleep_restart(restart_block);
1026}
1027
1028
1029
1030
1031
1032long
1033clock_nanosleep_restart(struct restart_block *restart_block)
1034{
1035 clockid_t which_clock = restart_block->arg0;
1036
1037 return CLOCK_DISPATCH(which_clock, nsleep_restart,
1038 (restart_block));
1039}
1040