mm: Make generic weak get_user_pages_fast and EXPORT_GPL it
authorRusty Russell <rusty@rustcorp.com.au>
Tue, 12 Aug 2008 22:52:52 +0000 (17:52 -0500)
committerRusty Russell <rusty@rustcorp.com.au>
Tue, 12 Aug 2008 07:52:53 +0000 (17:52 +1000)
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>
arch/powerpc/Kconfig
arch/x86/Kconfig
arch/x86/mm/Makefile
include/linux/mm.h
mm/Kconfig
mm/util.c

index 63c9cafda9c4e34bce6d096db4bcf83b68b7cd51..587da5e0990f9504979f9357b2783305e6a23d02 100644 (file)
@@ -42,9 +42,6 @@ config GENERIC_HARDIRQS
        bool
        default y
 
-config HAVE_GET_USER_PAGES_FAST
-       def_bool PPC64
-
 config HAVE_SETUP_PER_CPU_AREA
        def_bool PPC64
 
index 3d0f2b6a5a16e6edd6f349b4b19756a5d2cecff7..ac2fb0641a041e4a28055867140f458613673dc2 100644 (file)
@@ -22,7 +22,6 @@ config X86
        select HAVE_IDE
        select HAVE_OPROFILE
        select HAVE_IOREMAP_PROT
-       select HAVE_GET_USER_PAGES_FAST
        select HAVE_KPROBES
        select ARCH_WANT_OPTIONAL_GPIOLIB
        select HAVE_KRETPROBES
index 2977ea37791f3ca3ec53efb8a2984fc17d866d30..dfb932dcf136c5055dd555d6e5680e4821bacf59 100644 (file)
@@ -1,7 +1,6 @@
 obj-y  :=  init_$(BITS).o fault.o ioremap.o extable.o pageattr.o mmap.o \
-           pat.o pgtable.o
+           pat.o pgtable.o gup.o
 
-obj-$(CONFIG_HAVE_GET_USER_PAGES_FAST) += gup.o
 obj-$(CONFIG_X86_32)           += pgtable_32.o
 
 obj-$(CONFIG_HUGETLB_PAGE)     += hugetlbpage.o
index 335288bff1b741bd25dce72d3a84773c5ef70aee..fa651609b65dbc928a1a3d20035c29b42a1a8947 100644 (file)
@@ -834,7 +834,6 @@ extern int mprotect_fixup(struct vm_area_struct *vma,
                          struct vm_area_struct **pprev, unsigned long start,
                          unsigned long end, unsigned long newflags);
 
-#ifdef CONFIG_HAVE_GET_USER_PAGES_FAST
 /*
  * get_user_pages_fast provides equivalent functionality to get_user_pages,
  * 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,
 int get_user_pages_fast(unsigned long start, int nr_pages, int write,
                        struct page **pages);
 
-#else
-/*
- * Should probably be moved to asm-generic, and architectures can include it if
- * they don't implement their own get_user_pages_fast.
- */
-#define get_user_pages_fast(start, nr_pages, write, pages)     \
-({                                                             \
-       struct mm_struct *mm = current->mm;                     \
-       int ret;                                                \
-                                                               \
-       down_read(&mm->mmap_sem);                               \
-       ret = get_user_pages(current, mm, start, nr_pages,      \
-                                       write, 0, pages, NULL); \
-       up_read(&mm->mmap_sem);                                 \
-                                                               \
-       ret;                                                    \
-})
-#endif
-
 /*
  * A callback you can register to apply pressure to ageable caches.
  *
index 446c6588c75398ab91e9413c20363dcd076432da..0bd9c2dbb2a0be8d184b4b9f1d75dc03ec2a14ba 100644 (file)
@@ -77,9 +77,6 @@ config FLAT_NODE_MEM_MAP
        def_bool y
        depends on !SPARSEMEM
 
-config HAVE_GET_USER_PAGES_FAST
-       bool
-
 #
 # Both the NUMA code and DISCONTIGMEM use arrays of pg_data_t's
 # to represent different areas of memory.  This variable allows
index 9341ca77bd88240741afbcbabed9019f247a7531..cb00b748ce47886446975d96466c2154f4d52fa3 100644 (file)
--- a/mm/util.c
+++ b/mm/util.c
@@ -171,3 +171,18 @@ void arch_pick_mmap_layout(struct mm_struct *mm)
        mm->unmap_area = arch_unmap_area;
 }
 #endif
+
+int __attribute__((weak)) get_user_pages_fast(unsigned long start,
+                               int nr_pages, int write, struct page **pages)
+{
+       struct mm_struct *mm = current->mm;
+       int ret;
+
+       down_read(&mm->mmap_sem);
+       ret = get_user_pages(current, mm, start, nr_pages,
+                                       write, 0, pages, NULL);
+       up_read(&mm->mmap_sem);
+
+       return ret;
+}
+EXPORT_SYMBOL_GPL(get_user_pages_fast);