[DTrace-devel] [PATCH 31/61] Remove the "default tuple" area

Kris Van Hees kris.van.hees at oracle.com
Fri Aug 5 06:36:19 UTC 2022


On Fri, Jul 08, 2022 at 10:45:15AM -0400, eugene.loh--- via DTrace-devel wrote:
> From: Eugene Loh <eugene.loh at oracle.com>
> 
> All we need is a bunch of zeroes, which are available from the newly
> introduced block of zeroes.  Using that block is better because:
> 
> 1)  The new block is global, while the older area was per-CPU.
>     We only need one copy of this read-only memory.
> 
> 2)  The new block will be overlapped with other uses of zeroes.
> 
> Signed-off-by: Eugene Loh <eugene.loh at oracle.com>

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

... queued for dev (with minor change for dt_cg_zerosptr())

> ---
>  libdtrace/dt_bpf.c  |  4 ++++
>  libdtrace/dt_cg.c   |  6 ++++--
>  libdtrace/dt_dctx.h | 16 ++++------------
>  3 files changed, 12 insertions(+), 14 deletions(-)
> 
> diff --git a/libdtrace/dt_bpf.c b/libdtrace/dt_bpf.c
> index ee9aa846..f0d1a99e 100644
> --- a/libdtrace/dt_bpf.c
> +++ b/libdtrace/dt_bpf.c
> @@ -351,6 +351,10 @@ dt_bpf_gmap_create(dtrace_hdl_t *dtp)
>  	if (pr_mapfd == -1)
>  		return -1;		/* dt_errno is set for us */
>  
> +	/* figure out how big the region of zeroes should be */
> +	if (dtp->dt_zerosize < dtp->dt_maxtuplesize)
> +		dtp->dt_zerosize = dtp->dt_maxtuplesize;
> +
>  	/* global variables, including a region of zeroes */
>  	dtp->dt_zerooffset = P2ROUNDUP(dt_idhash_datasize(dtp->dt_globals), 8);
>  	sz = dtp->dt_zerooffset + dtp->dt_zerosize;
> diff --git a/libdtrace/dt_cg.c b/libdtrace/dt_cg.c
> index f48452ee..11a9c8c5 100644
> --- a/libdtrace/dt_cg.c
> +++ b/libdtrace/dt_cg.c
> @@ -2631,6 +2631,7 @@ dt_cg_arglist(dt_ident_t *idp, dt_node_t *args, dt_irlist_t *dlp,
>  	const dt_idsig_t	*isp = idp->di_data;
>  	dt_node_t		*dnp;
>  	dt_ident_t		*maxtupsz = dt_dlib_get_var(dtp, "TUPSZ");
> +	dt_ident_t		*zero_off = dt_dlib_get_var(dtp, "ZERO_OFF");
>  	int			i;
>  	int			treg, areg;
>  	uint_t			tuplesize;
> @@ -2676,8 +2677,9 @@ dt_cg_arglist(dt_ident_t *idp, dt_node_t *args, dt_irlist_t *dlp,
>  
>  	emit(dlp,  BPF_MOV_REG(BPF_REG_1, treg));
>  	emite(dlp, BPF_MOV_IMM(BPF_REG_2, -1), maxtupsz);
> -	emit(dlp,  BPF_MOV_REG(BPF_REG_3, BPF_REG_1));
> -	emite(dlp, BPF_ALU64_IMM(BPF_ADD, BPF_REG_3, -1), maxtupsz);
> +	emit(dlp,  BPF_LOAD(BPF_DW, BPF_REG_3, BPF_REG_FP, DT_STK_DCTX));
> +	emit(dlp,  BPF_LOAD(BPF_DW, BPF_REG_3, BPF_REG_3, DCTX_GVARS));
> +	emite(dlp, BPF_ALU64_IMM(BPF_ADD, BPF_REG_3, -1), zero_off);
>  	dt_regset_xalloc(drp, BPF_REG_0);
>  	emit(dlp,  BPF_CALL_HELPER(BPF_FUNC_probe_read));
>  	dt_regset_free_args(drp);
> diff --git a/libdtrace/dt_dctx.h b/libdtrace/dt_dctx.h
> index ea4758b6..c93fff2b 100644
> --- a/libdtrace/dt_dctx.h
> +++ b/libdtrace/dt_dctx.h
> @@ -79,12 +79,10 @@ typedef struct dt_dctx {
>   *                  0 -> | Stack          :     tstring    | \
>   *                       |   trace     (shared)   storage  |  |
>   *                       |     storage    :                |  |
> - *                       +----------------+----------------+  |
> - *        DMEM_STRTOK -> |     strtok() internal state     |   > DMEM_SIZE
> + *                       +----------------+----------------+   > DMEM_SIZE
> + *        DMEM_STRTOK -> |     strtok() internal state     |  |
>   *                       +---------------------------------+  |
> - *        DMEM_TUPLE  -> |       tuple assembly area       |  |
> - *                       +---------------------------------+  |
> - *   DMEM_TUPLE_DFLT  -> |       default empty tuple       | /
> + *        DMEM_TUPLE  -> |       tuple assembly area       | /
>   *                       +---------------------------------+
>   */
>  
> @@ -107,17 +105,11 @@ typedef struct dt_dctx {
>  
>  /*
>   * Macros to determine the offset of the components of dctx->mem.
> - *
> - * CAUTION: DMEM_TUPLE(dtp) and DMEM_TUPLE_DFLT(dtp) depend on data collected
> - *	    during code generation and therefore cannot be used until all code
> - *	    generation has completed.
>   */
>  #define DMEM_STRTOK(dtp) \
>  		MAX(DMEM_STACK_SZ(dtp), DMEM_TSTR_SZ(dtp))
>  #define DMEM_TUPLE(dtp) \
>  		(DMEM_STRTOK(dtp) + DMEM_STRTOK_SZ(dtp))
> -#define DMEM_TUPLE_DFLT(dtp) \
> -		(DMEM_TUPLE(dtp) + DMEM_TUPLE_SZ(dtp))
>  
>  /*
>   * Macro to determine the total size of the mem area.
> @@ -126,7 +118,7 @@ typedef struct dt_dctx {
>   *	    and therefore cannot be used until all code generation has
>   *	    completed.
>   */
> -#define DMEM_SIZE(dtp)	(DMEM_TUPLE_DFLT(dtp) + DMEM_TUPLE_SZ(dtp))
> +#define DMEM_SIZE(dtp)	(DMEM_TUPLE(dtp) + DMEM_TUPLE_SZ(dtp))
>  
>  /*
>   * The stack layout for BPF programs that are generated as trampolines for
> -- 
> 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