aboutsummaryrefslogtreecommitdiffstats
path: root/kernel
diff options
context:
space:
mode:
Diffstat (limited to 'kernel')
-rw-r--r--kernel/cpuset.c27
1 files changed, 20 insertions, 7 deletions
diff --git a/kernel/cpuset.c b/kernel/cpuset.c
index b602f73fb38d..3e991c0c02e2 100644
--- a/kernel/cpuset.c
+++ b/kernel/cpuset.c
@@ -50,6 +50,7 @@
50#include <linux/time.h> 50#include <linux/time.h>
51#include <linux/backing-dev.h> 51#include <linux/backing-dev.h>
52#include <linux/sort.h> 52#include <linux/sort.h>
53#include <linux/task_ref.h>
53 54
54#include <asm/uaccess.h> 55#include <asm/uaccess.h>
55#include <asm/atomic.h> 56#include <asm/atomic.h>
@@ -2442,31 +2443,43 @@ void __cpuset_memory_pressure_bump(void)
2442 */ 2443 */
2443static int proc_cpuset_show(struct seq_file *m, void *v) 2444static int proc_cpuset_show(struct seq_file *m, void *v)
2444{ 2445{
2446 struct task_ref *tref;
2445 struct task_struct *tsk; 2447 struct task_struct *tsk;
2446 char *buf; 2448 char *buf;
2447 int retval = 0; 2449 int retval;
2448 2450
2451 retval = -ENOMEM;
2449 buf = kmalloc(PAGE_SIZE, GFP_KERNEL); 2452 buf = kmalloc(PAGE_SIZE, GFP_KERNEL);
2450 if (!buf) 2453 if (!buf)
2451 return -ENOMEM; 2454 goto out;
2455
2456 retval = -ESRCH;
2457 tref = m->private;
2458 tsk = get_tref_task(tref);
2459 if (!tsk)
2460 goto out_free;
2452 2461
2453 tsk = m->private; 2462 retval = -EINVAL;
2454 mutex_lock(&manage_mutex); 2463 mutex_lock(&manage_mutex);
2464
2455 retval = cpuset_path(tsk->cpuset, buf, PAGE_SIZE); 2465 retval = cpuset_path(tsk->cpuset, buf, PAGE_SIZE);
2456 if (retval < 0) 2466 if (retval < 0)
2457 goto out; 2467 goto out_unlock;
2458 seq_puts(m, buf); 2468 seq_puts(m, buf);
2459 seq_putc(m, '\n'); 2469 seq_putc(m, '\n');
2460out: 2470out_unlock:
2461 mutex_unlock(&manage_mutex); 2471 mutex_unlock(&manage_mutex);
2472 put_task_struct(tsk);
2473out_free:
2462 kfree(buf); 2474 kfree(buf);
2475out:
2463 return retval; 2476 return retval;
2464} 2477}
2465 2478
2466static int cpuset_open(struct inode *inode, struct file *file) 2479static int cpuset_open(struct inode *inode, struct file *file)
2467{ 2480{
2468 struct task_struct *tsk = PROC_I(inode)->task; 2481 struct task_ref *tref = PROC_I(inode)->tref;
2469 return single_open(file, proc_cpuset_show, tsk); 2482 return single_open(file, proc_cpuset_show, tref);
2470} 2483}
2471 2484
2472struct file_operations proc_cpuset_operations = { 2485struct file_operations proc_cpuset_operations = {