Gitweb:     
http://git.kernel.org/git/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=839e01c2bfba34f97ec36d0d355801e94254ffd5
Commit:     839e01c2bfba34f97ec36d0d355801e94254ffd5
Parent:     74ce8322bf8843e6fd04e081d361c107bcf73564
Author:     Robin Getz <[EMAIL PROTECTED]>
AuthorDate: Thu Nov 15 20:57:53 2007 +0800
Committer:  Bryan Wu <[EMAIL PROTECTED]>
CommitDate: Thu Nov 15 20:57:53 2007 +0800

    Blackfin arch: move the init sections to the end of memory to help decrease 
memory fragementation
    
    move the init sections to the end of memory, so that after they
    are free, run time memory is all continugous - this should help decrease
    memory fragementation. When doing this, we also pack some of the other
    sections a little closer together, to make sure we don't waste memory.
    To make this happen, we need to rename the .data.init_task section to
    .init_task.data, so it doesn't get picked up by the linker script glob.
    
    Signed-off-by: Robin Getz <[EMAIL PROTECTED]>
    Signed-off-by: Bryan Wu <[EMAIL PROTECTED]>
---
 arch/blackfin/kernel/init_task.c   |    2 +-
 arch/blackfin/kernel/setup.c       |    8 +++---
 arch/blackfin/kernel/vmlinux.lds.S |   47 +++++++++++++++++++++--------------
 3 files changed, 33 insertions(+), 24 deletions(-)

diff --git a/arch/blackfin/kernel/init_task.c b/arch/blackfin/kernel/init_task.c
index 673c860..c640154 100644
--- a/arch/blackfin/kernel/init_task.c
+++ b/arch/blackfin/kernel/init_task.c
@@ -57,5 +57,5 @@ EXPORT_SYMBOL(init_task);
  * "init_task" linker map entry.
  */
 union thread_union init_thread_union
-    __attribute__ ((__section__(".data.init_task"))) = {
+    __attribute__ ((__section__(".init_task.data"))) = {
 INIT_THREAD_INFO(init_task)};
diff --git a/arch/blackfin/kernel/setup.c b/arch/blackfin/kernel/setup.c
index 934234f..dfe06b0 100644
--- a/arch/blackfin/kernel/setup.c
+++ b/arch/blackfin/kernel/setup.c
@@ -236,7 +236,7 @@ void __init setup_arch(char **cmdline_p)
        /* by now the stack is part of the init task */
        memory_end = _ramend - DMA_UNCACHED_REGION;
 
-       _ramstart = (unsigned long)__bss_stop;
+       _ramstart = (unsigned long)_end;
        memory_start = PAGE_ALIGN(_ramstart);
 
 #if defined(CONFIG_MTD_UCLINUX)
@@ -285,7 +285,7 @@ void __init setup_arch(char **cmdline_p)
        }
 
        /* Relocate MTD image to the top of memory after the uncached memory 
area */
-       dma_memcpy((char *)memory_end, __bss_stop, mtd_size);
+       dma_memcpy((char *)memory_end, _end, mtd_size);
 
        memory_mtd_start = memory_end;
        _ebss = memory_mtd_start;       /* define _ebss for compatible */
@@ -357,10 +357,10 @@ void __init setup_arch(char **cmdline_p)
        printk(KERN_INFO "Memory map:\n"
               KERN_INFO "  text      = 0x%p-0x%p\n"
               KERN_INFO "  rodata    = 0x%p-0x%p\n"
+              KERN_INFO "  bss       = 0x%p-0x%p\n"
               KERN_INFO "  data      = 0x%p-0x%p\n"
               KERN_INFO "    stack   = 0x%p-0x%p\n"
               KERN_INFO "  init      = 0x%p-0x%p\n"
-              KERN_INFO "  bss       = 0x%p-0x%p\n"
               KERN_INFO "  available = 0x%p-0x%p\n"
 #ifdef CONFIG_MTD_UCLINUX
               KERN_INFO "  rootfs    = 0x%p-0x%p\n"
@@ -370,10 +370,10 @@ void __init setup_arch(char **cmdline_p)
 #endif
               , _stext, _etext,
               __start_rodata, __end_rodata,
+              __bss_start, __bss_stop,
               _sdata, _edata,
               (void *)&init_thread_union, (void *)((int)(&init_thread_union) + 
0x2000),
               __init_begin, __init_end,
-              __bss_start, __bss_stop,
               (void *)_ramstart, (void *)memory_end
 #ifdef CONFIG_MTD_UCLINUX
               , (void *)memory_mtd_start, (void *)(memory_mtd_start + mtd_size)
diff --git a/arch/blackfin/kernel/vmlinux.lds.S 
b/arch/blackfin/kernel/vmlinux.lds.S
index 9b75bc8..5bdc0f7 100644
--- a/arch/blackfin/kernel/vmlinux.lds.S
+++ b/arch/blackfin/kernel/vmlinux.lds.S
@@ -41,6 +41,9 @@ _jiffies = _jiffies_64;
 SECTIONS
 {
        . = CONFIG_BOOT_LOAD;
+       /* Neither the text, ro_data or bss section need to be aligned
+        * So pack them back to back
+        */
        .text :
        {
                __text = .;
@@ -58,22 +61,25 @@ SECTIONS
                *(__ex_table)
                ___stop___ex_table = .;
 
-               . = ALIGN(4);
                __etext = .;
        }
 
-       RO_DATA(PAGE_SIZE)
+       /* Just in case the first read only is a 32-bit access */
+       RO_DATA(4)
+
+       .bss :
+       {
+               . = ALIGN(4);
+               ___bss_start = .;
+               *(.bss .bss.*)
+               *(COMMON)
+               ___bss_stop = .;
+       }
 
        .data :
        {
-               /* make sure the init_task is aligned to the
-                * kernel thread size so we can locate the kernel
-                * stack properly and quickly.
-                */
                __sdata = .;
-               . = ALIGN(THREAD_SIZE);
-               *(.data.init_task)
-
+               /* This gets done first, so the glob doesn't suck it in */
                . = ALIGN(32);
                *(.data.cacheline_aligned)
 
@@ -81,10 +87,22 @@ SECTIONS
                *(.data.*)
                CONSTRUCTORS
 
+               /* make sure the init_task is aligned to the
+                * kernel thread size so we can locate the kernel
+                * stack properly and quickly.
+                */
                . = ALIGN(THREAD_SIZE);
+               *(.init_task.data)
+
                __edata = .;
        }
 
+       /* The init section should be last, so when we free it, it goes into
+        * the general memory pool, and (hopefully) will decrease fragmentation
+        * a tiny bit. The init section has a _requirement_ that it be
+        * PAGE_SIZE aligned
+        */
+       . = ALIGN(PAGE_SIZE);
        ___init_begin = .;
 
        .init.text :
@@ -179,16 +197,7 @@ SECTIONS
        . = ALIGN(PAGE_SIZE);
        ___init_end = .;
 
-       .bss :
-       {
-               . = ALIGN(4);
-               ___bss_start = .;
-               *(.bss .bss.*)
-               *(COMMON)
-               . = ALIGN(4);
-               ___bss_stop = .;
-               __end = .;
-       }
+       __end =.;
 
        STABS_DEBUG
 
-
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