[DTrace-devel] [PATCH 29/61] Clean up BPF map creation in anticipation of more changes

Kris Van Hees kris.van.hees at oracle.com
Tue Aug 2 03:31:25 UTC 2022


On Fri, Jul 08, 2022 at 10:45:13AM -0400, eugene.loh--- via DTrace-devel wrote:
> From: Eugene Loh <eugene.loh at oracle.com>
> 
> Adding or removing a BPF map to this function requires changes in
> different parts of the function.  Reorganize the function slightly
> so that adding or removing a BPF map can be done with simpler, more
> localized changes.
> 
> Signed-off-by: Eugene Loh <eugene.loh at oracle.com>

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

... queued for dev

> ---
>  libdtrace/dt_bpf.c | 52 +++++++++++++++++++++++++---------------------
>  1 file changed, 28 insertions(+), 24 deletions(-)
> 
> diff --git a/libdtrace/dt_bpf.c b/libdtrace/dt_bpf.c
> index 02a160fe..87cc0814 100644
> --- a/libdtrace/dt_bpf.c
> +++ b/libdtrace/dt_bpf.c
> @@ -229,7 +229,7 @@ populate_probes_map(dtrace_hdl_t *dtp, int fd)
>  int
>  dt_bpf_gmap_create(dtrace_hdl_t *dtp)
>  {
> -	int		stabsz, gvarsz, lvarsz, aggsz, memsz;
> +	int		stabsz, sz;
>  	int		dvarc = 0;
>  	int		ci_mapfd, st_mapfd, pr_mapfd;
>  	uint64_t	key = 0;
> @@ -245,18 +245,9 @@ dt_bpf_gmap_create(dtrace_hdl_t *dtp)
>  	/* Mark global maps creation as completed. */
>  	dt_gmap_done = 1;
>  
> -	/* Determine the aggregation buffer size.  */
> -	aggsz = dt_idhash_datasize(dtp->dt_aggs);
> +	/* Create BPF maps as long as there are no errors. */
>  
> -	/* Determine sizes for global, local, and TLS maps. */
> -	gvarsz = P2ROUNDUP(dt_idhash_datasize(dtp->dt_globals), 8);
> -	lvarsz = P2ROUNDUP(dtp->dt_maxlvaralloc, 8);
> -
> -	if (dtp->dt_maxdvarsize)
> -		dvarc = dtp->dt_options[DTRACEOPT_DYNVARSIZE] /
> -			dtp->dt_maxdvarsize;
> -
> -	/* Create global maps as long as there are no errors. */
> +	/* state map */
>  	dtp->dt_stmap_fd = create_gmap(dtp, "state", BPF_MAP_TYPE_ARRAY,
>  				       sizeof(DT_STATE_KEY_TYPE),
>  				       sizeof(DT_STATE_VAL_TYPE),
> @@ -267,24 +258,28 @@ dt_bpf_gmap_create(dtrace_hdl_t *dtp)
>  	/*
>  	 * Check if there is aggregation data to be collected.
>  	 */
> -	if (aggsz > 0) {
> +	sz = dt_idhash_datasize(dtp->dt_aggs);
> +	if (sz > 0) {
>  		dtp->dt_aggmap_fd = create_gmap(dtp, "aggs",
>  						BPF_MAP_TYPE_PERCPU_ARRAY,
> -						sizeof(uint32_t), aggsz, 1);
> +						sizeof(uint32_t), sz, 1);
>  		if (dtp->dt_aggmap_fd == -1)
>  			return -1;	/* dt_errno is set for us */
>  	}
>  
> +	/* speculations */
>  	if (create_gmap(dtp, "specs", BPF_MAP_TYPE_HASH,
>  		sizeof(uint32_t), sizeof(dt_bpf_specs_t),
>  		dtp->dt_options[DTRACEOPT_NSPEC]) == -1)
>  		return -1;		/* dt_errno is set for us */
>  
> +	/* output buffers */
>  	if (create_gmap(dtp, "buffers", BPF_MAP_TYPE_PERF_EVENT_ARRAY,
>  			sizeof(uint32_t), sizeof(uint32_t),
>  			dtp->dt_conf.num_online_cpus) == -1)
>  		return -1;		/* dt_errno is set for us */
>  
> +	/* cpuinfo */
>  	ci_mapfd = create_gmap(dtp, "cpuinfo", BPF_MAP_TYPE_PERCPU_ARRAY,
>  			       sizeof(uint32_t), sizeof(cpuinfo_t), 1);
>  	if (ci_mapfd == -1)
> @@ -299,12 +294,12 @@ dt_bpf_gmap_create(dtrace_hdl_t *dtp)
>  	 *	  multiple of 8
>  	 *	- size of dctx->mem (see dt_dctx.h)
>  	 */
> -	memsz = roundup(sizeof(dt_mstate_t), 8) +
> -		8 +
> -		roundup(dtp->dt_maxreclen, 8) +
> -		DMEM_SIZE(dtp);
> +	sz = roundup(sizeof(dt_mstate_t), 8) +
> +		     8 +
> +		     roundup(dtp->dt_maxreclen, 8) +
> +		     DMEM_SIZE(dtp);
>  	if (create_gmap(dtp, "mem", BPF_MAP_TYPE_PERCPU_ARRAY,
> -			sizeof(uint32_t), memsz, 1) == -1)
> +			sizeof(uint32_t), sz, 1) == -1)
>  		return -1;		/* dt_errno is set for us */
>  
>  	/*
> @@ -349,22 +344,31 @@ dt_bpf_gmap_create(dtrace_hdl_t *dtp)
>  	if (st_mapfd == -1)
>  		return -1;		/* dt_errno is set for us */
>  
> +	/* probe hash table */
>  	pr_mapfd = create_gmap(dtp, "probes", BPF_MAP_TYPE_HASH,
>  			       sizeof(uint32_t), sizeof(dt_bpf_probe_t),
>  			       dt_list_length(&dtp->dt_enablings));
>  	if (pr_mapfd == -1)
>  		return -1;		/* dt_errno is set for us */
>  
> -	if (gvarsz > 0 &&
> +	/* global variables */
> +	sz = P2ROUNDUP(dt_idhash_datasize(dtp->dt_globals), 8);
> +	if (sz > 0 &&
>  	    create_gmap(dtp, "gvars", BPF_MAP_TYPE_ARRAY,
> -			sizeof(uint32_t), gvarsz, 1) == -1)
> +			sizeof(uint32_t), sz, 1) == -1)
>  		return -1;		/* dt_errno is set for us */
>  
> -	if (lvarsz > 0 &&
> -	    create_gmap(dtp, "lvars", BPF_MAP_TYPE_PERCPU_ARRAY,
> -			sizeof(uint32_t), lvarsz, 1) == -1)
> +	/* local variables */
> +	sz = P2ROUNDUP(dtp->dt_maxlvaralloc, 8);
> +	if (sz > 0 && create_gmap(dtp, "lvars", BPF_MAP_TYPE_PERCPU_ARRAY,
> +				  sizeof(uint32_t), sz, 1) == -1)
>  		return -1;		/* dt_errno is set for us */
>  
> +	/* TLS and dynamic variables */
> +	if (dtp->dt_maxdvarsize)
> +		dvarc = dtp->dt_options[DTRACEOPT_DYNVARSIZE] /
> +			dtp->dt_maxdvarsize;
> +
>  	if (dvarc > 0) {
>  		int	fd;
>  		char	dflt[dtp->dt_maxdvarsize];
> -- 
> 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