lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-Id: <c4e198aff7953d25290a8f70910da235f1fd2464.1414629045.git.luto@amacapital.net>
Date:	Wed, 29 Oct 2014 17:42:13 -0700
From:	Andy Lutomirski <luto@...capital.net>
To:	akpm@...ux-foundation.org, linux-mm@...ck.org, x86@...nel.org
Cc:	linux-kernel@...r.kernel.org, Andy Lutomirski <luto@...capital.net>
Subject: [RFC 3/6] mm: Add a vm_special_mapping .fault method

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@...capital.net>
---
 include/linux/mm_types.h | 18 +++++++++++++++++-
 mm/mmap.c                | 14 ++++++++++----
 2 files changed, 27 insertions(+), 5 deletions(-)

diff --git a/include/linux/mm_types.h b/include/linux/mm_types.h
index ad6652fe3671..cc96c63b1002 100644
--- a/include/linux/mm_types.h
+++ b/include/linux/mm_types.h
@@ -511,12 +511,28 @@ 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)(struct vm_special_mapping *sm, struct vm_area_struct *vma,
+		     struct vm_fault *vmf);
+
+	/*
 	 * If non-NULL, this is called when installed and when mremap
 	 * moves the first page of the mapping.
 	 */
diff --git a/mm/mmap.c b/mm/mmap.c
index 8c398b9ee225..d27572e3e4f4 100644
--- a/mm/mmap.c
+++ b/mm/mmap.c
@@ -2950,11 +2950,17 @@ static int special_mapping_fault(struct vm_area_struct *vma,
 	 */
 	pgoff = vmf->pgoff - vma->vm_pgoff;
 
-	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) {
+			vmf->pgoff = pgoff;
+			return sm->fault(sm, vma, vmf);
+		} else {
+			pages = sm->pages;
+		}
+	}
 
 	for (; pgoff && *pages; ++pages)
 		pgoff--;
-- 
1.9.3

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

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