Author: markj
Date: Sat Feb 22 05:18:55 2014
New Revision: 262330
URL: http://svnweb.freebsd.org/changeset/base/262330

Log:
  1452 DTrace buffer autoscaling should be less violent
  
  illumos/illumos-gate@6fb4854bed54ce82bd8610896b64ddebcd4af706
  
  This fixes the tst.resize1.d and tst.resize2.d DTrace tests, which have
  been failing since r261122 since they were causing dtrace(1) to attempt to
  allocate and use large amounts of memory, and get killed by the OOM killer
  as a result.
  
  MFC after:    1 month

Modified:
  
head/cddl/contrib/opensolaris/cmd/dtrace/test/tst/common/buffering/tst.resize1.d
  
head/cddl/contrib/opensolaris/cmd/dtrace/test/tst/common/buffering/tst.resize2.d
  head/cddl/contrib/opensolaris/lib/libdtrace/common/dt_options.c
  head/sys/cddl/contrib/opensolaris/uts/common/dtrace/dtrace.c

Modified: 
head/cddl/contrib/opensolaris/cmd/dtrace/test/tst/common/buffering/tst.resize1.d
==============================================================================
--- 
head/cddl/contrib/opensolaris/cmd/dtrace/test/tst/common/buffering/tst.resize1.d
    Sat Feb 22 05:13:35 2014        (r262329)
+++ 
head/cddl/contrib/opensolaris/cmd/dtrace/test/tst/common/buffering/tst.resize1.d
    Sat Feb 22 05:18:55 2014        (r262330)
@@ -24,8 +24,6 @@
  * Use is subject to license terms.
  */
 
-#pragma ident  "%Z%%M% %I%     %E% SMI"
-
 /*
  * ASSERTION:
  *     Checks that setting "bufresize" to "auto" will cause buffer
@@ -34,14 +32,8 @@
  * SECTION: Buffers and Buffering/Buffer Resizing Policy;
  *     Options and Tunables/bufsize;
  *     Options and Tunables/bufresize
- *
- * NOTES:
- *     We use the undocumented "preallocate" option to make sure dtrace(1M)
- *     has enough space in its heap to allocate a buffer as large as the
- *     kernel's trace buffer.
  */
 
-#pragma D option preallocate=100t
 #pragma D option bufresize=auto
 #pragma D option bufsize=100t
 

Modified: 
head/cddl/contrib/opensolaris/cmd/dtrace/test/tst/common/buffering/tst.resize2.d
==============================================================================
--- 
head/cddl/contrib/opensolaris/cmd/dtrace/test/tst/common/buffering/tst.resize2.d
    Sat Feb 22 05:13:35 2014        (r262329)
+++ 
head/cddl/contrib/opensolaris/cmd/dtrace/test/tst/common/buffering/tst.resize2.d
    Sat Feb 22 05:18:55 2014        (r262330)
@@ -24,8 +24,6 @@
  * Use is subject to license terms.
  */
 
-#pragma ident  "%Z%%M% %I%     %E% SMI"
-
 /*
  * ASSERTION:
  *     Checks that setting "bufresize" to "auto" will cause buffer
@@ -34,14 +32,8 @@
  * SECTION: Buffers and Buffering/Buffer Resizing Policy;
  *     Options and Tunables/aggsize;
  *     Options and Tunables/bufresize
- *
- * NOTES:
- *     We use the undocumented "preallocate" option to make sure dtrace(1M)
- *     has enough space in its heap to allocate a buffer as large as the
- *     kernel's trace buffer.
  */
 
-#pragma D option preallocate=100t
 #pragma D option bufresize=auto
 #pragma D option aggsize=100t
 

Modified: head/cddl/contrib/opensolaris/lib/libdtrace/common/dt_options.c
==============================================================================
--- head/cddl/contrib/opensolaris/lib/libdtrace/common/dt_options.c     Sat Feb 
22 05:13:35 2014        (r262329)
+++ head/cddl/contrib/opensolaris/lib/libdtrace/common/dt_options.c     Sat Feb 
22 05:18:55 2014        (r262330)
@@ -24,8 +24,6 @@
  * Use is subject to license terms.
  */
 
-#pragma ident  "%Z%%M% %I%     %E% SMI"
-
 /*
  * Copyright (c) 2012 by Delphix. All rights reserved.
  */
@@ -906,30 +904,6 @@ dt_options_load(dtrace_hdl_t *dtp)
        return (0);
 }
 
