Author: markj
Date: Thu Jul 24 01:08:02 2014
New Revision: 269040
URL: http://svnweb.freebsd.org/changeset/base/269040

Log:
  MFC r262329:
  Define the KM_NORMALPRI flag for kmem_alloc(), as it is used in some
  upstream DTrace code.
  
  MFC r262330:
  1452 DTrace buffer autoscaling should be less violent
  
  illumos/illumos-gate@6fb4854bed54ce82bd8610896b64ddebcd4af706

Modified:
  
stable/9/cddl/contrib/opensolaris/cmd/dtrace/test/tst/common/buffering/tst.resize1.d
  
stable/9/cddl/contrib/opensolaris/cmd/dtrace/test/tst/common/buffering/tst.resize2.d
  stable/9/cddl/contrib/opensolaris/lib/libdtrace/common/dt_options.c
  stable/9/sys/cddl/compat/opensolaris/sys/kmem.h
  stable/9/sys/cddl/contrib/opensolaris/uts/common/dtrace/dtrace.c
Directory Properties:
  stable/9/cddl/contrib/opensolaris/   (props changed)
  stable/9/cddl/contrib/opensolaris/lib/libdtrace/common/   (props changed)
  stable/9/sys/   (props changed)
  stable/9/sys/cddl/contrib/opensolaris/   (props changed)

Modified: 
stable/9/cddl/contrib/opensolaris/cmd/dtrace/test/tst/common/buffering/tst.resize1.d
==============================================================================
--- 
stable/9/cddl/contrib/opensolaris/cmd/dtrace/test/tst/common/buffering/tst.resize1.d
        Thu Jul 24 00:25:25 2014        (r269039)
+++ 
stable/9/cddl/contrib/opensolaris/cmd/dtrace/test/tst/common/buffering/tst.resize1.d
        Thu Jul 24 01:08:02 2014        (r269040)
@@ -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: 
stable/9/cddl/contrib/opensolaris/cmd/dtrace/test/tst/common/buffering/tst.resize2.d
==============================================================================
--- 
stable/9/cddl/contrib/opensolaris/cmd/dtrace/test/tst/common/buffering/tst.resize2.d
        Thu Jul 24 00:25:25 2014        (r269039)
+++ 
stable/9/cddl/contrib/opensolaris/cmd/dtrace/test/tst/common/buffering/tst.resize2.d
        Thu Jul 24 01:08:02 2014        (r269040)
@@ -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: stable/9/cddl/contrib/opensolaris/lib/libdtrace/common/dt_options.c
==============================================================================
--- stable/9/cddl/contrib/opensolaris/lib/libdtrace/common/dt_options.c Thu Jul 
24 00:25:25 2014        (r269039)
+++ stable/9/cddl/contrib/opensolaris/lib/libdtrace/common/dt_options.c Thu Jul 
24 01:08:02 2014        (r269040)
@@ -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: stable/9/sys/cddl/compat/opensolaris/sys/kmem.h
==============================================================================
--- stable/9/sys/cddl/compat/opensolaris/sys/kmem.h     Thu Jul 24 00:25:25 
2014        (r269039)
+++ stable/9/sys/cddl/compat/opensolaris/sys/kmem.h     Thu Jul 24 01:08:02 
2014        (r269040)
@@ -46,8 +46,9 @@ MALLOC_DECLARE(M_SOLARIS);
 #define        KM_PUSHPAGE             M_WAITOK
 #define        KM_NOSLEEP              M_NOWAIT
 #define        KM_NODEBUG              M_NODUMP
-#define        KMC_NOTOUCH             0
+#define        KM_NORMALPRI            0
 #define        KMC_NODEBUG             UMA_ZONE_NODUMP
+#define        KMC_NOTOUCH             0
 
 typedef struct kmem_cache {
        char            kc_name[32];

Modified: stable/9/sys/cddl/contrib/opensolaris/uts/common/dtrace/dtrace.c
==============================================================================
--- stable/9/sys/cddl/contrib/opensolaris/uts/common/dtrace/dtrace.c    Thu Jul 
24 00:25:25 2014        (r269039)
+++ stable/9/sys/cddl/contrib/opensolaris/uts/common/dtrace/dtrace.c    Thu Jul 
24 01:08:02 2014        (r269040)
@@ -10809,17 +10809,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);
@@ -10843,7 +10846,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;
@@ -10854,7 +10858,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);
 
@@ -10868,27 +10873,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__)
        /*
         * FreeBSD isn't good at limiting the amount of memory we
@@ -10896,7 +10903,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));
@@ -10918,7 +10925,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;
@@ -10929,7 +10937,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;
        }
 
@@ -10945,16 +10954,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;
@@ -10962,9 +10974,10 @@ err:
                buf->dtb_size = 0;
 
        }
+#endif
+       *factor = desired / (allocated > 0 ? allocated : 1);
 
        return (ENOMEM);
-#endif
 }
 
 /*
@@ -12918,7 +12931,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;
@@ -13370,7 +13383,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));
@@ -13400,7 +13413,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.
@@ -13418,7 +13431,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;
@@ -13427,6 +13440,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);
@@ -13528,7 +13544,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;
@@ -13539,7 +13556,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-stable-9@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-stable-9
To unsubscribe, send any mail to "svn-src-stable-9-unsubscr...@freebsd.org"

Reply via email to