module: merge module_alloc() finally
authorAmerigo Wang <amwang@redhat.com>
Thu, 4 Jun 2009 01:46:46 +0000 (21:46 -0400)
committerRusty Russell <rusty@rustcorp.com.au>
Fri, 12 Jun 2009 12:17:03 +0000 (21:47 +0930)
As Christoph Hellwig suggested, module_alloc() actually can be
unified for i386 and x86_64 (of course, also UML).

Signed-off-by: WANG Cong <amwang@redhat.com>
Cc: Christoph Hellwig <hch@infradead.org>
Cc: 'Ingo Molnar' <mingo@elte.hu>
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
arch/um/include/asm/pgtable.h
arch/x86/include/asm/pgtable_32_types.h
arch/x86/kernel/module.c

index 58da2480a7f4229fb164ae81947bfc901de8b27d..9ce3f165111a63607fa91f98a99e3b232fb5080a 100644 (file)
@@ -53,16 +53,21 @@ extern unsigned long end_iomem;
 #else
 # define VMALLOC_END   (FIXADDR_START-2*PAGE_SIZE)
 #endif
+#define MODULES_VADDR  VMALLOC_START
+#define MODULES_END    VMALLOC_END
+#define MODULES_LEN    (MODULES_VADDR - MODULES_END)
 
 #define _PAGE_TABLE    (_PAGE_PRESENT | _PAGE_RW | _PAGE_USER | _PAGE_ACCESSED | _PAGE_DIRTY)
 #define _KERNPG_TABLE  (_PAGE_PRESENT | _PAGE_RW | _PAGE_ACCESSED | _PAGE_DIRTY)
 #define _PAGE_CHG_MASK (PAGE_MASK | _PAGE_ACCESSED | _PAGE_DIRTY)
-
+#define __PAGE_KERNEL_EXEC                                              \
+        (_PAGE_PRESENT | _PAGE_RW | _PAGE_DIRTY | _PAGE_ACCESSED)
 #define PAGE_NONE      __pgprot(_PAGE_PROTNONE | _PAGE_ACCESSED)
 #define PAGE_SHARED    __pgprot(_PAGE_PRESENT | _PAGE_RW | _PAGE_USER | _PAGE_ACCESSED)
 #define PAGE_COPY      __pgprot(_PAGE_PRESENT | _PAGE_USER | _PAGE_ACCESSED)
 #define PAGE_READONLY  __pgprot(_PAGE_PRESENT | _PAGE_USER | _PAGE_ACCESSED)
 #define PAGE_KERNEL    __pgprot(_PAGE_PRESENT | _PAGE_RW | _PAGE_DIRTY | _PAGE_ACCESSED)
+#define PAGE_KERNEL_EXEC       __pgprot(__PAGE_KERNEL_EXEC)
 
 /*
  * The i386 can't do page protection for execute, and considers that the same
index 2733fad45f989bfd5a775c99e5decb35cfe8014a..5e67c15323145753d29894eb43c4c29f0343f38e 100644 (file)
@@ -46,6 +46,10 @@ extern bool __vmalloc_start_set; /* set once high_memory is set */
 # define VMALLOC_END   (FIXADDR_START - 2 * PAGE_SIZE)
 #endif
 
+#define MODULES_VADDR  VMALLOC_START
+#define MODULES_END    VMALLOC_END
+#define MODULES_LEN    (MODULES_VADDR - MODULES_END)
+
 #define MAXMEM (VMALLOC_END - PAGE_OFFSET - __VMALLOC_RESERVE)
 
 #endif /* _ASM_X86_PGTABLE_32_DEFS_H */
index b92fbcf48609fe0cc3eda0cd8fb45ecc82960e1f..894bb718a6fb8fbb9ab766ae79830ba6d93ecfd2 100644 (file)
 #define DEBUGP(fmt...)
 #endif
 
-#if defined(CONFIG_UML) || defined(CONFIG_X86_32)
-void *module_alloc(unsigned long size)
-{
-       if (size == 0)
-               return NULL;
-       return vmalloc_exec(size);
-}
-#else /*X86_64*/
 void *module_alloc(unsigned long size)
 {
        struct vm_struct *area;
@@ -56,9 +48,9 @@ void *module_alloc(unsigned long size)
        if (!area)
                return NULL;
 
-       return __vmalloc_area(area, GFP_KERNEL, PAGE_KERNEL_EXEC);
+       return __vmalloc_area(area, GFP_KERNEL | __GFP_HIGHMEM,
+                                       PAGE_KERNEL_EXEC);
 }
-#endif
 
 /* Free memory returned from module_alloc */
 void module_free(struct module *mod, void *module_region)