aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRusty Russell <rusty@rustcorp.com.au>2009-06-12 23:46:56 -0400
committerRusty Russell <rusty@rustcorp.com.au>2009-06-12 08:16:56 -0400
commit45fcc70c0b6ee0c508e1fdb5fef735c3546803f4 (patch)
tree15ea34cf77ecd9bbd4f78259ced012f18a26e01b
parent9a71af2c3627b379b7c31917a7f6ee0d29bc559b (diff)
module_param: split perm field into flags and perm
Impact: cleanup Rather than hack KPARAM_KMALLOCED into the perm field, separate it out. Since the perm field was 32 bits and only needs 16, we don't add bloat. Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
-rw-r--r--include/linux/moduleparam.h8
-rw-r--r--kernel/params.c9
2 files changed, 9 insertions, 8 deletions
diff --git a/include/linux/moduleparam.h b/include/linux/moduleparam.h
index 9bbca8e8c19f..009a5f768768 100644
--- a/include/linux/moduleparam.h
+++ b/include/linux/moduleparam.h
@@ -36,9 +36,13 @@ typedef int (*param_set_fn)(const char *val, struct kernel_param *kp);
36/* Returns length written or -errno. Buffer is 4k (ie. be short!) */ 36/* Returns length written or -errno. Buffer is 4k (ie. be short!) */
37typedef int (*param_get_fn)(char *buffer, struct kernel_param *kp); 37typedef int (*param_get_fn)(char *buffer, struct kernel_param *kp);
38 38
39/* Flag bits for kernel_param.flags */
40#define KPARAM_KMALLOCED 1
41
39struct kernel_param { 42struct kernel_param {
40 const char *name; 43 const char *name;
41 unsigned int perm; 44 u16 perm;
45 u16 flags;
42 param_set_fn set; 46 param_set_fn set;
43 param_get_fn get; 47 param_get_fn get;
44 union { 48 union {
@@ -88,7 +92,7 @@ struct kparam_array
88 static struct kernel_param __moduleparam_const __param_##name \ 92 static struct kernel_param __moduleparam_const __param_##name \
89 __used \ 93 __used \
90 __attribute__ ((unused,__section__ ("__param"),aligned(sizeof(void *)))) \ 94 __attribute__ ((unused,__section__ ("__param"),aligned(sizeof(void *)))) \
91 = { __param_str_##name, perm, set, get, { arg } } 95 = { __param_str_##name, perm, 0, set, get, { arg } }
92 96
93#define module_param_call(name, set, get, arg, perm) \ 97#define module_param_call(name, set, get, arg, perm) \
94 __module_param_call(MODULE_PARAM_PREFIX, name, set, get, arg, perm) 98 __module_param_call(MODULE_PARAM_PREFIX, name, set, get, arg, perm)
diff --git a/kernel/params.c b/kernel/params.c
index 023abbf5f89f..b4660dc13dbc 100644
--- a/kernel/params.c
+++ b/kernel/params.c
@@ -24,9 +24,6 @@
24#include <linux/err.h> 24#include <linux/err.h>
25#include <linux/slab.h> 25#include <linux/slab.h>
26 26
27/* We abuse the high bits of "perm" to record whether we kmalloc'ed. */
28#define KPARAM_KMALLOCED 0x80000000
29
30#if 0 27#if 0
31#define DEBUGP printk 28#define DEBUGP printk
32#else 29#else
@@ -220,13 +217,13 @@ int param_set_charp(const char *val, struct kernel_param *kp)
220 return -ENOSPC; 217 return -ENOSPC;
221 } 218 }
222 219
223 if (kp->perm & KPARAM_KMALLOCED) 220 if (kp->flags & KPARAM_KMALLOCED)
224 kfree(*(char **)kp->arg); 221 kfree(*(char **)kp->arg);
225 222
226 /* This is a hack. We can't need to strdup in early boot, and we 223 /* This is a hack. We can't need to strdup in early boot, and we
227 * don't need to; this mangled commandline is preserved. */ 224 * don't need to; this mangled commandline is preserved. */
228 if (slab_is_available()) { 225 if (slab_is_available()) {
229 kp->perm |= KPARAM_KMALLOCED; 226 kp->flags |= KPARAM_KMALLOCED;
230 *(char **)kp->arg = kstrdup(val, GFP_KERNEL); 227 *(char **)kp->arg = kstrdup(val, GFP_KERNEL);
231 if (!kp->arg) 228 if (!kp->arg)
232 return -ENOMEM; 229 return -ENOMEM;
@@ -591,7 +588,7 @@ void destroy_params(const struct kernel_param *params, unsigned num)
591 unsigned int i; 588 unsigned int i;
592 589
593 for (i = 0; i < num; i++) 590 for (i = 0; i < num; i++)
594 if (params[i].perm & KPARAM_KMALLOCED) 591 if (params[i].flags & KPARAM_KMALLOCED)
595 kfree(*(char **)params[i].arg); 592 kfree(*(char **)params[i].arg);
596} 593}
597 594