public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
* [PATCH 1/3] param: Adapt MN10300 to the new parameter handling regime
@ 2008-12-03 16:32 David Howells
  2008-12-03 16:32 ` [PATCH 2/3] [PATCH] param: Stop gcc from inlining empty weak functions David Howells
                   ` (2 more replies)
  0 siblings, 3 replies; 11+ messages in thread
From: David Howells @ 2008-12-03 16:32 UTC (permalink / raw)
  To: rusty; +Cc: dhowells, linux-kernel

Make MN10300 use the new core parameter code.

Signed-off-by: David Howells <dhowells@redhat.com>
---

 arch/mn10300/kernel/setup.c |   50 +++++++++++++++----------------------------
 1 files changed, 18 insertions(+), 32 deletions(-)


diff --git a/arch/mn10300/kernel/setup.c b/arch/mn10300/kernel/setup.c
index e8c5d0b..310d542 100644
--- a/arch/mn10300/kernel/setup.c
+++ b/arch/mn10300/kernel/setup.c
@@ -60,6 +60,7 @@ static struct resource data_resource = {
 static unsigned long __initdata phys_memory_base;
 static unsigned long __initdata phys_memory_end;
 static unsigned long __initdata memory_end;
+static unsigned long __initdata memory_param;
 unsigned long memory_size;
 
 struct thread_info *__current_ti = &init_thread_union.thread_info;
@@ -79,41 +80,17 @@ void __init arch_get_boot_command_line(void)
 }
 
 /*
- * FIXME: use core_param
+ * handle a specific memory limit handed over the kernel command line
  */
-static void __init parse_mem_cmdline(void)
+static int __init mem_parameter(char *data)
 {
-	char *from, *to, c;
+	if (!data || !*data)
+		return 0;
 
-	/* see if there's an explicit memory size option */
-	from = redboot_command_line;
-	to = redboot_command_line;
-	c = ' ';
-
-	for (;;) {
-		if (c == ' ' && !memcmp(from, "mem=", 4)) {
-			if (to != redboot_command_line)
-				to--;
-			memory_size = memparse(from + 4, &from);
-		}
-
-		c = *(from++);
-		if (!c)
-			break;
-
-		*(to++) = c;
-	}
-
-	*to = '\0';
-
-	if (memory_size == 0)
-		panic("Memory size not known\n");
-
-	memory_end = (unsigned long) CONFIG_KERNEL_RAM_BASE_ADDRESS +
-		memory_size;
-	if (memory_end > phys_memory_end)
-		memory_end = phys_memory_end;
+	memory_param = memparse(data, NULL);
+	return 0;
 }
+early_param("mem", mem_parameter);
 
 /*
  * architecture specific setup
@@ -125,7 +102,6 @@ void __init setup_arch(void)
 
 	cpu_init();
 	unit_setup();
-	parse_mem_cmdline();
 
 	init_mm.start_code = (unsigned long)&_text;
 	init_mm.end_code = (unsigned long) &_etext;
@@ -223,6 +199,16 @@ void __init cpu_init(void)
 
 	phys_memory_end = phys_memory_base + memory_size;
 
+	if (memory_param)
+		memory_size = memory_param;
+	if (memory_size == 0)
+		panic("Memory size not known\n");
+
+	memory_end = (unsigned long) CONFIG_KERNEL_RAM_BASE_ADDRESS +
+		memory_size;
+	if (memory_end > phys_memory_end)
+		memory_end = phys_memory_end;
+
 #ifdef CONFIG_FPU
 	fpu_init_state();
 #endif


^ permalink raw reply related	[flat|nested] 11+ messages in thread

* [PATCH 2/3] [PATCH] param: Stop gcc from inlining empty weak functions
  2008-12-03 16:32 [PATCH 1/3] param: Adapt MN10300 to the new parameter handling regime David Howells
@ 2008-12-03 16:32 ` David Howells
  2008-12-05  8:28   ` Rusty Russell
  2008-12-03 16:32 ` [PATCH 3/3] [PATCH] param: Adapt FRV to the new parameter handling regime David Howells
  2008-12-05  8:25 ` [PATCH 1/3] param: Adapt MN10300 " Rusty Russell
  2 siblings, 1 reply; 11+ messages in thread
From: David Howells @ 2008-12-03 16:32 UTC (permalink / raw)
  To: rusty; +Cc: dhowells, linux-kernel

Stop gcc from inlining empty weak functions by making them non-empty.  The gcc
I have for FRV (4.1.2) will inline empty weak functions that are in the same
file, even if those functions are marked 'noinline'.

Without this patch, the default arch_get_boot_command_line() is rolled into
start_kernel(), and the arch specific one is not called, thus making the
kernel unbootable.

Signed-off-by: David Howells <dhowells@redhat.com>
---

 init/main.c |    3 +++
 1 files changed, 3 insertions(+), 0 deletions(-)


diff --git a/init/main.c b/init/main.c
index 92ad2fe..665993b 100644
--- a/init/main.c
+++ b/init/main.c
@@ -522,15 +522,18 @@ static void __init boot_cpu_init(void)
 
 void __init __weak smp_setup_processor_id(void)
 {
+	barrier();
 }
 
 void __init __weak thread_info_cache_init(void)
 {
+	barrier();
 }
 
 /* If the arch already sets boot_command_line, we need do nothing. */
 void __init __weak arch_get_boot_command_line(void)
 {
+	barrier();
 }
 
 /* Ideally, this would take a 'const char *cmdline' param. */


