Merge git://git.kernel.org/pub/scm/linux/kernel/git/rusty/linux-2.6-for-linus
* git://git.kernel.org/pub/scm/linux/kernel/git/rusty/linux-2.6-for-linus: stop_machine: fix error code handling on multiple cpus stop_machine: use workqueues instead of kernel threads workqueue: introduce create_rt_workqueue Call init_workqueues before pre smp initcalls. Make panic= and panic_on_oops into core_params Make initcall_debug a core_param core_param() for genuinely core kernel parameters param: Fix duplicate module prefixes module: check kernel param length at compile time, not runtime Remove stop_machine during module load v2 module: simplify load_module.
This commit is contained in:
@@ -29,7 +29,7 @@
|
||||
#define MODULE_SYMBOL_PREFIX ""
|
||||
#endif
|
||||
|
||||
#define MODULE_NAME_LEN (64 - sizeof(unsigned long))
|
||||
#define MODULE_NAME_LEN MAX_PARAM_PREFIX_LEN
|
||||
|
||||
struct kernel_symbol
|
||||
{
|
||||
@@ -60,6 +60,7 @@ struct module_kobject
|
||||
struct kobject kobj;
|
||||
struct module *mod;
|
||||
struct kobject *drivers_dir;
|
||||
struct module_param_attrs *mp;
|
||||
};
|
||||
|
||||
/* These are either module local, or the kernel's dummy ones. */
|
||||
@@ -242,7 +243,6 @@ struct module
|
||||
|
||||
/* Sysfs stuff. */
|
||||
struct module_kobject mkobj;
|
||||
struct module_param_attrs *param_attrs;
|
||||
struct module_attribute *modinfo_attrs;
|
||||
const char *version;
|
||||
const char *srcversion;
|
||||
@@ -277,7 +277,7 @@ struct module
|
||||
|
||||
/* Exception table */
|
||||
unsigned int num_exentries;
|
||||
const struct exception_table_entry *extable;
|
||||
struct exception_table_entry *extable;
|
||||
|
||||
/* Startup function. */
|
||||
int (*init)(void);
|
||||
|
||||
@@ -13,6 +13,9 @@
|
||||
#define MODULE_PARAM_PREFIX KBUILD_MODNAME "."
|
||||
#endif
|
||||
|
||||
/* Chosen so that structs with an unsigned long line up. */
|
||||
#define MAX_PARAM_PREFIX_LEN (64 - sizeof(unsigned long))
|
||||
|
||||
#ifdef MODULE
|
||||
#define ___module_cat(a,b) __mod_ ## a ## b
|
||||
#define __module_cat(a,b) ___module_cat(a,b)
|
||||
@@ -79,7 +82,8 @@ struct kparam_array
|
||||
#define __module_param_call(prefix, name, set, get, arg, perm) \
|
||||
/* Default value instead of permissions? */ \
|
||||
static int __param_perm_check_##name __attribute__((unused)) = \
|
||||
BUILD_BUG_ON_ZERO((perm) < 0 || (perm) > 0777 || ((perm) & 2)); \
|
||||
BUILD_BUG_ON_ZERO((perm) < 0 || (perm) > 0777 || ((perm) & 2)) \
|
||||
+ BUILD_BUG_ON_ZERO(sizeof(""prefix) > MAX_PARAM_PREFIX_LEN); \
|
||||
static const char __param_str_##name[] = prefix #name; \
|
||||
static struct kernel_param __moduleparam_const __param_##name \
|
||||
__used \
|
||||
@@ -100,6 +104,25 @@ struct kparam_array
|
||||
#define module_param(name, type, perm) \
|
||||
module_param_named(name, name, type, perm)
|
||||
|
||||
#ifndef MODULE
|
||||
/**
|
||||
* core_param - define a historical core kernel parameter.
|
||||
* @name: the name of the cmdline and sysfs parameter (often the same as var)
|
||||
* @var: the variable
|
||||
* @type: the type (for param_set_##type and param_get_##type)
|
||||
* @perm: visibility in sysfs
|
||||
*
|
||||
* core_param is just like module_param(), but cannot be modular and
|
||||
* doesn't add a prefix (such as "printk."). This is for compatibility
|
||||
* with __setup(), and it makes sense as truly core parameters aren't
|
||||
* tied to the particular file they're in.
|
||||
*/
|
||||
#define core_param(name, var, type, perm) \
|
||||
param_check_##type(name, &(var)); \
|
||||
__module_param_call("", name, param_set_##type, param_get_##type, \
|
||||
&var, perm)
|
||||
#endif /* !MODULE */
|
||||
|
||||
/* Actually copy string: maxlen param is usually sizeof(string). */
|
||||
#define module_param_string(name, string, len, perm) \
|
||||
static const struct kparam_string __param_string_##name \
|
||||
|
||||
@@ -149,11 +149,11 @@ struct execute_work {
|
||||
|
||||
extern struct workqueue_struct *
|
||||
__create_workqueue_key(const char *name, int singlethread,
|
||||
int freezeable, struct lock_class_key *key,
|
||||
int freezeable, int rt, struct lock_class_key *key,
|
||||
const char *lock_name);
|
||||
|
||||
#ifdef CONFIG_LOCKDEP
|
||||
#define __create_workqueue(name, singlethread, freezeable) \
|
||||
#define __create_workqueue(name, singlethread, freezeable, rt) \
|
||||
({ \
|
||||
static struct lock_class_key __key; \
|
||||
const char *__lock_name; \
|
||||
@@ -164,17 +164,19 @@ __create_workqueue_key(const char *name, int singlethread,
|
||||
__lock_name = #name; \
|
||||
\
|
||||
__create_workqueue_key((name), (singlethread), \
|
||||
(freezeable), &__key, \
|
||||
(freezeable), (rt), &__key, \
|
||||
__lock_name); \
|
||||
})
|
||||
#else
|
||||
#define __create_workqueue(name, singlethread, freezeable) \
|
||||
__create_workqueue_key((name), (singlethread), (freezeable), NULL, NULL)
|
||||
#define __create_workqueue(name, singlethread, freezeable, rt) \
|
||||
__create_workqueue_key((name), (singlethread), (freezeable), (rt), \
|
||||
NULL, NULL)
|
||||
#endif
|
||||
|
||||
#define create_workqueue(name) __create_workqueue((name), 0, 0)
|
||||
#define create_freezeable_workqueue(name) __create_workqueue((name), 1, 1)
|
||||
#define create_singlethread_workqueue(name) __create_workqueue((name), 1, 0)
|
||||
#define create_workqueue(name) __create_workqueue((name), 0, 0, 0)
|
||||
#define create_rt_workqueue(name) __create_workqueue((name), 0, 0, 1)
|
||||
#define create_freezeable_workqueue(name) __create_workqueue((name), 1, 1, 0)
|
||||
#define create_singlethread_workqueue(name) __create_workqueue((name), 1, 0, 0)
|
||||
|
||||
extern void destroy_workqueue(struct workqueue_struct *wq);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user