-/*ARGSUSED*/
-static int
-dt_opt_preallocate(dtrace_hdl_t *dtp, const char *arg, uintptr_t option)
-{
-       dtrace_optval_t size;
-       void *p;
-
-       if (arg == NULL || dt_optval_parse(arg, &size) != 0)
-               return (dt_set_errno(dtp, EDT_BADOPTVAL));
-
-       if (size > SIZE_MAX)
-               size = SIZE_MAX;
-
-       if ((p = dt_zalloc(dtp, size)) == NULL) {
-               do {
-                       size /= 2;
-               } while ((p = dt_zalloc(dtp, size)) == NULL);
-       }
-
-       dt_free(dtp, p);
-
-       return (0);
-}
-
 typedef struct dt_option {
        const char *o_name;
        int (*o_func)(dtrace_hdl_t *, const char *, uintptr_t);
@@ -968,7 +942,6 @@ static const dt_option_t _dtrace_ctoptio
        { "linktype", dt_opt_linktype },
        { "nolibs", dt_opt_cflags, DTRACE_C_NOLIBS },
        { "pgmax", dt_opt_pgmax },
-       { "preallocate", dt_opt_preallocate },
        { "pspec", dt_opt_cflags, DTRACE_C_PSPEC },
        { "setenv", dt_opt_setenv, 1 },
        { "stdc", dt_opt_stdc },

Modified: head/sys/cddl/contrib/opensolaris/uts/common/dtrace/dtrace.c
==============================================================================
--- head/sys/cddl/contrib/opensolaris/uts/common/dtrace/dtrace.c        Sat Feb 
22 05:13:35 2014        (r262329)
+++ head/sys/cddl/contrib/opensolaris/uts/common/dtrace/dtrace.c        Sat Feb 
22 05:18:55 2014        (r262330)
@@ -10853,17 +10853,20 @@ dtrace_buffer_activate(dtrace_state_t *s
 
 static int
 dtrace_buffer_alloc(dtrace_buffer_t *bufs, size_t size, int flags,
-    processorid_t cpu)
+    processorid_t cpu, int *factor)
 {
 #if defined(sun)
        cpu_t *cp;
 #endif
        dtrace_buffer_t *buf;
+       int allocated = 0, desired = 0;
 
 #if defined(sun)
        ASSERT(MUTEX_HELD(&cpu_lock));
        ASSERT(MUTEX_HELD(&dtrace_lock));
 
+       *factor = 1;
+
        if (size > dtrace_nonroot_maxsize &&
            !PRIV_POLICY_CHOICE(CRED(), PRIV_ALL, B_FALSE))
                return (EFBIG);
@@ -10887,7 +10890,8 @@ dtrace_buffer_alloc(dtrace_buffer_t *buf
 
                ASSERT(buf->dtb_xamot == NULL);
 
-               if ((buf->dtb_tomax = kmem_zalloc(size, KM_NOSLEEP)) == NULL)
+               if ((buf->dtb_tomax = kmem_zalloc(size,
+                   KM_NOSLEEP | KM_NORMALPRI)) == NULL)
                        goto err;
 
                buf->dtb_size = size;
@@ -10898,7 +10902,8 @@ dtrace_buffer_alloc(dtrace_buffer_t *buf
                if (flags & DTRACEBUF_NOSWITCH)
                        continue;
 
-               if ((buf->dtb_xamot = kmem_zalloc(size, KM_NOSLEEP)) == NULL)
+               if ((buf->dtb_xamot = kmem_zalloc(size,
+                   KM_NOSLEEP | KM_NORMALPRI)) == NULL)
                        goto err;
        } while ((cp = cp->cpu_next) != cpu_list);
 
@@ -10912,27 +10917,29 @@ err:
                        continue;
 
                buf = &bufs[cp->cpu_id];
+               desired += 2;
 
                if (buf->dtb_xamot != NULL) {
                        ASSERT(buf->dtb_tomax != NULL);
                        ASSERT(buf->dtb_size == size);
                        kmem_free(buf->dtb_xamot, size);
+                       allocated++;
                }
 
                if (buf->dtb_tomax != NULL) {
                        ASSERT(buf->dtb_size == size);
                        kmem_free(buf->dtb_tomax, size);
+                       allocated++;
                }
 
                buf->dtb_tomax = NULL;
                buf->dtb_xamot = NULL;
                buf->dtb_size = 0;
        } while ((cp = cp->cpu_next) != cpu_list);
-
-       return (ENOMEM);
 #else
        int i;
 
+       *factor = 1;
 #if defined(__amd64__) || defined(__mips__) || defined(__powerpc__)
        /*
         * FreeBSD isn't good at limiting the amount of memory we
@@ -10940,7 +10947,7 @@ err:
         * to do something that might well end in tears at bedtime.
         */
        if (size > physmem * PAGE_SIZE / (128 * (mp_maxid + 1)))
-               return(ENOMEM);
+               return (ENOMEM);
 #endif
 
        ASSERT(MUTEX_HELD(&dtrace_lock));
@@ -10962,7 +10969,8 @@ err:
 
                ASSERT(buf->dtb_xamot == NULL);
 
-               if ((buf->dtb_tomax = kmem_zalloc(size, KM_NOSLEEP)) == NULL)
+               if ((buf->dtb_tomax = kmem_zalloc(size,
+                   KM_NOSLEEP | KM_NORMALPRI)) == NULL)
                        goto err;
 
                buf->dtb_size = size;
@@ -10973,7 +10981,8 @@ err:
                if (flags & DTRACEBUF_NOSWITCH)
                        continue;
 
-               if ((buf->dtb_xamot = kmem_zalloc(size, KM_NOSLEEP)) == NULL)
+               if ((buf->dtb_xamot = kmem_zalloc(size,
+                   KM_NOSLEEP | KM_NORMALPRI)) == NULL)
                        goto err;
        }
 
@@ -10989,16 +10998,19 @@ err:
                        continue;
 
                buf = &bufs[i];
+               desired += 2;
 
                if (buf->dtb_xamot != NULL) {
                        ASSERT(buf->dtb_tomax != NULL);
                        ASSERT(buf->dtb_size == size);
                        kmem_free(buf->dtb_xamot, size);
+                       allocated++;
                }
 
                if (buf->dtb_tomax != NULL) {
                        ASSERT(buf->dtb_size == size);
                        kmem_free(buf->dtb_tomax, size);
+                       allocated++;
                }
 
                buf->dtb_tomax = NULL;
@@ -11006,9 +11018,10 @@ err:
                buf->dtb_size = 0;
 
        }
