@@ -71,6 +71,62 @@ struct kparam_array
71
71
void * elem ;
72
72
};
73
73
74
+ /**
75
+ * module_param - typesafe helper for a module/cmdline parameter
76
+ * @value: the variable to alter, and exposed parameter name.
77
+ * @type: the type of the parameter
78
+ * @perm: visibility in sysfs.
79
+ *
80
+ * @value becomes the module parameter, or (prefixed by KBUILD_MODNAME and a
81
+ * ".") the kernel commandline parameter. Note that - is changed to _, so
82
+ * the user can use "foo-bar=1" even for variable "foo_bar".
83
+ *
84
+ * @perm is 0 if the the variable is not to appear in sysfs, or 0444
85
+ * for world-readable, 0644 for root-writable, etc. Note that if it
86
+ * is writable, you may need to use kparam_block_sysfs_write() around
87
+ * accesses (esp. charp, which can be kfreed when it changes).
88
+ *
89
+ * The @type is simply pasted to refer to a param_ops_##type and a
90
+ * param_check_##type: for convenience many standard types are provided but
91
+ * you can create your own by defining those variables.
92
+ *
93
+ * Standard types are:
94
+ * byte, short, ushort, int, uint, long, ulong
95
+ * charp: a character pointer
96
+ * bool: a bool, values 0/1, y/n, Y/N.
97
+ * invbool: the above, only sense-reversed (N = true).
98
+ */
99
+ #define module_param (name , type , perm ) \
100
+ module_param_named(name, name, type, perm)
101
+
102
+ /**
103
+ * module_param_named - typesafe helper for a renamed module/cmdline parameter
104
+ * @name: a valid C identifier which is the parameter name.
105
+ * @value: the actual lvalue to alter.
106
+ * @type: the type of the parameter
107
+ * @perm: visibility in sysfs.
108
+ *
109
+ * Usually it's a good idea to have variable names and user-exposed names the
110
+ * same, but that's harder if the variable must be non-static or is inside a
111
+ * structure. This allows exposure under a different name.
112
+ */
113
+ #define module_param_named (name , value , type , perm ) \
114
+ param_check_##type(name, &(value)); \
115
+ module_param_cb(name, ¶m_ops_##type, &value, perm); \
116
+ __MODULE_PARM_TYPE(name, #type)
117
+
118
+ /**
119
+ * module_param_cb - general callback for a module/cmdline parameter
120
+ * @name: a valid C identifier which is the parameter name.
121
+ * @ops: the set & get operations for this parameter.
122
+ * @perm: visibility in sysfs.
123
+ *
124
+ * The ops can have NULL set or get functions.
125
+ */
126
+ #define module_param_cb (name , ops , arg , perm ) \
127
+ __module_param_call(MODULE_PARAM_PREFIX, \
128
+ name, ops, arg, __same_type(*(arg), bool), perm)
129
+
74
130
/* On alpha, ia64 and ppc64 relocations to global data cannot go into
75
131
read-only sections (which is part of respective UNIX ABI on these
76
132
platforms). So 'const' makes no sense and even causes compile failures
@@ -82,9 +138,7 @@ struct kparam_array
82
138
#endif
83
139
84
140
/* This is the fundamental function for registering boot/module
85
- parameters. perm sets the visibility in sysfs: 000 means it's
86
- not there, read bits mean it's readable, write bits mean it's
87
- writable. */
141
+ parameters. */
88
142
#define __module_param_call (prefix , name , ops , arg , isbool , perm ) \
89
143
/* Default value instead of permissions? */ \
90
144
static int __param_perm_check_##name __attribute__((unused)) = \
@@ -113,23 +167,6 @@ __check_old_set_param(int (*oldset)(const char *, struct kernel_param *))
113
167
return 0 ;
114
168
}
115
169
116
- #define module_param_cb (name , ops , arg , perm ) \
117
- __module_param_call(MODULE_PARAM_PREFIX, \
118
- name, ops, arg, __same_type(*(arg), bool), perm)
119
-
120
- /*
121
- * Helper functions: type is byte, short, ushort, int, uint, long,
122
- * ulong, charp, bool or invbool, or XXX if you define param_ops_XXX
123
- * and param_check_XXX.
124
- */
125
- #define module_param_named (name , value , type , perm ) \
126
- param_check_##type(name, &(value)); \
127
- module_param_cb(name, ¶m_ops_##type, &value, perm); \
128
- __MODULE_PARM_TYPE(name, #type)
129
-
130
- #define module_param (name , type , perm ) \
131
- module_param_named(name, name, type, perm)
132
-
133
170
/**
134
171
* kparam_block_sysfs_write - make sure a parameter isn't written via sysfs.
135
172
* @name: the name of the parameter
@@ -191,7 +228,7 @@ static inline void __kernel_param_unlock(void)
191
228
* core_param - define a historical core kernel parameter.
192
229
* @name: the name of the cmdline and sysfs parameter (often the same as var)
193
230
* @var: the variable
194
- * @type: the type (for param_set_##type and param_get_##type)
231
+ * @type: the type of the parameter
195
232
* @perm: visibility in sysfs
196
233
*
197
234
* core_param is just like module_param(), but cannot be modular and
@@ -205,7 +242,16 @@ static inline void __kernel_param_unlock(void)
205
242
&var, __same_type(var, bool), perm)
206
243
#endif /* !MODULE */
207
244
208
- /* Actually copy string: maxlen param is usually sizeof(string). */
245
+ /**
246
+ * module_param_string - a char array parameter
247
+ * @name: the name of the parameter
248
+ * @string: the string variable
249
+ * @len: the maximum length of the string, incl. terminator
250
+ * @perm: visibility in sysfs.
251
+ *
252
+ * This actually copies the string when it's set (unlike type charp).
253
+ * @len is usually just sizeof(string).
254
+ */
209
255
#define module_param_string (name , string , len , perm ) \
210
256
static const struct kparam_string __param_string_##name \
211
257
= { len, string }; \
@@ -294,7 +340,33 @@ extern int param_set_invbool(const char *val, const struct kernel_param *kp);
294
340
extern int param_get_invbool (char * buffer , const struct kernel_param * kp );
295
341
#define param_check_invbool (name , p ) __param_check(name, p, bool)
296
342
297
- /* Comma-separated array: *nump is set to number they actually specified. */
343
+ /**
344
+ * module_param_array - a parameter which is an array of some type
345
+ * @name: the name of the array variable
346
+ * @type: the type, as per module_param()
347
+ * @nump: optional pointer filled in with the number written
348
+ * @perm: visibility in sysfs
349
+ *
350
+ * Input and output are as comma-separated values. Commas inside values
351
+ * don't work properly (eg. an array of charp).
352
+ *
353
+ * ARRAY_SIZE(@name) is used to determine the number of elements in the
354
+ * array, so the definition must be visible.
355
+ */
356
+ #define module_param_array (name , type , nump , perm ) \
357
+ module_param_array_named(name, name, type, nump, perm)
358
+
359
+ /**
360
+ * module_param_array_named - renamed parameter which is an array of some type
361
+ * @name: a valid C identifier which is the parameter name
362
+ * @array: the name of the array variable
363
+ * @type: the type, as per module_param()
364
+ * @nump: optional pointer filled in with the number written
365
+ * @perm: visibility in sysfs
366
+ *
367
+ * This exposes a different name than the actual variable name. See
368
+ * module_param_named() for why this might be necessary.
369
+ */
298
370
#define module_param_array_named (name , array , type , nump , perm ) \
299
371
static const struct kparam_array __param_arr_##name \
300
372
= { ARRAY_SIZE(array), nump, ¶m_ops_##type, \
@@ -305,9 +377,6 @@ extern int param_get_invbool(char *buffer, const struct kernel_param *kp);
305
377
__same_type(array[0], bool), perm); \
306
378
__MODULE_PARM_TYPE(name, "array of " #type)
307
379
308
- #define module_param_array (name , type , nump , perm ) \
309
- module_param_array_named(name, name, type, nump, perm)
310
-
311
380
extern struct kernel_param_ops param_array_ops ;
312
381
313
382
extern struct kernel_param_ops param_ops_string ;
0 commit comments