[DTrace-devel] [PATCH 1/5] Implement setopt()

Eugene Loh eugene.loh at oracle.com
Wed Sep 7 19:32:33 UTC 2022


On 9/6/22 21:36, Kris Van Hees via DTrace-devel wrote:

> The basic mechanics of the setopt() action are implemented in this
> patch.  Each dynamic runtime options that can be set using setopt()
> must provide support for it.

There ought to be at least one test, and if rudimentary setopt() support 
was the only thing only keeping tst.keysort.d from passing then that 
could be the test.

> Signed-off-by: Kris Van Hees <kris.van.hees at oracle.com>
> ---
>   libdtrace/dt_cg.c      | 11 ++++++++++
>   libdtrace/dt_consume.c | 47 +++++++++++++++++++++++++++++++++---------
>   2 files changed, 48 insertions(+), 10 deletions(-)
>
> diff --git a/libdtrace/dt_cg.c b/libdtrace/dt_cg.c
> index cb51c474..ffab2443 100644
> --- a/libdtrace/dt_cg.c
> +++ b/libdtrace/dt_cg.c
> @@ -1751,6 +1751,17 @@ dt_cg_act_raise(dt_pcb_t *pcb, dt_node_t *dnp, dtrace_actkind_t kind)
>   static void
>   dt_cg_act_setopt(dt_pcb_t *pcb, dt_node_t *dnp, dtrace_actkind_t kind)
>   {
> +	dt_node_t	*opt = dnp->dn_args;
> +	dt_node_t	*val = opt->dn_list;
> +
> +	TRACE_REGSET("setopt(): Begin ");
> +	dt_cg_store_val(pcb, opt, DTRACEACT_LIBACT, NULL, DT_ACT_SETOPT);
> +
> +	/* If not value is given, we default to 0. */
> +	if (val == NULL)
> +		val = dt_node_int(0);

I don't get it.  Why int(0) vs int(1) vs not writing a second value 
altogether?

> +	dt_cg_store_val(pcb, val, DTRACEACT_LIBACT, NULL, DT_ACT_SETOPT);
> +	TRACE_REGSET("setopt(): End   ");
>   }
>   
>   /*
> diff --git a/libdtrace/dt_consume.c b/libdtrace/dt_consume.c
> index 44d7e935..011653d8 100644
> --- a/libdtrace/dt_consume.c
> +++ b/libdtrace/dt_consume.c
> @@ -2150,6 +2150,7 @@ dt_consume_one_probe(dtrace_hdl_t *dtp, FILE *fp, char *data, uint32_t size,
>   		     void *arg)
>   {
>   	dtrace_epid_t		epid;
> +	dtrace_datadesc_t	*epd = pdat->dtpda_ddesc;

How about just "dtrace_datadesc_t *epd;"?  The value you write here is 
going to get overwritten anyhow.

>   	dt_spec_buf_t		tmpl;
>   	dt_spec_buf_t		*dtsb;
>   	int			specid;
> @@ -2170,11 +2171,12 @@ dt_consume_one_probe(dtrace_hdl_t *dtp, FILE *fp, char *data, uint32_t size,
>   	pdat->dtpda_data = data;
>   
>   	rval = dt_epid_lookup(dtp, epid, &pdat->dtpda_ddesc,
> -			      &pdat->dtpda_pdesc);
> +					 &pdat->dtpda_pdesc);
>   	if (rval != 0)
>   		return dt_set_errno(dtp, EDT_BADEPID);
>   
> -	if (pdat->dtpda_ddesc->dtdd_uarg != DT_ECB_DEFAULT) {
> +	epd = pdat->dtpda_ddesc;
> +	if (epd->dtdd_uarg != DT_ECB_DEFAULT) {
>   		rval = dt_handle(dtp, pdat);
>   
>   		if (rval == DTRACE_CONSUME_NEXT)
> @@ -2332,6 +2334,31 @@ dt_consume_one_probe(dtrace_hdl_t *dtp, FILE *fp, char *data, uint32_t size,
>   				ftruncate(fileno(fp), 0);
>   				fseeko(fp, 0, SEEK_SET);
>   
> +				continue;
> +			case DT_ACT_SETOPT: {
> +				caddr_t			opt = recdata;
> +				caddr_t			val;
> +				dtrace_recdesc_t	*vrec;
> +
> +				if (i == epd->dtdd_nrecs - 1)
> +					return dt_set_errno(dtp, EDT_BADSETOPT);

Or if dt_cg.c doesn't write a val arg -- that is, if i == 
epd->dtdd_nrecs-1 -- then just ignore the vrec stuff and call 
dt_setopt(dtp,pdat,opt,"set").

> +
> +				vrec = &epd->dtdd_recs[++i];
> +				if (vrec->dtrd_action != act &&
> +				    vrec->dtrd_arg != rec->dtrd_arg)
> +					return dt_set_errno(dtp, EDT_BADSETOPT);
> +
> +				if (vrec->dtrd_size > sizeof(uint64_t))

So if strsize is small, then the value will be ignored?

> +					val = data + vrec->dtrd_offset;
> +				else
> +					val = "1";
> +
> +				if (dt_setopt(dtp, pdat, opt, val) != 0)
> +					return DTRACE_WORKSTATUS_ERROR;
> +
> +				continue;
> +			}
> +			default:
>   				continue;
>   			}
>   		}



More information about the DTrace-devel mailing list