From d0f615513fd403aa51646a1d1c3420c944e58ad2 Mon Sep 17 00:00:00 2001 From: Lee Schermerhorn Date: Mon, 28 Apr 2008 02:13:10 -0700 Subject: [PATCH] --- yaml --- r: 94032 b: refs/heads/master c: f4e53d910b7dde2685b177f1e7c3e3e0b4a42f7b h: refs/heads/master v: v3 --- [refs] | 2 +- trunk/mm/mempolicy.c | 13 +++++++++++++ 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/[refs] b/[refs] index 452b244241fb..2a69aefb95fb 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 846a16bf0fc80dc95a414ffce465e3cbf9680247 +refs/heads/master: f4e53d910b7dde2685b177f1e7c3e3e0b4a42f7b diff --git a/trunk/mm/mempolicy.c b/trunk/mm/mempolicy.c index e9fc1c1ae66c..c6c61ea6bb8c 100644 --- a/trunk/mm/mempolicy.c +++ b/trunk/mm/mempolicy.c @@ -591,16 +591,29 @@ static long do_set_mempolicy(unsigned short mode, unsigned short flags, nodemask_t *nodes) { struct mempolicy *new; + struct mm_struct *mm = current->mm; new = mpol_new(mode, flags, nodes); if (IS_ERR(new)) return PTR_ERR(new); + + /* + * prevent changing our mempolicy while show_numa_maps() + * is using it. + * Note: do_set_mempolicy() can be called at init time + * with no 'mm'. + */ + if (mm) + down_write(&mm->mmap_sem); mpol_put(current->mempolicy); current->mempolicy = new; mpol_set_task_struct_flag(); if (new && new->policy == MPOL_INTERLEAVE && nodes_weight(new->v.nodes)) current->il_next = first_node(new->v.nodes); + if (mm) + up_write(&mm->mmap_sem); + return 0; }