[DTrace-devel] [PATCH v3 1/3] Introduce temporary string space for string manipulation functions

Eugene Loh eugene.loh at oracle.com
Fri Sep 3 15:11:42 PDT 2021


A few questions/comments...

On 9/3/21 3:52 PM, Kris Van Hees wrote:
> Functions must request a temporary string slot and have it associated
> with their return value using a statement like:
>      dt_cg_tstring_alloc(pcb, dnp);

Just to clarify your earlier response... if a function needs scratch 
space for computation (but not for the output result), that's beyond the 
scope of this patch.  Did I get that right?

> Functions that may be receiving a temporary string as argument (which
> is any function or action that accept string arguments) must free the
> temporary string once it is no longer needed.  This should be done
> using code like:
>
>      if (dnp->dn_tstring)
>          dt_cg_tstring_free(pcb, dnp);

How about putting that dnp->dn_tstring check inside of 
dt_cg_tstring_free()?  That would save some boilerplate code.

> diff --git a/libdtrace/dt_bpf.c b/libdtrace/dt_bpf.c
> @@ -276,20 +269,25 @@ dt_bpf_gmap_create(dtrace_hdl_t *dtp)
>   
>   	/*
>   	 * The size of the map value (a byte array) is the sum of:
> -	 *	- size of the DTrace context, rounded up to the nearest
> +	 *	- size of the DTrace machine state, rounded up to the nearest
>   	 *	  multiple of 8
>   	 *	- 8 bytes padding for trace buffer alignment purposes
>   	 *	- maximum trace buffer record size, rounded up to the
>   	 *	  multiple of 8
>   	 *	- the greater of:
>   	 *		+ the maximum stack trace size
> -	 *		+ three times the maximum string size
> +	 *		+ four times the maximum string size (incl. length)
> +	 *		  plus the maximum string size (to accomodate the BPF
> +	 *		  verifier)
>   	 */
>   	memsz = roundup(sizeof(dt_mstate_t), 8) +
>   		8 +
>   		roundup(dtp->dt_maxreclen, 8) +
>   		MAX(sizeof(uint64_t) * dtp->dt_options[DTRACEOPT_MAXFRAMES],
> -		    3 * dtp->dt_options[DTRACEOPT_STRSIZE]);
> +		    DT_TSTRING_SLOTS *
> +			(DT_STRLEN_BYTES + dtp->dt_options[DTRACEOPT_STRSIZE] +
> +		    dtp->dt_options[DTRACEOPT_STRSIZE]
> +		));

Thanks for the clarification, but I'm still a little puzzled.  Do you 
want the extra strsize overall or per slot?  The code above seems to 
have it per slot.

> diff --git a/libdtrace/dt_cg.c b/libdtrace/dt_cg.c
> @@ -2841,6 +2912,8 @@ dt_cg_asgn_op(dt_node_t *dnp, dt_irlist_t *dlp, dt_regset_t *drp)
>   			dt_cg_arglist(idp, dnp->dn_left->dn_args, dlp, drp);
>   
>   		dt_cg_store_var(dnp, dlp, drp, idp);
> +		if (dnp->dn_right->dn_kind == DT_NODE_FUNC)
> +			dt_cg_tstring_free(yypcb, dnp->dn_right);
>   	} else {

I don't understand this stuff, but the usual ->dn_tstring check is not 
performed here.  Is that okay?  Of course, no problem if the check ends 
up being moved into tstring_free().



More information about the DTrace-devel mailing list