^ permalink raw reply related	[flat|nested] 11+ messages in thread

* [PATCH 3/3] [PATCH] param: Adapt FRV to the new parameter handling regime
  2008-12-03 16:32 [PATCH 1/3] param: Adapt MN10300 to the new parameter handling regime David Howells
  2008-12-03 16:32 ` [PATCH 2/3] [PATCH] param: Stop gcc from inlining empty weak functions David Howells
@ 2008-12-03 16:32 ` David Howells
  2008-12-05  8:25 ` [PATCH 1/3] param: Adapt MN10300 " Rusty Russell
  2 siblings, 0 replies; 11+ messages in thread
From: David Howells @ 2008-12-03 16:32 UTC (permalink / raw)
  To: rusty; +Cc: dhowells, linux-kernel

Make FRV use the new core parameter code.

Signed-off-by: David Howells <dhowells@redhat.com>
---

 arch/frv/kernel/setup.c |   43 ++++++++++++++-----------------------------
 1 files changed, 14 insertions(+), 29 deletions(-)


diff --git a/arch/frv/kernel/setup.c b/arch/frv/kernel/setup.c
index 9548961..2f1506d 100644
--- a/arch/frv/kernel/setup.c
+++ b/arch/frv/kernel/setup.c
@@ -718,36 +718,25 @@ void __cpuinit calibrate_delay(void)
 
 } /* end calibrate_delay() */
 
-/*****************************************************************************/
 /*
- * look through the command line for some things we need to know immediately
- * FIXME: Use core_param or early_param.
+ * handle a specific memory limit handed over the kernel command line
  */
-static void __init parse_cmdline_early(char *cmdline)
+static int __init mem_parameter(char *data)
 {
-	if (!cmdline)
-		return;
-
-	while (*cmdline) {
-		if (*cmdline == ' ')
-			cmdline++;
-
-		/* "mem=XXX[kKmM]" sets SDRAM size to <mem>, overriding the value we worked
-		 * out from the SDRAM controller mask register
-		 */
-		if (!memcmp(cmdline, "mem=", 4)) {
-			unsigned long long mem_size;
-
-			mem_size = memparse(cmdline + 4, &cmdline);
-			memory_end = memory_start + mem_size;
-		}
-
-		while (*cmdline && *cmdline != ' ')
-			cmdline++;
-	}
+	unsigned long long mem_size;
 
-} /* end parse_cmdline_early() */
+	if (!data || !*data)
+		return 0;
+	mem_size = memparse(data, NULL);
+	memory_end = memory_start + mem_size;
+	return 0;
+}
+early_param("mem", mem_parameter);
 
+/*
+ * retrieve the boot command line from RedBoot and stash it somewhere more
+ * appropriate
+ */
 void __init arch_get_boot_command_line(void)
 {
 	memcpy(boot_command_line, redboot_command_line, COMMAND_LINE_SIZE);
@@ -796,10 +785,6 @@ void __init setup_arch(void)
 #endif
 #endif
 
-	/* deal with the command line - RedBoot may have passed one to the kernel */
-	memcpy(command_line, boot_command_line, sizeof(command_line));
-	parse_cmdline_early(command_line);
-
 	/* set up the memory description
 	 * - by now the stack is part of the init task */
 	printk("Memory %08lx-%08lx\n", memory_start, memory_end);


^ permalink raw reply related	[flat|nested] 11+ messages in thread

* Re: [PATCH 1/3] param: Adapt MN10300 to the new parameter handling regime
  2008-12-03 16:32 [PATCH 1/3] param: Adapt MN10300 to the new parameter handling regime David Howells
  2008-12-03 16:32 ` [PATCH 2/3] [PATCH] param: Stop gcc from inlining empty weak functions David Howells
  2008-12-03 16:32 ` [PATCH 3/3] [PATCH] param: Adapt FRV to the new parameter handling regime David Howells
@ 2008-12-05  8:25 ` Rusty Russell
  2008-12-05 11:58   ` David Howells
  2 siblings, 1 reply; 11+ messages in thread
From: Rusty Russell @ 2008-12-05  8:25 UTC (permalink / raw)
  To: David Howells; +Cc: linux-kernel

On Thursday 04 December 2008 03:02:07 David Howells wrote:
> Make MN10300 use the new core parameter code.
> 
> Signed-off-by: David Howells <dhowells@redhat.com>

Hi David,

   Maybe we should add a new param type to the general code so this can be
done with core_param.  See below. Not sure if it's a win tho (many archs want
mem=num@pos, x86 wants mem=nopentium, etc).

I've applied this and 3/3 meanwhile.

Thanks!
Rusty.

param: add "mem" type for module_param/core_param

core_param is now called early enough to be useful for arch's mem=
parameter.  Some archs want fancier parsing, but this allows:

	static unsigned long mem_override;
	core_param(mem, mem_override, mem, 0444);

Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>

diff --git a/include/linux/moduleparam.h b/include/linux/moduleparam.h
--- a/include/linux/moduleparam.h
+++ b/include/linux/moduleparam.h
@@ -94,7 +94,7 @@ struct kparam_array
 	__module_param_call(MODULE_PARAM_PREFIX, name, set, get, arg, perm)
 
 /* Helper functions: type is byte, short, ushort, int, uint, long,
-   ulong, charp, bool or invbool, or XXX if you define param_get_XXX,
+   ulong, charp, bool or invbool, mem or XXX if you define param_get_XXX,
    param_set_XXX and param_check_XXX. */
 #define module_param_named(name, value, type, perm)			   \
 	param_check_##type(name, &(value));				   \
@@ -184,6 +184,10 @@ extern int param_get_invbool(char *buffe
 extern int param_get_invbool(char *buffer, struct kernel_param *kp);
 #define param_check_invbool(name, p) __param_check(name, p, int)
 
+extern int param_set_mem(const char *val, struct kernel_param *kp);
+extern int param_get_mem(char *buffer, struct kernel_param *kp);
+#define param_check_mem(name, p) __param_check(name, p, unsigned long)
+
 /* Comma-separated array: *nump is set to number they actually specified. */
 #define module_param_array_named(name, array, type, nump, perm)		\
 	static const struct kparam_array __param_arr_##name		\
diff --git a/kernel/params.c b/kernel/params.c
--- a/kernel/params.c
+++ b/kernel/params.c
@@ -264,6 +264,44 @@ int param_get_invbool(char *buffer, stru
 int param_get_invbool(char *buffer, struct kernel_param *kp)
 {
 	return sprintf(buffer, "%c", (*(int *)kp->arg) ? 'N' : 'Y');
+}
+
+int param_set_mem(const char *val, struct kernel_param *kp)
+{
+	unsigned long long mem;
+	char *endp;
+
+	if (!val || !*val)
+		return -EINVAL;
+
+	mem = memparse(val, &endp);
+	if (*endp)
+		return -EINVAL;
+
+	if ((unsigned long)mem != mem)
+		return -E2BIG;
+	*(unsigned long *)kp->arg = mem;
+	return 0;
+}
+
+int param_get_mem(char *buffer, struct kernel_param *kp)
+{
+	unsigned long mem = *(unsigned long *)kp->arg;
+	const char *suffix = "";
+
+	if (mem > 0) {
+		if (mem % (1024*1024*1024) == 0) {
+			suffix = "G";
+			mem /= 1024*1024*1024;
+		} else if (mem % (1024*1024) == 0) {
+			suffix = "M";
+			mem /= 1024*1024;
+		} else if (mem % 1024 == 0) {
+			suffix = "K";
+			mem /= 1024;
+		}
+	}		
+	return sprintf(buffer, "%lu%s", mem, suffix);
 }
 
 /* We break the rule and mangle the string. */

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH 2/3] [PATCH] param: Stop gcc from inlining empty weak functions
  2008-12-03 16:32 ` [PATCH 2/3] [PATCH] param: Stop gcc from inlining empty weak functions David Howells
