[PATCH 1/2 v5][resend] shmem: provide vm_ops when also providing a mem policy

2012-07-09 Thread Nathan Zimmer
Updating shmem_get_policy to use the vma_policy if provided.
This is to allows us to safely provide shmem_vm_ops to the vma when the vm_file
has not been setup which is the case on the pseudo vmas.

Cc: Christoph Lameter 
Cc: Nick Piggin 
Cc: Hugh Dickins 
Cc: Lee Schermerhorn 
Cc: KOSAKI Motohiro 
Cc: Rik van Riel 
Signed-off-by: Nathan Zimmer 
---
 mm/shmem.c |   18 +++---
 1 files changed, 15 insertions(+), 3 deletions(-)

diff --git a/mm/shmem.c b/mm/shmem.c
index a15a466..d073252 100644
--- a/mm/shmem.c
+++ b/mm/shmem.c
@@ -921,8 +921,11 @@ static struct page *shmem_swapin(swp_entry_t swap, gfp_t 
gfp,
/* Create a pseudo vma that just contains the policy */
pvma.vm_start = 0;
pvma.vm_pgoff = index;
-   pvma.vm_ops = NULL;
pvma.vm_policy = spol;
+   if (pvma.vm_policy)
+   pvma.vm_ops = _vm_ops;
+   else
+   pvma.vm_ops = NULL;
return swapin_readahead(swap, gfp, , 0);
 }
 
@@ -934,8 +937,11 @@ static struct page *shmem_alloc_page(gfp_t gfp,
/* Create a pseudo vma that just contains the policy */
pvma.vm_start = 0;
pvma.vm_pgoff = index;
-   pvma.vm_ops = NULL;
pvma.vm_policy = mpol_shared_policy_lookup(>policy, index);
+   if (pvma.vm_policy)
+   pvma.vm_ops = _vm_ops;
+   else
+   pvma.vm_ops = NULL;
 
/*
 * alloc_page_vma() will drop the shared policy reference
@@ -1296,8 +1302,14 @@ static int shmem_set_policy(struct vm_area_struct *vma, 
struct mempolicy *mpol)
 static struct mempolicy *shmem_get_policy(struct vm_area_struct *vma,
  unsigned long addr)
 {
-   struct inode *inode = vma->vm_file->f_path.dentry->d_inode;
pgoff_t index;
+   struct inode *inode;
+
+   /* If the vma knows what policy it wants use that one. */
+   if (vma->vm_policy)
+   return vma->vm_policy;
+
+   inode = vma->vm_file->f_path.dentry->d_inode;
 
index = ((addr - vma->vm_start) >> PAGE_SHIFT) + vma->vm_pgoff;
return mpol_shared_policy_lookup(_I(inode)->policy, index);
-- 
1.6.0.2

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[PATCH 1/2 v5][resend] shmem: provide vm_ops when also providing a mem policy

2012-07-09 Thread Nathan Zimmer
Updating shmem_get_policy to use the vma_policy if provided.
This is to allows us to safely provide shmem_vm_ops to the vma when the vm_file
has not been setup which is the case on the pseudo vmas.

Cc: Christoph Lameter c...@linux.com
Cc: Nick Piggin npig...@gmail.com
Cc: Hugh Dickins hu...@google.com
Cc: Lee Schermerhorn lee.schermerh...@hp.com
Cc: KOSAKI Motohiro kosaki.motoh...@jp.fujitsu.com
Cc: Rik van Riel r...@redhat.com
Signed-off-by: Nathan Zimmer nzim...@sgi.com
---
 mm/shmem.c |   18 +++---
 1 files changed, 15 insertions(+), 3 deletions(-)

diff --git a/mm/shmem.c b/mm/shmem.c
index a15a466..d073252 100644
--- a/mm/shmem.c
+++ b/mm/shmem.c
@@ -921,8 +921,11 @@ static struct page *shmem_swapin(swp_entry_t swap, gfp_t 
gfp,
/* Create a pseudo vma that just contains the policy */
pvma.vm_start = 0;
pvma.vm_pgoff = index;
-   pvma.vm_ops = NULL;
pvma.vm_policy = spol;
+   if (pvma.vm_policy)
+   pvma.vm_ops = shmem_vm_ops;
+   else
+   pvma.vm_ops = NULL;
return swapin_readahead(swap, gfp, pvma, 0);
 }
 
@@ -934,8 +937,11 @@ static struct page *shmem_alloc_page(gfp_t gfp,
/* Create a pseudo vma that just contains the policy */
pvma.vm_start = 0;
pvma.vm_pgoff = index;
-   pvma.vm_ops = NULL;
pvma.vm_policy = mpol_shared_policy_lookup(info-policy, index);
+   if (pvma.vm_policy)
+   pvma.vm_ops = shmem_vm_ops;
+   else
+   pvma.vm_ops = NULL;
 
/*
 * alloc_page_vma() will drop the shared policy reference
@@ -1296,8 +1302,14 @@ static int shmem_set_policy(struct vm_area_struct *vma, 
struct mempolicy *mpol)
 static struct mempolicy *shmem_get_policy(struct vm_area_struct *vma,
  unsigned long addr)
 {
-   struct inode *inode = vma-vm_file-f_path.dentry-d_inode;
pgoff_t index;
+   struct inode *inode;
+
+   /* If the vma knows what policy it wants use that one. */
+   if (vma-vm_policy)
+   return vma-vm_policy;
+
+   inode = vma-vm_file-f_path.dentry-d_inode;
 
index = ((addr - vma-vm_start)  PAGE_SHIFT) + vma-vm_pgoff;
return mpol_shared_policy_lookup(SHMEM_I(inode)-policy, index);
-- 
1.6.0.2

--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/