svn commit: r319746 - in head: cddl/contrib/opensolaris/cmd/dtrace/test/tst/common/aggs sys/dev/aacraid

Andriy Gapon avg at FreeBSD.org
Fri Jun 9 15:16:40 UTC 2017


Author: avg
Date: Fri Jun  9 15:16:39 2017
New Revision: 319746
URL: https://svnweb.freebsd.org/changeset/base/319746

Log:
  MFV r319744,r319745: 8269 dtrace stddev aggregation is normalized incorrectly
  
  illumos/illumos-gate at 79809f9cf402f130667349b2d4007ecd65d63c6f
  https://github.com/illumos/illumos-gate/commit/79809f9cf402f130667349b2d4007ecd65d63c6f
  
  https://www.illumos.org/issues/8269
    It seems that currently normalization of stddev aggregation is done
    incorrectly.
    We divide both the sum of values and the sum of their squares by the
    normalization factor. But we should divide the sum of squares by the
    normalization factor squared to scale the original values properly.
  
  FreeBSD note: the actual change was committed in r316853, this commit
  adds the test files and record merge information.
  
  Reviewed by: Bryan Cantrill <bryan at joyent.com>
  Approved by: Robert Mustacchi <rm at joyent.com>
  Author: Andriy Gapon <avg at FreeBSD.org>
  MFC after:	1 week
  Sponsored by:	Panzura

Added:
  head/cddl/contrib/opensolaris/cmd/dtrace/test/tst/common/aggs/tst.stddev.normalize.d
     - copied unchanged from r319745, vendor/illumos/dist/cmd/dtrace/test/tst/common/aggs/tst.stddev.normalize.d
  head/cddl/contrib/opensolaris/cmd/dtrace/test/tst/common/aggs/tst.stddev.normalize.d.out
     - copied unchanged from r319745, vendor/illumos/dist/cmd/dtrace/test/tst/common/aggs/tst.stddev.normalize.d.out
Modified:
  head/sys/dev/aacraid/aacraid.c
Directory Properties:
  head/cddl/contrib/opensolaris/   (props changed)

Copied: head/cddl/contrib/opensolaris/cmd/dtrace/test/tst/common/aggs/tst.stddev.normalize.d (from r319745, vendor/illumos/dist/cmd/dtrace/test/tst/common/aggs/tst.stddev.normalize.d)
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ head/cddl/contrib/opensolaris/cmd/dtrace/test/tst/common/aggs/tst.stddev.normalize.d	Fri Jun  9 15:16:39 2017	(r319746, copy of r319745, vendor/illumos/dist/cmd/dtrace/test/tst/common/aggs/tst.stddev.normalize.d)
@@ -0,0 +1,46 @@
+/*
+ * This file and its contents are supplied under the terms of the
+ * Common Development and Distribution License ("CDDL"), version 1.0.
+ * You may only use this file in accordance with the terms of version
+ * 1.0 of the CDDL.
+ *
+ * A full copy of the text of the CDDL should have accompanied this
+ * source.  A copy of the CDDL is also available via the Internet at
+ * http://www.illumos.org/license/CDDL.
+ */
+
+/*
+ * Copyright 2017 Panzura.  All rights reserved.
+ */
+
+/*
+ * ASSERTION:
+ *   Positive test for normalization() of stddev()
+ *
+ * SECTION: Aggregations/Normalization
+ *
+ */
+
+#pragma D option quiet
+#pragma D option aggrate=1ms
+#pragma D option switchrate=50ms
+
+BEGIN
+{
+	i = 0;
+}
+
+tick-100ms
+/i < 11/
+{
+	@ = stddev(i * 100);
+	i++;
+}
+
+tick-100ms
+/i == 11/
+{
+	printf("normalized data:\n");
+	normalize(@, 10);
+	exit(0);
+}

Copied: head/cddl/contrib/opensolaris/cmd/dtrace/test/tst/common/aggs/tst.stddev.normalize.d.out (from r319745, vendor/illumos/dist/cmd/dtrace/test/tst/common/aggs/tst.stddev.normalize.d.out)
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ head/cddl/contrib/opensolaris/cmd/dtrace/test/tst/common/aggs/tst.stddev.normalize.d.out	Fri Jun  9 15:16:39 2017	(r319746, copy of r319745, vendor/illumos/dist/cmd/dtrace/test/tst/common/aggs/tst.stddev.normalize.d.out)
@@ -0,0 +1,3 @@
+normalized data:
+
+               31

