aboutsummaryrefslogtreecommitdiffstats
path: root/fs/proc/base.c
diff options
context:
space:
mode:
Diffstat (limited to 'fs/proc/base.c')
-rw-r--r--fs/proc/base.c24
1 files changed, 20 insertions, 4 deletions
diff --git a/fs/proc/base.c b/fs/proc/base.c
index 6f742f6658a9..81cfff82875b 100644
--- a/fs/proc/base.c
+++ b/fs/proc/base.c
@@ -999,11 +999,17 @@ static ssize_t oom_adjust_read(struct file *file, char __user *buf,
999 struct task_struct *task = get_proc_task(file->f_path.dentry->d_inode); 999 struct task_struct *task = get_proc_task(file->f_path.dentry->d_inode);
1000 char buffer[PROC_NUMBUF]; 1000 char buffer[PROC_NUMBUF];
1001 size_t len; 1001 size_t len;
1002 int oom_adjust; 1002 int oom_adjust = OOM_DISABLE;
1003 unsigned long flags;
1003 1004
1004 if (!task) 1005 if (!task)
1005 return -ESRCH; 1006 return -ESRCH;
1006 oom_adjust = task->oomkilladj; 1007
1008 if (lock_task_sighand(task, &flags)) {
1009 oom_adjust = task->signal->oom_adj;
1010 unlock_task_sighand(task, &flags);
1011 }
1012
1007 put_task_struct(task); 1013 put_task_struct(task);
1008 1014
1009 len = snprintf(buffer, sizeof(buffer), "%i\n", oom_adjust); 1015 len = snprintf(buffer, sizeof(buffer), "%i\n", oom_adjust);
@@ -1017,6 +1023,7 @@ static ssize_t oom_adjust_write(struct file *file, const char __user *buf,
1017 struct task_struct *task; 1023 struct task_struct *task;
1018 char buffer[PROC_NUMBUF], *end; 1024 char buffer[PROC_NUMBUF], *end;
1019 int oom_adjust; 1025 int oom_adjust;
1026 unsigned long flags;
1020 1027
1021 memset(buffer, 0, sizeof(buffer)); 1028 memset(buffer, 0, sizeof(buffer));
1022 if (count > sizeof(buffer) - 1) 1029 if (count > sizeof(buffer) - 1)
@@ -1032,11 +1039,20 @@ static ssize_t oom_adjust_write(struct file *file, const char __user *buf,
1032 task = get_proc_task(file->f_path.dentry->d_inode); 1039 task = get_proc_task(file->f_path.dentry->d_inode);
1033 if (!task) 1040 if (!task)
1034 return -ESRCH; 1041 return -ESRCH;
1035 if (oom_adjust < task->oomkilladj && !capable(CAP_SYS_RESOURCE)) { 1042 if (!lock_task_sighand(task, &flags)) {
1043 put_task_struct(task);
1044 return -ESRCH;
1045 }
1046
1047 if (oom_adjust < task->signal->oom_adj && !capable(CAP_SYS_RESOURCE)) {
1048 unlock_task_sighand(task, &flags);
1036 put_task_struct(task); 1049 put_task_struct(task);
1037 return -EACCES; 1050 return -EACCES;
1038 } 1051 }
1039 task->oomkilladj = oom_adjust; 1052
1053 task->signal->oom_adj = oom_adjust;
1054
1055 unlock_task_sighand(task, &flags);
1040 put_task_struct(task); 1056 put_task_struct(task);
1041 if (end - buffer == 0) 1057 if (end - buffer == 0)
1042 return -EIO; 1058 return -EIO;