@ 2008-12-05  8:28   ` Rusty Russell
  2008-12-05 12:02     ` David Howells
  0 siblings, 1 reply; 11+ messages in thread
From: Rusty Russell @ 2008-12-05  8:28 UTC (permalink / raw)
  To: David Howells; +Cc: linux-kernel

On Thursday 04 December 2008 03:02:12 David Howells wrote:
> Stop gcc from inlining empty weak functions by making them non-empty.  The gcc
> I have for FRV (4.1.2) will inline empty weak functions that are in the same
> file, even if those functions are marked 'noinline'.
> 
> Without this patch, the default arch_get_boot_command_line() is rolled into
> start_kernel(), and the arch specific one is not called, thus making the
> kernel unbootable.
> 
> Signed-off-by: David Howells <dhowells@redhat.com>

Ouch.  I'd prefer to fix this by moving the weak noop version to
kernel/params.c.  You may still need to fix the rest.

Here's what I ended up with (I'll eventually fold it):

commit 4858874241391aa62b5818781f702883e4ddf4ed
Author: Rusty Russell <rusty@rustcorp.com.au>
Date:   Fri Dec 5 18:56:34 2008 +1030

    Move arch_get_boot_command_line out of init/main.c for broken gccs.

diff --git a/include/linux/init.h b/include/linux/init.h
index 71cd0f5..8cd1a93 100644
--- a/include/linux/init.h
+++ b/include/linux/init.h
@@ -150,7 +150,7 @@ extern unsigned int reset_devices;
 
 /* used by init/main.c */
 void setup_arch(void);
