MFV r319744,r319745: 8269 dtrace stddev aggregation is normalized incorrectly
illumos/illumos-gate@79809f9cf4
79809f9cf4
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@joyent.com>
Approved by: Robert Mustacchi <rm@joyent.com>
Author: Andriy Gapon <avg@FreeBSD.org>
MFC after: 1 week
Sponsored by: Panzura
This commit is contained in:
commit
b394e6b3dd
@ -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);
|
||||
}
|
@ -0,0 +1,3 @@
|
||||
normalized data:
|
||||
|
||||
31
|
@ -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,
|
||||
|
Loading…
x
Reference in New Issue
Block a user