* [PATCH -mm 2/3] call_usermodehelper: simplify/fix UMH_NO_WAIT case
@ 2010-03-09 21:45 Oleg Nesterov
0 siblings, 0 replies; only message in thread
From: Oleg Nesterov @ 2010-03-09 21:45 UTC (permalink / raw)
To: Andrew Morton
Cc: Andi Kleen, David Howells, Neil Horman, Rusty Russell,
linux-kernel
__call_usermodehelper(UMH_NO_WAIT) has 2 problems:
- if kernel_thread() fails, call_usermodehelper_freeinfo()
is not called.
- for unknown reason UMH_NO_WAIT has UMH_WAIT_PROC logic,
we spawn yet another thread which waits until the user
mode application exits.
Change the UMH_NO_WAIT code to use ____call_usermodehelper() instead of
wait_for_helper(), and do call_usermodehelper_freeinfo() unconditionally.
We can rely on CLONE_VFORK, do_fork(CLONE_VFORK) until the child exits
or execs.
With or without this patch UMH_NO_WAIT does not report the error if
kernel_thread() fails, this is correct since the caller doesn't wait
for result.
Signed-off-by: Oleg Nesterov <oleg@redhat.com>
---
kernel/kmod.c | 10 ++++------
1 file changed, 4 insertions(+), 6 deletions(-)
--- mm/kernel/kmod.c~2_UMH_NO_WAIT 2010-03-09 21:31:09.000000000 +0100
+++ mm/kernel/kmod.c 2010-03-09 21:56:36.000000000 +0100
@@ -224,10 +224,7 @@ static int wait_for_helper(void *data)
sub_info->retval = ret;
}
- if (sub_info->wait == UMH_NO_WAIT)
- call_usermodehelper_freeinfo(sub_info);
- else
- complete(sub_info->complete);
+ complete(sub_info->complete);
return 0;
}
@@ -236,13 +233,13 @@ static void __call_usermodehelper(struct
{
struct subprocess_info *sub_info =
container_of(work, struct subprocess_info, work);
- pid_t pid;
enum umh_wait wait = sub_info->wait;
+ pid_t pid;
/* CLONE_VFORK: wait until the usermode helper has execve'd
* successfully We need the data structures to stay around
* until that is done. */
- if (wait == UMH_WAIT_PROC || wait == UMH_NO_WAIT)
+ if (wait == UMH_WAIT_PROC)
pid = kernel_thread(wait_for_helper, sub_info,
CLONE_FS | CLONE_FILES | SIGCHLD);
else
@@ -251,6 +248,7 @@ static void __call_usermodehelper(struct
switch (wait) {
case UMH_NO_WAIT:
+ call_usermodehelper_freeinfo(sub_info);
break;
case UMH_WAIT_PROC:
^ permalink raw reply [flat|nested] only message in thread
only message in thread, other threads:[~2010-03-09 22:48 UTC | newest]
Thread overview: (only message) (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2010-03-09 21:45 [PATCH -mm 2/3] call_usermodehelper: simplify/fix UMH_NO_WAIT case Oleg Nesterov
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.