diff options
Diffstat (limited to 'kernel/timer.c')
-rw-r--r-- | kernel/timer.c | 58 |
1 files changed, 2 insertions, 56 deletions
diff --git a/kernel/timer.c b/kernel/timer.c index fd74268d8663..4f1cb0ab5251 100644 --- a/kernel/timer.c +++ b/kernel/timer.c | |||
@@ -33,6 +33,7 @@ | |||
33 | #include <linux/posix-timers.h> | 33 | #include <linux/posix-timers.h> |
34 | #include <linux/cpu.h> | 34 | #include <linux/cpu.h> |
35 | #include <linux/syscalls.h> | 35 | #include <linux/syscalls.h> |
36 | #include <linux/delay.h> | ||
36 | 37 | ||
37 | #include <asm/uaccess.h> | 38 | #include <asm/uaccess.h> |
38 | #include <asm/unistd.h> | 39 | #include <asm/unistd.h> |
@@ -857,6 +858,7 @@ static void run_timer_softirq(struct softirq_action *h) | |||
857 | { | 858 | { |
858 | tvec_base_t *base = &__get_cpu_var(tvec_bases); | 859 | tvec_base_t *base = &__get_cpu_var(tvec_bases); |
859 | 860 | ||
861 | hrtimer_run_queues(); | ||
860 | if (time_after_eq(jiffies, base->timer_jiffies)) | 862 | if (time_after_eq(jiffies, base->timer_jiffies)) |
861 | __run_timers(base); | 863 | __run_timers(base); |
862 | } | 864 | } |
@@ -1118,62 +1120,6 @@ asmlinkage long sys_gettid(void) | |||
1118 | return current->pid; | 1120 | return current->pid; |
1119 | } | 1121 | } |
1120 | 1122 | ||
1121 | static long __sched nanosleep_restart(struct restart_block *restart) | ||
1122 | { | ||
1123 | unsigned long expire = restart->arg0, now = jiffies; | ||
1124 | struct timespec __user *rmtp = (struct timespec __user *) restart->arg1; | ||
1125 | long ret; | ||
1126 | |||
1127 | /* Did it expire while we handled signals? */ | ||
1128 | if (!time_after(expire, now)) | ||
1129 | return 0; | ||
1130 | |||
1131 | expire = schedule_timeout_interruptible(expire - now); | ||
1132 | |||
1133 | ret = 0; | ||
1134 | if (expire) { | ||
1135 | struct timespec t; | ||
1136 | jiffies_to_timespec(expire, &t); | ||
1137 | |||
1138 | ret = -ERESTART_RESTARTBLOCK; | ||
1139 | if (rmtp && copy_to_user(rmtp, &t, sizeof(t))) | ||
1140 | ret = -EFAULT; | ||
1141 | /* The 'restart' block is already filled in */ | ||
1142 | } | ||
1143 | return ret; | ||
1144 | } | ||
1145 | |||
1146 | asmlinkage long sys_nanosleep(struct timespec __user *rqtp, struct timespec __user *rmtp) | ||
1147 | { | ||
1148 | struct timespec t; | ||
1149 | unsigned long expire; | ||
1150 | long ret; | ||
1151 | |||
1152 | if (copy_from_user(&t, rqtp, sizeof(t))) | ||
1153 | return -EFAULT; | ||
1154 | |||
1155 | if ((t.tv_nsec >= 1000000000L) || (t.tv_nsec < 0) || (t.tv_sec < 0)) | ||
1156 | return -EINVAL; | ||
1157 | |||
1158 | expire = timespec_to_jiffies(&t) + (t.tv_sec || t.tv_nsec); | ||
1159 | expire = schedule_timeout_interruptible(expire); | ||
1160 | |||
1161 | ret = 0; | ||
1162 | if (expire) { | ||
1163 | struct restart_block *restart; | ||
1164 | jiffies_to_timespec(expire, &t); | ||
1165 | if (rmtp && copy_to_user(rmtp, &t, sizeof(t))) | ||
1166 | return -EFAULT; | ||
1167 | |||
1168 | restart = ¤t_thread_info()->restart_block; | ||
1169 | restart->fn = nanosleep_restart; | ||
1170 | restart->arg0 = jiffies + expire; | ||
1171 | restart->arg1 = (unsigned long) rmtp; | ||
1172 | ret = -ERESTART_RESTARTBLOCK; | ||
1173 | } | ||
1174 | return ret; | ||
1175 | } | ||
1176 | |||
1177 | /* | 1123 | /* |
1178 | * sys_sysinfo - fill in sysinfo struct | 1124 | * sys_sysinfo - fill in sysinfo struct |
1179 | */ | 1125 | */ |