From f49b2b3af915e715c9410b8aff270e37af3c4673 Mon Sep 17 00:00:00 2001 From: Lee Schermerhorn Date: Mon, 10 Mar 2008 11:43:45 -0700 Subject: [PATCH] --- yaml --- r: 87087 b: refs/heads/master c: 69682d852f5c94ee94e21174b3e8b719626c98db h: refs/heads/master i: 87085: 6b384422222c4e6a765e8f12539966debf1b8293 87083: bd55192ddb9141e3bc5a93f68ccef333407b3cb5 87079: 4796e662796fabe56a99605892bf31087b39a27f 87071: aa37f3b279efcdfed48335a8c1fa6a85d8da90c2 v: v3 --- [refs] | 2 +- trunk/ipc/shm.c | 5 +++-- trunk/mm/mempolicy.c | 7 ++++++- 3 files changed, 10 insertions(+), 4 deletions(-) diff --git a/[refs] b/[refs] index 7fc73c7411e0..bfdc4b0dd229 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 9afa802ff568d935dab33dd207dc25d9849f35d4 +refs/heads/master: 69682d852f5c94ee94e21174b3e8b719626c98db diff --git a/trunk/ipc/shm.c b/trunk/ipc/shm.c index c47e87278a92..cc63fae02f06 100644 --- a/trunk/ipc/shm.c +++ b/trunk/ipc/shm.c @@ -271,9 +271,10 @@ static struct mempolicy *shm_get_policy(struct vm_area_struct *vma, if (sfd->vm_ops->get_policy) pol = sfd->vm_ops->get_policy(vma, addr); - else if (vma->vm_policy) + else if (vma->vm_policy) { pol = vma->vm_policy; - else + mpol_get(pol); /* get_vma_policy() expects this */ + } else pol = current->mempolicy; return pol; } diff --git a/trunk/mm/mempolicy.c b/trunk/mm/mempolicy.c index 6c7ba1a63d23..3c3601121509 100644 --- a/trunk/mm/mempolicy.c +++ b/trunk/mm/mempolicy.c @@ -1296,7 +1296,9 @@ struct zonelist *huge_zonelist(struct vm_area_struct *vma, unsigned long addr, unsigned nid; nid = interleave_nid(pol, vma, addr, HPAGE_SHIFT); - __mpol_free(pol); /* finished with pol */ + if (unlikely(pol != &default_policy && + pol != current->mempolicy)) + __mpol_free(pol); /* finished with pol */ return NODE_DATA(nid)->node_zonelists + gfp_zone(gfp_flags); } @@ -1360,6 +1362,9 @@ alloc_page_vma(gfp_t gfp, struct vm_area_struct *vma, unsigned long addr) unsigned nid; nid = interleave_nid(pol, vma, addr, PAGE_SHIFT); + if (unlikely(pol != &default_policy && + pol != current->mempolicy)) + __mpol_free(pol); /* finished with pol */ return alloc_page_interleave(gfp, 0, nid); } zl = zonelist_policy(gfp, pol);