aboutsummaryrefslogtreecommitdiffstats
path: root/include/linux
diff options
context:
space:
mode:
authorNick Piggin <npiggin@suse.de>2007-07-19 04:47:05 -0400
committerLinus Torvalds <torvalds@woody.linux-foundation.org>2007-07-19 13:04:41 -0400
commit83c54070ee1a2d05c89793884bea1a03f2851ed4 (patch)
treedc732f5a9b93fb7004ed23f551bd98b77cc580e0 /include/linux
parentd0217ac04ca6591841e5665f518e38064f4e65bd (diff)
mm: fault feedback #2
This patch completes Linus's wish that the fault return codes be made into bit flags, which I agree makes everything nicer. This requires requires all handle_mm_fault callers to be modified (possibly the modifications should go further and do things like fault accounting in handle_mm_fault -- however that would be for another patch). [akpm@linux-foundation.org: fix alpha build] [akpm@linux-foundation.org: fix s390 build] [akpm@linux-foundation.org: fix sparc build] [akpm@linux-foundation.org: fix sparc64 build] [akpm@linux-foundation.org: fix ia64 build] Signed-off-by: Nick Piggin <npiggin@suse.de> Cc: Richard Henderson <rth@twiddle.net> Cc: Ivan Kokshaysky <ink@jurassic.park.msu.ru> Cc: Russell King <rmk@arm.linux.org.uk> Cc: Ian Molton <spyro@f2s.com> Cc: Bryan Wu <bryan.wu@analog.com> Cc: Mikael Starvik <starvik@axis.com> Cc: David Howells <dhowells@redhat.com> Cc: Yoshinori Sato <ysato@users.sourceforge.jp> Cc: "Luck, Tony" <tony.luck@intel.com> Cc: Hirokazu Takata <takata@linux-m32r.org> Cc: Geert Uytterhoeven <geert@linux-m68k.org> Cc: Roman Zippel <zippel@linux-m68k.org> Cc: Greg Ungerer <gerg@uclinux.org> Cc: Matthew Wilcox <willy@debian.org> Cc: Paul Mackerras <paulus@samba.org> Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org> Cc: Heiko Carstens <heiko.carstens@de.ibm.com> Cc: Martin Schwidefsky <schwidefsky@de.ibm.com> Cc: Paul Mundt <lethal@linux-sh.org> Cc: Kazumoto Kojima <kkojima@rr.iij4u.or.jp> Cc: Richard Curnow <rc@rc0.org.uk> Cc: William Lee Irwin III <wli@holomorphy.com> Cc: "David S. Miller" <davem@davemloft.net> Cc: Jeff Dike <jdike@addtoit.com> Cc: Paolo 'Blaisorblade' Giarrusso <blaisorblade@yahoo.it> Cc: Miles Bader <uclinux-v850@lsi.nec.co.jp> Cc: Chris Zankel <chris@zankel.net> Acked-by: Kyle McMartin <kyle@mcmartin.ca> Acked-by: Haavard Skinnemoen <hskinnemoen@atmel.com> Acked-by: Ralf Baechle <ralf@linux-mips.org> Acked-by: Andi Kleen <ak@muc.de> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> [ Still apparently needs some ARM and PPC loving - Linus ] Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'include/linux')
-rw-r--r--include/linux/mm.h58
1 files changed, 13 insertions, 45 deletions
diff --git a/include/linux/mm.h b/include/linux/mm.h
index ff0b8844bd5a..f8e12b3b6110 100644
--- a/include/linux/mm.h
+++ b/include/linux/mm.h
@@ -196,25 +196,10 @@ extern pgprot_t protection_map[16];
196#define FAULT_FLAG_NONLINEAR 0x02 /* Fault was via a nonlinear mapping */ 196#define FAULT_FLAG_NONLINEAR 0x02 /* Fault was via a nonlinear mapping */
197 197
198 198
199#define FAULT_RET_NOPAGE 0x0100 /* ->fault did not return a page. This
200 * can be used if the handler installs
201 * their own pte.
202 */
203#define FAULT_RET_LOCKED 0x0200 /* ->fault locked the page, caller must
204 * unlock after installing the mapping.
205 * This is used by pagecache in
206 * particular, where the page lock is
207 * used to synchronise against truncate
208 * and invalidate. Mutually exclusive
209 * with FAULT_RET_NOPAGE.
210 */
211
212/* 199/*
213 * vm_fault is filled by the the pagefault handler and passed to the vma's 200 * vm_fault is filled by the the pagefault handler and passed to the vma's
214 * ->fault function. The vma's ->fault is responsible for returning the 201 * ->fault function. The vma's ->fault is responsible for returning a bitmask
215 * VM_FAULT_xxx type which occupies the lowest byte of the return code, ORed 202 * of VM_FAULT_xxx flags that give details about how the fault was handled.
216 * with FAULT_RET_ flags that occupy the next byte and give details about
217 * how the fault was handled.
218 * 203 *
219 * pgoff should be used in favour of virtual_address, if possible. If pgoff 204 * pgoff should be used in favour of virtual_address, if possible. If pgoff
220 * is used, one may set VM_CAN_NONLINEAR in the vma->vm_flags to get nonlinear 205 * is used, one may set VM_CAN_NONLINEAR in the vma->vm_flags to get nonlinear
@@ -226,9 +211,9 @@ struct vm_fault {
226 void __user *virtual_address; /* Faulting virtual address */ 211 void __user *virtual_address; /* Faulting virtual address */
227 212
228 struct page *page; /* ->fault handlers should return a 213 struct page *page; /* ->fault handlers should return a
229 * page here, unless FAULT_RET_NOPAGE 214 * page here, unless VM_FAULT_NOPAGE
230 * is set (which is also implied by 215 * is set (which is also implied by
231 * VM_FAULT_OOM or SIGBUS). 216 * VM_FAULT_ERROR).
232 */ 217 */
233}; 218};
234 219
@@ -712,26 +697,17 @@ static inline int page_mapped(struct page *page)
712 * just gets major/minor fault counters bumped up. 697 * just gets major/minor fault counters bumped up.
713 */ 698 */
714 699
715/* 700#define VM_FAULT_MINOR 0 /* For backwards compat. Remove me quickly. */
716 * VM_FAULT_ERROR is set for the error cases, to make some tests simpler.
717 */
718#define VM_FAULT_ERROR 0x20
719 701
720#define VM_FAULT_OOM (0x00 | VM_FAULT_ERROR) 702#define VM_FAULT_OOM 0x0001
721#define VM_FAULT_SIGBUS (0x01 | VM_FAULT_ERROR) 703#define VM_FAULT_SIGBUS 0x0002
722#define VM_FAULT_MINOR 0x02 704#define VM_FAULT_MAJOR 0x0004
723#define VM_FAULT_MAJOR 0x03 705#define VM_FAULT_WRITE 0x0008 /* Special case for get_user_pages */
724 706
725/* 707#define VM_FAULT_NOPAGE 0x0100 /* ->fault installed the pte, not return page */
726 * Special case for get_user_pages. 708#define VM_FAULT_LOCKED 0x0200 /* ->fault locked the returned page */
727 * Must be in a distinct bit from the above VM_FAULT_ flags.
728 */
729#define VM_FAULT_WRITE 0x10
730 709
731/* 710#define VM_FAULT_ERROR (VM_FAULT_OOM | VM_FAULT_SIGBUS)
732 * Mask of VM_FAULT_ flags
733 */
734#define VM_FAULT_MASK 0xff
735 711
736#define offset_in_page(p) ((unsigned long)(p) & ~PAGE_MASK) 712#define offset_in_page(p) ((unsigned long)(p) & ~PAGE_MASK)
737 713
@@ -817,16 +793,8 @@ extern int vmtruncate(struct inode * inode, loff_t offset);
817extern int vmtruncate_range(struct inode * inode, loff_t offset, loff_t end); 793extern int vmtruncate_range(struct inode * inode, loff_t offset, loff_t end);
818 794
819#ifdef CONFIG_MMU 795#ifdef CONFIG_MMU
820extern int __handle_mm_fault(struct mm_struct *mm,struct vm_area_struct *vma, 796extern int handle_mm_fault(struct mm_struct *mm, struct vm_area_struct *vma,
821 unsigned long address, int write_access); 797 unsigned long address, int write_access);
822
823static inline int handle_mm_fault(struct mm_struct *mm,
824 struct vm_area_struct *vma, unsigned long address,
825 int write_access)
826{
827 return __handle_mm_fault(mm, vma, address, write_access) &
828 (~VM_FAULT_WRITE);
829}
830#else 798#else
831static inline int handle_mm_fault(struct mm_struct *mm, 799static inline int handle_mm_fault(struct mm_struct *mm,
832 struct vm_area_struct *vma, unsigned long address, 800 struct vm_area_struct *vma, unsigned long address,