[PATCH 4/15] Mempolicy: Fixup Fallback for Default Shmem Policy

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



PATCH 04/15 Mempolicy:  Fixup Fallback for Default Shmem/Shm Policy

Against:  2.6.25-rc8-mm1

get_vma_policy() is not handling fallback to task policy correctly
when the get_policy() vm_op returns NULL.  The NULL overwrites
the 'pol' variable that was holding the fallback task mempolicy.
So, it was falling back directly to system default policy.

Fix get_vma_policy() to use only non-NULL policy returned from
the vma get_policy op.

shm_get_policy() was falling back to current task's mempolicy if
the "backing file system" [tmpfs vs hugetlbfs] does not support
the get_policy vm_op and the vma policy is null.  This is incorrect
for show_numa_maps() which is likely querying the numa_maps of
some task other than current.  Remove this fallback.

Signed-off-by:  Lee Schermerhorn <lee.schermerhorn@xxxxxx>

 ipc/shm.c      |    3 +--
 mm/mempolicy.c |    7 +++++--
 2 files changed, 6 insertions(+), 4 deletions(-)

Index: linux-2.6.25-rc8-mm1/mm/mempolicy.c
===================================================================
--- linux-2.6.25-rc8-mm1.orig/mm/mempolicy.c	2008-04-02 17:32:35.000000000 -0400
+++ linux-2.6.25-rc8-mm1/mm/mempolicy.c	2008-04-03 15:44:48.000000000 -0400
@@ -1262,7 +1262,7 @@ asmlinkage long compat_sys_mbind(compat_
  * @task != current].  It is the caller's responsibility to
  * free the reference in these cases.
  */
-static struct mempolicy * get_vma_policy(struct task_struct *task,
+static struct mempolicy *get_vma_policy(struct task_struct *task,
 		struct vm_area_struct *vma, unsigned long addr)
 {
 	struct mempolicy *pol = task->mempolicy;
@@ -1270,7 +1270,10 @@ static struct mempolicy * get_vma_policy
 
 	if (vma) {
 		if (vma->vm_ops && vma->vm_ops->get_policy) {
-			pol = vma->vm_ops->get_policy(vma, addr);
+			struct mempolicy *vpol = vma->vm_ops->get_policy(vma,
+									addr);
+			if (vpol)
+				pol = vpol;
 			shared_pol = 1;	/* if pol non-NULL, add ref below */
 		} else if (vma->vm_policy &&
 				vma->vm_policy->policy != MPOL_DEFAULT)
Index: linux-2.6.25-rc8-mm1/ipc/shm.c
===================================================================
--- linux-2.6.25-rc8-mm1.orig/ipc/shm.c	2008-04-02 17:09:54.000000000 -0400
+++ linux-2.6.25-rc8-mm1/ipc/shm.c	2008-04-03 15:27:46.000000000 -0400
@@ -255,8 +255,7 @@ static struct mempolicy *shm_get_policy(
 	else if (vma->vm_policy) {
 		pol = vma->vm_policy;
 		mpol_get(pol);	/* get_vma_policy() expects this */
-	} else
-		pol = current->mempolicy;
+	}
 	return pol;
 }
 #endif
--
To unsubscribe from this list: send the line "unsubscribe linux-numa" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html

[Index of Archives]     [Linux Kernel]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux SCSI]     [Devices]

  Powered by Linux