mirror of
https://github.com/adulau/aha.git
synced 2024-12-27 11:16:11 +00:00
[PATCH] hrtimer: switch sys_nanosleep to hrtimer
convert sys_nanosleep() to use hrtimer_nanosleep() Signed-off-by: Thomas Gleixner <tglx@linutronix.de> Signed-off-by: Ingo Molnar <mingo@elte.hu> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
This commit is contained in:
parent
10c94ec16d
commit
6ba1b91213
2 changed files with 14 additions and 56 deletions
|
@ -707,6 +707,20 @@ long hrtimer_nanosleep(struct timespec *rqtp, struct timespec __user *rmtp,
|
|||
return -ERESTART_RESTARTBLOCK;
|
||||
}
|
||||
|
||||
asmlinkage long
|
||||
sys_nanosleep(struct timespec __user *rqtp, struct timespec __user *rmtp)
|
||||
{
|
||||
struct timespec tu;
|
||||
|
||||
if (copy_from_user(&tu, rqtp, sizeof(tu)))
|
||||
return -EFAULT;
|
||||
|
||||
if (!timespec_valid(&tu))
|
||||
return -EINVAL;
|
||||
|
||||
return hrtimer_nanosleep(&tu, rmtp, HRTIMER_REL, CLOCK_MONOTONIC);
|
||||
}
|
||||
|
||||
/*
|
||||
* Functions related to boot-time initialization:
|
||||
*/
|
||||
|
|
|
@ -1120,62 +1120,6 @@ asmlinkage long sys_gettid(void)
|
|||
return current->pid;
|
||||
}
|
||||
|
||||
static long __sched nanosleep_restart(struct restart_block *restart)
|
||||
{
|
||||
unsigned long expire = restart->arg0, now = jiffies;
|
||||
struct timespec __user *rmtp = (struct timespec __user *) restart->arg1;
|
||||
long ret;
|
||||
|
||||
/* Did it expire while we handled signals? */
|
||||
if (!time_after(expire, now))
|
||||
return 0;
|
||||
|
||||
expire = schedule_timeout_interruptible(expire - now);
|
||||
|
||||
ret = 0;
|
||||
if (expire) {
|
||||
struct timespec t;
|
||||
jiffies_to_timespec(expire, &t);
|
||||
|
||||
ret = -ERESTART_RESTARTBLOCK;
|
||||
if (rmtp && copy_to_user(rmtp, &t, sizeof(t)))
|
||||
ret = -EFAULT;
|
||||
/* The 'restart' block is already filled in */
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
asmlinkage long sys_nanosleep(struct timespec __user *rqtp, struct timespec __user *rmtp)
|
||||
{
|
||||
struct timespec t;
|
||||
unsigned long expire;
|
||||
long ret;
|
||||
|
||||
if (copy_from_user(&t, rqtp, sizeof(t)))
|
||||
return -EFAULT;
|
||||
|
||||
if ((t.tv_nsec >= 1000000000L) || (t.tv_nsec < 0) || (t.tv_sec < 0))
|
||||
return -EINVAL;
|
||||
|
||||
expire = timespec_to_jiffies(&t) + (t.tv_sec || t.tv_nsec);
|
||||
expire = schedule_timeout_interruptible(expire);
|
||||
|
||||
ret = 0;
|
||||
if (expire) {
|
||||
struct restart_block *restart;
|
||||
jiffies_to_timespec(expire, &t);
|
||||
if (rmtp && copy_to_user(rmtp, &t, sizeof(t)))
|
||||
return -EFAULT;
|
||||
|
||||
restart = ¤t_thread_info()->restart_block;
|
||||
restart->fn = nanosleep_restart;
|
||||
restart->arg0 = jiffies + expire;
|
||||
restart->arg1 = (unsigned long) rmtp;
|
||||
ret = -ERESTART_RESTARTBLOCK;
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
/*
|
||||
* sys_sysinfo - fill in sysinfo struct
|
||||
*/
|
||||
|
|
Loading…
Reference in a new issue