[DTrace-devel] [PATCH 08/13] Add code for avg() aggregation function

Kris Van Hees kris.van.hees at oracle.com
Tue Dec 8 11:17:22 PST 2020


On Wed, Dec 02, 2020 at 01:54:53PM -0500, eugene.loh at oracle.com wrote:
> From: Eugene Loh <eugene.loh at oracle.com>
> 
> Signed-off-by: Eugene Loh <eugene.loh at oracle.com>

Reviewed-by: Kris Van Hees <kris.van.hees at oracle.com>

> ---
>  libdtrace/dt_cg.c | 39 +++++++++++++++++++++++++++++++++++++++
>  1 file changed, 39 insertions(+)
> 
> diff --git a/libdtrace/dt_cg.c b/libdtrace/dt_cg.c
> index 6fa49bbc..43edb363 100644
> --- a/libdtrace/dt_cg.c
> +++ b/libdtrace/dt_cg.c
> @@ -3071,6 +3071,35 @@ dt_cg_agg_opt_incr(dt_node_t *dnp, dt_node_t *lastarg, const char *fn,
>  	return incr;
>  }
>  
> +static void
> +dt_cg_agg_avg_impl(dt_irlist_t *dlp, dt_regset_t *drp, int dreg, int vreg)
> +{
> +	TRACE_REGSET("            Impl: Begin");
> +
> +	/*
> +	 * uint64_t dst[2], val;
> +	 * char *dreg = dst, *vreg = &val;
> +	 *				//     (%rd = dreg -- agg data ptr)
> +	 *				//     (%rv = vreg -- value)
> +	 *	uint64_t *dst = dreg;
> +	 *
> +	 *	dst[0]++;		// mov %r0, 1
> +	 *				// xadd [%rd + 0], %r0
> +	 *	dst[1] += vreg;		// xadd [%rd + 8], %rv
> +	 */
> +
> +	/* dst[0]++ */
> +	dt_regset_xalloc(drp, BPF_REG_0);
> +	emit(dlp, BPF_MOV_IMM(BPF_REG_0, 1));
> +	emit(dlp, BPF_XADD_REG(BPF_DW, dreg, 0, BPF_REG_0));
> +	dt_regset_free(drp, BPF_REG_0);
> +
> +	/* dst[1] += val */
> +	emit(dlp, BPF_XADD_REG(BPF_DW, dreg, 8, vreg));
> +
> +	TRACE_REGSET("            Impl: End  ");
> +}
> +
>  static void
>  dt_cg_agg_avg(dt_pcb_t *pcb, dt_ident_t *aid, dt_node_t *dnp,
>  	      dt_irlist_t *dlp, dt_regset_t *drp)
> @@ -3079,6 +3108,16 @@ dt_cg_agg_avg(dt_pcb_t *pcb, dt_ident_t *aid, dt_node_t *dnp,
>  
>  	if (aid->di_offset == -1)
>  		aid->di_offset = DT_CG_AGG_OFFSET(pcb, sz);
> +
> +	TRACE_REGSET("    AggAvg: Begin");
> +
> +	dt_cg_node(dnp->dn_aggfun->dn_args, dlp, drp);
> +
> +	DT_CG_AGG_IMPL(aid, sz, dlp, drp, dt_cg_agg_avg_impl,
> +		       dnp->dn_aggfun->dn_args->dn_reg);
> +	dt_regset_free(drp, dnp->dn_aggfun->dn_args->dn_reg);
> +
> +	TRACE_REGSET("    AggAvg: End  ");
>  }
>  
>  static void
> -- 
> 2.18.4
> 
> 
> _______________________________________________
> DTrace-devel mailing list
> DTrace-devel at oss.oracle.com
> https://oss.oracle.com/mailman/listinfo/dtrace-devel



More information about the DTrace-devel mailing list