2007-02-21 10:04:07

by Martin Schwidefsky

[permalink] [raw]
Subject: [S390] nss: Free unused memory in kernel image.

From: Heiko Carstens <[email protected]>

[S390] nss: Free unused memory in kernel image.

With CONFIG_SHARED_KERNEL the kernel text segment that might be in a
read only memory sections starts at 1MB. Memory between 0x12000 and
0x100000 is unused then. Free this, so we have appr. an extra MB
of memory available.

Signed-off-by: Heiko Carstens <[email protected]>
Signed-off-by: Martin Schwidefsky <[email protected]>
---

arch/s390/kernel/head31.S | 15 ++-------------
arch/s390/kernel/head64.S | 16 ++--------------
arch/s390/kernel/ipl.c | 7 +++++++
arch/s390/kernel/setup.c | 7 ++++++-
drivers/s390/cio/cio.c | 2 +-
include/asm-s390/sections.h | 2 +-
6 files changed, 19 insertions(+), 30 deletions(-)

diff -urpN linux-2.6/arch/s390/kernel/head31.S linux-2.6-patched/arch/s390/kernel/head31.S
--- linux-2.6/arch/s390/kernel/head31.S 2007-02-21 10:47:06.000000000 +0100
+++ linux-2.6-patched/arch/s390/kernel/head31.S 2007-02-21 10:47:34.000000000 +0100
@@ -148,20 +148,9 @@ startup_continue:
.Lstartup_init:
.long startup_init

- .globl ipl_schib
-ipl_schib:
- .rept 13
- .long 0
- .endr
-
- .globl ipl_flags
-ipl_flags:
- .long 0
- .globl ipl_devno
-ipl_devno:
- .word 0
-
.org 0x12000
+ .globl _ehead
+_ehead:
#ifdef CONFIG_SHARED_KERNEL
.org 0x100000
#endif
diff -urpN linux-2.6/arch/s390/kernel/head64.S linux-2.6-patched/arch/s390/kernel/head64.S
--- linux-2.6/arch/s390/kernel/head64.S 2007-02-21 10:47:06.000000000 +0100
+++ linux-2.6-patched/arch/s390/kernel/head64.S 2007-02-21 10:47:34.000000000 +0100
@@ -154,21 +154,9 @@ startup_continue:
.Lparmaddr:
.quad PARMAREA

- .globl ipl_schib
-ipl_schib:
- .rept 13
- .long 0
- .endr
-
- .globl ipl_flags
-ipl_flags:
- .long 0
- .globl ipl_devno
-ipl_devno:
- .word 0
-
.org 0x12000
-
+ .globl _ehead
+_ehead:
#ifdef CONFIG_SHARED_KERNEL
.org 0x100000
#endif
diff -urpN linux-2.6/arch/s390/kernel/ipl.c linux-2.6-patched/arch/s390/kernel/ipl.c
--- linux-2.6/arch/s390/kernel/ipl.c 2007-02-21 10:47:33.000000000 +0100
+++ linux-2.6-patched/arch/s390/kernel/ipl.c 2007-02-21 10:47:34.000000000 +0100
@@ -43,6 +43,13 @@ enum ipl_type {
#define IPL_FCP_STR "fcp"
#define IPL_NSS_STR "nss"

+/*
+ * Must be in data section since the bss section
+ * is not cleared when these are accessed.
+ */
+u16 ipl_devno __attribute__((__section__(".data"))) = 0;
+u32 ipl_flags __attribute__((__section__(".data"))) = 0;
+
static char *ipl_type_str(enum ipl_type type)
{
switch (type) {
diff -urpN linux-2.6/arch/s390/kernel/setup.c linux-2.6-patched/arch/s390/kernel/setup.c
--- linux-2.6/arch/s390/kernel/setup.c 2007-02-21 10:47:32.000000000 +0100
+++ linux-2.6-patched/arch/s390/kernel/setup.c 2007-02-21 10:47:34.000000000 +0100
@@ -690,9 +690,14 @@ setup_memory(void)
psw_set_key(PAGE_DEFAULT_KEY);

free_bootmem_with_active_regions(0, max_pfn);
- reserve_bootmem(0, PFN_PHYS(start_pfn));

/*
+ * Reserve memory used for lowcore/command line/kernel image.
+ */
+ reserve_bootmem(0, (unsigned long)_ehead);
+ reserve_bootmem((unsigned long)_stext,
+ PFN_PHYS(start_pfn) - (unsigned long)_stext);
+ /*
* Reserve the bootmem bitmap itself as well. We do this in two
* steps (first step was init_bootmem()) because this catches
* the (very unlikely) case of us accidentally initializing the
diff -urpN linux-2.6/drivers/s390/cio/cio.c linux-2.6-patched/drivers/s390/cio/cio.c
--- linux-2.6/drivers/s390/cio/cio.c 2007-02-21 10:47:32.000000000 +0100
+++ linux-2.6-patched/drivers/s390/cio/cio.c 2007-02-21 10:47:34.000000000 +0100
@@ -1048,7 +1048,7 @@ void reipl_ccw_dev(struct ccw_dev_id *de
do_reipl_asm(*((__u32*)&schid));
}

-extern struct schib ipl_schib;
+static struct schib __initdata ipl_schib;

/*
* ipl_save_parameters gets called very early. It is not allowed to access
diff -urpN linux-2.6/include/asm-s390/sections.h linux-2.6-patched/include/asm-s390/sections.h
--- linux-2.6/include/asm-s390/sections.h 2007-02-21 10:47:14.000000000 +0100
+++ linux-2.6-patched/include/asm-s390/sections.h 2007-02-21 10:47:34.000000000 +0100
@@ -3,6 +3,6 @@

#include <asm-generic/sections.h>

-extern char _eshared[];
+extern char _eshared[], _ehead[];

#endif
--
blue skies, IBM Deutschland Entwicklung GmbH
Martin Vorsitzender des Aufsichtsrats: Johann Weihen
Gesch?ftsf?hrung: Herbert Kircher
Martin Schwidefsky Sitz der Gesellschaft: B?blingen
Linux on zSeries Registergericht: Amtsgericht Stuttgart,
Development HRB 243294

"Reality continues to ruin my life." - Calvin.