+#endif
+       *factor = desired / (allocated > 0 ? allocated : 1);
 
        return (ENOMEM);
-#endif
 }
 
 /*
@@ -12961,7 +12974,7 @@ dtrace_dstate_init(dtrace_dstate_t *dsta
        if (size < (min = dstate->dtds_chunksize + sizeof (dtrace_dynhash_t)))
                size = min;
 
-       if ((base = kmem_zalloc(size, KM_NOSLEEP)) == NULL)
+       if ((base = kmem_zalloc(size, KM_NOSLEEP | KM_NORMALPRI)) == NULL)
                return (ENOMEM);
 
        dstate->dtds_size = size;
@@ -13413,7 +13426,7 @@ dtrace_state_buffer(dtrace_state_t *stat
 {
        dtrace_optval_t *opt = state->dts_options, size;
        processorid_t cpu = 0;;
-       int flags = 0, rval;
+       int flags = 0, rval, factor, divisor = 1;
 
        ASSERT(MUTEX_HELD(&dtrace_lock));
        ASSERT(MUTEX_HELD(&cpu_lock));
@@ -13443,7 +13456,7 @@ dtrace_state_buffer(dtrace_state_t *stat
                        flags |= DTRACEBUF_INACTIVE;
        }
 
-       for (size = opt[which]; size >= sizeof (uint64_t); size >>= 1) {
+       for (size = opt[which]; size >= sizeof (uint64_t); size /= divisor) {
                /*
                 * The size must be 8-byte aligned.  If the size is not 8-byte
                 * aligned, drop it down by the difference.
@@ -13461,7 +13474,7 @@ dtrace_state_buffer(dtrace_state_t *stat
                        return (E2BIG);
                }
 
-               rval = dtrace_buffer_alloc(buf, size, flags, cpu);
+               rval = dtrace_buffer_alloc(buf, size, flags, cpu, &factor);
 
                if (rval != ENOMEM) {
                        opt[which] = size;
@@ -13470,6 +13483,9 @@ dtrace_state_buffer(dtrace_state_t *stat
 
                if (opt[DTRACEOPT_BUFRESIZE] == DTRACEOPT_BUFRESIZE_MANUAL)
                        return (rval);
+
+               for (divisor = 2; divisor < factor; divisor <<= 1)
+                       continue;
        }
 
        return (ENOMEM);
@@ -13571,7 +13587,8 @@ dtrace_state_go(dtrace_state_t *state, p
                goto out;
        }
 
-       spec = kmem_zalloc(nspec * sizeof (dtrace_speculation_t), KM_NOSLEEP);
+       spec = kmem_zalloc(nspec * sizeof (dtrace_speculation_t),
+           KM_NOSLEEP | KM_NORMALPRI);
 
        if (spec == NULL) {
                rval = ENOMEM;
@@ -13582,7 +13599,8 @@ dtrace_state_go(dtrace_state_t *state, p
        state->dts_nspeculations = (int)nspec;
 
        for (i = 0; i < nspec; i++) {
-               if ((buf = kmem_zalloc(bufsize, KM_NOSLEEP)) == NULL) {
+               if ((buf = kmem_zalloc(bufsize,
+                   KM_NOSLEEP | KM_NORMALPRI)) == NULL) {
                        rval = ENOMEM;
                        goto err;
                }
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to