-void arch_get_cmdline(char *cmdline);
+void arch_get_boot_command_line(void);
 void prepare_namespace(void);
 
 extern void (*late_time_init)(void);
diff --git a/init/main.c b/init/main.c
index 9595dba..f6032ba 100644
--- a/init/main.c
+++ b/init/main.c
@@ -528,11 +528,6 @@ void __init __weak thread_info_cache_init(void)
 {
 }
 
-/* If the arch already sets boot_command_line, we need do nothing. */
-void __init __weak arch_get_boot_command_line(void)
-{
-}
-
 /* Ideally, this would take a 'const char *cmdline' param. */
 asmlinkage void __init start_kernel(void)
 {
diff --git a/kernel/params.c b/kernel/params.c
index 69dd623..7fac630 100644
--- a/kernel/params.c
+++ b/kernel/params.c
@@ -30,6 +30,15 @@
 #define DEBUGP(fmt, a...)
 #endif
 
+/*
+ * If the arch already sets boot_command_line, we need do nothing. 
+ * This is not in init/main.c because David Howells reports that on FRV
+ * gcc 4.1.2 will inline empty functions, ignoring noinline and weak.
+ */
+void __init __weak arch_get_boot_command_line(void)
+{
+}
+
 static inline char dash2underscore(char c)
 {
 	if (c == '-')



^ permalink raw reply related	[flat|nested] 11+ messages in thread

* Re: [PATCH 1/3] param: Adapt MN10300 to the new parameter handling regime
  2008-12-05  8:25 ` [PATCH 1/3] param: Adapt MN10300 " Rusty Russell
@ 2008-12-05 11:58   ` David Howells
  2008-12-05 12:55     ` Rusty Russell
  0 siblings, 1 reply; 11+ messages in thread
From: David Howells @ 2008-12-05 11:58 UTC (permalink / raw)
  To: Rusty Russell; +Cc: dhowells, linux-kernel


Rusty Russell <rusty@rustcorp.com.au> wrote:

>    Maybe we should add a new param type to the general code so this can be
> done with core_param.  See below. Not sure if it's a win tho (many archs want
> mem=num@pos, x86 wants mem=nopentium, etc).

I tried applying your patch, and then I added:

	#include <linux/moduleparam.h>

and put this into my code in place of what I had:

	static unsigned long mem_override;
	core_param(mem, mem_override, mem, 0444);

I get the following error, however:

  CC      arch/mn10300/kernel/setup.o
arch/mn10300/kernel/setup.c:86: error: 'param_mem_keeps_reference' undeclared here (not in a function)

I think you're missing:

	#define param_mem_keeps_reference 0

from the stuff you added.

With that, the core_param stuff does work for mem=...  But I object to
mem_override not being __initdata.  I also don't think the parameter should
appear in sysfs - that's just a waste of resources.  It should, perhaps,
appear in /proc/cmdline, but for some reason it does not.  I can live without
that, though, since its effect appears in /proc/meminfo.

Also, something else to consider: If CONFIG_MODULES=n and CONFIG_SYSFS=n,
should the contents of kernel/params.c be discarded along with the __init
sections?

David

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH 2/3] [PATCH] param: Stop gcc from inlining empty weak functions
  2008-12-05  8:28   ` Rusty Russell
@ 2008-12-05 12:02     ` David Howells
  0 siblings, 0 replies; 11+ messages in thread
From: David Howells @ 2008-12-05 12:02 UTC (permalink / raw)
  To: Rusty Russell; +Cc: dhowells, linux-kernel

Rusty Russell <rusty@rustcorp.com.au> wrote:

> commit 4858874241391aa62b5818781f702883e4ddf4ed
> Author: Rusty Russell <rusty@rustcorp.com.au>
> Date:   Fri Dec 5 18:56:34 2008 +1030
> 
>     Move arch_get_boot_command_line out of init/main.c for broken gccs.

Acked-by: David Howells <dhowells@redhat.com>

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH 1/3] param: Adapt MN10300 to the new parameter handling regime
  2008-12-05 11:58   ` David Howells
@ 2008-12-05 12:55     ` Rusty Russell
  2008-12-05 13:07       ` David Howells
  2008-12-07  9:21       ` Rusty Russell
  0 siblings, 2 replies; 11+ messages in thread
From: Rusty Russell @ 2008-12-05 12:55 UTC (permalink / raw)
  To: David Howells; +Cc: linux-kernel

On Friday 05 December 2008 22:28:16 David Howells wrote:
> I think you're missing:
> 
> 	#define param_mem_keeps_reference 0
> 
> from the stuff you added.

Ah thanks, I didn't actually *cough* test it.

> With that, the core_param stuff does work for mem=...  But I object to
> mem_override not being __initdata.  I also don't think the parameter should
> appear in sysfs - that's just a waste of resources.

If you set the perm to 0, then it won't appear in sys, and hence can be
__initdata.

> It should, perhaps,
> appear in /proc/cmdline, but for some reason it does not.

Hmm, that's more concering.  I'll dig into this in the morning.

> I can live without
> that, though, since its effect appears in /proc/meminfo.
> 
> Also, something else to consider: If CONFIG_MODULES=n and CONFIG_SYSFS=n,
> should the contents of kernel/params.c be discarded along with the __init
> sections?

Yes, I think so.  YA __init variant, but it can be local to kernel/params.c
I think.

Cheers,
Rusty.

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH 1/3] param: Adapt MN10300 to the new parameter handling regime
  2008-12-05 12:55     ` Rusty Russell
@ 2008-12-05 13:07       ` David Howells
  2008-12-07  9:21       ` Rusty Russell
  1 sibling, 0 replies; 11+ messages in thread
From: David Howells @ 2008-12-05 13:07 UTC (permalink / raw)
  To: Rusty Russell; +Cc: dhowells, linux-kernel

Rusty Russell <rusty@rustcorp.com.au> wrote:

> > With that, the core_param stuff does work for mem=...  But I object to
> > mem_override not being __initdata.  I also don't think the parameter should
> > appear in sysfs - that's just a waste of resources.
> 
> If you set the perm to 0, then it won't appear in sys, and hence can be
> __initdata.

That seemed to work.

David

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH 1/3] param: Adapt MN10300 to the new parameter handling regime
  2008-12-05 12:55     ` Rusty Russell
  2008-12-05 13:07       ` David Howells
@ 2008-12-07  9:21       ` Rusty Russell
  2008-12-10 10:39         ` David Howells
  1 sibling, 1 reply; 11+ messages in thread
From: Rusty Russell @ 2008-12-07  9:21 UTC (permalink / raw)
  To: David Howells; +Cc: linux-kernel

On Friday 05 December 2008 23:25:22 Rusty Russell wrote:
> On Friday 05 December 2008 22:28:16 David Howells wrote:
> > With that, the core_param stuff does work for mem=...
...
> > It should, perhaps,
> > appear in /proc/cmdline, but for some reason it does not.
> 
> Hmm, that's more concering.  I'll dig into this in the morning.

OK, I can't reproduce it.  I was thinking some weird corner case
with not restoring the string in parse_args, but putting in a dummy
"mem" core_param() on x86 works as first, middle and last arg on cmdline,
and command line shows up correctly in /proc/cmdline.

Any chance I can ask you to verify that?  Is the commandline printk'd
on boot also wrong?

Thanks,
Rusty.

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH 1/3] param: Adapt MN10300 to the new parameter handling regime
  2008-12-07  9:21       ` Rusty Russell
@ 2008-12-10 10:39         ` David Howells
  0 siblings, 0 replies; 11+ messages in thread
