Gitweb:     
http://git.kernel.org/git/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=72280ede316911fd5a82ef78d12a6705b1007d36
Commit:     72280ede316911fd5a82ef78d12a6705b1007d36
Parent:     a3142c8e1dd57ff48040bdb3478cff9312543dc3
Author:     Yasunori Goto <[EMAIL PROTECTED]>
AuthorDate: Tue May 8 00:23:10 2007 -0700
Committer:  Linus Torvalds <[EMAIL PROTECTED]>
CommitDate: Tue May 8 11:14:57 2007 -0700

    Add white list into modpost.c for memory hotplug code and ia64's machvec 
section
    
    This patch is add white list into modpost.c for some functions and
    ia64's section to fix section mismatchs.
    
      sparse_index_alloc() and zone_wait_table_init() calls bootmem allocator
      at boot time, and kmalloc/vmalloc at hotplug time. If config
      memory hotplug is on, there are references of bootmem allocater(init text)
      from them (normal text). This is cause of section mismatch.
    
      Bootmem is called by many functions and it must be
      used only at boot time. I think __init of them should keep for
      section mismatch check. So, I would like to register sparse_index_alloc()
      and zone_wait_table_init() into white list.
    
      In addition, ia64's .machvec section is function table of some platform
      dependent code. It is mixture of .init.text and normal text. These
      reference of __init functions are valid too.
    
    Signed-off-by: Yasunori Goto <[EMAIL PROTECTED]>
    Cc: Sam Ravnborg <[EMAIL PROTECTED]>
    Signed-off-by: Andrew Morton <[EMAIL PROTECTED]>
    Signed-off-by: Linus Torvalds <[EMAIL PROTECTED]>
---
 mm/page_alloc.c       |    2 +-
 mm/sparse.c           |    2 +-
 scripts/mod/modpost.c |   27 +++++++++++++++++++++++++++
 3 files changed, 29 insertions(+), 2 deletions(-)

diff --git a/mm/page_alloc.c b/mm/page_alloc.c
index fd77451..6fd0b74 100644
--- a/mm/page_alloc.c
+++ b/mm/page_alloc.c
@@ -2179,7 +2179,7 @@ void __init setup_per_cpu_pageset(void)
 
 #endif
 
-static __meminit
+static __meminit noinline
 int zone_wait_table_init(struct zone *zone, unsigned long zone_size_pages)
 {
        int i;
diff --git a/mm/sparse.c b/mm/sparse.c
index 9079afe..6f3fff9 100644
--- a/mm/sparse.c
+++ b/mm/sparse.c
@@ -44,7 +44,7 @@ EXPORT_SYMBOL(page_to_nid);
 #endif
 
 #ifdef CONFIG_SPARSEMEM_EXTREME
-static struct mem_section *sparse_index_alloc(int nid)
+static struct mem_section noinline *sparse_index_alloc(int nid)
 {
        struct mem_section *section = NULL;
        unsigned long array_size = SECTIONS_PER_ROOT *
diff --git a/scripts/mod/modpost.c b/scripts/mod/modpost.c
index 4ab36de..480e18b 100644
--- a/scripts/mod/modpost.c
+++ b/scripts/mod/modpost.c
@@ -642,6 +642,16 @@ static int strrcmp(const char *s, const char *sub)
  *  tosec   = .init.text
  *  fromsec  = .paravirtprobe
  *
+ * Pattern 9:
+ *  Some of functions are common code between boot time and hotplug
+ *  time. The bootmem allocater is called only boot time in its
+ *  functions. So it's ok to reference.
+ *  tosec    = .init.text
+ *
+ * Pattern 10:
+ *  ia64 has machvec table for each platform. It is mixture of function
+ *  pointer of .init.text and .text.
+ *  fromsec  = .machvec
  **/
 static int secref_whitelist(const char *modname, const char *tosec,
                            const char *fromsec, const char *atsym,
@@ -668,6 +678,12 @@ static int secref_whitelist(const char *modname, const 
char *tosec,
                NULL
        };
 
+       const char *pat4sym[] = {
+               "sparse_index_alloc",
+               "zone_wait_table_init",
+               NULL
+       };
+
        /* Check for pattern 1 */
        if (strcmp(tosec, ".init.data") != 0)
                f1 = 0;
@@ -726,6 +742,17 @@ static int secref_whitelist(const char *modname, const 
char *tosec,
            (strcmp(fromsec, ".paravirtprobe") == 0))
                return 1;
 
+       /* Check for pattern 9 */
+       if ((strcmp(tosec, ".init.text") == 0) &&
+           (strcmp(fromsec, ".text") == 0))
+               for (s = pat4sym; *s; s++)
+                       if (strcmp(atsym, *s) == 0)
+                               return 1;
+
+       /* Check for pattern 10 */
+       if (strcmp(fromsec, ".machvec") == 0)
+               return 1;
+
        return 0;
 }
 
-
To unsubscribe from this list: send the line "unsubscribe git-commits-head" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to