* [PATCH 1/3] kernel: Add a new config option to remove command line parsing
@ 2015-04-01 14:34 Iulia Manda
2015-04-01 14:34 ` [PATCH 2/3] linux: Add macros that define and declare a core_param variable Iulia Manda
` (2 more replies)
0 siblings, 3 replies; 7+ messages in thread
From: Iulia Manda @ 2015-04-01 14:34 UTC (permalink / raw)
To: josh; +Cc: linux-embedded, tim.bird, paulmck, dvhart, peterz, mihai.caraman
This patch introduces CONFIG_CMDLINE_PARSE option which conditionally compiles
the support for parsing kernel command line arguments. The corresponding
functions that actually do the parsing will be compiled out.
This is used when no parameters will be specified neither at compile time nor at
boot time.
Bloat-o-meter output (compared to the preivous version in which builtin cmdline
was also set to 'Y'):
add/remove: 0/8 grow/shrink: 0/6 up/down: 0/-3669 (-3669)
function old new delta
load_module 5571 5563 -8
parse_early_param 54 44 -10
parse_early_options 33 5 -28
initcall_level_names 32 - -32
kernel_init_freeable 413 360 -53
unknown_module_param_cb 60 - -60
setup_arch 3041 2972 -69
set_init_arg 73 - -73
repair_env_string 81 - -81
start_kernel 857 759 -98
do_early_param 117 - -117
unknown_bootoption 366 - -366
parse_args 626 - -626
builtin_cmdline 2048 - -2048
Signed-off-by: Iulia Manda <iulia.manda21@gmail.com>
Reviewed-by: Josh Triplett <josh@joshtriplett.org>
---
arch/x86/Kconfig | 15 +++++++++++++++
include/linux/moduleparam.h | 14 ++++++++++++++
kernel/params.c | 2 ++
3 files changed, 31 insertions(+)
diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig
index c2fb8a8..f1e02ea 100644
--- a/arch/x86/Kconfig
+++ b/arch/x86/Kconfig
@@ -2003,8 +2003,23 @@ config COMPAT_VDSO
If unsure, say N: if you are compiling your own kernel, you
are unlikely to be using a buggy version of glibc.
+config CMDLINE_PARSE
+ bool "Enable support for command line parsing"
+ default y
+ ---help---
+ With this option set to 'Y', kernel parameters, both the ones
+ passed at boot time and at compile time are parsed.
+
+ If you say no here, all the kernel parameters' values will be set
+ to their defaults at compile time, in order to make constant
+ folding possible.
+
+ Systems with no space constraints should leave this option set to
+ 'Y'.
+
config CMDLINE_BOOL
bool "Built-in kernel command line"
+ depends on CMDLINE_PARSE
---help---
Allow for specifying boot arguments to the kernel at
build time. On some systems (e.g. embedded ones), it is
diff --git a/include/linux/moduleparam.h b/include/linux/moduleparam.h
index 1c9effa..f97397c 100644
--- a/include/linux/moduleparam.h
+++ b/include/linux/moduleparam.h
@@ -350,6 +350,7 @@ extern bool parameq(const char *name1, const char *name2);
*/
extern bool parameqn(const char *name1, const char *name2, size_t n);
+#ifdef CONFIG_CMDLINE_PARSE
/* Called on module insert or kernel boot */
extern char *parse_args(const char *name,
char *args,
@@ -359,6 +360,19 @@ extern char *parse_args(const char *name,
s16 level_max,
int (*unknown)(char *param, char *val,
const char *doing));
+#else
+static inline char *parse_args(const char *name,
+ char *args,
+ const struct kernel_param *params,
+ unsigned num,
+ s16 level_min,
+ s16 level_max,
+ int (*unknown)(char *param, char *val,
+ const char *doing))
+{
+ return NULL;
+}
+#endif
/* Called by module remove. */
#ifdef CONFIG_SYSFS
diff --git a/kernel/params.c b/kernel/params.c
index 728e05b..d3bfe47 100644
--- a/kernel/params.c
+++ b/kernel/params.c
@@ -93,6 +93,7 @@ static void param_check_unsafe(const struct kernel_param *kp)
}
}
+#ifdef CONFIG_CMDLINE_PARSE
static int parse_one(char *param,
char *val,
const char *doing,
@@ -239,6 +240,7 @@ char *parse_args(const char *doing,
/* All parsed OK. */
return NULL;
}
+#endif
/* Lazy bastard, eh? */
#define STANDARD_PARAM_DEF(name, type, format, strtolfn) \
--
1.9.1
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH 2/3] linux: Add macros that define and declare a core_param variable
2015-04-01 14:34 [PATCH 1/3] kernel: Add a new config option to remove command line parsing Iulia Manda
@ 2015-04-01 14:34 ` Iulia Manda
2015-04-01 14:34 ` [PATCH 3/3] init: Set initcall_debug to a default value Iulia Manda
2015-04-09 14:44 ` [PATCH 1/3] kernel: Add a new config option to remove command line parsing Tim Bird
2 siblings, 0 replies; 7+ messages in thread
From: Iulia Manda @ 2015-04-01 14:34 UTC (permalink / raw)
To: josh; +Cc: linux-embedded, tim.bird, paulmck, dvhart, peterz, mihai.caraman
This patch introduces two macros for kernel command line arguments subsequently
defined as core parameters:
* DECLARE_CORE_PARAM - declares an extern variable in case CMDLINE_PARSE is
set. In the other case it will make the variable a static constant asigned with
a default value to enable constant folding;
* DEFINE_CORE_PARAM - defines a core_param variable if CMDLINE_PARSE is set. In
the other case it leaves the definition to be handled by DECLARE_CORE_PARAM
macro.
Introducing a new header file for the declaration of kernel parameters seemed
to be the best option, because it solves the circular includes problem. Any
other proposal that would be fit for this case is welcomed.
Signed-off-by: Iulia Manda <iulia.manda21@gmail.com>
Reviewed-by: Josh Triplett <josh@joshtriplett.org>
---
include/linux/moduleparam.h | 9 +++++++++
include/linux/params.h | 12 ++++++++++++
2 files changed, 21 insertions(+)
create mode 100644 include/linux/params.h
diff --git a/include/linux/moduleparam.h b/include/linux/moduleparam.h
index f97397c..17efa97 100644
--- a/include/linux/moduleparam.h
+++ b/include/linux/moduleparam.h
@@ -310,6 +310,15 @@ static inline void __kernel_param_unlock(void)
#define core_param(name, var, type, perm) \
param_check_##type(name, &(var)); \
__module_param_call("", name, ¶m_ops_##type, &var, perm, -1, 0)
+
+#ifdef CONFIG_CMDLINE_PARSE
+#define DEFINE_CORE_PARAM(name, var, val, type, perm) \
+ type var = val; \
+ core_param(name, var, type, perm)
+#else
+#define DEFINE_CORE_PARAM(name, var, val, type, perm)
+#endif
+
#endif /* !MODULE */
/**
diff --git a/include/linux/params.h b/include/linux/params.h
new file mode 100644
index 0000000..c1ee6ff
--- /dev/null
+++ b/include/linux/params.h
@@ -0,0 +1,12 @@
+#ifndef _LINUX_PARAMS_H
+#define _LINUX_PARAMS_H
+
+#ifdef CONFIG_CMDLINE_PARSE
+#define DECLARE_CORE_PARAM(var, val, type) \
+ extern type var
+#else
+#define DECLARE_CORE_PARAM(var, val, type) \
+ static const type var = val
+#endif
+
+#endif /* _LINUX_PARAMS_H */
--
1.9.1
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH 3/3] init: Set initcall_debug to a default value
2015-04-01 14:34 [PATCH 1/3] kernel: Add a new config option to remove command line parsing Iulia Manda
2015-04-01 14:34 ` [PATCH 2/3] linux: Add macros that define and declare a core_param variable Iulia Manda
@ 2015-04-01 14:34 ` Iulia Manda
2015-04-09 14:44 ` [PATCH 1/3] kernel: Add a new config option to remove command line parsing Tim Bird
2 siblings, 0 replies; 7+ messages in thread
From: Iulia Manda @ 2015-04-01 14:34 UTC (permalink / raw)
To: josh; +Cc: linux-embedded, tim.bird, paulmck, dvhart, peterz, mihai.caraman
Test the previously implemented macros on initcall_debug parameter, after
setting CONFIG_CMDLINE_PARSE to 'n'.
This change is a first example for how knowing the values of kernel parameters
at build time can allow GCC constant folding and result in an actually
relevant decrease in size. Other types of parameters also need to be handled.
Also, at the moment this would only work with default values. For being able
to change those defaults and still know their values at compile time, a
pre-compiled stand-alone parser should be run on those variables. This will be
discussed in a following patch.
The variable corresponding to initcall_debug kernel parameter is set by default
to false. Even though DEFINE_CORE_PARAM resumes to nothing when
CONFIG_CMDLINE_PARSE is not set, we need to use it in main.c so that it is
still defined when this option is 'y'.
Bloat-o-meter output:
add/remove: 0/3 grow/shrink: 0/9 up/down: 0/-385 (-385)
function old new delta
initcall_debug 1 - -1
pm_init 105 100 -5
__param_str_initcall_debug 15 - -15
__param_initcall_debug 16 - -16
syscore_suspend 247 224 -23
syscore_resume 175 152 -23
syscore_shutdown 80 55 -25
pci_fixup_device 235 198 -37
async_synchronize_cookie_domain 162 116 -46
async_run_entry_fn 178 127 -51
device_shutdown 256 204 -52
do_one_initcall 339 248 -91
Signed-off-by: Iulia Manda <iulia.manda21@gmail.com>
Reviewed-by: Josh Triplett <josh@joshtriplett.org>
---
include/linux/init.h | 3 ++-
init/main.c | 3 +--
2 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/include/linux/init.h b/include/linux/init.h
index 2df8e8d..d53f28d 100644
--- a/include/linux/init.h
+++ b/include/linux/init.h
@@ -3,6 +3,7 @@
#include <linux/compiler.h>
#include <linux/types.h>
+#include <linux/params.h>
/* These macros are used to mark some functions or
* initialized data (doesn't apply to uninitialized data)
@@ -155,7 +156,7 @@ int __init init_rootfs(void);
extern void (*late_time_init)(void);
-extern bool initcall_debug;
+DECLARE_CORE_PARAM(initcall_debug, false, bool);
#endif
diff --git a/init/main.c b/init/main.c
index 6f0f1c5f..85e9001 100644
--- a/init/main.c
+++ b/init/main.c
@@ -685,8 +685,7 @@ static void __init do_ctors(void)
#endif
}
-bool initcall_debug;
-core_param(initcall_debug, initcall_debug, bool, 0644);
+DEFINE_CORE_PARAM(initcall_debug, initcall_debug, false, bool, 0644);
#ifdef CONFIG_KALLSYMS
struct blacklist_entry {
--
1.9.1
^ permalink raw reply related [flat|nested] 7+ messages in thread
* Re: [PATCH 1/3] kernel: Add a new config option to remove command line parsing
2015-04-01 14:34 [PATCH 1/3] kernel: Add a new config option to remove command line parsing Iulia Manda
2015-04-01 14:34 ` [PATCH 2/3] linux: Add macros that define and declare a core_param variable Iulia Manda
2015-04-01 14:34 ` [PATCH 3/3] init: Set initcall_debug to a default value Iulia Manda
@ 2015-04-09 14:44 ` Tim Bird
2 siblings, 0 replies; 7+ messages in thread
From: Tim Bird @ 2015-04-09 14:44 UTC (permalink / raw)
To: Iulia Manda, josh
Cc: linux-embedded, paulmck, dvhart, peterz, mihai.caraman, linux-kernel
On 04/01/2015 07:34 AM, Iulia Manda wrote:
> This patch introduces CONFIG_CMDLINE_PARSE option which conditionally compiles
> the support for parsing kernel command line arguments. The corresponding
> functions that actually do the parsing will be compiled out.
>
> This is used when no parameters will be specified neither at compile time nor at
> boot time.
>
> Bloat-o-meter output (compared to the preivous version in which builtin cmdline
> was also set to 'Y'):
>
> add/remove: 0/8 grow/shrink: 0/6 up/down: 0/-3669 (-3669)
I think this is great stuff. (Of course, having research something like this
previously, I'm a bit biased.)
It's very nice to have the Bloat-o-meter output for these kernel size shrinking
patches.
The patch itself looks very straightforward, and I don't see any problems
in a visual inspection.
You can add a Reviewed-by: Tim Bird <tim.bird@sonymobile.com> to this patch.
I'd like to be able to point people to this on the mailing list. In the future
can you make sure to CC: <linux-kernel@vger.kernel.org>, so there's a reference
on lkml.org I can point people to?
Thanks for this great work!
-- Tim
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH 3/3] init: Set initcall_debug to a default value
2015-05-19 9:46 ` Paul Bolle
@ 2015-05-20 0:54 ` josh
0 siblings, 0 replies; 7+ messages in thread
From: josh @ 2015-05-20 0:54 UTC (permalink / raw)
To: Paul Bolle; +Cc: Iulia Manda, tim.bird, linux-kernel
On Tue, May 19, 2015 at 11:46:54AM +0200, Paul Bolle wrote:
> On Mon, 2015-05-18 at 14:50 +0300, Iulia Manda wrote:
> > ---
> > include/linux/init.h | 3 ++-
> > init/main.c | 3 +--
> > 2 files changed, 3 insertions(+), 3 deletions(-)
> >
> > diff --git a/include/linux/init.h b/include/linux/init.h
> > index 21b6d76..7c7ee80 100644
> > --- a/include/linux/init.h
> > +++ b/include/linux/init.h
>
> > -extern bool initcall_debug;
> > +DECLARE_CORE_PARAM(initcall_debug, false, bool);
>
> CONFIG_CMDLINE_PARSE will never be set outside of x86, right? So does
> this change nothing for those other architectures?
See comment on the previous patch; this is not x86-specific, and it
should be a config option for all architectures.
- Josh Triplett
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH 3/3] init: Set initcall_debug to a default value
2015-05-18 11:50 ` [PATCH 3/3] init: Set initcall_debug to a default value Iulia Manda
@ 2015-05-19 9:46 ` Paul Bolle
2015-05-20 0:54 ` josh
0 siblings, 1 reply; 7+ messages in thread
From: Paul Bolle @ 2015-05-19 9:46 UTC (permalink / raw)
To: Iulia Manda; +Cc: tim.bird, linux-kernel, josh
On Mon, 2015-05-18 at 14:50 +0300, Iulia Manda wrote:
> Test the previously implemented macros on initcall_debug parameter, after
> setting CONFIG_CMDLINE_PARSE to 'n'.
>
> This change is a first example for how knowing the values of kernel
> parameters at build time can allow GCC constant folding and result in an
> actually relevant decrease in size. Other types of parameters also need to
> be handled. Also, at the moment this would only work with default values.
> For being able to change those defaults and still know their values at
> compile time, a pre-compiled stand-alone parser should be run on those
> variables. This will be discussed in a following patch.
>
> The variable corresponding to initcall_debug kernel parameter is set by
> default to false. Even though DEFINE_CORE_PARAM resumes to nothing when
resumes to nothing?
> CONFIG_CMDLINE_PARSE is not set, we need to use it in main.c so that it is
> still defined when this option is 'y'.
> ---
> include/linux/init.h | 3 ++-
> init/main.c | 3 +--
> 2 files changed, 3 insertions(+), 3 deletions(-)
>
> diff --git a/include/linux/init.h b/include/linux/init.h
> index 21b6d76..7c7ee80 100644
> --- a/include/linux/init.h
> +++ b/include/linux/init.h
> -extern bool initcall_debug;
> +DECLARE_CORE_PARAM(initcall_debug, false, bool);
CONFIG_CMDLINE_PARSE will never be set outside of x86, right? So does
this change nothing for those other architectures?
> #endif
>
> diff --git a/init/main.c b/init/main.c
> index 2115055..a7d0129 100644
> -bool initcall_debug;
> -core_param(initcall_debug, initcall_debug, bool, 0644);
> +DEFINE_CORE_PARAM(initcall_debug, initcall_debug, false, bool, 0644);
Ditto.
Thanks,
Paul Bolle
^ permalink raw reply [flat|nested] 7+ messages in thread
* [PATCH 3/3] init: Set initcall_debug to a default value
2015-05-18 11:50 Iulia Manda
@ 2015-05-18 11:50 ` Iulia Manda
2015-05-19 9:46 ` Paul Bolle
0 siblings, 1 reply; 7+ messages in thread
From: Iulia Manda @ 2015-05-18 11:50 UTC (permalink / raw)
To: tim.bird; +Cc: linux-kernel, josh
Test the previously implemented macros on initcall_debug parameter, after
setting CONFIG_CMDLINE_PARSE to 'n'.
This change is a first example for how knowing the values of kernel
parameters at build time can allow GCC constant folding and result in an
actually relevant decrease in size. Other types of parameters also need to
be handled. Also, at the moment this would only work with default values.
For being able to change those defaults and still know their values at
compile time, a pre-compiled stand-alone parser should be run on those
variables. This will be discussed in a following patch.
The variable corresponding to initcall_debug kernel parameter is set by
default to false. Even though DEFINE_CORE_PARAM resumes to nothing when
CONFIG_CMDLINE_PARSE is not set, we need to use it in main.c so that it is
still defined when this option is 'y'.
Bloat-o-meter output:
add/remove: 0/3 grow/shrink: 0/9 up/down: 0/-385 (-385)
function old new delta
initcall_debug 1 - -1
pm_init 105 100 -5
__param_str_initcall_debug 15 - -15
__param_initcall_debug 16 - -16
syscore_suspend 247 224 -23
syscore_resume 175 152 -23
syscore_shutdown 80 55 -25
pci_fixup_device 235 198 -37
async_synchronize_cookie_domain 162 116 -46
async_run_entry_fn 178 127 -51
device_shutdown 256 204 -52
do_one_initcall 339 248 -91
Signed-off-by: Iulia Manda <iulia.manda21@gmail.com>
Reviewed-by: Josh Triplett <josh@joshtriplett.org>
---
include/linux/init.h | 3 ++-
init/main.c | 3 +--
2 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/include/linux/init.h b/include/linux/init.h
index 21b6d76..7c7ee80 100644
--- a/include/linux/init.h
+++ b/include/linux/init.h
@@ -3,6 +3,7 @@
#include <linux/compiler.h>
#include <linux/types.h>
+#include <linux/params.h>
/* These macros are used to mark some functions or
* initialized data (doesn't apply to uninitialized data)
@@ -155,7 +156,7 @@ int __init init_rootfs(void);
extern void (*late_time_init)(void);
-extern bool initcall_debug;
+DECLARE_CORE_PARAM(initcall_debug, false, bool);
#endif
diff --git a/init/main.c b/init/main.c
index 2115055..a7d0129 100644
--- a/init/main.c
+++ b/init/main.c
@@ -688,8 +688,7 @@ static void __init do_ctors(void)
#endif
}
-bool initcall_debug;
-core_param(initcall_debug, initcall_debug, bool, 0644);
+DEFINE_CORE_PARAM(initcall_debug, initcall_debug, false, bool, 0644);
#ifdef CONFIG_KALLSYMS
struct blacklist_entry {
--
1.8.3.2
^ permalink raw reply related [flat|nested] 7+ messages in thread
end of thread, other threads:[~2015-05-20 0:54 UTC | newest]
Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2015-04-01 14:34 [PATCH 1/3] kernel: Add a new config option to remove command line parsing Iulia Manda
2015-04-01 14:34 ` [PATCH 2/3] linux: Add macros that define and declare a core_param variable Iulia Manda
2015-04-01 14:34 ` [PATCH 3/3] init: Set initcall_debug to a default value Iulia Manda
2015-04-09 14:44 ` [PATCH 1/3] kernel: Add a new config option to remove command line parsing Tim Bird
2015-05-18 11:50 Iulia Manda
2015-05-18 11:50 ` [PATCH 3/3] init: Set initcall_debug to a default value Iulia Manda
2015-05-19 9:46 ` Paul Bolle
2015-05-20 0:54 ` josh
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.