|
@@ -910,25 +910,29 @@ static struct mempolicy *shmem_get_sbmpol(struct shmem_sb_info *sbinfo)
|
|
|
static struct page *shmem_swapin(swp_entry_t swap, gfp_t gfp,
|
|
|
struct shmem_inode_info *info, pgoff_t index)
|
|
|
{
|
|
|
- struct mempolicy mpol, *spol;
|
|
|
struct vm_area_struct pvma;
|
|
|
-
|
|
|
- spol = mpol_cond_copy(&mpol,
|
|
|
- mpol_shared_policy_lookup(&info->policy, index));
|
|
|
+ struct page *page;
|
|
|
|
|
|
/* Create a pseudo vma that just contains the policy */
|
|
|
pvma.vm_start = 0;
|
|
|
/* Bias interleave by inode number to distribute better across nodes */
|
|
|
pvma.vm_pgoff = index + info->vfs_inode.i_ino;
|
|
|
pvma.vm_ops = NULL;
|
|
|
- pvma.vm_policy = spol;
|
|
|
- return swapin_readahead(swap, gfp, &pvma, 0);
|
|
|
+ pvma.vm_policy = mpol_shared_policy_lookup(&info->policy, index);
|
|
|
+
|
|
|
+ page = swapin_readahead(swap, gfp, &pvma, 0);
|
|
|
+
|
|
|
+ /* Drop reference taken by mpol_shared_policy_lookup() */
|
|
|
+ mpol_cond_put(pvma.vm_policy);
|
|
|
+
|
|
|
+ return page;
|
|
|
}
|
|
|
|
|
|
static struct page *shmem_alloc_page(gfp_t gfp,
|
|
|
struct shmem_inode_info *info, pgoff_t index)
|
|
|
{
|
|
|
struct vm_area_struct pvma;
|
|
|
+ struct page *page;
|
|
|
|
|
|
/* Create a pseudo vma that just contains the policy */
|
|
|
pvma.vm_start = 0;
|
|
@@ -937,10 +941,12 @@ static struct page *shmem_alloc_page(gfp_t gfp,
|
|
|
pvma.vm_ops = NULL;
|
|
|
pvma.vm_policy = mpol_shared_policy_lookup(&info->policy, index);
|
|
|
|
|
|
- /*
|
|
|
- * alloc_page_vma() will drop the shared policy reference
|
|
|
- */
|
|
|
- return alloc_page_vma(gfp, &pvma, 0);
|
|
|
+ page = alloc_page_vma(gfp, &pvma, 0);
|
|
|
+
|
|
|
+ /* Drop reference taken by mpol_shared_policy_lookup() */
|
|
|
+ mpol_cond_put(pvma.vm_policy);
|
|
|
+
|
|
|
+ return page;
|
|
|
}
|
|
|
#else /* !CONFIG_NUMA */
|
|
|
#ifdef CONFIG_TMPFS
|