diff options
Diffstat (limited to 'mm/migrate.c')
| -rw-r--r-- | mm/migrate.c | 38 | 
1 files changed, 19 insertions, 19 deletions
| diff --git a/mm/migrate.c b/mm/migrate.c index df141f60289e..51c08a0c6f68 100644 --- a/mm/migrate.c +++ b/mm/migrate.c @@ -839,8 +839,6 @@ static int unmap_and_move(new_page_t get_new_page, unsigned long private,  	if (!newpage)  		return -ENOMEM; -	mem_cgroup_reset_owner(newpage); -  	if (page_count(page) == 1) {  		/* page was freed from under us. So we are done. */  		goto out; @@ -1176,20 +1174,17 @@ set_status:   * Migrate an array of page address onto an array of nodes and fill   * the corresponding array of status.   */ -static int do_pages_move(struct mm_struct *mm, struct task_struct *task, +static int do_pages_move(struct mm_struct *mm, nodemask_t task_nodes,  			 unsigned long nr_pages,  			 const void __user * __user *pages,  			 const int __user *nodes,  			 int __user *status, int flags)  {  	struct page_to_node *pm; -	nodemask_t task_nodes;  	unsigned long chunk_nr_pages;  	unsigned long chunk_start;  	int err; -	task_nodes = cpuset_mems_allowed(task); -  	err = -ENOMEM;  	pm = (struct page_to_node *)__get_free_page(GFP_KERNEL);  	if (!pm) @@ -1351,6 +1346,7 @@ SYSCALL_DEFINE6(move_pages, pid_t, pid, unsigned long, nr_pages,  	struct task_struct *task;  	struct mm_struct *mm;  	int err; +	nodemask_t task_nodes;  	/* Check flags */  	if (flags & ~(MPOL_MF_MOVE|MPOL_MF_MOVE_ALL)) @@ -1366,11 +1362,7 @@ SYSCALL_DEFINE6(move_pages, pid_t, pid, unsigned long, nr_pages,  		rcu_read_unlock();  		return -ESRCH;  	} -	mm = get_task_mm(task); -	rcu_read_unlock(); - -	if (!mm) -		return -EINVAL; +	get_task_struct(task);  	/*  	 * Check if this process has the right to modify the specified @@ -1378,7 +1370,6 @@ SYSCALL_DEFINE6(move_pages, pid_t, pid, unsigned long, nr_pages,  	 * capabilities, superuser privileges or the same  	 * userid as the target process.  	 */ -	rcu_read_lock();  	tcred = __task_cred(task);  	if (cred->euid != tcred->suid && cred->euid != tcred->uid &&  	    cred->uid  != tcred->suid && cred->uid  != tcred->uid && @@ -1393,16 +1384,25 @@ SYSCALL_DEFINE6(move_pages, pid_t, pid, unsigned long, nr_pages,   	if (err)  		goto out; -	if (nodes) { -		err = do_pages_move(mm, task, nr_pages, pages, nodes, status, -				    flags); -	} else { -		err = do_pages_stat(mm, nr_pages, pages, status); -	} +	task_nodes = cpuset_mems_allowed(task); +	mm = get_task_mm(task); +	put_task_struct(task); + +	if (mm) { +		if (nodes) +			err = do_pages_move(mm, task_nodes, nr_pages, pages, +					    nodes, status, flags); +		else +			err = do_pages_stat(mm, nr_pages, pages, status); +	} else +		err = -EINVAL; -out:  	mmput(mm);  	return err; + +out: +	put_task_struct(task); +	return err;  }  /* | 
