clock_nanosleep()のソースを追う

clock_nanosleepはシステムコールだそうです。

[kernel/posix-timers.c]

1035 SYSCALL_DEFINE4(clock_nanosleep, const clockid_t, which_clock, int, flags,
1036         const struct timespec __user *, rqtp,
1037         struct timespec __user *, rmtp)
1038 {
1039     struct k_clock *kc = clockid_to_kclock(which_clock);
1040     struct timespec t;
1041 
1042     if (!kc)
1043         return -EINVAL;
1044     if (!kc->nsleep)
1045         return -ENANOSLEEP_NOTSUP;
1046 
1047     if (copy_from_user(&t, rqtp, sizeof (struct timespec)))
1048         return -EFAULT;
1049 
1050     if (!timespec_valid(&t))
1051         return -EINVAL;
1052 
1053     return kc->nsleep(which_clock, flags, &t, rmtp);
1054 }

kc->nsleepが定義されているのはここ。
[kernel/posix-timers.c]

 225 /*
 226  * Initialize everything, well, just everything in Posix clocks/timers ;)
 227  */
 228 static __init int init_posix_timers(void)
 229 {
 230     struct k_clock clock_realtime = {
 231         .clock_getres   = hrtimer_get_res,
 232         .clock_get  = posix_clock_realtime_get,
 233         .clock_set  = posix_clock_realtime_set,
 234         .clock_adj  = posix_clock_realtime_adj,
 235         .nsleep     = common_nsleep,
 236         .nsleep_restart = hrtimer_nanosleep_restart,
 237         .timer_create   = common_timer_create,
 238         .timer_set  = common_timer_set,
 239         .timer_get  = common_timer_get,
 240         .timer_del  = common_timer_del,
 241     };
 242     struct k_clock clock_monotonic = {
 243         .clock_getres   = hrtimer_get_res,
 244         .clock_get  = posix_ktime_get_ts,
 245         .nsleep     = common_nsleep,
 246         .nsleep_restart = hrtimer_nanosleep_restart,
 247         .timer_create   = common_timer_create,
 248         .timer_set  = common_timer_set,
 249         .timer_get  = common_timer_get,
 250         .timer_del  = common_timer_del,
 251     };
...

そして、common_nsleepはこちら。
[kernel/posix-timers.c]

1024 /*
1025  * nanosleep for monotonic and realtime clocks
1026  */
1027 static int common_nsleep(const clockid_t which_clock, int flags,
1028              struct timespec *tsave, struct timespec __user *rmtp)
1029 {
1030     return hrtimer_nanosleep(tsave, rmtp, flags & TIMER_ABSTIME ?
1031                  HRTIMER_MODE_ABS : HRTIMER_MODE_REL,
1032                  which_clock);
1033 }

ここから、高精度カーネルタイマ hrtimerの世界へ!