diff options
author | Rusty Russell <rusty@rustcorp.com.au> | 2008-08-12 18:52:52 -0400 |
---|---|---|
committer | Rusty Russell <rusty@rustcorp.com.au> | 2008-08-12 03:52:53 -0400 |
commit | 912985dce45ef18fcdd9f5439fef054e0e22302a (patch) | |
tree | 394b3be51134bddef200f86dde48aa3e3c7ae94c | |
parent | 40c42076ebd362dc69210cccea101ac80b6d4bd4 (diff) |
mm: Make generic weak get_user_pages_fast and EXPORT_GPL it
Out of line get_user_pages_fast fallback implementation, make it a weak
symbol, get rid of CONFIG_HAVE_GET_USER_PAGES_FAST.
Export the symbol to modules so lguest can use it.
Signed-off-by: Nick Piggin <npiggin@suse.de>
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
-rw-r--r-- | arch/powerpc/Kconfig | 3 | ||||
-rw-r--r-- | arch/x86/Kconfig | 1 | ||||
-rw-r--r-- | arch/x86/mm/Makefile | 3 | ||||
-rw-r--r-- | include/linux/mm.h | 20 | ||||
-rw-r--r-- | mm/Kconfig | 3 | ||||
-rw-r--r-- | mm/util.c | 15 |
6 files changed, 16 insertions, 29 deletions
diff --git a/arch/powerpc/Kconfig b/arch/powerpc/Kconfig index 63c9cafda9c4..587da5e0990f 100644 --- a/arch/powerpc/Kconfig +++ b/arch/powerpc/Kconfig | |||
@@ -42,9 +42,6 @@ config GENERIC_HARDIRQS | |||
42 | bool | 42 | bool |
43 | default y | 43 | default y |
44 | 44 | ||
45 | config HAVE_GET_USER_PAGES_FAST | ||
46 | def_bool PPC64 | ||
47 | |||
48 | config HAVE_SETUP_PER_CPU_AREA | 45 | config HAVE_SETUP_PER_CPU_AREA |
49 | def_bool PPC64 | 46 | def_bool PPC64 |
50 | 47 | ||
diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig index 3d0f2b6a5a16..ac2fb0641a04 100644 --- a/arch/x86/Kconfig +++ b/arch/x86/Kconfig | |||
@@ -22,7 +22,6 @@ config X86 | |||
22 | select HAVE_IDE | 22 | select HAVE_IDE |
23 | select HAVE_OPROFILE | 23 | select HAVE_OPROFILE |
24 | select HAVE_IOREMAP_PROT | 24 | select HAVE_IOREMAP_PROT |
25 | select HAVE_GET_USER_PAGES_FAST | ||
26 | select HAVE_KPROBES | 25 | select HAVE_KPROBES |
27 | select ARCH_WANT_OPTIONAL_GPIOLIB | 26 | select ARCH_WANT_OPTIONAL_GPIOLIB |
28 | select HAVE_KRETPROBES | 27 | select HAVE_KRETPROBES |
diff --git a/arch/x86/mm/Makefile b/arch/x86/mm/Makefile index 2977ea37791f..dfb932dcf136 100644 --- a/arch/x86/mm/Makefile +++ b/arch/x86/mm/Makefile | |||
@@ -1,7 +1,6 @@ | |||
1 | obj-y := init_$(BITS).o fault.o ioremap.o extable.o pageattr.o mmap.o \ | 1 | obj-y := init_$(BITS).o fault.o ioremap.o extable.o pageattr.o mmap.o \ |
2 | pat.o pgtable.o | 2 | pat.o pgtable.o gup.o |
3 | 3 | ||
4 | obj-$(CONFIG_HAVE_GET_USER_PAGES_FAST) += gup.o | ||
5 | obj-$(CONFIG_X86_32) += pgtable_32.o | 4 | obj-$(CONFIG_X86_32) += pgtable_32.o |
6 | 5 | ||
7 | obj-$(CONFIG_HUGETLB_PAGE) += hugetlbpage.o | 6 | obj-$(CONFIG_HUGETLB_PAGE) += hugetlbpage.o |
diff --git a/include/linux/mm.h b/include/linux/mm.h index 335288bff1b7..fa651609b65d 100644 --- a/include/linux/mm.h +++ b/include/linux/mm.h | |||
@@ -834,7 +834,6 @@ extern int mprotect_fixup(struct vm_area_struct *vma, | |||
834 | struct vm_area_struct **pprev, unsigned long start, | 834 | struct vm_area_struct **pprev, unsigned long start, |
835 | unsigned long end, unsigned long newflags); | 835 | unsigned long end, unsigned long newflags); |
836 | 836 | ||
837 | #ifdef CONFIG_HAVE_GET_USER_PAGES_FAST | ||
838 | /* | 837 | /* |
839 | * get_user_pages_fast provides equivalent functionality to get_user_pages, | 838 | * get_user_pages_fast provides equivalent functionality to get_user_pages, |
840 | * operating on current and current->mm (force=0 and doesn't return any vmas). | 839 | * operating on current and current->mm (force=0 and doesn't return any vmas). |
@@ -848,25 +847,6 @@ extern int mprotect_fixup(struct vm_area_struct *vma, | |||
848 | int get_user_pages_fast(unsigned long start, int nr_pages, int write, | 847 | int get_user_pages_fast(unsigned long start, int nr_pages, int write, |
849 | struct page **pages); | 848 | struct page **pages); |
850 | 849 | ||
851 | #else | ||
852 | /* | ||
853 | * Should probably be moved to asm-generic, and architectures can include it if | ||
854 | * they don't implement their own get_user_pages_fast. | ||
855 | */ | ||
856 | #define get_user_pages_fast(start, nr_pages, write, pages) \ | ||
857 | ({ \ | ||
858 | struct mm_struct *mm = current->mm; \ | ||
859 | int ret; \ | ||
860 | \ | ||
861 | down_read(&mm->mmap_sem); \ | ||
862 | ret = get_user_pages(current, mm, start, nr_pages, \ | ||
863 | write, 0, pages, NULL); \ | ||
864 | up_read(&mm->mmap_sem); \ | ||
865 | \ | ||
866 | ret; \ | ||
867 | }) | ||
868 | #endif | ||
869 | |||
870 | /* | 850 | /* |
871 | * A callback you can register to apply pressure to ageable caches. | 851 | * A callback you can register to apply pressure to ageable caches. |
872 | * | 852 | * |
diff --git a/mm/Kconfig b/mm/Kconfig index 446c6588c753..0bd9c2dbb2a0 100644 --- a/mm/Kconfig +++ b/mm/Kconfig | |||
@@ -77,9 +77,6 @@ config FLAT_NODE_MEM_MAP | |||
77 | def_bool y | 77 | def_bool y |
78 | depends on !SPARSEMEM | 78 | depends on !SPARSEMEM |
79 | 79 | ||
80 | config HAVE_GET_USER_PAGES_FAST | ||
81 | bool | ||
82 | |||
83 | # | 80 | # |
84 | # Both the NUMA code and DISCONTIGMEM use arrays of pg_data_t's | 81 | # Both the NUMA code and DISCONTIGMEM use arrays of pg_data_t's |
85 | # to represent different areas of memory. This variable allows | 82 | # to represent different areas of memory. This variable allows |
@@ -171,3 +171,18 @@ void arch_pick_mmap_layout(struct mm_struct *mm) | |||
171 | mm->unmap_area = arch_unmap_area; | 171 | mm->unmap_area = arch_unmap_area; |
172 | } | 172 | } |
173 | #endif | 173 | #endif |
174 | |||
175 | int __attribute__((weak)) get_user_pages_fast(unsigned long start, | ||
176 | int nr_pages, int write, struct page **pages) | ||
177 | { | ||
178 | struct mm_struct *mm = current->mm; | ||
179 | int ret; | ||
180 | |||
181 | down_read(&mm->mmap_sem); | ||
182 | ret = get_user_pages(current, mm, start, nr_pages, | ||
183 | write, 0, pages, NULL); | ||
184 | up_read(&mm->mmap_sem); | ||
185 | |||
186 | return ret; | ||
187 | } | ||
188 | EXPORT_SYMBOL_GPL(get_user_pages_fast); | ||