mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 10:40:15 +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
 | 
			
		||||
 | 
			
		||||
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,
 | 
			
		||||
 * in order to marshall parameters inside a compat thunk.
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -16,6 +16,7 @@
 | 
			
		|||
#include <linux/init_task.h>
 | 
			
		||||
#include <linux/context_tracking.h>
 | 
			
		||||
#include <linux/rcupdate_wait.h>
 | 
			
		||||
#include <linux/compat.h>
 | 
			
		||||
 | 
			
		||||
#include <linux/blkdev.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,
 | 
			
		||||
 * an error code.
 | 
			
		||||
 */
 | 
			
		||||
SYSCALL_DEFINE2(sched_rr_get_interval, pid_t, pid,
 | 
			
		||||
		struct timespec __user *, interval)
 | 
			
		||||
static int sched_rr_get_interval(pid_t pid, struct timespec64 *t)
 | 
			
		||||
{
 | 
			
		||||
	struct task_struct *p;
 | 
			
		||||
	unsigned int time_slice;
 | 
			
		||||
	struct rq_flags rf;
 | 
			
		||||
	struct timespec t;
 | 
			
		||||
	struct rq *rq;
 | 
			
		||||
	int retval;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -5128,15 +5127,40 @@ SYSCALL_DEFINE2(sched_rr_get_interval, pid_t, pid,
 | 
			
		|||
	task_rq_unlock(rq, p, &rf);
 | 
			
		||||
 | 
			
		||||
	rcu_read_unlock();
 | 
			
		||||
	jiffies_to_timespec(time_slice, &t);
 | 
			
		||||
	retval = copy_to_user(interval, &t, sizeof(t)) ? -EFAULT : 0;
 | 
			
		||||
	return retval;
 | 
			
		||||
	jiffies_to_timespec64(time_slice, t);
 | 
			
		||||
	return 0;
 | 
			
		||||
 | 
			
		||||
out_unlock:
 | 
			
		||||
	rcu_read_unlock();
 | 
			
		||||
	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)
 | 
			
		||||
{
 | 
			
		||||
	unsigned long free = 0;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in a new issue