Discussion:
[PATCH] m68k: Increase initial mapping to 16MB if possible
Andreas Schwab
2014-04-24 10:24:48 UTC
Permalink
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.

Signed-off-by: Andreas Schwab <***@linux-m68k.org>
---
arch/m68k/kernel/head.S | 9 ++++++++-
arch/m68k/mm/motorola.c | 2 +-
2 files changed, 9 insertions(+), 2 deletions(-)

diff --git a/arch/m68k/kernel/head.S b/arch/m68k/kernel/head.S
index ac85f16..23091ea 100644
--- a/arch/m68k/kernel/head.S
+++ b/arch/m68k/kernel/head.S
@@ -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'
diff --git a/arch/m68k/mm/motorola.c b/arch/m68k/mm/motorola.c
index 251c543..0e4c3a9 100644
--- a/arch/m68k/mm/motorola.c
+++ b/arch/m68k/mm/motorola.c
@@ -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;
--
1.9.2
--
Andreas Schwab, ***@linux-m68k.org
GPG Key fingerprint = 58CA 54C7 6D53 942B 1756 01D3 44D5 214B 8276 4ED5
"And now for something completely different."
Michael Schmitz
2014-04-25 09:37:52 UTC
Permalink
Thanks Andreas,
Post by Andreas Schwab
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
Post by Andreas Schwab
---
arch/m68k/kernel/head.S | 9 ++++++++-
arch/m68k/mm/motorola.c | 2 +-
2 files changed, 9 insertions(+), 2 deletions(-)
diff --git a/arch/m68k/kernel/head.S b/arch/m68k/kernel/head.S
index ac85f16..23091ea 100644
--- a/arch/m68k/kernel/head.S
+++ b/arch/m68k/kernel/head.S
* First map the first 4 MB of kernel code & data
*/
+ get_bi_record BI_MEMCHUNK
+ movel #16*1024*1024,%d1
+ cmpl %d0,%d1
+ jls 1f
+ lsrl #1,%d1
+ cmpl %d0,%d1
+ jls 1f
+ lsrl #1,%d1
Post by Andreas Schwab
putc 'C'
diff --git a/arch/m68k/mm/motorola.c b/arch/m68k/mm/motorola.c
index 251c543..0e4c3a9 100644
--- a/arch/m68k/mm/motorola.c
+++ b/arch/m68k/mm/motorola.c
@@ -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;
Thorsten Glaser
2014-04-29 10:11:55 UTC
Permalink
Post by Andreas Schwab
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?
Post by Andreas Schwab
/* 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)
Ah, so this is where we missed when I tried earlier.

bye,
//mirabilos
Andreas Schwab
2014-04-29 10:33:44 UTC
Permalink
Post by Thorsten Glaser
Post by Andreas Schwab
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.
--
Andreas Schwab, ***@linux-m68k.org
GPG Key fingerprint = 58CA 54C7 6D53 942B 1756 01D3 44D5 214B 8276 4ED5
"And now for something completely different."
Geert Uytterhoeven
2014-04-29 16:29:27 UTC
Permalink
Post by Andreas Schwab
Post by Thorsten Glaser
Post by Andreas Schwab
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 -- ***@linux-m68k.org

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
Andreas Schwab
2014-04-29 16:43:32 UTC
Permalink
Post by Geert Uytterhoeven
Always increases the initial mapping to 16 MiB.
You can't map more than is available.

Andreas.
--
Andreas Schwab, ***@linux-m68k.org
GPG Key fingerprint = 58CA 54C7 6D53 942B 1756 01D3 44D5 214B 8276 4ED5
"And now for something completely different."
Michael Schmitz
2014-04-30 07:38:41 UTC
Permalink
Hi Andreas,

first off - thanks for the patch!
Post by Andreas Schwab
Post by 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
2014-05-25 16:57:49 UTC
Permalink
Hi Michael, Andreas,
Post by Michael Schmitz
first off - thanks for the patch!
Indeed.
Post by Michael Schmitz
Post by Andreas Schwab
Post by 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.
Post by Michael Schmitz
From fac30ceba841cd5e076f4c0e83b05ca3ba9d3eb2 Mon Sep 17 00:00:00 2001
From: Andreas Schwab <***@linux-m68k.org>
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).

Signed-off-by: Andreas Schwab <***@linux-m68k.org>

- Add support for 8 MiB,
- Store initial mapping size in head.S for later reuse,
- Add comment about large kernels.

Signed-off-by: Geert Uytterhoeven <***@linux-m68k.org>
---
arch/m68k/kernel/head.S | 19 +++++++++++++++++--
arch/m68k/mm/motorola.c | 10 ++++++----
2 files changed, 23 insertions(+), 6 deletions(-)

diff --git a/arch/m68k/kernel/head.S b/arch/m68k/kernel/head.S
index 145bc3d5b3da..9745156b1db8 100644
--- a/arch/m68k/kernel/head.S
+++ b/arch/m68k/kernel/head.S
@@ -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):
diff --git a/arch/m68k/mm/motorola.c b/arch/m68k/mm/motorola.c
index cf4dfc7eeb29..3bdc56a882fd 100644
--- a/arch/m68k/mm/motorola.c
+++ b/arch/m68k/mm/motorola.c
@@ -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 -- ***@linux-m68k.org

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
Michael Schmitz
2014-05-26 01:28:09 UTC
Permalink
Hi Geert,
Post by Geert Uytterhoeven
Post by Michael Schmitz
Post by Andreas Schwab
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.
Post by Geert Uytterhoeven
Andreas, I amended your patch like below, and plan to queue it for 3.16.
Definitely more elegant than my version :-)

Cheers,

Michael
Post by Geert Uytterhoeven
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.
Post by Michael Schmitz
From fac30ceba841cd5e076f4c0e83b05ca3ba9d3eb2 Mon Sep 17 00:00:00 2001
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(-)
diff --git a/arch/m68k/kernel/head.S b/arch/m68k/kernel/head.S
index 145bc3d5b3da..9745156b1db8 100644
--- a/arch/m68k/kernel/head.S
+++ b/arch/m68k/kernel/head.S
@@ -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
*
* 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
*/
+ get_bi_record BI_MEMCHUNK
+ movel #16*1024*1024,%d1
+ cmpl %d0,%d1
+ jls 1f
+ lsrl #1,%d1
+ cmpl %d0,%d1
+ jls 1f
+ lsrl #1,%d1
+ movel %d1,m68k_init_mapped_size
putc 'C'
@@ -3729,6 +3741,9 @@ func_return console_plot_pixel
__INITDATA
.align 4
+ .long 0
+
#if defined(CONFIG_ATARI) || defined(CONFIG_AMIGA) || \
defined(CONFIG_HP300) || defined(CONFIG_APOLLO)
diff --git a/arch/m68k/mm/motorola.c b/arch/m68k/mm/motorola.c
index cf4dfc7eeb29..3bdc56a882fd 100644
--- a/arch/m68k/mm/motorola.c
+++ b/arch/m68k/mm/motorola.c
@@ -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
--
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
Andreas Schwab
2014-06-28 12:46:36 UTC
Permalink
Post by Geert Uytterhoeven
Andreas, I amended your patch like below, and plan to queue it for 3.16.
That doesn't work.

Andreas.
--
Andreas Schwab, ***@linux-m68k.org
GPG Key fingerprint = 58CA 54C7 6D53 942B 1756 01D3 44D5 214B 8276 4ED5
"And now for something completely different."
Geert Uytterhoeven
2014-06-28 13:26:06 UTC
Permalink
Hi Andreas,
Post by Andreas Schwab
Post by 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 -- ***@linux-m68k.org

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
Andreas Schwab
2014-06-28 13:49:47 UTC
Permalink
Post by Michael Schmitz
Hi Andreas,
Post by Andreas Schwab
Post by 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.
--
Andreas Schwab, ***@linux-m68k.org
GPG Key fingerprint = 58CA 54C7 6D53 942B 1756 01D3 44D5 214B 8276 4ED5
"And now for something completely different."
Geert Uytterhoeven
2014-06-28 14:29:07 UTC
Permalink
Hi Andreas,
Post by Andreas Schwab
Post by Geert Uytterhoeven
Post by Andreas Schwab
Post by 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 -- ***@linux-m68k.org

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
Andreas Schwab
2014-06-28 14:36:19 UTC
Permalink
Post by Geert Uytterhoeven
In what way doesn't it work?
[ 0.000000] bootmem alloc of 4096 bytes failed!

Andreas.
--
Andreas Schwab, ***@linux-m68k.org
GPG Key fingerprint = 58CA 54C7 6D53 942B 1756 01D3 44D5 214B 8276 4ED5
"And now for something completely different."
Geert Uytterhoeven
2014-06-28 15:55:14 UTC
Permalink
Hi Andreas,
Post by Andreas Schwab
Post by Geert Uytterhoeven
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 -- ***@linux-m68k.org

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
Andreas Schwab
2014-06-28 16:27:33 UTC
Permalink
I guess this failure can be triggered with some specific memory
configuration with your original version, too.
No.

Andreas.
--
Andreas Schwab, ***@linux-m68k.org
GPG Key fingerprint = 58CA 54C7 6D53 942B 1756 01D3 44D5 214B 8276 4ED5
"And now for something completely different."
Geert Uytterhoeven
2014-07-06 09:31:10 UTC
Permalink
Hi Andreas,
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?

diff --git a/arch/m68k/kernel/head.S b/arch/m68k/kernel/head.S
index dbb118e1a4e0..a54788458ca3 100644
--- a/arch/m68k/kernel/head.S
+++ b/arch/m68k/kernel/head.S
@@ -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 -- ***@linux-m68k.org

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
Andreas Schwab
2014-07-07 22:11:57 UTC
Permalink
Post by Geert Uytterhoeven
Does this (whitespace-damaged) patch help?
Yes, that helps.

Andreas.
--
Andreas Schwab, ***@linux-m68k.org
GPG Key fingerprint = 58CA 54C7 6D53 942B 1756 01D3 44D5 214B 8276 4ED5
"And now for something completely different."
Geert Uytterhoeven
2014-07-08 07:23:05 UTC
Permalink
Hi Andreas,
Post by Andreas Schwab
Post by Geert Uytterhoeven
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 -- ***@linux-m68k.org

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

Loading...