From: Andy Lutomirski <luto@amacapital.net>
To: akpm@linux-foundation.org, linux-mm@kvack.org, x86@kernel.org
Cc: linux-kernel@vger.kernel.org, Andy Lutomirski <luto@amacapital.net>
Subject: [RFC 3/6] mm: Add a vm_special_mapping .fault method
Date: Wed, 29 Oct 2014 17:42:13 -0700 [thread overview]
Message-ID: <c4e198aff7953d25290a8f70910da235f1fd2464.1414629045.git.luto@amacapital.net> (raw)
In-Reply-To: <cover.1414629045.git.luto@amacapital.net>
In-Reply-To: <cover.1414629045.git.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@amacapital.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, send a message with 'unsubscribe linux-mm' in
the body to majordomo@kvack.org. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>
next prev parent reply other threads:[~2014-10-30 0:42 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-10-30 0:42 [RFC 0/6] mm, x86: New special mapping ops Andy Lutomirski
2014-10-30 0:42 ` [RFC 1/6] mm: Add a mechanism to track the current address of a special mapping Andy Lutomirski
2014-10-30 0:42 ` [RFC 2/6] x86,vdso: Use special mapping tracking for the vdso Andy Lutomirski
2014-10-30 0:42 ` Andy Lutomirski [this message]
2014-10-30 0:42 ` [RFC 4/6] mm: Add vm_insert_pfn_prot Andy Lutomirski
2014-10-30 0:42 ` [RFC 5/6] x86,vdso: Use .fault instead of remap_pfn_range for the vvar mapping Andy Lutomirski
2014-10-30 0:42 ` [RFC 6/6] x86,vdso: Use .fault for the vdso text mapping Andy Lutomirski
2014-10-30 0:57 ` [RFC 0/6] mm, x86: New special mapping ops Andy Lutomirski
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=c4e198aff7953d25290a8f70910da235f1fd2464.1414629045.git.luto@amacapital.net \
--to=luto@amacapital.net \
--cc=akpm@linux-foundation.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=x86@kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox