mirror of
https://github.com/Fishwaldo/Star64_linux.git
synced 2025-06-21 06:01:23 +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;
|
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:
|
* Functions related to boot-time initialization:
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -1120,62 +1120,6 @@ asmlinkage long sys_gettid(void)
|
||||||
return current->pid;
|
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
|
* sys_sysinfo - fill in sysinfo struct
|
||||||
*/
|
*/
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue