Skip to contentSkip to conversation

m68k: Increase initial mapping to 16MB if possible

PATCH In review Andreas Schwab 4 participants 19 messages Apr 24, 2014 – Jul 8, 2014 m68k architecture

lore
Share & tools
lore
#0 lore raw

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
index ac85f16..23091ea 100644
@@ -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
index 251c543..0e4c3a9 100644
@@ -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."
#1 lore raw

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
---
 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
index ac85f16..23091ea 100644
@@ -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 -0
 	putc	'C'
arch/m68k/mm/motorola.c +1 -1
index 251c543..0e4c3a9 100644
@@ -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;
 
#2 lore raw
In reply to Andreas Schwab
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

#3 lore raw
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."
#4 lore raw
Quoted 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

#5 lore raw
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."
#6 lore raw

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

#7 lore raw

Hi 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 fac30ceba841cd5e076f4c0e83b05ca3ba9d3eb2 Mon 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
index 145bc3d5b3da..9745156b1db8 100644
@@ -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
index cf4dfc7eeb29..3bdc56a882fd 100644
@@ -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 Torvalds
#8 lore raw

Hi 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_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 fac30ceba841cd5e076f4c0e83b05ca3ba9d3eb2 Mon 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
index 145bc3d5b3da..9745156b1db8 100644
@@ -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
index cf4dfc7eeb29..3bdc56a882fd 100644
@@ -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

#9 lore raw
In reply to Geert Uytterhoeven
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."
#10 lore raw

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?

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

#11 lore raw
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."
#12 lore raw

Hi 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

#13 lore raw
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."
#14 lore raw

Hi 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

#15 lore raw
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."
#16 lore raw

Hi 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
index dbb118e1a4e0..a54788458ca3 100644
@@ -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

#17 lore raw
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."
#18 lore raw

Hi 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