[DTrace-devel] [PATCH 3/5] agg: ensure there is always space for at least one aggregation

Eugene Loh eugene.loh at oracle.com
Tue May 2 02:32:05 UTC 2023


Well,

1)  Shouldn't this depend on -xbufresize?

2)  And/or why not just complain about insufficient space and let the 
user ask for more if that is what is desired?

In general, it's unclear to me what aggsize even means.  I think the 
nelem*(dt_maxtuplesize+dt_maxaggdsize) memory model is very approximate 
(that's from memory, so I may be wrong) and there is probably some 
rounding to page size, etc.  I didn't try this, but I suspect that, in 
the test that says that aggsize was raised to 285, the user will be 
hard-pressed to see anything that is 285. So why are we telling the user 
about stuff that maps to nothing they see?  We could rationalize some 
explanation, but it would be kind of convoluted from a user's point of view.

Another way of thinking about it is that the legacy parameters 
describing buffer sizing don't really work well for what we're doing 
anymore.  Trying to hang onto them may not make much sense. This patch 
doesn't feel to me to be a meaningful step either in size or direction.

On 5/1/23 15:51, Kris Van Hees via DTrace-devel wrote:
> When aggregations are used, raise the aggsize option value if needed to
> ensure there is room for at least one aggregation.
>
> diff --git a/libdtrace/dt_bpf.c b/libdtrace/dt_bpf.c
> @@ -520,9 +520,11 @@ gmap_create_aggs(dtrace_hdl_t *dtp)
>   
>   	nelems = dtp->dt_options[DTRACEOPT_AGGSIZE] /
>   		 (dtp->dt_maxtuplesize + dtp->dt_maxaggdsize);
> -
> -	if (nelems == 0)
> -		return 0;
> +	if (nelems == 0) {
> +		dtp->dt_options[DTRACEOPT_AGGSIZE] =
> +				dtp->dt_maxtuplesize + dtp->dt_maxaggdsize;
> +		nelems = 1;
> +	}
>   
>   	dtp->dt_aggmap_fd = create_gmap_of_maps(dtp, "aggs",
>   						BPF_MAP_TYPE_ARRAY_OF_MAPS,
> diff --git a/test/unittest/aggs/tst.aggsize-too-small.d b/test/unittest/aggs/tst.aggsize-too-small.d
> new file mode 100644
> index 00000000..3298d600
> --- /dev/null
> +++ b/test/unittest/aggs/tst.aggsize-too-small.d
> @@ -0,0 +1,28 @@
> +/*
> + * Oracle Linux DTrace.
> + * Copyright (c) 2023, Oracle and/or its affiliates. All rights reserved.
> + * Licensed under the Universal Permissive License v 1.0 as shown at
> + * http://oss.oracle.com/licenses/upl.
> + */
> +
> +/*
> + * ASSERTION: If aggsize is too small to hold a single aggregation, the size is
> + *	      increased to make it fit.
> + *
> + * SECTION: Aggregations/Aggregations
> + */
> +
> +#pragma D option quietresize=no
> +#pragma D option aggsize=256
> +#pragma D option strsize=256
> +
> +BEGIN
> +{
> +	@["a"] = count();
> +	exit(0);
> +}
> +
> +ERROR
> +{
> +	exit(0);
> +}
> diff --git a/test/unittest/aggs/tst.aggsize-too-small.r b/test/unittest/aggs/tst.aggsize-too-small.r
> new file mode 100644
> index 00000000..504e0ed0
> --- /dev/null
> +++ b/test/unittest/aggs/tst.aggsize-too-small.r
> @@ -0,0 +1,7 @@
> +                   FUNCTION:NAME
> +                          :BEGIN
> +
> +  a                                                                 1
> +-- @@stderr --
> +dtrace: script 'test/unittest/aggs/tst.aggsize-too-small.d' matched 2 probes
> +dtrace: aggregation size raised to 285



More information about the DTrace-devel mailing list