Skip to content

Commit

Permalink
kobject: Make support for uevent_helper optional.
Browse files Browse the repository at this point in the history
Support for uevent_helper, aka hotplug, is not required on many systems
these days but it can still be enabled via sysfs or sysctl.

Reported-by: Darren Shepherd <[email protected]>
Signed-off-by: Michael Marineau <[email protected]>
Signed-off-by: Greg Kroah-Hartman <[email protected]>
  • Loading branch information
marineam authored and gregkh committed Apr 25, 2014
1 parent d911d98 commit 86d5613
Show file tree
Hide file tree
Showing 5 changed files with 25 additions and 9 deletions.
17 changes: 11 additions & 6 deletions drivers/base/Kconfig
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
menu "Generic Driver Options"

config UEVENT_HELPER_PATH
string "path to uevent helper"
default ""
config UEVENT_HELPER
bool "Support for uevent helper"
default y
help
Path to uevent helper program forked by the kernel for
The uevent helper program is forked by the kernel for
every uevent.
Before the switch to the netlink-based uevent source, this was
used to hook hotplug scripts into kernel device events. It
Expand All @@ -15,8 +15,13 @@ config UEVENT_HELPER_PATH
that it creates a high system load, or on smaller systems
it is known to create out-of-memory situations during bootup.

To disable user space helper program execution at early boot
time specify an empty string here. This setting can be altered
config UEVENT_HELPER_PATH
string "path to uevent helper"
depends on UEVENT_HELPER
default ""
help
To disable user space helper program execution at by default
specify an empty string here. This setting can still be altered
via /proc/sys/kernel/hotplug or via /sys/kernel/uevent_helper
later at runtime.

Expand Down
2 changes: 2 additions & 0 deletions include/linux/kobject.h
Original file line number Diff line number Diff line change
Expand Up @@ -32,8 +32,10 @@
#define UEVENT_NUM_ENVP 32 /* number of env pointers */
#define UEVENT_BUFFER_SIZE 2048 /* buffer for the variables */

#ifdef CONFIG_UEVENT_HELPER
/* path to the userspace helper executed on an event */
extern char uevent_helper[];
#endif

/* counter to tag the uevent, read only except for the kobject core */
extern u64 uevent_seqnum;
Expand Down
5 changes: 4 additions & 1 deletion kernel/ksysfs.c
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@ static ssize_t uevent_seqnum_show(struct kobject *kobj,
}
KERNEL_ATTR_RO(uevent_seqnum);

#ifdef CONFIG_UEVENT_HELPER
/* uevent helper program, used during early boot */
static ssize_t uevent_helper_show(struct kobject *kobj,
struct kobj_attribute *attr, char *buf)
Expand All @@ -56,7 +57,7 @@ static ssize_t uevent_helper_store(struct kobject *kobj,
return count;
}
KERNEL_ATTR_RW(uevent_helper);

#endif

#ifdef CONFIG_PROFILING
static ssize_t profiling_show(struct kobject *kobj,
Expand Down Expand Up @@ -189,7 +190,9 @@ EXPORT_SYMBOL_GPL(kernel_kobj);
static struct attribute * kernel_attrs[] = {
&fscaps_attr.attr,
&uevent_seqnum_attr.attr,
#ifdef CONFIG_UEVENT_HELPER
&uevent_helper_attr.attr,
#endif
#ifdef CONFIG_PROFILING
&profiling_attr.attr,
#endif
Expand Down
4 changes: 2 additions & 2 deletions kernel/sysctl.c
Original file line number Diff line number Diff line change
Expand Up @@ -643,15 +643,15 @@ static struct ctl_table kern_table[] = {
.extra2 = &one,
},
#endif

#ifdef CONFIG_UEVENT_HELPER
{
.procname = "hotplug",
.data = &uevent_helper,
.maxlen = UEVENT_HELPER_PATH_LEN,
.mode = 0644,
.proc_handler = proc_dostring,
},

#endif
#ifdef CONFIG_CHR_DEV_SG
{
.procname = "sg-big-buff",
Expand Down
6 changes: 6 additions & 0 deletions lib/kobject_uevent.c
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,9 @@


u64 uevent_seqnum;
#ifdef CONFIG_UEVENT_HELPER
char uevent_helper[UEVENT_HELPER_PATH_LEN] = CONFIG_UEVENT_HELPER_PATH;
#endif
#ifdef CONFIG_NET
struct uevent_sock {
struct list_head list;
Expand Down Expand Up @@ -109,6 +111,7 @@ static int kobj_bcast_filter(struct sock *dsk, struct sk_buff *skb, void *data)
}
#endif

#ifdef CONFIG_UEVENT_HELPER
static int kobj_usermode_filter(struct kobject *kobj)
{
const struct kobj_ns_type_operations *ops;
Expand Down Expand Up @@ -147,6 +150,7 @@ static void cleanup_uevent_env(struct subprocess_info *info)
{
kfree(info->data);
}
#endif

/**
* kobject_uevent_env - send an uevent with environmental data
Expand Down Expand Up @@ -323,6 +327,7 @@ int kobject_uevent_env(struct kobject *kobj, enum kobject_action action,
#endif
mutex_unlock(&uevent_sock_mutex);

#ifdef CONFIG_UEVENT_HELPER
/* call uevent_helper, usually only enabled during early boot */
if (uevent_helper[0] && !kobj_usermode_filter(kobj)) {
struct subprocess_info *info;
Expand All @@ -347,6 +352,7 @@ int kobject_uevent_env(struct kobject *kobj, enum kobject_action action,
env = NULL; /* freed by cleanup_uevent_env */
}
}
#endif

exit:
kfree(devpath);
Expand Down

0 comments on commit 86d5613

Please sign in to comment.