diff options
Diffstat (limited to 'kernel/sys.c')
| -rw-r--r-- | kernel/sys.c | 38 | 
1 files changed, 25 insertions, 13 deletions
diff --git a/kernel/sys.c b/kernel/sys.c index c18ecca575b..66a751ebf9d 100644 --- a/kernel/sys.c +++ b/kernel/sys.c @@ -16,7 +16,6 @@  #include <linux/perf_event.h>  #include <linux/resource.h>  #include <linux/kernel.h> -#include <linux/kexec.h>  #include <linux/workqueue.h>  #include <linux/capability.h>  #include <linux/device.h> @@ -175,10 +174,10 @@ SYSCALL_DEFINE3(setpriority, int, which, int, who, int, niceval)  	/* normalize: avoid signed division (rounding problems) */  	error = -ESRCH; -	if (niceval < -20) -		niceval = -20; -	if (niceval > 19) -		niceval = 19; +	if (niceval < MIN_NICE) +		niceval = MIN_NICE; +	if (niceval > MAX_NICE) +		niceval = MAX_NICE;  	rcu_read_lock();  	read_lock(&tasklist_lock); @@ -251,7 +250,7 @@ SYSCALL_DEFINE2(getpriority, int, which, int, who)  			else  				p = current;  			if (p) { -				niceval = 20 - task_nice(p); +				niceval = nice_to_rlimit(task_nice(p));  				if (niceval > retval)  					retval = niceval;  			} @@ -262,7 +261,7 @@ SYSCALL_DEFINE2(getpriority, int, which, int, who)  			else  				pgrp = task_pgrp(current);  			do_each_pid_thread(pgrp, PIDTYPE_PGID, p) { -				niceval = 20 - task_nice(p); +				niceval = nice_to_rlimit(task_nice(p));  				if (niceval > retval)  					retval = niceval;  			} while_each_pid_thread(pgrp, PIDTYPE_PGID, p); @@ -278,7 +277,7 @@ SYSCALL_DEFINE2(getpriority, int, which, int, who)  			do_each_thread(g, p) {  				if (uid_eq(task_uid(p), uid)) { -					niceval = 20 - task_nice(p); +					niceval = nice_to_rlimit(task_nice(p));  					if (niceval > retval)  						retval = niceval;  				} @@ -896,8 +895,7 @@ SYSCALL_DEFINE1(times, struct tms __user *, tbuf)   * only important on a multi-user system anyway, to make sure one user   * can't send a signal to a process owned by another.  -TYT, 12/12/91   * - * Auch. Had to add the 'did_exec' flag to conform completely to POSIX. - * LBT 04.03.94 + * !PF_FORKNOEXEC check to conform completely to POSIX.   */  SYSCALL_DEFINE2(setpgid, pid_t, pid, pid_t, pgid)  { @@ -933,7 +931,7 @@ SYSCALL_DEFINE2(setpgid, pid_t, pid, pid_t, pgid)  		if (task_session(p) != task_session(group_leader))  			goto out;  		err = -EACCES; -		if (p->did_exec) +		if (!(p->flags & PF_FORKNOEXEC))  			goto out;  	} else {  		err = -ESRCH; @@ -1573,8 +1571,7 @@ static void k_getrusage(struct task_struct *p, int who, struct rusage *r)  			t = p;  			do {  				accumulate_thread_rusage(t, r); -				t = next_thread(t); -			} while (t != p); +			} while_each_thread(p, t);  			break;  		default: @@ -1999,6 +1996,21 @@ SYSCALL_DEFINE5(prctl, int, option, unsigned long, arg2, unsigned long, arg3,  		if (arg2 || arg3 || arg4 || arg5)  			return -EINVAL;  		return current->no_new_privs ? 1 : 0; +	case PR_GET_THP_DISABLE: +		if (arg2 || arg3 || arg4 || arg5) +			return -EINVAL; +		error = !!(me->mm->def_flags & VM_NOHUGEPAGE); +		break; +	case PR_SET_THP_DISABLE: +		if (arg3 || arg4 || arg5) +			return -EINVAL; +		down_write(&me->mm->mmap_sem); +		if (arg2) +			me->mm->def_flags |= VM_NOHUGEPAGE; +		else +			me->mm->def_flags &= ~VM_NOHUGEPAGE; +		up_write(&me->mm->mmap_sem); +		break;  	default:  		error = -EINVAL;  		break;  | 
