diff options
| author | Steve French <sfrench@us.ibm.com> | 2006-01-12 17:47:08 -0500 |
|---|---|---|
| committer | Steve French <sfrench@us.ibm.com> | 2006-01-12 17:47:08 -0500 |
| commit | 94bc2be31a01a3055ec94176e595dfe208e92d3b (patch) | |
| tree | ebfbe81c6718a6390bfa1b99c6d228237d818576 /kernel/timer.c | |
| parent | c32a0b689cb9cc160cfcd19735bbf50bb70c6ef4 (diff) | |
| parent | 58cba4650a7a414eabd2b40cc9d8e45fcdf192d9 (diff) | |
Merge with /pub/scm/linux/kernel/git/torvalds/linux-2.6.git
Signed-off-by: Steve French <sfrench@us.ibm.com>
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 | */ |
