uml: simplify helper stack handling
authorJeff Dike <jdike@addtoit.com>
Mon, 16 Jul 2007 06:38:56 +0000 (23:38 -0700)
committerLinus Torvalds <torvalds@woody.linux-foundation.org>
Mon, 16 Jul 2007 16:05:38 +0000 (09:05 -0700)
run_helper and run_helper_thread had arguments which were the same in all
callers.  run_helper's stack_out was always NULL and run_helper_thread's
stack_order was always 0.  These are now gone, and the constants folded
into the code.

Also fixed leaks of the helper stack in the AIO and SIGIO code.

Signed-off-by: Jeff Dike <jdike@linux.intel.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
13 files changed:
arch/um/drivers/chan_user.c
arch/um/drivers/harddog_user.c
arch/um/drivers/net_user.c
arch/um/drivers/port_user.c
arch/um/drivers/slip_user.c
arch/um/drivers/slirp_user.c
arch/um/drivers/xterm.c
arch/um/include/os.h
arch/um/os-Linux/aio.c
arch/um/os-Linux/drivers/ethertap_user.c
arch/um/os-Linux/drivers/tuntap_user.c
arch/um/os-Linux/helper.c
arch/um/os-Linux/sigio.c

index 8b81bd5f20f2ff4c6fb6b11414d0bfdc0bd79679..4d438f36ea2e66b68451dd6f9039b28e6dab11c2 100644 (file)
@@ -161,7 +161,7 @@ static int winch_tramp(int fd, struct tty_struct *tty, int *fd_out,
         * problem with /dev/net/tun, which if held open by this
         * thread, prevents the TUN/TAP device from being reused.
         */
-       err = run_helper_thread(winch_thread, &data, CLONE_FILES, stack_out, 0);
+       err = run_helper_thread(winch_thread, &data, CLONE_FILES, stack_out);
        if(err < 0){
                printk("fork of winch_thread failed - errno = %d\n", -err);
                goto out_close;
index 5eeecf8917c3158b31a6ef960a14a7d9312f4d1b..1171790f742c33c79fe41b18fe4801947cc640d8 100644 (file)
@@ -68,7 +68,7 @@ int start_watchdog(int *in_fd_ret, int *out_fd_ret, char *sock)
                args = pid_args;
        }
 
-       pid = run_helper(pre_exec, &data, args, NULL);
+       pid = run_helper(pre_exec, &data, args);
 
        os_close_file(out_fds[0]);
        os_close_file(in_fds[1]);
index 3503cff867c34d1166466c5da5acc6a14de3f46d..6fa948ba969d137a16f4513f014f0cb5c0334f80 100644 (file)
@@ -187,7 +187,7 @@ static int change_tramp(char **argv, char *output, int output_len)
        }
        pe_data.close_me = fds[0];
        pe_data.stdout = fds[1];
-       pid = run_helper(change_pre_exec, &pe_data, argv, NULL);
+       pid = run_helper(change_pre_exec, &pe_data, argv);
 
        if (pid > 0)    /* Avoid hang as we won't get data in failure case. */
                read_output(fds[0], output, output_len);
index 3f6357d24bee19bc69a469fec39555a138de9f3a..29250beba4296bc55a41b4167eefeaa3393e528f 100644 (file)
@@ -188,7 +188,7 @@ int port_connection(int fd, int *socket, int *pid_out)
                { .sock_fd              = new,
                  .pipe_fd              = socket[1] });
 
-       err = run_helper(port_pre_exec, &data, argv, NULL);
+       err = run_helper(port_pre_exec, &data, argv);
        if(err < 0)
                goto out_shutdown;
 
index 78f0e515da8f792ca57334d6ea1a5f26c0657638..edc2de3ee2f454b355dcab8883951a66dc45d0ae 100644 (file)
@@ -85,7 +85,7 @@ static int slip_tramp(char **argv, int fd)
        pe_data.stdin = fd;
        pe_data.stdout = fds[1];
        pe_data.close_me = fds[0];
-       err = run_helper(slip_pre_exec, &pe_data, argv, NULL);
+       err = run_helper(slip_pre_exec, &pe_data, argv);
        if(err < 0)
                goto out_close;
        pid = err;
index 39f889fe994966a54a00b5818bfbf42f77a3c55a..0e462f64f227f6cae75b4fa95e28bc13450a0aa6 100644 (file)
@@ -42,7 +42,7 @@ static int slirp_tramp(char **argv, int fd)
 
        pe_data.stdin = fd;
        pe_data.stdout = fd;
