Inter-revision diff: patch 11

Comparing v3 (message) to v5 (message)

--- v3
+++ v5
@@ -1,70 +1,72 @@
-The current maybe_mkwrite() is getting passed the pointer to the vma
-structure to fetch the vm_flags field.
+migrate_misplaced_page() is only called during the page fault handling so
+it's better to pass the pointer to the struct vm_fault instead of the vma.
 
-When dealing with the speculative page fault handler, it will be better to
-rely on the cached vm_flags value stored in the vm_fault structure.
-
-This patch introduce a __maybe_mkwrite() service which can be called by
-passing the value of the vm_flags field.
-
-There is no change functional changes expected for the other callers of
-maybe_mkwrite().
+This way during the speculative page fault path the saved vma->vm_flags
+could be used.
 
 Signed-off-by: Laurent Dufour <ldufour@linux.vnet.ibm.com>
 ---
- include/linux/mm.h | 9 +++++++--
- mm/memory.c        | 6 +++---
- 2 files changed, 10 insertions(+), 5 deletions(-)
+ include/linux/migrate.h | 4 ++--
+ mm/memory.c             | 2 +-
+ mm/migrate.c            | 4 ++--
+ 3 files changed, 5 insertions(+), 5 deletions(-)
 
-diff --git a/include/linux/mm.h b/include/linux/mm.h
-index 5fd90ac31317..bb0c87f1c725 100644
---- a/include/linux/mm.h
-+++ b/include/linux/mm.h
-@@ -673,13 +673,18 @@ void free_compound_page(struct page *page);
-  * pte_mkwrite.  But get_user_pages can cause write faults for mappings
-  * that do not have writing enabled, when used by access_process_vm.
-  */
--static inline pte_t maybe_mkwrite(pte_t pte, struct vm_area_struct *vma)
-+static inline pte_t __maybe_mkwrite(pte_t pte, unsigned long vma_flags)
+diff --git a/include/linux/migrate.h b/include/linux/migrate.h
+index 643c7ae7d7b4..a815ed6838b3 100644
+--- a/include/linux/migrate.h
++++ b/include/linux/migrate.h
+@@ -126,14 +126,14 @@ static inline void __ClearPageMovable(struct page *page)
+ #ifdef CONFIG_NUMA_BALANCING
+ extern bool pmd_trans_migrating(pmd_t pmd);
+ extern int migrate_misplaced_page(struct page *page,
+-				  struct vm_area_struct *vma, int node);
++				  struct vm_fault *vmf, int node);
+ #else
+ static inline bool pmd_trans_migrating(pmd_t pmd)
  {
--	if (likely(vma->vm_flags & VM_WRITE))
-+	if (likely(vma_flags & VM_WRITE))
- 		pte = pte_mkwrite(pte);
- 	return pte;
+ 	return false;
  }
- 
-+static inline pte_t maybe_mkwrite(pte_t pte, struct vm_area_struct *vma)
-+{
-+	return __maybe_mkwrite(pte, vma->vm_flags);
-+}
-+
- int alloc_set_pte(struct vm_fault *vmf, struct mem_cgroup *memcg,
- 		struct page *page);
- int finish_fault(struct vm_fault *vmf);
+ static inline int migrate_misplaced_page(struct page *page,
+-					 struct vm_area_struct *vma, int node)
++					 struct vm_fault *vmf, int node)
+ {
+ 	return -EAGAIN; /* can't migrate now */
+ }
 diff --git a/mm/memory.c b/mm/memory.c
-index 4583f354be94..c306f1f64c9e 100644
+index 681a04f843f0..94de8e976c01 100644
 --- a/mm/memory.c
 +++ b/mm/memory.c
-@@ -2408,7 +2408,7 @@ static inline void wp_page_reuse(struct vm_fault *vmf)
+@@ -3861,7 +3861,7 @@ static int do_numa_page(struct vm_fault *vmf)
+ 	}
  
- 	flush_cache_page(vma, vmf->address, pte_pfn(vmf->orig_pte));
- 	entry = pte_mkyoung(vmf->orig_pte);
--	entry = maybe_mkwrite(pte_mkdirty(entry), vma);
-+	entry = __maybe_mkwrite(pte_mkdirty(entry), vmf->vma_flags);
- 	if (ptep_set_access_flags(vma, vmf->address, vmf->pte, entry, 1))
- 		update_mmu_cache(vma, vmf->address, vmf->pte);
- 	pte_unmap_unlock(vmf->pte, vmf->ptl);
-@@ -2498,8 +2498,8 @@ static int wp_page_copy(struct vm_fault *vmf)
- 			inc_mm_counter_fast(mm, MM_ANONPAGES);
- 		}
- 		flush_cache_page(vma, vmf->address, pte_pfn(vmf->orig_pte));
--		entry = mk_pte(new_page, vma->vm_page_prot);
--		entry = maybe_mkwrite(pte_mkdirty(entry), vma);
-+		entry = mk_pte(new_page, vmf->vma_page_prot);
-+		entry = __maybe_mkwrite(pte_mkdirty(entry), vmf->vma_flags);
- 		/*
- 		 * Clear the pte entry and flush it first, before updating the
- 		 * pte with the new entry. This will avoid a race condition
+ 	/* Migrate to the requested node */
+-	migrated = migrate_misplaced_page(page, vma, target_nid);
++	migrated = migrate_misplaced_page(page, vmf, target_nid);
+ 	if (migrated) {
+ 		page_nid = target_nid;
+ 		flags |= TNF_MIGRATED;
+diff --git a/mm/migrate.c b/mm/migrate.c
+index e603c123c0d1..386772582e1d 100644
+--- a/mm/migrate.c
++++ b/mm/migrate.c
+@@ -1939,7 +1939,7 @@ bool pmd_trans_migrating(pmd_t pmd)
+  * node. Caller is expected to have an elevated reference count on
+  * the page that will be dropped by this function before returning.
+  */
+-int migrate_misplaced_page(struct page *page, struct vm_area_struct *vma,
++int migrate_misplaced_page(struct page *page, struct vm_fault *vmf,
+ 			   int node)
+ {
+ 	pg_data_t *pgdat = NODE_DATA(node);
+@@ -1952,7 +1952,7 @@ int migrate_misplaced_page(struct page *page, struct vm_area_struct *vma,
+ 	 * with execute permissions as they are probably shared libraries.
+ 	 */
+ 	if (page_mapcount(page) != 1 && page_is_file_cache(page) &&
+-	    (vma->vm_flags & VM_EXEC))
++	    (vmf->vma_flags & VM_EXEC))
+ 		goto out;
+ 
+ 	/*
 -- 
 2.7.4
 
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help