From: David Howells @ 2008-12-10 10:39 UTC (permalink / raw)
  To: Rusty Russell; +Cc: dhowells, linux-kernel

Rusty Russell <rusty@rustcorp.com.au> wrote:

> > > It should, perhaps,
> > > appear in /proc/cmdline, but for some reason it does not.
> > 
> > Hmm, that's more concering.  I'll dig into this in the morning.
> 
> OK, I can't reproduce it.  I was thinking some weird corner case
> with not restoring the string in parse_args, but putting in a dummy
> "mem" core_param() on x86 works as first, middle and last arg on cmdline,
> and command line shows up correctly in /proc/cmdline.
> 
> Any chance I can ask you to verify that?  Is the commandline printk'd
> on boot also wrong?

I think I must've tested it wrong, probably by forgetting to paste in a mem=
option on the kernel command line when I was trying to check /proc/cmdline.
Leastways, it works now.

David

^ permalink raw reply	[flat|nested] 11+ messages in thread

end of thread, other threads:[~2008-12-10 10:39 UTC | newest]

Thread overview: 11+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2008-12-03 16:32 [PATCH 1/3] param: Adapt MN10300 to the new parameter handling regime David Howells
2008-12-03 16:32 ` [PATCH 2/3] [PATCH] param: Stop gcc from inlining empty weak functions David Howells
2008-12-05  8:28   ` Rusty Russell
2008-12-05 12:02     ` David Howells
2008-12-03 16:32 ` [PATCH 3/3] [PATCH] param: Adapt FRV to the new parameter handling regime David Howells
2008-12-05  8:25 ` [PATCH 1/3] param: Adapt MN10300 " Rusty Russell
2008-12-05 11:58   ` David Howells
2008-12-05 12:55     ` Rusty Russell
2008-12-05 13:07       ` David Howells
2008-12-07  9:21       ` Rusty Russell
2008-12-10 10:39         ` David Howells

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox