diff --git a/[refs] b/[refs] index 1c849f4f2e74..7af201edb90b 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 63f74ca21f1fad36d075e063f06dcc6d39fe86b2 +refs/heads/master: 00442ad04a5eac08a98255697c510e708f6082e2 diff --git a/trunk/mm/mempolicy.c b/trunk/mm/mempolicy.c index 1763418f1ada..3d64b369180d 100644 --- a/trunk/mm/mempolicy.c +++ b/trunk/mm/mempolicy.c @@ -1552,8 +1552,18 @@ struct mempolicy *get_vma_policy(struct task_struct *task, addr); if (vpol) pol = vpol; - } else if (vma->vm_policy) + } else if (vma->vm_policy) { pol = vma->vm_policy; + + /* + * shmem_alloc_page() passes MPOL_F_SHARED policy with + * a pseudo vma whose vma->vm_ops=NULL. Take a reference + * count on these policies which will be dropped by + * mpol_cond_put() later + */ + if (mpol_needs_cond_ref(pol)) + mpol_get(pol); + } } if (!pol) pol = &default_policy;