mirror of
				https://github.com/torvalds/linux.git
				synced 2025-10-31 16:48:26 +02:00 
			
		
		
		
	sched_rr_get_interval(): move compat to native, get rid of set_fs()
switch to using timespec64 internally, while we are at it Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
This commit is contained in:
		
							parent
							
								
									7bea578b5f
								
							
						
					
					
						commit
						abca5fc535
					
				
					 2 changed files with 30 additions and 22 deletions
				
			
		|  | @ -562,22 +562,6 @@ COMPAT_SYSCALL_DEFINE4(migrate_pages, compat_pid_t, pid, | ||||||
| } | } | ||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
| COMPAT_SYSCALL_DEFINE2(sched_rr_get_interval, |  | ||||||
| 		       compat_pid_t, pid, |  | ||||||
| 		       struct compat_timespec __user *, interval) |  | ||||||
| { |  | ||||||
| 	struct timespec t; |  | ||||||
| 	int ret; |  | ||||||
| 	mm_segment_t old_fs = get_fs(); |  | ||||||
| 
 |  | ||||||
| 	set_fs(KERNEL_DS); |  | ||||||
| 	ret = sys_sched_rr_get_interval(pid, (struct timespec __user *)&t); |  | ||||||
| 	set_fs(old_fs); |  | ||||||
| 	if (compat_put_timespec(&t, interval)) |  | ||||||
| 		return -EFAULT; |  | ||||||
| 	return ret; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| /*
 | /*
 | ||||||
|  * Allocate user-space memory for the duration of a single system call, |  * Allocate user-space memory for the duration of a single system call, | ||||||
|  * in order to marshall parameters inside a compat thunk. |  * in order to marshall parameters inside a compat thunk. | ||||||
|  |  | ||||||
|  | @ -16,6 +16,7 @@ | ||||||
| #include <linux/init_task.h> | #include <linux/init_task.h> | ||||||
| #include <linux/context_tracking.h> | #include <linux/context_tracking.h> | ||||||
| #include <linux/rcupdate_wait.h> | #include <linux/rcupdate_wait.h> | ||||||
|  | #include <linux/compat.h> | ||||||
| 
 | 
 | ||||||
| #include <linux/blkdev.h> | #include <linux/blkdev.h> | ||||||
| #include <linux/kprobes.h> | #include <linux/kprobes.h> | ||||||
|  | @ -5098,13 +5099,11 @@ SYSCALL_DEFINE1(sched_get_priority_min, int, policy) | ||||||
|  * Return: On success, 0 and the timeslice is in @interval. Otherwise, |  * Return: On success, 0 and the timeslice is in @interval. Otherwise, | ||||||
|  * an error code. |  * an error code. | ||||||
|  */ |  */ | ||||||
| SYSCALL_DEFINE2(sched_rr_get_interval, pid_t, pid, | static int sched_rr_get_interval(pid_t pid, struct timespec64 *t) | ||||||
| 		struct timespec __user *, interval) |  | ||||||
| { | { | ||||||
| 	struct task_struct *p; | 	struct task_struct *p; | ||||||
| 	unsigned int time_slice; | 	unsigned int time_slice; | ||||||
| 	struct rq_flags rf; | 	struct rq_flags rf; | ||||||
| 	struct timespec t; |  | ||||||
| 	struct rq *rq; | 	struct rq *rq; | ||||||
| 	int retval; | 	int retval; | ||||||
| 
 | 
 | ||||||
|  | @ -5128,15 +5127,40 @@ SYSCALL_DEFINE2(sched_rr_get_interval, pid_t, pid, | ||||||
| 	task_rq_unlock(rq, p, &rf); | 	task_rq_unlock(rq, p, &rf); | ||||||
| 
 | 
 | ||||||
| 	rcu_read_unlock(); | 	rcu_read_unlock(); | ||||||
| 	jiffies_to_timespec(time_slice, &t); | 	jiffies_to_timespec64(time_slice, t); | ||||||
| 	retval = copy_to_user(interval, &t, sizeof(t)) ? -EFAULT : 0; | 	return 0; | ||||||
| 	return retval; |  | ||||||
| 
 | 
 | ||||||
| out_unlock: | out_unlock: | ||||||
| 	rcu_read_unlock(); | 	rcu_read_unlock(); | ||||||
| 	return retval; | 	return retval; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | SYSCALL_DEFINE2(sched_rr_get_interval, pid_t, pid, | ||||||
|  | 		struct timespec __user *, interval) | ||||||
|  | { | ||||||
|  | 	struct timespec64 t; | ||||||
|  | 	int retval = sched_rr_get_interval(pid, &t); | ||||||
|  | 
 | ||||||
|  | 	if (retval == 0) | ||||||
|  | 		retval = put_timespec64(&t, interval); | ||||||
|  | 
 | ||||||
|  | 	return retval; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | #ifdef CONFIG_COMPAT | ||||||
|  | COMPAT_SYSCALL_DEFINE2(sched_rr_get_interval, | ||||||
|  | 		       compat_pid_t, pid, | ||||||
|  | 		       struct compat_timespec __user *, interval) | ||||||
|  | { | ||||||
|  | 	struct timespec64 t; | ||||||
|  | 	int retval = sched_rr_get_interval(pid, &t); | ||||||
|  | 
 | ||||||
|  | 	if (retval == 0) | ||||||
|  | 		retval = compat_put_timespec64(&t, interval); | ||||||
|  | 	return retval; | ||||||
|  | } | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
| void sched_show_task(struct task_struct *p) | void sched_show_task(struct task_struct *p) | ||||||
| { | { | ||||||
| 	unsigned long free = 0; | 	unsigned long free = 0; | ||||||
|  |  | ||||||
		Loading…
	
		Reference in a new issue
	
	 Al Viro
						Al Viro