[PATCH] kobject_uevent: add uevent_helper exist check

From: zhoumin
Date: Fri Apr 04 2025 - 13:39:40 EST


The kernel creates uevent_helper process for every uevent sent,
even if the uevent_helper does not exist. Before the rootfs is
mounted, a large number of events are generated. This change
introduces uevent_helper existence check to prevent unnecessary
operations.

Logs a debug messase before call_usermodehelper_setup.
e.g.: pr_emerg("action:%s devpath:%s\n", action_string, devpath);
You will see a large number of uevent_helper processes
are attempted to be created before the rootfs is mounted.

Signed-off-by: zhoumin <teczm@xxxxxxxxxxx>
---
lib/kobject_uevent.c | 20 +++++++++++++++++++-
1 file changed, 19 insertions(+), 1 deletion(-)

diff --git a/lib/kobject_uevent.c b/lib/kobject_uevent.c
index b7f2fa08d9c8..f3d34ded141a 100644
--- a/lib/kobject_uevent.c
+++ b/lib/kobject_uevent.c
@@ -28,6 +28,7 @@
#include <net/sock.h>
#include <net/netlink.h>
#include <net/net_namespace.h>
+#include <linux/namei.h>


atomic64_t uevent_seqnum;
@@ -58,6 +59,23 @@ static const char *kobject_actions[] = {
[KOBJ_UNBIND] = "unbind",
};

+#ifdef CONFIG_UEVENT_HELPER
+static int uevent_helper_lookup(void)
+{
+ static int ret = -ENOENT;
+ struct path path;
+
+ if (!ret)
+ return ret;
+
+ ret = kern_path(uevent_helper, LOOKUP_FOLLOW, &path);
+ if (!ret)
+ path_put(&path);
+
+ return ret;
+}
+#endif
+
static int kobject_action_type(const char *buf, size_t count,
enum kobject_action *type,
const char **args)
@@ -610,7 +628,7 @@ int kobject_uevent_env(struct kobject *kobj, enum kobject_action action,

#ifdef CONFIG_UEVENT_HELPER
/* call uevent_helper, usually only enabled during early boot */
- if (uevent_helper[0] && !kobj_usermode_filter(kobj)) {
+ if (uevent_helper[0] && !uevent_helper_lookup() && !kobj_usermode_filter(kobj)) {
struct subprocess_info *info;

retval = add_uevent_var(env, "HOME=/");
--
2.43.0