]> granicus.if.org Git - zfs/commitdiff
Minimize ztest stack frame size
authorBrian Behlendorf <behlendorf1@llnl.gov>
Thu, 4 Oct 2012 18:14:04 +0000 (11:14 -0700)
committerBrian Behlendorf <behlendorf1@llnl.gov>
Thu, 4 Oct 2012 20:19:09 +0000 (13:19 -0700)
To ensure ztest behaves as similarly as possible to the kernel
implementation of ZFS we attempt to honor the kernel stack limits.
This includes keeping the individual stack frame sizes under 1K
in size.  We currently use gcc to detect and enforce this limit.

Therefore to get this building cleanly with full debugging enabled
the stack usage in the following functions has been reduced by
moving the buffer to the heap.

Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov>
cmd/ztest/ztest.c

index 973e7b2f6a80c2454cd85bebabb7dbd3acc57dc0..65cbbe0b44c4efc2c532af9dd3539e553275742a 100644 (file)
@@ -5900,12 +5900,13 @@ exec_child(char *cmd, char *libpath, boolean_t ignorekill, int *statusp)
 {
        pid_t pid;
        int status;
-       char cmdbuf[MAXPATHLEN];
+       char *cmdbuf = NULL;
 
        pid = fork();
 
        if (cmd == NULL) {
-               (void) strlcpy(cmdbuf, getexecname(), sizeof (cmdbuf));
+               cmdbuf = umem_alloc(MAXPATHLEN, UMEM_NOFAIL);
+               (void) strlcpy(cmdbuf, getexecname(), MAXPATHLEN);
                cmd = cmdbuf;
        }
 
@@ -5931,6 +5932,11 @@ exec_child(char *cmd, char *libpath, boolean_t ignorekill, int *statusp)
                fatal(B_TRUE, "exec failed: %s", cmd);
        }
 
+       if (cmdbuf != NULL) {
+               umem_free(cmdbuf, MAXPATHLEN);
+               cmd = NULL;
+       }
+
        while (waitpid(pid, &status, 0) != pid)
                continue;
        if (statusp != NULL)
@@ -5997,7 +6003,7 @@ main(int argc, char **argv)
        char timebuf[100];
        char numbuf[6];
        spa_t *spa;
-       char cmd[MAXNAMELEN];
+       char *cmd;
        boolean_t hasalt;
        int f;
        char *fd_data_str = getenv("ZTEST_FD_DATA");
@@ -6054,7 +6060,8 @@ main(int argc, char **argv)
                    (u_longlong_t)ztest_opts.zo_time);
        }
 
-       (void) strlcpy(cmd, getexecname(), sizeof (cmd));
+       cmd = umem_alloc(MAXNAMELEN, UMEM_NOFAIL);
+       (void) strlcpy(cmd, getexecname(), MAXNAMELEN);
 
        zs->zs_do_init = B_TRUE;
        if (strlen(ztest_opts.zo_alt_ztest) != 0) {
@@ -6195,5 +6202,7 @@ main(int argc, char **argv)
                    kills, iters - kills, (100.0 * kills) / MAX(1, iters));
        }
 
+       umem_free(cmd, MAXNAMELEN);
+
        return (0);
 }