-       pid = run_helper(slirp_pre_exec, &pe_data, argv, NULL);
+       pid = run_helper(slirp_pre_exec, &pe_data, argv);
 
        return(pid);
 }
index 35912846ed215e23e19739d28d2152e6d0971cd2..fd817e5415435564fcf359945a7362b6ad38db23 100644 (file)
@@ -132,7 +132,7 @@ static int xterm_open(int input, int output, int primary, void *d,
        }
 
        sprintf(title, data->title, data->device);
-       pid = run_helper(NULL, NULL, argv, NULL);
+       pid = run_helper(NULL, NULL, argv);
        if (pid < 0) {
                err = pid;
                printk(UM_KERN_ERR "xterm_open : run_helper failed, "
index 4d9fb26387d565290a58ef093d34f3c25d10042b..930b261ea483ddf1e3e777c05e92c867ca7227fc 100644 (file)
@@ -239,11 +239,9 @@ extern unsigned long __do_user_copy(void *to, const void *from, int n,
 /* execvp.c */
 extern int execvp_noalloc(char *buf, const char *file, char *const argv[]);
 /* helper.c */
-extern int run_helper(void (*pre_exec)(void *), void *pre_data, char **argv,
-                     unsigned long *stack_out);
+extern int run_helper(void (*pre_exec)(void *), void *pre_data, char **argv);
 extern int run_helper_thread(int (*proc)(void *), void *arg,
-                            unsigned int flags, unsigned long *stack_out,
-                            int stack_order);
+                            unsigned int flags, unsigned long *stack_out);
 extern int helper_wait(int pid);
 
 
index 9bf944f6a1dbe75639e4ae029938929c7b0d03d0..b126df4ea168e6f9211b289ee4f033835fa7ec66 100644 (file)
@@ -177,6 +177,7 @@ static int do_not_aio(struct aio_thread_req *req)
 static int aio_req_fd_r = -1;
 static int aio_req_fd_w = -1;
 static int aio_pid = -1;
+static unsigned long aio_stack;
 
 static int not_aio_thread(void *arg)
 {
@@ -212,7 +213,6 @@ static int not_aio_thread(void *arg)
 
 static int init_aio_24(void)
 {
-       unsigned long stack;
        int fds[2], err;
 
        err = os_pipe(fds, 1, 1);
@@ -227,7 +227,7 @@ static int init_aio_24(void)
                goto out_close_pipe;
 
        err = run_helper_thread(not_aio_thread, NULL,
-                               CLONE_FILES | CLONE_VM | SIGCHLD, &stack, 0);
+                               CLONE_FILES | CLONE_VM | SIGCHLD, &aio_stack);
        if(err < 0)
                goto out_close_pipe;
 
@@ -252,7 +252,6 @@ out:
 #define DEFAULT_24_AIO 0
 static int init_aio_26(void)
 {
-       unsigned long stack;
        int err;
 
        if(io_setup(256, &ctx)){
@@ -263,7 +262,7 @@ static int init_aio_26(void)
        }
 
        err = run_helper_thread(aio_thread, NULL,
-                               CLONE_FILES | CLONE_VM | SIGCHLD, &stack, 0);
+                               CLONE_FILES | CLONE_VM | SIGCHLD, &aio_stack);
        if(err < 0)
                return err;
 
@@ -365,8 +364,10 @@ __initcall(init_aio);
 
 static void exit_aio(void)
 {
-       if(aio_pid != -1)
+       if (aio_pid != -1) {
                os_kill_process(aio_pid, 1);
+               free_stack(aio_stack, 0);
+       }
 }
 
 __uml_exitcall(exit_aio);
index acba301612879b4af1d45b96f9b416f8e35a98f6..cac01b31ea95864a2d9c6d6cf36108800d230a6b 100644 (file)
@@ -117,7 +117,7 @@ static int etap_tramp(char *dev, char *gate, int control_me,
        pe_data.control_remote = control_remote;
        pe_data.control_me = control_me;
        pe_data.data_me = data_me;
-       pid = run_helper(etap_pre_exec, &pe_data, args, NULL);
+       pid = run_helper(etap_pre_exec, &pe_data, args);
 
        if(pid < 0)
                err = pid;
index 11a9779dc9f1dea57cd1c0ac808c16d90d111157..f848b4ea9343685a901a91103fa4e2d13b874276 100644 (file)
@@ -83,7 +83,7 @@ static int tuntap_open_tramp(char *gate, int *fd_out, int me, int remote,
        data.stdout = remote;
        data.close_me = me;
 
-       pid = run_helper(tuntap_pre_exec, &data, argv, NULL);
+       pid = run_helper(tuntap_pre_exec, &data, argv);
 
        if(pid < 0)
                return -pid;
index 97bed16bf4c73c2817ceffa283589a8aa02753ef..9cf48d0577cc4f82d1ef674a287123c28c059f05 100644 (file)
@@ -44,17 +44,13 @@ static int helper_child(void *arg)
 /* Returns either the pid of the child process we run or -E* on failure.
  * XXX The alloc_stack here breaks if this is called in the tracing thread, so
  * we need to receive a preallocated stack (a local buffer is ok). */
-int run_helper(void (*pre_exec)(void *), void *pre_data, char **argv,
-              unsigned long *stack_out)
+int run_helper(void (*pre_exec)(void *), void *pre_data, char **argv)
 {
        struct helper_data data;
        unsigned long stack, sp;
        int pid, fds[2], ret, n;
 
-       if ((stack_out != NULL) && (*stack_out != 0))
-               stack = *stack_out;
-       else
-               stack = alloc_stack(0, __cant_sleep());
+       stack = alloc_stack(0, __cant_sleep());
        if (stack == 0)
                return -ENOMEM;
 
@@ -113,22 +109,21 @@ out_close:
                close(fds[1]);
        close(fds[0]);
 out_free:
-       if ((stack_out == NULL) || (*stack_out == 0))
-               free_stack(stack, 0);
+       free_stack(stack, 0);
        return ret;
 }
 
 int run_helper_thread(int (*proc)(void *), void *arg, unsigned int flags,
-                     unsigned long *stack_out, int stack_order)
+                     unsigned long *stack_out)
 {
        unsigned long stack, sp;
        int pid, status, err;
 
-       stack = alloc_stack(stack_order, __cant_sleep());
+       stack = alloc_stack(0, __cant_sleep());
        if (stack == 0)
                return -ENOMEM;
 
-       sp = stack + (UM_KERN_PAGE_SIZE << stack_order) - sizeof(void *);
+       sp = stack + UM_KERN_PAGE_SIZE - sizeof(void *);
        pid = clone(proc, (void *) sp, flags | SIGCHLD, arg);
        if (pid < 0) {
                err = -errno;
@@ -147,7 +142,7 @@ int run_helper_thread(int (*proc)(void *), void *arg, unsigned int flags,
                if (!WIFEXITED(status) || (WEXITSTATUS(status) != 0))
                        printk("run_helper_thread - thread returned status "
                               "0x%x\n", status);
-               free_stack(stack, stack_order);
+               free_stack(stack, 0);
        } else
                *stack_out = stack;
        return pid;
index 8d4e0c6b8c92e085e697557f68e59b87af7afe23..2c23cb261188f2249995e4fc60ea92c77c40b6f0 100644 (file)
@@ -26,6 +26,7 @@
  * exitcall.
  */
 static int write_sigio_pid = -1;
+static unsigned long write_sigio_stack;
 
 /* These arrays are initialized before the sigio thread is started, and
  * the descriptors closed after it is killed.  So, it can't see them change.
@@ -144,8 +145,10 @@ static void update_thread(void)
        return;
  fail:
        /* Critical section start */
-       if(write_sigio_pid != -1)
+       if (write_sigio_pid != -1) {
                os_kill_process(write_sigio_pid, 1);
+               free_stack(write_sigio_stack, 0);
+       }
        write_sigio_pid = -1;
        close(sigio_private[0]);
        close(sigio_private[1]);
@@ -243,7 +246,6 @@ static struct pollfd *setup_initial_poll(int fd)
 
 static void write_sigio_workaround(void)
 {
-       unsigned long stack;
        struct pollfd *p;
        int err;
        int l_write_sigio_fds[2];
@@ -293,7 +295,8 @@ static void write_sigio_workaround(void)
        memcpy(sigio_private, l_sigio_private, sizeof(l_sigio_private));
 
        write_sigio_pid = run_helper_thread(write_sigio_thread, NULL,
-                                           CLONE_FILES | CLONE_VM, &stack, 0);
+                                           CLONE_FILES | CLONE_VM,
+                                           &write_sigio_stack);
 
        if (write_sigio_pid < 0)
                goto out_clear;
@@ -356,10 +359,12 @@ out:
 
 static void sigio_cleanup(void)
 {
-       if(write_sigio_pid != -1){
-               os_kill_process(write_sigio_pid, 1);
-               write_sigio_pid = -1;
-       }
+       if (write_sigio_pid == -1)
+               return;
+
+       os_kill_process(write_sigio_pid, 1);
+       free_stack(write_sigio_stack, 0);
+       write_sigio_pid = -1;
 }
 
 __uml_exitcall(sigio_cleanup);