Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > linux.kernel > #1289102

[PATCH 1/6] mm: Add a vm_special_mapping .fault method

From Andy Lutomirski <luto@kernel.org>
Newsgroups linux.kernel
Subject [PATCH 1/6] mm: Add a vm_special_mapping .fault method
Date 2015-12-11 04:30 +0100
Message-ID <qEmz8-6ZR-33@gated-at.bofh.it> (permalink)
References <qEmz7-6ZR-3@gated-at.bofh.it>
Organization linux.* mail to news gateway

Show all headers | View raw


From: Andy Lutomirski <luto@amacapital.net>

Requiring special mappings to give a list of struct pages is
inflexible: it prevents sane use of IO memory in a special mapping,
it's inefficient (it requires arch code to initialize a list of
struct pages, and it requires the mm core to walk the entire list
just to figure out how long it is), and it prevents arch code from
doing anything fancy when a special mapping fault occurs.

Add a .fault method as an alternative to filling in a .pages array.

Signed-off-by: Andy Lutomirski <luto@kernel.org>
---
 include/linux/mm_types.h | 19 ++++++++++++++++++-
 mm/mmap.c                | 13 +++++++++----
 2 files changed, 27 insertions(+), 5 deletions(-)

diff --git a/include/linux/mm_types.h b/include/linux/mm_types.h
index f8d1492a114f..3d315d373daf 100644
--- a/include/linux/mm_types.h
+++ b/include/linux/mm_types.h
@@ -568,10 +568,27 @@ static inline void clear_tlb_flush_pending(struct mm_struct *mm)
 }
 #endif
 
+struct vm_fault;
+
 struct vm_special_mapping
 {
-	const char *name;
+	const char *name;	/* The name, e.g. "[vdso]". */
+
+	/*
+	 * If .fault is not provided, this is points to a
+	 * NULL-terminated array of pages that back the special mapping.
+	 *
+	 * This must not be NULL unless .fault is provided.
+	 */
 	struct page **pages;
+
+	/*
+	 * If non-NULL, then this is called to resolve page faults
+	 * on the special mapping.  If used, .pages is not checked.
+	 */
+	int (*fault)(const struct vm_special_mapping *sm,
+		     struct vm_area_struct *vma,
+		     struct vm_fault *vmf);
 };
 
 enum tlb_flush_reason {
diff --git a/mm/mmap.c b/mm/mmap.c
index 2ce04a649f6b..f717453b1a57 100644
--- a/mm/mmap.c
+++ b/mm/mmap.c
@@ -3030,11 +3030,16 @@ static int special_mapping_fault(struct vm_area_struct *vma,
 	pgoff_t pgoff;
 	struct page **pages;
 
-	if (vma->vm_ops == &legacy_special_mapping_vmops)
+	if (vma->vm_ops == &legacy_special_mapping_vmops) {
 		pages = vma->vm_private_data;
-	else
-		pages = ((struct vm_special_mapping *)vma->vm_private_data)->
-			pages;
+	} else {
+		struct vm_special_mapping *sm = vma->vm_private_data;
+
+		if (sm->fault)
+			return sm->fault(sm, vma, vmf);
+
+		pages = sm->pages;
+	}
 
 	for (pgoff = vmf->pgoff; pgoff && *pages; ++pages)
 		pgoff--;
-- 
2.5.0

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

Back to linux.kernel | Previous | NextPrevious in thread | Next in thread | Find similar | Unroll thread


Thread

[PATCH 0/6] mm, x86/vdso: Special IO mapping improvements Andy Lutomirski <luto@kernel.org> - 2015-12-11 04:30 +0100
  [PATCH 4/6] x86,vdso: Use .fault for the vdso text mapping Andy Lutomirski <luto@kernel.org> - 2015-12-11 04:30 +0100
  [PATCH 5/6] x86,vdso: Use .fault instead of remap_pfn_range for the vvar mapping Andy Lutomirski <luto@kernel.org> - 2015-12-11 04:30 +0100
  [PATCH 6/6] x86/vdso: Disallow vvar access to vclock IO for never-used vclocks Andy Lutomirski <luto@kernel.org> - 2015-12-11 04:30 +0100
  [PATCH 2/6] mm: Add vm_insert_pfn_prot Andy Lutomirski <luto@kernel.org> - 2015-12-11 04:30 +0100
    Re: [PATCH 2/6] mm: Add vm_insert_pfn_prot Andrew Morton <akpm@linux-foundation.org> - 2015-12-11 23:40 +0100
      Re: [PATCH 2/6] mm: Add vm_insert_pfn_prot Andy Lutomirski <luto@amacapital.net> - 2015-12-11 23:50 +0100
  [PATCH 1/6] mm: Add a vm_special_mapping .fault method Andy Lutomirski <luto@kernel.org> - 2015-12-11 04:30 +0100
    Re: [PATCH 1/6] mm: Add a vm_special_mapping .fault method Andrew Morton <akpm@linux-foundation.org> - 2015-12-11 23:30 +0100

csiph-web