[Devel] [PATCH vz9 04/14] ve/umh: make queue function one of the subprocess_info parameters

Nikita Yushchenko nikita.yushchenko at virtuozzo.com
Mon Sep 27 09:29:50 MSK 2021


From: Stanislav Kinsburskiy <skinsbursky at virtuozzo.com>

This will allow to use a different one for containers.

Signed-off-by: Stanislav Kinsburskiy <skinsbursky at virtuozzo.com>

(cherry-picked from vz8 commit 041bcd5475d5 ("ve/umh: make queue
function one of the subprocess_info parameters"))

Signed-off-by: Nikita Yushchenko <nikita.yushchenko at virtuozzo.com>
---
 include/linux/umh.h |  1 +
 kernel/umh.c        | 24 ++++++++++++++++++++++--
 2 files changed, 23 insertions(+), 2 deletions(-)

diff --git a/include/linux/umh.h b/include/linux/umh.h
index 244aff638220..d91be2030375 100644
--- a/include/linux/umh.h
+++ b/include/linux/umh.h
@@ -26,6 +26,7 @@ struct subprocess_info {
 	int retval;
 	int (*init)(struct subprocess_info *info, struct cred *new);
 	void (*cleanup)(struct subprocess_info *info);
+	void (*queue)(struct subprocess_info *info);
 	void *data;
 } __randomize_layout;
 
diff --git a/kernel/umh.c b/kernel/umh.c
index 04e60474f1c8..8654aa356b26 100644
--- a/kernel/umh.c
+++ b/kernel/umh.c
@@ -332,6 +332,11 @@ static void helper_unlock(void)
 		wake_up(&running_helpers_waitq);
 }
 
+static void call_usermodehelper_queue(struct subprocess_info *info)
+{
+	queue_work(system_unbound_wq, &info->work);
+}
+
 /**
  * call_usermodehelper_setup - prepare to call a usermode helper
  * @path: path to usermode executable
@@ -355,10 +360,12 @@ static void helper_unlock(void)
  * Function must be runnable in either a process context or the
  * context in which call_usermodehelper_exec is called.
  */
-struct subprocess_info *call_usermodehelper_setup(const char *path, char **argv,
+static struct subprocess_info *__call_usermodehelper_setup(const char *path,
+		char **argv,
 		char **envp, gfp_t gfp_mask,
 		int (*init)(struct subprocess_info *info, struct cred *new),
 		void (*cleanup)(struct subprocess_info *info),
+		void (*queue)(struct subprocess_info *info),
 		void *data)
 {
 	struct subprocess_info *sub_info;
@@ -378,10 +385,23 @@ struct subprocess_info *call_usermodehelper_setup(const char *path, char **argv,
 
 	sub_info->cleanup = cleanup;
 	sub_info->init = init;
+	sub_info->queue = queue;
 	sub_info->data = data;
   out:
 	return sub_info;
 }
+
+struct subprocess_info *call_usermodehelper_setup(const char *path, char **argv,
+		char **envp, gfp_t gfp_mask,
+		int (*init)(struct subprocess_info *info, struct cred *new),
+		void (*cleanup)(struct subprocess_info *info),
+		void *data)
+{
+	return __call_usermodehelper_setup(path, argv, envp, gfp_mask,
+					   init, cleanup,
+					   call_usermodehelper_queue,
+					   data);
+}
 EXPORT_SYMBOL(call_usermodehelper_setup);
 
 /**
@@ -436,7 +456,7 @@ int call_usermodehelper_exec(struct subprocess_info *sub_info, int wait)
 	sub_info->complete = (wait == UMH_NO_WAIT) ? NULL : &done;
 	sub_info->wait = wait;
 
-	queue_work(system_unbound_wq, &sub_info->work);
+	sub_info->queue(sub_info);
 	if (wait == UMH_NO_WAIT)	/* task has freed sub_info */
 		goto unlock;
 
-- 
2.30.2



More information about the Devel mailing list