|
@@ -1174,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)
|
|
@@ -1349,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))
|
|
@@ -1364,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
|
|
@@ -1376,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 &&
|
|
@@ -1391,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;
|
|
|
}
|
|
|
|
|
|
/*
|