Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 24894
b: refs/heads/master
c: e4e364e
h: refs/heads/master
v: v3
  • Loading branch information
Paul Jackson authored and Linus Torvalds committed Mar 31, 2006
1 parent 890a2fb commit 3466e9b
Show file tree
Hide file tree
Showing 2 changed files with 53 additions and 6 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 2741a559a01e1ba9bf87285569dc1a104d134ecf
refs/heads/master: e4e364e865b382f9d99c7fc230ec2ce7df21257a
57 changes: 52 additions & 5 deletions trunk/kernel/cpuset.c
Original file line number Diff line number Diff line change
Expand Up @@ -833,6 +833,55 @@ static int update_cpumask(struct cpuset *cs, char *buf)
return 0;
}

/*
* cpuset_migrate_mm
*
* Migrate memory region from one set of nodes to another.
*
* Temporarilly set tasks mems_allowed to target nodes of migration,
* so that the migration code can allocate pages on these nodes.
*
* Call holding manage_mutex, so our current->cpuset won't change
* during this call, as manage_mutex holds off any attach_task()
* calls. Therefore we don't need to take task_lock around the
* call to guarantee_online_mems(), as we know no one is changing
* our tasks cpuset.
*
* Hold callback_mutex around the two modifications of our tasks
* mems_allowed to synchronize with cpuset_mems_allowed().
*
* While the mm_struct we are migrating is typically from some
* other task, the task_struct mems_allowed that we are hacking
* is for our current task, which must allocate new pages for that
* migrating memory region.
*
* We call cpuset_update_task_memory_state() before hacking
* our tasks mems_allowed, so that we are assured of being in
* sync with our tasks cpuset, and in particular, callbacks to
* cpuset_update_task_memory_state() from nested page allocations
* won't see any mismatch of our cpuset and task mems_generation
* values, so won't overwrite our hacked tasks mems_allowed
* nodemask.
*/

static void cpuset_migrate_mm(struct mm_struct *mm, const nodemask_t *from,
const nodemask_t *to)
{
struct task_struct *tsk = current;

cpuset_update_task_memory_state();

mutex_lock(&callback_mutex);
tsk->mems_allowed = *to;
mutex_unlock(&callback_mutex);

do_migrate_pages(mm, from, to, MPOL_MF_MOVE_ALL);

mutex_lock(&callback_mutex);
guarantee_online_mems(tsk->cpuset, &tsk->mems_allowed);
mutex_unlock(&callback_mutex);
}

/*
* Handle user request to change the 'mems' memory placement
* of a cpuset. Needs to validate the request, update the
Expand Down Expand Up @@ -945,10 +994,8 @@ static int update_nodemask(struct cpuset *cs, char *buf)
struct mm_struct *mm = mmarray[i];

mpol_rebind_mm(mm, &cs->mems_allowed);
if (migrate) {
do_migrate_pages(mm, &oldmem, &cs->mems_allowed,
MPOL_MF_MOVE_ALL);
}
if (migrate)
cpuset_migrate_mm(mm, &oldmem, &cs->mems_allowed);
mmput(mm);
}

Expand Down Expand Up @@ -1184,7 +1231,7 @@ static int attach_task(struct cpuset *cs, char *pidbuf, char **ppathbuf)
if (mm) {
mpol_rebind_mm(mm, &to);
if (is_memory_migrate(cs))
do_migrate_pages(mm, &from, &to, MPOL_MF_MOVE_ALL);
cpuset_migrate_mm(mm, &from, &to);
mmput(mm);
}

Expand Down

0 comments on commit 3466e9b

Please sign in to comment.