svn commit: r262330 - in head: cddl/contrib/opensolaris/cmd/dtrace/test/tst/common/buffering cddl/contrib/opensolaris/lib/libdtrace/common sys/cddl/contrib/opensolaris/uts/common/dtrace

Mark Johnston markj at FreeBSD.org
Sat Feb 22 05:18:56 UTC 2014


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 at 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;
 		}


More information about the svn-src-head mailing list