* [PATCH][RFC] Move some kernel globals from asm file to C file.
@ 2007-01-23 15:38 Atsushi Nemoto
2007-01-23 16:12 ` Ralf Baechle
0 siblings, 1 reply; 4+ messages in thread
From: Atsushi Nemoto @ 2007-01-23 15:38 UTC (permalink / raw)
To: linux-mips; +Cc: ralf
I found that symbols defined by .comm in head.S are placed in random
order (with binutils 2.17). For example, here is a tail of
System.map:
801ce000 B fw_arg3
801ce004 B fw_arg1
801cf000 B swapper_pg_dir
801d0000 B invalid_pte_table
801d1000 B fw_arg2
801d1008 B kernelsp
801d1010 B fw_arg0
801d1018 B pgd_current
801d1020 A __bss_stop
801d1020 A _end
It looks less efficient while fw_arg[0-3] are all 4 byte.
Is there any point on declaring those symbols in asm file? If
nothing, how about moving them to C file? And I can not see why
kernel_sp and pgd_current have 8-byte size even on 32-bit kernel.
Here is a proposal patch. Comments?
Signed-off-by: Atsushi Nemoto <anemo@mba.ocn.ne.jp>
---
arch/mips/kernel/asm-offsets.c | 4 ----
arch/mips/kernel/head.S | 25 -------------------------
arch/mips/kernel/setup.c | 17 +++++++++++++++++
3 files changed, 17 insertions(+), 29 deletions(-)
diff --git a/arch/mips/kernel/asm-offsets.c b/arch/mips/kernel/asm-offsets.c
index ff88b06..ea7df4b 100644
--- a/arch/mips/kernel/asm-offsets.c
+++ b/arch/mips/kernel/asm-offsets.c
@@ -234,10 +234,6 @@ void output_mm_defines(void)
constant("#define _PMD_SHIFT ", PMD_SHIFT);
constant("#define _PGDIR_SHIFT ", PGDIR_SHIFT);
linefeed;
- constant("#define _PGD_ORDER ", PGD_ORDER);
- constant("#define _PMD_ORDER ", PMD_ORDER);
- constant("#define _PTE_ORDER ", PTE_ORDER);
- linefeed;
constant("#define _PTRS_PER_PGD ", PTRS_PER_PGD);
constant("#define _PTRS_PER_PMD ", PTRS_PER_PMD);
constant("#define _PTRS_PER_PTE ", PTRS_PER_PTE);
diff --git a/arch/mips/kernel/head.S b/arch/mips/kernel/head.S
index 9a7811d..6f57ca4 100644
--- a/arch/mips/kernel/head.S
+++ b/arch/mips/kernel/head.S
@@ -231,28 +231,3 @@ NESTED(smp_bootstrap, 16, sp)
#endif /* CONFIG_SMP */
__FINIT
-
- .comm kernelsp, NR_CPUS * 8, 8
- .comm pgd_current, NR_CPUS * 8, 8
-
- .comm fw_arg0, SZREG, SZREG # firmware arguments
- .comm fw_arg1, SZREG, SZREG
- .comm fw_arg2, SZREG, SZREG
- .comm fw_arg3, SZREG, SZREG
-
- .macro page name, order
- .comm \name, (_PAGE_SIZE << \order), (_PAGE_SIZE << \order)
- .endm
-
- /*
- * On 64-bit we've got three-level pagetables with a slightly
- * different layout ...
- */
- page swapper_pg_dir, _PGD_ORDER
-#ifdef CONFIG_64BIT
-#if defined(CONFIG_MODULES) && !defined(CONFIG_BUILD_ELF64)
- page module_pg_dir, _PGD_ORDER
-#endif
- page invalid_pmd_table, _PMD_ORDER
-#endif
- page invalid_pte_table, _PTE_ORDER
diff --git a/arch/mips/kernel/setup.c b/arch/mips/kernel/setup.c
index 89440a0..dc307e4 100644
--- a/arch/mips/kernel/setup.c
+++ b/arch/mips/kernel/setup.c
@@ -541,3 +541,20 @@ int __init dsp_disable(char *s)
}
__setup("nodsp", dsp_disable);
+
+unsigned long kernelsp[NR_CPUS];
+unsigned long pgd_current[NR_CPUS];
+unsigned long fw_arg0, fw_arg1, fw_arg2, fw_arg3;
+/*
+ * On 64-bit we've got three-level pagetables with a slightly
+ * different layout ...
+ */
+#define __page_aligned(order) __attribute__((__aligned__(PAGE_SIZE<<order)))
+pgd_t swapper_pg_dir[PTRS_PER_PGD] __page_aligned(PGD_ORDER);
+#ifdef CONFIG_64BIT
+#if defined(CONFIG_MODULES) && !defined(CONFIG_BUILD_ELF64)
+pgd_t module_pg_dir[PTRS_PER_PGD] __page_aligned(PGD_ORDER);
+#endif
+pmd_t invalid_pmd_table[PTRS_PER_PMD] __page_aligned(PMD_ORDER);
+#endif
+pte_t invalid_pte_table[PTRS_PER_PTE] __page_aligned(PTE_ORDER);
^ permalink raw reply related [flat|nested] 4+ messages in thread
* Re: [PATCH][RFC] Move some kernel globals from asm file to C file.
2007-01-23 15:38 [PATCH][RFC] Move some kernel globals from asm file to C file Atsushi Nemoto
@ 2007-01-23 16:12 ` Ralf Baechle
2007-01-23 16:21 ` Atsushi Nemoto
0 siblings, 1 reply; 4+ messages in thread
From: Ralf Baechle @ 2007-01-23 16:12 UTC (permalink / raw)
To: Atsushi Nemoto; +Cc: linux-mips
On Wed, Jan 24, 2007 at 12:38:59AM +0900, Atsushi Nemoto wrote:
> 801ce000 B fw_arg3
> 801ce004 B fw_arg1
> 801cf000 B swapper_pg_dir
> 801d0000 B invalid_pte_table
> 801d1000 B fw_arg2
> 801d1008 B kernelsp
> 801d1010 B fw_arg0
> 801d1018 B pgd_current
> 801d1020 A __bss_stop
> 801d1020 A _end
>
> It looks less efficient while fw_arg[0-3] are all 4 byte.
>
> Is there any point on declaring those symbols in asm file? If
> nothing, how about moving them to C file? And I can not see why
> kernel_sp and pgd_current have 8-byte size even on 32-bit kernel.
>
> Here is a proposal patch. Comments?
Looks ok but I think all the pagetable stuff should move to somewhere
like arch/mips/mm/init.c.
Ralf
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [PATCH][RFC] Move some kernel globals from asm file to C file.
2007-01-23 16:12 ` Ralf Baechle
@ 2007-01-23 16:21 ` Atsushi Nemoto
2007-01-23 17:04 ` Ralf Baechle
0 siblings, 1 reply; 4+ messages in thread
From: Atsushi Nemoto @ 2007-01-23 16:21 UTC (permalink / raw)
To: ralf; +Cc: linux-mips
On Tue, 23 Jan 2007 16:12:26 +0000, Ralf Baechle <ralf@linux-mips.org> wrote:
> Looks ok but I think all the pagetable stuff should move to somewhere
> like arch/mips/mm/init.c.
Thanks, updated. Also use "#ifdef MODULE_START" instead of complex
condition.
Subject: Move some kernel globals from asm file to C file.
This get rid of some undesirable hole in BSS section due to random
order of placement.
Signed-off-by: Atsushi Nemoto <anemo@mba.ocn.ne.jp>
---
arch/mips/kernel/asm-offsets.c | 4 ----
arch/mips/kernel/head.S | 25 -------------------------
arch/mips/kernel/setup.c | 3 +++
arch/mips/mm/init.c | 15 +++++++++++++++
4 files changed, 18 insertions(+), 29 deletions(-)
diff --git a/arch/mips/kernel/asm-offsets.c b/arch/mips/kernel/asm-offsets.c
index ff88b06..ea7df4b 100644
--- a/arch/mips/kernel/asm-offsets.c
+++ b/arch/mips/kernel/asm-offsets.c
@@ -234,10 +234,6 @@ void output_mm_defines(void)
constant("#define _PMD_SHIFT ", PMD_SHIFT);
constant("#define _PGDIR_SHIFT ", PGDIR_SHIFT);
linefeed;
- constant("#define _PGD_ORDER ", PGD_ORDER);
- constant("#define _PMD_ORDER ", PMD_ORDER);
- constant("#define _PTE_ORDER ", PTE_ORDER);
- linefeed;
constant("#define _PTRS_PER_PGD ", PTRS_PER_PGD);
constant("#define _PTRS_PER_PMD ", PTRS_PER_PMD);
constant("#define _PTRS_PER_PTE ", PTRS_PER_PTE);
diff --git a/arch/mips/kernel/head.S b/arch/mips/kernel/head.S
index 9a7811d..6f57ca4 100644
--- a/arch/mips/kernel/head.S
+++ b/arch/mips/kernel/head.S
@@ -231,28 +231,3 @@ NESTED(smp_bootstrap, 16, sp)
#endif /* CONFIG_SMP */
__FINIT
-
- .comm kernelsp, NR_CPUS * 8, 8
- .comm pgd_current, NR_CPUS * 8, 8
-
- .comm fw_arg0, SZREG, SZREG # firmware arguments
- .comm fw_arg1, SZREG, SZREG
- .comm fw_arg2, SZREG, SZREG
- .comm fw_arg3, SZREG, SZREG
-
- .macro page name, order
- .comm \name, (_PAGE_SIZE << \order), (_PAGE_SIZE << \order)
- .endm
-
- /*
- * On 64-bit we've got three-level pagetables with a slightly
- * different layout ...
- */
- page swapper_pg_dir, _PGD_ORDER
-#ifdef CONFIG_64BIT
-#if defined(CONFIG_MODULES) && !defined(CONFIG_BUILD_ELF64)
- page module_pg_dir, _PGD_ORDER
-#endif
- page invalid_pmd_table, _PMD_ORDER
-#endif
- page invalid_pte_table, _PTE_ORDER
diff --git a/arch/mips/kernel/setup.c b/arch/mips/kernel/setup.c
index 89440a0..8da9d03 100644
--- a/arch/mips/kernel/setup.c
+++ b/arch/mips/kernel/setup.c
@@ -541,3 +541,6 @@ int __init dsp_disable(char *s)
}
__setup("nodsp", dsp_disable);
+
+unsigned long kernelsp[NR_CPUS];
+unsigned long fw_arg0, fw_arg1, fw_arg2, fw_arg3;
diff --git a/arch/mips/mm/init.c b/arch/mips/mm/init.c
index 30245c0..1e1427a 100644
--- a/arch/mips/mm/init.c
+++ b/arch/mips/mm/init.c
@@ -507,3 +507,18 @@ void free_initmem(void)
__pa_symbol(&__init_begin),
__pa_symbol(&__init_end));
}
+
+unsigned long pgd_current[NR_CPUS];
+/*
+ * On 64-bit we've got three-level pagetables with a slightly
+ * different layout ...
+ */
+#define __page_aligned(order) __attribute__((__aligned__(PAGE_SIZE<<order)))
+pgd_t swapper_pg_dir[PTRS_PER_PGD] __page_aligned(PGD_ORDER);
+#ifdef CONFIG_64BIT
+#ifdef MODULE_START
+pgd_t module_pg_dir[PTRS_PER_PGD] __page_aligned(PGD_ORDER);
+#endif
+pmd_t invalid_pmd_table[PTRS_PER_PMD] __page_aligned(PMD_ORDER);
+#endif
+pte_t invalid_pte_table[PTRS_PER_PTE] __page_aligned(PTE_ORDER);
^ permalink raw reply related [flat|nested] 4+ messages in thread
* Re: [PATCH][RFC] Move some kernel globals from asm file to C file.
2007-01-23 16:21 ` Atsushi Nemoto
@ 2007-01-23 17:04 ` Ralf Baechle
0 siblings, 0 replies; 4+ messages in thread
From: Ralf Baechle @ 2007-01-23 17:04 UTC (permalink / raw)
To: Atsushi Nemoto; +Cc: linux-mips
On Wed, Jan 24, 2007 at 01:21:05AM +0900, Atsushi Nemoto wrote:
> Thanks, updated. Also use "#ifdef MODULE_START" instead of complex
> condition.
Thanks, queued.
Ralf
^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2007-01-23 17:04 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2007-01-23 15:38 [PATCH][RFC] Move some kernel globals from asm file to C file Atsushi Nemoto
2007-01-23 16:12 ` Ralf Baechle
2007-01-23 16:21 ` Atsushi Nemoto
2007-01-23 17:04 ` Ralf Baechle
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox