m68k: Increase initial mapping to 16MB if possible
PATCH 1/1 m68k: Increase initial mapping to 16MB if possible
If the size of the first memory chunk is at least 16MB increase the initial mapping to 16MB instead of 4MB. This makes it possible to map more memory in the first node without running out of space for the page tables.
--- arch/m68k/kernel/head.S | 9 ++++++++- arch/m68k/mm/motorola.c | 2 +- 2 files changed, 9 insertions(+), 2 deletions(-)
arch/m68k/kernel/head.S +8 -1
@@ -941,7 +941,14 @@ L(nocon): * First map the first 4 MB of kernel code & data */ - mmu_map #PAGE_OFFSET,%pc@(L(phys_kernel_start)),#4*1024*1024,\ + get_bi_record BI_MEMCHUNK + movel %a0@(4),%d0 + movel #16*1024*1024,%d1 + cmpl %d0,%d1 + jls 1f + lsrl #2,%d1 +1: + mmu_map #PAGE_OFFSET,%pc@(L(phys_kernel_start)),%d1,\ %pc@(m68k_supervisor_cachemode) putc 'C'
arch/m68k/mm/motorola.c +1 -1
@@ -45,7 +45,7 @@ EXPORT_SYMBOL(mm_cachebits);#endif /* size of memory already mapped in head.S */ -#define INIT_MAPPED_SIZE (4UL<<20) +#define INIT_MAPPED_SIZE (m68k_memory[0].size >= 16UL<<20 ? 16UL<<20 : 4UL<<20)extern unsigned long availmem;
Signature · 7 lines
1.9.2 -- Andreas Schwab, [email protected] GPG Key fingerprint = 58CA 54C7 6D53 942B 1756 01D3 44D5 214B 8276 4ED5 "And now for something completely different."
Thanks Andreas,
Quoted 6 lines
If the size of the first memory chunk is at least 16MB increase the initial mapping to 16MB instead of 4MB. This makes it possible to map more memory in the first node without running out of space for the page tables.
Minor nit - the Falcon has 14MB, not 16MB. Not sure how large ST-RAM was on the TTs - trying for 8MB as well might be safer?
Cheers,
Michael
Quoted 12 lines
Signed-off-by Andreas Schwab <[email protected]>--- arch/m68k/kernel/head.S | 9 ++++++++- arch/m68k/mm/motorola.c | 2 +- 2 files changed, 9 insertions(+), 2 deletions(-)arch/m68k/kernel/head.S +0
-0@@ -941,7 +941,14 @@ L(nocon): * First map the first 4 MB of kernel code & data
arch/m68k/kernel/head.S L(nocon): · line 950
Quoted 10 lines
arch/m68k/kernel/head.S +6
-1*/ - mmu_map #PAGE_OFFSET,%pc@(L(phys_kernel_start)),#4*1024*1024,\ + get_bi_record BI_MEMCHUNK + movel %a0@(4),%d0 + movel #16*1024*1024,%d1 + cmpl %d0,%d1 + jls 1f + lsrl #1,%d1
+ cmpl %d0,%d1
+ jls 1f
+ lsrl #1,%d1
Quoted 19 lines
arch/m68k/kernel/head.S +2
-0+1: + mmu_map #PAGE_OFFSET,%pc@(L(phys_kernel_start)),%d1,\ %pc@(m68k_supervisor_cachemode)arch/m68k/kernel/head.S +0
-0putc 'C'arch/m68k/mm/motorola.c +1
-1@@ -45,7 +45,7 @@ EXPORT_SYMBOL(mm_cachebits);#endif /* size of memory already mapped in head.S */ -#define INIT_MAPPED_SIZE (4UL<<20) +#define INIT_MAPPED_SIZE (m68k_memory[0].size >= 16UL<<20 ? 16UL<<20 : 4UL<<20)extern unsigned long availmem;
Quoted 2 lines · Andreas Schwab <schwab <at> linux-m68k.org> writes:
If the size of the first memory chunk is at least 16MB increase the initial mapping to 16MB instead of 4MB. This makes it possible to map
Why not always?
Review
Quoted 3 lines
/* size of memory already mapped in
head.S*/(quoted diff) +1
-1-#define INIT_MAPPED_SIZE (4UL<<20) +#define INIT_MAPPED_SIZE (m68k_memory[0].size >= 16UL<<20 ? 16UL<<20 :
4UL<<20)
Ah, so this is where we missed when I tried earlier.
bye,
//mirabilos
Quoted 6 lines · Thorsten Glaser
Quoted 2 lines · Andreas Schwab <schwab <at> linux-m68k.org> writes:
If the size of the first memory chunk is at least 16MB increase the initial mapping to 16MB instead of 4MB. This makes it possible to map
Why not always?
Always what?
Andreas.
Signature · 3 lines
Andreas Schwab, [email protected] GPG Key fingerprint = 58CA 54C7 6D53 942B 1756 01D3 44D5 214B 8276 4ED5 "And now for something completely different."
Geert Uytterhoeven
maintainerQuoted 10 lines · Andreas Schwab
Quoted 6 lines · Thorsten Glaser
Quoted 2 lines · Andreas Schwab <schwab <at> linux-m68k.org> writes:
If the size of the first memory chunk is at least 16MB increase the initial mapping to 16MB instead of 4MB. This makes it possible to map
Why not always?
Always what?
Always increases the initial mapping to 16 MiB.
Gr{oetje,eeting}s,
Geert
--
Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- [email protected]
In personal conversations with technical people, I call myself a hacker. But when I'm talking to journalists I just say "programmer" or something like that.
-- Linus Torvalds
Quoted 1 line · Geert Uytterhoeven
Always increases the initial mapping to 16 MiB.
You can't map more than is available.
Andreas.
Signature · 3 lines
Andreas Schwab, [email protected] GPG Key fingerprint = 58CA 54C7 6D53 942B 1756 01D3 44D5 214B 8276 4ED5 "And now for something completely different."
Hi Andreas,
first off - thanks for the patch!
Quoted 5 lines
Quoted 1 line · Geert Uytterhoeven
Always increases the initial mapping to 16 MiB.
You can't map more than is available.
How about trying for 16, then 8, then 4? Would help my 14 MB ST-RAM Falcon.
I had a patch half prepared for that which I forgot to send ...
Cheers,
Michael
Geert Uytterhoeven
maintainerHi Michael, Andreas,
Quoted 1 line · Michael Schmitz
first off - thanks for the patch!
Indeed.
Quoted 8 lines
Quoted 5 lines
Quoted 1 line · Geert Uytterhoeven
Always increases the initial mapping to 16 MiB.
You can't map more than is available.
How about trying for 16, then 8, then 4? Would help my 14 MB ST-RAM Falcon.
I had a patch half prepared for that which I forgot to send ...
And thus I never saw it ;-)
Andreas, I amended your patch like below, and plan to queue it for 3.16. This allows me to boot a multi_defconfig kernel on ARAnyM, with 14 MiB ST-RAM in the first chunk, which didn't work with your 16 MiB-only version.
Quoted 1 line
From
fac30ceba841cd5e076f4c0e83b05ca3ba9d3eb2Mon Sep 17 00:00:00 2001
From: Andreas Schwab <[email protected]>
Date: Thu, 24 Apr 2014 12:24:48 +0200
Subject: [PATCH] m68k: Increase initial mapping to 8 or 16 MiB if possible
If the size of the first memory chunk is at least 8 or 16 MiB increase the initial mapping to 8 resp. 16 MiB instead of 4 MiB.
This makes it possible to
1. Map more memory in the first node without running out of space for the page tables,
2. Boot kernels that don't fit in 4 MiB (e.g. multi_defconfig).
- Add support for 8 MiB,
- Store initial mapping size in head.S for later reuse,
- Add comment about large kernels.
--- arch/m68k/kernel/head.S | 19 +++++++++++++++++-- arch/m68k/mm/motorola.c | 10 ++++++---- 2 files changed, 23 insertions(+), 6 deletions(-)
arch/m68k/kernel/head.S +17 -2
@@ -292,6 +292,7 @@ .globl kernel_pg_dir .globl availmem +.globl m68k_init_mapped_size .globl m68k_pgtable_cachemode .globl m68k_supervisor_cachemode #ifdef CONFIG_MVME16x
@@ -907,10 +908,21 @@ L(nocon): * * This block of code does what's necessary to map in the various kinds * of machines for execution of Linux. - * First map the first 4 MB of kernel code & data + * First map the first 4, 8, or 16 MB of kernel code & data */ - mmu_map #PAGE_OFFSET,%pc@(L(phys_kernel_start)),#4*1024*1024,\ + get_bi_record BI_MEMCHUNK + movel %a0@(4),%d0 + movel #16*1024*1024,%d1 + cmpl %d0,%d1 + jls 1f + lsrl #1,%d1 + cmpl %d0,%d1 + jls 1f + lsrl #1,%d1 +1: + movel %d1,m68k_init_mapped_size + mmu_map #PAGE_OFFSET,%pc@(L(phys_kernel_start)),%d1,\ %pc@(m68k_supervisor_cachemode) putc 'C'
@@ -3729,6 +3741,9 @@ func_return console_plot_pixel __INITDATA .align 4 +m68k_init_mapped_size: + .long 0 + #if defined(CONFIG_ATARI) || defined(CONFIG_AMIGA) || \ defined(CONFIG_HP300) || defined(CONFIG_APOLLO) L(custom):
arch/m68k/mm/motorola.c +6 -4
@@ -45,7 +45,7 @@ EXPORT_SYMBOL(mm_cachebits);#endif /* size of memory already mapped in head.S */ -#define INIT_MAPPED_SIZE (4UL<<20) +extern __initdata unsigned long m68k_init_mapped_size;extern unsigned long availmem;
@@ -273,10 +273,12 @@ printk("*** m68k_virt_to_node_shift = %d\n", m68k_virt_to_node_shift);*/ addr = m68k_memory[0 ].addr; size = m68k_memory[0 ].size; -free_bootmem_node (NODE_DATA (0 ), availmem,min (INIT_MAPPED_SIZE , size) - (availmem - addr)); +free_bootmem_node (NODE_DATA (0 ), availmem, +min (m68k_init_mapped_size, size) - (availmem - addr));map_node (0 ); -if (size >INIT_MAPPED_SIZE ) -free_bootmem_node (NODE_DATA (0 ), addr +INIT_MAPPED_SIZE , size -INIT_MAPPED_SIZE ); +if (size > m68k_init_mapped_size) +free_bootmem_node (NODE_DATA (0 ), addr + m68k_init_mapped_size, + size - m68k_init_mapped_size);for (i =1 ; i < m68k_num_memory; i++)map_node (i);
Signature · 12 lines
1.9.1
Gr{oetje,eeting}s,
Geert
--
Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- [email protected]
In personal conversations with technical people, I call myself a hacker. But
when I'm talking to journalists I just say "programmer" or something like that.
-- Linus TorvaldsHi Geert,
Quoted 7 lines
Quoted 5 lines
Quoted 2 lines
You can't map more than is available.
How about trying for 16, then 8, then 4? Would help my 14 MB ST-RAM Falcon.
I had a patch half prepared for that which I forgot to send ...
And thus I never saw it ;-)
Sorry - I just didn't want to send out assembly code patches I never attempted to compile. Happy to do that for C code, but that's bad enough for me.
Quoted 1 line
Andreas, I amended your patch like below, and plan to queue it for 3.16.
Definitely more elegant than my version :-)
Cheers,
Michael
Quoted 115 lines
This allows me to boot a
multi_defconfigkernel on ARAnyM, with 14 MiB ST-RAM in the first chunk, which didn't work with your 16 MiB-only version.Quoted 1 line
From
fac30ceba841cd5e076f4c0e83b05ca3ba9d3eb2Mon Sep 17 00:00:00 2001From: Andreas Schwab <[email protected]>
Date: Thu, 24 Apr 2014 12:24:48 +0200
Subject: [PATCH] m68k: Increase initial mapping to 8 or 16 MiB if possibleIf the size of the first memory chunk is at least 8 or 16 MiB increase the initial mapping to 8 resp. 16 MiB instead of 4 MiB.
This makes it possible to
1. Map more memory in the first node without running out of space for the page tables,
2. Boot kernels that don't fit in 4 MiB (e.g.multi_defconfig).Signed-off-by Andreas Schwab <[email protected]>- Add support for 8 MiB,
- Store initial mapping size inhead.Sfor later reuse,
- Add comment about large kernels.Signed-off-by Geert Uytterhoeven <[email protected]>--- arch/m68k/kernel/head.S | 19 +++++++++++++++++-- arch/m68k/mm/motorola.c | 10 ++++++---- 2 files changed, 23 insertions(+), 6 deletions(-)arch/m68k/kernel/head.S +17
-2@@ -292,6 +292,7 @@ .globl kernel_pg_dir .globl availmem +.globl m68k_init_mapped_size .globl m68k_pgtable_cachemode .globl m68k_supervisor_cachemode #ifdef CONFIG_MVME16x@@ -907,10 +908,21 @@ L(nocon): * * This block of code does what's necessary to map in the various kinds * of machines for execution of Linux. - * First map the first 4 MB of kernel code & data + * First map the first 4, 8, or 16 MB of kernel code & data */ - mmu_map #PAGE_OFFSET,%pc@(L(phys_kernel_start)),#4*1024*1024,\ + get_bi_record BI_MEMCHUNK + movel %a0@(4),%d0 + movel #16*1024*1024,%d1 + cmpl %d0,%d1 + jls 1f + lsrl #1,%d1 + cmpl %d0,%d1 + jls 1f + lsrl #1,%d1 +1: + movel %d1,m68k_init_mapped_size + mmu_map #PAGE_OFFSET,%pc@(L(phys_kernel_start)),%d1,\ %pc@(m68k_supervisor_cachemode) putc 'C'@@ -3729,6 +3741,9 @@ func_return console_plot_pixel __INITDATA .align 4 +m68k_init_mapped_size: + .long 0 + #if defined(CONFIG_ATARI) || defined(CONFIG_AMIGA) || \ defined(CONFIG_HP300) || defined(CONFIG_APOLLO) L(custom):arch/m68k/mm/motorola.c +6
-5@@ -45,7 +45,7 @@ EXPORT_SYMBOL(mm_cachebits);#endif /* size of memory already mapped in head.S */ -#define INIT_MAPPED_SIZE (4UL<<20) +extern __initdata unsigned long m68k_init_mapped_size;extern unsigned long availmem;@@ -273,10 +273,12 @@ printk("*** m68k_virt_to_node_shift = %d\n", m68k_virt_to_node_shift);*/ addr = m68k_memory[0 ].addr; size = m68k_memory[0 ].size; -free_bootmem_node (NODE_DATA (0 ), availmem,min (INIT_MAPPED_SIZE , size) - (availmem - addr)); +free_bootmem_node (NODE_DATA (0 ), availmem, +min (m68k_init_mapped_size, size) - (availmem - addr));map_node (0 ); -if (size >INIT_MAPPED_SIZE ) -free_bootmem_node (NODE_DATA (0 ), addr +INIT_MAPPED_SIZE , size -INIT_MAPPED_SIZE ); +if (size > m68k_init_mapped_size) +free_bootmem_node (NODE_DATA (0 ), addr + m68k_init_mapped_size, + size - m68k_init_mapped_size);for (i =1 ; i < m68k_num_memory; i++)map_node (i); --1.9.1
Gr{oetje,eeting}s,
Geert
--
Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- [email protected]In personal conversations with technical people, I call myself a hacker. But when I'm talking to journalists I just say "programmer" or something like that.
-- Linus Torvalds
Quoted 1 line · Geert Uytterhoeven
Andreas, I amended your patch like below, and plan to queue it for 3.16.
That doesn't work.
Andreas.
Signature · 3 lines
Andreas Schwab, [email protected] GPG Key fingerprint = 58CA 54C7 6D53 942B 1756 01D3 44D5 214B 8276 4ED5 "And now for something completely different."
Geert Uytterhoeven
maintainerHi Andreas,
Quoted 4 lines · Andreas Schwab
Quoted 1 line · Geert Uytterhoeven
Andreas, I amended your patch like below, and plan to queue it for 3.16.
That doesn't work.
What doesn't work?
BTW, it's upstream since v3.16-rc1.
Gr{oetje,eeting}s,
Geert
--
Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- [email protected]
In personal conversations with technical people, I call myself a hacker. But when I'm talking to journalists I just say "programmer" or something like that.
-- Linus Torvalds
Quoted 9 lines · Geert Uytterhoeven
Hi Andreas,
Quoted 4 lines · Andreas Schwab
Quoted 1 line · Geert Uytterhoeven
Andreas, I amended your patch like below, and plan to queue it for 3.16.
That doesn't work.
What doesn't work?
Your amendment.
Andreas.
Signature · 3 lines
Andreas Schwab, [email protected] GPG Key fingerprint = 58CA 54C7 6D53 942B 1756 01D3 44D5 214B 8276 4ED5 "And now for something completely different."
Geert Uytterhoeven
maintainerHi Andreas,
Quoted 10 lines · Andreas Schwab
Quoted 7 lines · Geert Uytterhoeven
Quoted 4 lines · Andreas Schwab
Quoted 1 line · Geert Uytterhoeven
Andreas, I amended your patch like below, and plan to queue it for 3.16.
That doesn't work.
What doesn't work?
Your amendment.
In what way doesn't it work?
Can you please be a bit clearer? Thanks!
Gr{oetje,eeting}s,
Geert
--
Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- [email protected]
In personal conversations with technical people, I call myself a hacker. But when I'm talking to journalists I just say "programmer" or something like that.
-- Linus Torvalds
Quoted 1 line · Geert Uytterhoeven
In what way doesn't it work?
[ 0.000000] bootmem alloc of 4096 bytes failed!
Andreas.
Signature · 3 lines
Andreas Schwab, [email protected] GPG Key fingerprint = 58CA 54C7 6D53 942B 1756 01D3 44D5 214B 8276 4ED5 "And now for something completely different."
Geert Uytterhoeven
maintainerHi Andreas,
Quoted 3 lines · Andreas Schwab
Quoted 1 line
In what way doesn't it work?
[ 0.000000] bootmem alloc of 4096 bytes failed!
Interesting. I don't think there are any logical differences between my and your version, if you have 16 MiB in the first chunk.
Perhaps my changes cause one of the sections to grow or shrink by one page, leading to a shortage of one page in the bootmem for you?
Do you know where exactly it fails to allocate one page? Is this while mapping the pages for the rest of RAM? If yes, I guess this failure can be triggered with
some specific memory configuration with your original version, too.
Thanks!
Gr{oetje,eeting}s,
Geert
--
Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- [email protected]
In personal conversations with technical people, I call myself a hacker. But when I'm talking to journalists I just say "programmer" or something like that.
-- Linus Torvalds
Quoted 2 lines · Geert Uytterhoeven
I guess this failure can be triggered with some specific memory configuration with your original version, too.
No.
Andreas.
Signature · 3 lines
Andreas Schwab, [email protected] GPG Key fingerprint = 58CA 54C7 6D53 942B 1756 01D3 44D5 214B 8276 4ED5 "And now for something completely different."
Geert Uytterhoeven
maintainerHi Andreas,
Quoted 5 lines · Andreas Schwab
Quoted 2 lines · Geert Uytterhoeven
I guess this failure can be triggered with some specific memory configuration with your original version, too.
No.
Hmmm...
<guess mode>
Does this (whitespace-damaged) patch help?
arch/m68k/kernel/head.S +2 -1
@@ -921,7 +921,8 @@ L(nocon): jls 1f lsrl #1,%d1 1: - movel %d1,m68k_init_mapped_size + lea %pc@(m68k_init_mapped_size),%a0 + movel %d1,%a0@ mmu_map #PAGE_OFFSET,%pc@(L(phys_kernel_start)),%d1,\ %pc@(m68k_supervisor_cachemode)
</guess mode>
Gr{oetje,eeting}s,
Geert
--
Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- [email protected]
In personal conversations with technical people, I call myself a hacker. But when I'm talking to journalists I just say "programmer" or something like that.
-- Linus Torvalds
Quoted 1 line · Geert Uytterhoeven
Does this (whitespace-damaged) patch help?
Yes, that helps.
Andreas.
Signature · 3 lines
Andreas Schwab, [email protected] GPG Key fingerprint = 58CA 54C7 6D53 942B 1756 01D3 44D5 214B 8276 4ED5 "And now for something completely different."
Geert Uytterhoeven
maintainerHi Andreas,
Quoted 3 lines · Andreas Schwab
Quoted 1 line
Does this (whitespace-damaged) patch help?
Yes, that helps.
Thanks for testing!
Sorry for breaking your patch.
Gr{oetje,eeting}s,
Geert
--
Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- [email protected]
In personal conversations with technical people, I call myself a hacker. But when I'm talking to journalists I just say "programmer" or something like that.
-- Linus Torvalds