params: <level>_initcall-like kernel parameters
This patch adds a set of macros that can be used to declare kernel parameters to be parsed _before_ initcalls at a chosen level are executed. We rename the now-unused "flags" field of struct kernel_param as the level. It's signed, for when we use this for early params as well, in future. Linker macro collating init calls had to be modified in order to add additional symbols between levels that are later used by the init code to split the calls into blocks. Signed-off-by: Pawel Moll <pawel.moll@arm.com> Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
This commit is contained in:
committed by
Rusty Russell
parent
8b8252813d
commit
026cee0086
@@ -2923,7 +2923,8 @@ static struct module *load_module(void __user *umod,
|
||||
mutex_unlock(&module_mutex);
|
||||
|
||||
/* Module is ready to execute: parsing args may do that. */
|
||||
err = parse_args(mod->name, mod->args, mod->kp, mod->num_kp, NULL);
|
||||
err = parse_args(mod->name, mod->args, mod->kp, mod->num_kp,
|
||||
-32768, 32767, NULL);
|
||||
if (err < 0)
|
||||
goto unlink;
|
||||
|
||||
|
@@ -87,6 +87,8 @@ static int parse_one(char *param,
|
||||
char *val,
|
||||
const struct kernel_param *params,
|
||||
unsigned num_params,
|
||||
s16 min_level,
|
||||
s16 max_level,
|
||||
int (*handle_unknown)(char *param, char *val))
|
||||
{
|
||||
unsigned int i;
|
||||
@@ -95,6 +97,9 @@ static int parse_one(char *param,
|
||||
/* Find parameter */
|
||||
for (i = 0; i < num_params; i++) {
|
||||
if (parameq(param, params[i].name)) {
|
||||
if (params[i].level < min_level
|
||||
|| params[i].level > max_level)
|
||||
return 0;
|
||||
/* No one handled NULL, so do it here. */
|
||||
if (!val && params[i].ops->set != param_set_bool
|
||||
&& params[i].ops->set != param_set_bint)
|
||||
@@ -174,6 +179,8 @@ int parse_args(const char *name,
|
||||
char *args,
|
||||
const struct kernel_param *params,
|
||||
unsigned num,
|
||||
s16 min_level,
|
||||
s16 max_level,
|
||||
int (*unknown)(char *param, char *val))
|
||||
{
|
||||
char *param, *val;
|
||||
@@ -189,7 +196,8 @@ int parse_args(const char *name,
|
||||
|
||||
args = next_arg(args, ¶m, &val);
|
||||
irq_was_disabled = irqs_disabled();
|
||||
ret = parse_one(param, val, params, num, unknown);
|
||||
ret = parse_one(param, val, params, num,
|
||||
min_level, max_level, unknown);
|
||||
if (irq_was_disabled && !irqs_disabled()) {
|
||||
printk(KERN_WARNING "parse_args(): option '%s' enabled "
|
||||
"irq's!\n", param);
|
||||
@@ -374,7 +382,7 @@ static int param_array(const char *name,
|
||||
unsigned int min, unsigned int max,
|
||||
void *elem, int elemsize,
|
||||
int (*set)(const char *, const struct kernel_param *kp),
|
||||
u16 flags,
|
||||
s16 level,
|
||||
unsigned int *num)
|
||||
{
|
||||
int ret;
|
||||
@@ -384,7 +392,7 @@ static int param_array(const char *name,
|
||||
/* Get the name right for errors. */
|
||||
kp.name = name;
|
||||
kp.arg = elem;
|
||||
kp.flags = flags;
|
||||
kp.level = level;
|
||||
|
||||
*num = 0;
|
||||
/* We expect a comma-separated list of values. */
|
||||
@@ -425,7 +433,7 @@ static int param_array_set(const char *val, const struct kernel_param *kp)
|
||||
unsigned int temp_num;
|
||||
|
||||
return param_array(kp->name, val, 1, arr->max, arr->elem,
|
||||
arr->elemsize, arr->ops->set, kp->flags,
|
||||
arr->elemsize, arr->ops->set, kp->level,
|
||||
arr->num ?: &temp_num);
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user