Modified: head/sys/dev/aacraid/aacraid.c
==============================================================================
--- head/sys/dev/aacraid/aacraid.c	Fri Jun  9 15:06:50 2017	(r319745)
+++ head/sys/dev/aacraid/aacraid.c	Fri Jun  9 15:16:39 2017	(r319746)
@@ -670,12 +670,10 @@ aac_alloc(struct aac_softc *sc)
 	TAILQ_INIT(&sc->aac_fibmap_tqh);
 	sc->aac_commands = malloc(sc->aac_max_fibs * sizeof(struct aac_command),
 				  M_AACRAIDBUF, M_WAITOK|M_ZERO);
-	mtx_lock(&sc->aac_io_lock);
 	while (sc->total_fibs < sc->aac_max_fibs) {
 		if (aac_alloc_commands(sc) != 0)
 			break;
 	}
-	mtx_unlock(&sc->aac_io_lock);
 	if (sc->total_fibs == 0)
 		return (ENOMEM);
 
@@ -1046,7 +1044,9 @@ aac_command_thread(struct aac_softc *sc)
 		 * will grab Giant, and would result in an LOR.
 		 */
 		if ((sc->aifflags & AAC_AIFFLAGS_ALLOCFIBS) != 0) {
+			mtx_unlock(&sc->aac_io_lock);
 			aac_alloc_commands(sc);
+			mtx_lock(&sc->aac_io_lock);
 			sc->aifflags &= ~AAC_AIFFLAGS_ALLOCFIBS;
 			aacraid_startio(sc);
 		}
@@ -1193,7 +1193,6 @@ aac_alloc_commands(struct aac_softc *sc)
 	u_int32_t maxsize;
 
 	fwprintf(sc, HBA_FLAGS_DBG_FUNCTION_ENTRY_B, "");
-	mtx_assert(&sc->aac_io_lock, MA_OWNED);
 
 	if (sc->total_fibs + sc->aac_max_fibs_alloc > sc->aac_max_fibs)
 		return (ENOMEM);
@@ -1202,7 +1201,6 @@ aac_alloc_commands(struct aac_softc *sc)
 	if (fm == NULL)
 		return (ENOMEM);
 
-	mtx_unlock(&sc->aac_io_lock);
 	/* allocate the FIBs in DMAable memory and load them */
 	if (bus_dmamem_alloc(sc->aac_fib_dmat, (void **)&fm->aac_fibs,
 			     BUS_DMA_NOWAIT, &fm->aac_fibmap)) {
@@ -1220,7 +1218,6 @@ aac_alloc_commands(struct aac_softc *sc)
 	(void)bus_dmamap_load(sc->aac_fib_dmat, fm->aac_fibmap, fm->aac_fibs,
 			      sc->aac_max_fibs_alloc * maxsize,
 			      aac_map_command_helper, &fibphys, 0);
-	mtx_lock(&sc->aac_io_lock);
 
 	/* initialize constant fields in the command structure */
 	bzero(fm->aac_fibs, sc->aac_max_fibs_alloc * maxsize);
@@ -1250,8 +1247,12 @@ aac_alloc_commands(struct aac_softc *sc)
 		if ((error = bus_dmamap_create(sc->aac_buffer_dmat, 0,
 					       &cm->cm_datamap)) != 0)
 			break;
-		if (sc->aac_max_fibs <= 1 || sc->aac_max_fibs - sc->total_fibs > 1)
+		if (sc->aac_max_fibs <= 1 ||
+		    sc->aac_max_fibs - sc->total_fibs > 1) {
+			mtx_lock(&sc->aac_io_lock);
 			aacraid_release_command(cm);
+			mtx_unlock(&sc->aac_io_lock);
+		}
 		sc->total_fibs++;
 	}
 
@@ -1500,6 +1501,7 @@ aac_unmap_command(struct aac_command *cm)
 	if (!(cm->cm_flags & AAC_CMD_MAPPED))
 		return;
 
+	mtx_assert(&sc->aac_io_lock, MA_OWNED);
 	if (cm->cm_datalen != 0 && cm->cm_passthr_dmat == 0) {
 		if (cm->cm_flags & AAC_CMD_DATAIN)
 			bus_dmamap_sync(sc->aac_buffer_dmat, cm->cm_datamap,


More information about the svn-src-all mailing list