[DTrace-devel] [PATCH] Add 'id' builtin D variable

Kris Van Hees kris.van.hees at oracle.com
Tue Sep 15 18:19:02 PDT 2020


Can you please add a test fashioned after tst.curcpu_cpu_id.sh that verifies
that the output of trace(id) matches the probe id listed in the ID column?
It should go in test/unittest/variables/bar.

On Tue, Sep 15, 2020 at 01:19:23PM -0700, David Mc Lean wrote:
> Signed-off-by: David Mc Lean <david.mclean at oracle.com>
> ---
>  bpf/get_bvar.c       | 2 ++
>  libdtrace/dt_bpf.h   | 1 +
>  libdtrace/dt_cc.c    | 5 ++++-
>  libdtrace/dt_cg.c    | 6 ++++++
>  libdtrace/dt_dctx.h  | 2 ++
>  libdtrace/dt_dlibs.c | 1 +
>  6 files changed, 16 insertions(+), 1 deletion(-)
> 
> diff --git a/bpf/get_bvar.c b/bpf/get_bvar.c
> index 9f09108..52ec186 100644
> --- a/bpf/get_bvar.c
> +++ b/bpf/get_bvar.c
> @@ -27,6 +27,8 @@ noinline uint64_t dt_get_bvar(dt_mstate_t *mst, uint32_t id)
>  		return mst->tstamp;
>  	case DIF_VAR_EPID:
>  		return mst->epid;
> +	case DIF_VAR_ID:
> +		return mst->prid;
>  	case DIF_VAR_ARG0: case DIF_VAR_ARG1: case DIF_VAR_ARG2:
>  	case DIF_VAR_ARG3: case DIF_VAR_ARG4: case DIF_VAR_ARG5:
>  	case DIF_VAR_ARG6: case DIF_VAR_ARG7: case DIF_VAR_ARG8:
> diff --git a/libdtrace/dt_bpf.h b/libdtrace/dt_bpf.h
> index c4a4a99..7a7fe87 100644
> --- a/libdtrace/dt_bpf.h
> +++ b/libdtrace/dt_bpf.h
> @@ -17,6 +17,7 @@ extern "C" {
>  
>  #define DT_CONST_EPID	1
>  #define DT_CONST_ARGC	2
> +#define DT_CONST_PRID	3
>  
>  extern int perf_event_open(struct perf_event_attr *attr, pid_t pid, int cpu,
>  			   int group_fd, unsigned long flags);
> diff --git a/libdtrace/dt_cc.c b/libdtrace/dt_cc.c
> index f29a21f..ceea19c 100644
> --- a/libdtrace/dt_cc.c
> +++ b/libdtrace/dt_cc.c
> @@ -2412,7 +2412,10 @@ dt_link_construct(dtrace_hdl_t *dtp, const dt_probe_t *prp, dtrace_difo_t *dp,
>  		case DT_IDENT_SCALAR:			/* constant */
>  			switch (idp->di_id) {
>  			case DT_CONST_EPID:
> -				nrp->dofr_data = epid;	/* set vakue */
> +				nrp->dofr_data = epid;
> +				break;
> +			case DT_CONST_PRID:
> +				nrp->dofr_data = prp->desc->id;
>  				break;
>  			case DT_CONST_ARGC:
>  				nrp->dofr_data = 0;	/* FIXME */
> diff --git a/libdtrace/dt_cg.c b/libdtrace/dt_cg.c
> index 0d3463c..14e543b 100644
> --- a/libdtrace/dt_cg.c
> +++ b/libdtrace/dt_cg.c
> @@ -175,9 +175,11 @@ dt_cg_prologue(dt_pcb_t *pcb, dt_node_t *pred)
>  {
>  	dt_irlist_t	*dlp = &pcb->pcb_ir;
>  	dt_ident_t	*epid = dt_dlib_get_var(pcb->pcb_hdl, "EPID");
> +	dt_ident_t	*prid = dt_dlib_get_var(pcb->pcb_hdl, "PRID");
>  	struct bpf_insn	instr;
>  
>  	assert(epid != NULL);
> +	assert(prid != NULL);
>  
>  	/*
>  	 * void dt_program(dt_dctx_t *dctx)
> @@ -206,6 +208,7 @@ dt_cg_prologue(dt_pcb_t *pcb, dt_node_t *pred)
>  	 *				// stdw [%r0 + DMST_FAULT], 0
>  	 *	dctx->mst->tstamp = 0;	// stdw [%r0 + DMST_TSTAMP], 0
>  	 *	dctx->mst->epid = EPID;	// stw [%r0 + DMST_EPID], EPID
> +	 *	dctx->mst->prid = PRID;	// stw [%r0 + DMST_PRID], PRID
>  	 *	*((uint32_t *)&buf[0]) = EPID;
>  	 *				// stw [%r9 + 0], EPID
>  	 */
> @@ -218,6 +221,9 @@ dt_cg_prologue(dt_pcb_t *pcb, dt_node_t *pred)
>  	instr = BPF_STORE_IMM(BPF_W, BPF_REG_0, DMST_EPID, -1);
>  	dt_irlist_append(dlp, dt_cg_node_alloc(DT_LBL_NONE, instr));
>  	dlp->dl_last->di_extern = epid;
> +	instr = BPF_STORE_IMM(BPF_W, BPF_REG_0, DMST_PRID, -1);
> +	dt_irlist_append(dlp, dt_cg_node_alloc(DT_LBL_NONE, instr));
> +	dlp->dl_last->di_extern = prid;
>  	instr = BPF_STORE_IMM(BPF_W, BPF_REG_9, 0, -1);
>  	dt_irlist_append(dlp, dt_cg_node_alloc(DT_LBL_NONE, instr));
>  	dlp->dl_last->di_extern = epid;
> diff --git a/libdtrace/dt_dctx.h b/libdtrace/dt_dctx.h
> index 79ef710..48b1470 100644
> --- a/libdtrace/dt_dctx.h
> +++ b/libdtrace/dt_dctx.h
> @@ -15,6 +15,7 @@
>   */
>  typedef struct dt_mstate {
>  	uint32_t	epid;		/* Enabled probe ID */
> +	uint32_t	prid;		/* Probe ID */
>  	uint32_t	tag;		/* Tag (for future use) */
>  	uint64_t	fault;		/* DTrace fault flags */
>  	uint64_t	tstamp;		/* cached timestamp value */
> @@ -45,6 +46,7 @@ typedef struct dt_dctx {
>  #define DCTX_FP(off)	(-(ushort_t)DCTX_SIZE + (ushort_t)(off))
>  
>  #define DMST_EPID	offsetof(dt_mstate_t, epid)
> +#define DMST_PRID	offsetof(dt_mstate_t, prid)
>  #define DMST_TAG	offsetof(dt_mstate_t, tag)
>  #define DMST_FAULT	offsetof(dt_mstate_t, fault)
>  #define DMST_TSTAMP	offsetof(dt_mstate_t, tstamp)
> diff --git a/libdtrace/dt_dlibs.c b/libdtrace/dt_dlibs.c
> index 83eb4a1..2875364 100644
> --- a/libdtrace/dt_dlibs.c
> +++ b/libdtrace/dt_dlibs.c
> @@ -69,6 +69,7 @@ static const dt_ident_t		dt_bpf_symbols[] = {
>  	DT_BPF_SYMBOL(tvars, DT_IDENT_PTR),
>  	/* BPF internal identifiers */
>  	DT_BPF_SYMBOL_ID(EPID, DT_IDENT_SCALAR, DT_CONST_EPID),
> +	DT_BPF_SYMBOL_ID(PRID, DT_IDENT_SCALAR, DT_CONST_PRID),
>  	DT_BPF_SYMBOL_ID(ARGC, DT_IDENT_SCALAR, DT_CONST_ARGC),
>  	/* End-of-list marker */
>  	{ NULL, }
> -- 
> 1.8.3.1
> 
> 
> _______________________________________________
> 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