[DTrace-devel] [PATCH] Store probe id in the trampoline

Eugene Loh eugene.loh at oracle.com
Mon Mar 29 19:16:48 PDT 2021


Reviewed-by: Eugene Loh <eugene.loh at oracle.com>
though

On 3/29/21 1:28 PM, Kris Van Hees wrote:
> The probe id (PRID) is associated with the probe and is therefore unique
> for every final BPF program that is attached to a probe.  It will have
> the same value for all clauses associated with thst probe and it is
> therefore no necessary to store it in the DTrace machine state (DMST) in
> every clause.

no -> not?

thst?

Also, while this commit message makes sense at this point, isn't it 
about to become obsolete with the PID patch?

And FWIW, most of the refactoring in this patch is unrelated to the patch.
>
> Signed-off-by: Kris Van Hees <kris.van.hees at oracle.com>
> ---
>   libdtrace/dt_cg.c | 49 +++++++++++++++++++++++------------------------
>   1 file changed, 24 insertions(+), 25 deletions(-)
>
> diff --git a/libdtrace/dt_cg.c b/libdtrace/dt_cg.c
> index d606925a..f55d58f6 100644
> --- a/libdtrace/dt_cg.c
> +++ b/libdtrace/dt_cg.c
> @@ -49,6 +49,7 @@ dt_cg_tramp_prologue_act(dt_pcb_t *pcb, dt_activity_t act)
>   	dt_irlist_t	*dlp = &pcb->pcb_ir;
>   	dt_ident_t	*mem = dt_dlib_get_map(dtp, "mem");
>   	dt_ident_t	*state = dt_dlib_get_map(dtp, "state");
> +	dt_ident_t	*prid = dt_dlib_get_var(pcb->pcb_hdl, "PRID");
>   	uint_t		lbl_exit = pcb->pcb_exitlbl;
>   
>   	assert(mem != NULL);
> @@ -67,8 +68,8 @@ dt_cg_tramp_prologue_act(dt_pcb_t *pcb, dt_activity_t act)
>   	 *				// mov %r8, %r1
>   	 *	dctx.ctx = ctx;		// stdw [%fp + DCTX_FP(DCTX_CTX)], %r8
>   	 */
> -	emit(dlp, BPF_MOV_REG(BPF_REG_8, BPF_REG_1));
> -	emit(dlp, BPF_STORE(BPF_DW, BPF_REG_FP, DCTX_FP(DCTX_CTX), BPF_REG_8));
> +	emit(dlp,  BPF_MOV_REG(BPF_REG_8, BPF_REG_1));
> +	emit(dlp,  BPF_STORE(BPF_DW, BPF_REG_FP, DCTX_FP(DCTX_CTX), BPF_REG_8));
>   
>   	/*
>   	 *	key = DT_STATE_ACTIVITY;// stw [%fp + DCTX_FP(DCTX_ACT)],
> @@ -87,15 +88,15 @@ dt_cg_tramp_prologue_act(dt_pcb_t *pcb, dt_activity_t act)
>   	 *
>   	 *	dctx.act = rc;		// stdw [%fp + DCTX_FP(DCTX_ACT)], %r0
>   	 */
> -	emit(dlp, BPF_STORE_IMM(BPF_W, BPF_REG_FP, DCTX_FP(DCTX_ACT), DT_STATE_ACTIVITY));
> +	emit(dlp,  BPF_STORE_IMM(BPF_W, BPF_REG_FP, DCTX_FP(DCTX_ACT), DT_STATE_ACTIVITY));
>   	dt_cg_xsetx(dlp, state, DT_LBL_NONE, BPF_REG_1, state->di_id);
> -	emit(dlp, BPF_MOV_REG(BPF_REG_2, BPF_REG_FP));
> -	emit(dlp, BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, DCTX_FP(DCTX_ACT)));
> -	emit(dlp, BPF_CALL_HELPER(BPF_FUNC_map_lookup_elem));
> -	emit(dlp, BPF_BRANCH_IMM(BPF_JEQ, BPF_REG_0, 0, lbl_exit));
> -	emit(dlp, BPF_LOAD(BPF_W, BPF_REG_1, BPF_REG_0, 0));
> -	emit(dlp, BPF_BRANCH_IMM(BPF_JNE, BPF_REG_1, act, lbl_exit));
> -	emit(dlp, BPF_STORE(BPF_DW, BPF_REG_FP, DCTX_FP(DCTX_ACT), BPF_REG_0));
> +	emit(dlp,  BPF_MOV_REG(BPF_REG_2, BPF_REG_FP));
> +	emit(dlp,  BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, DCTX_FP(DCTX_ACT)));
> +	emit(dlp,  BPF_CALL_HELPER(BPF_FUNC_map_lookup_elem));
> +	emit(dlp,  BPF_BRANCH_IMM(BPF_JEQ, BPF_REG_0, 0, lbl_exit));
> +	emit(dlp,  BPF_LOAD(BPF_W, BPF_REG_1, BPF_REG_0, 0));
> +	emit(dlp,  BPF_BRANCH_IMM(BPF_JNE, BPF_REG_1, act, lbl_exit));
> +	emit(dlp,  BPF_STORE(BPF_DW, BPF_REG_FP, DCTX_FP(DCTX_ACT), BPF_REG_0));
>   
>   	/*
>   	 *	key = 0;		// stw [%fp + DCTX_FP(DCTX_MST)], 0
> @@ -112,15 +113,17 @@ dt_cg_tramp_prologue_act(dt_pcb_t *pcb, dt_activity_t act)
>   	 *				//     (%r7 = pointer to dt_mstate_t)
>   	 *				// mov %r7, %r0
>   	 *	dctx.mst = rc;		// stdw [%fp + DCTX_FP(DCTX_MST)], %r7
> +	 *	dctx.mst->prid = PRID;	// stw [%r7 + DMST_PRID], PRID
>   	 */
> -	emit(dlp, BPF_STORE_IMM(BPF_W, BPF_REG_FP, DCTX_FP(DCTX_MST), 0));
> +	emit(dlp,  BPF_STORE_IMM(BPF_W, BPF_REG_FP, DCTX_FP(DCTX_MST), 0));
>   	dt_cg_xsetx(dlp, mem, DT_LBL_NONE, BPF_REG_1, mem->di_id);
> -	emit(dlp, BPF_MOV_REG(BPF_REG_2, BPF_REG_FP));
> -	emit(dlp, BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, DCTX_FP(DCTX_MST)));
> -	emit(dlp, BPF_CALL_HELPER(BPF_FUNC_map_lookup_elem));
> -	emit(dlp, BPF_BRANCH_IMM(BPF_JEQ, BPF_REG_0, 0, lbl_exit));
> -	emit(dlp, BPF_MOV_REG(BPF_REG_7, BPF_REG_0));
> -	emit(dlp, BPF_STORE(BPF_DW, BPF_REG_FP, DCTX_FP(DCTX_MST), BPF_REG_7));
> +	emit(dlp,  BPF_MOV_REG(BPF_REG_2, BPF_REG_FP));
> +	emit(dlp,  BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, DCTX_FP(DCTX_MST)));
> +	emit(dlp,  BPF_CALL_HELPER(BPF_FUNC_map_lookup_elem));
> +	emit(dlp,  BPF_BRANCH_IMM(BPF_JEQ, BPF_REG_0, 0, lbl_exit));
> +	emit(dlp,  BPF_MOV_REG(BPF_REG_7, BPF_REG_0));
> +	emit(dlp,  BPF_STORE(BPF_DW, BPF_REG_FP, DCTX_FP(DCTX_MST), BPF_REG_7));
> +	emite(dlp, BPF_STORE_IMM(BPF_W, BPF_REG_7, DMST_PRID, -1), prid);
>   
>   	/*
>   	 *	buf = rc + roundup(sizeof(dt_mstate_t), 8);
> @@ -132,10 +135,10 @@ dt_cg_tramp_prologue_act(dt_pcb_t *pcb, dt_activity_t act)
>   	 *				//     (%r0 = pointer to buffer space)
>   	 *	dctx.buf = buf;		// stdw [%fp + DCTX_FP(DCTX_BUF)], %r0
>   	 */
> -	emit(dlp, BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, roundup(sizeof(dt_mstate_t), 8)));
> -	emit(dlp, BPF_STORE_IMM(BPF_DW, BPF_REG_0, 0, 0));
> -	emit(dlp, BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8));
> -	emit(dlp, BPF_STORE(BPF_DW, BPF_REG_FP, DCTX_FP(DCTX_BUF), BPF_REG_0));
> +	emit(dlp,  BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, roundup(sizeof(dt_mstate_t), 8)));
> +	emit(dlp,  BPF_STORE_IMM(BPF_DW, BPF_REG_0, 0, 0));
> +	emit(dlp,  BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8));
> +	emit(dlp,  BPF_STORE(BPF_DW, BPF_REG_FP, DCTX_FP(DCTX_BUF), BPF_REG_0));
>   
>   	if (dt_idhash_datasize(dtp->dt_aggs) > 0) {
>   		dt_ident_t	*aggs = dt_dlib_get_map(dtp, "aggs");
> @@ -420,11 +423,9 @@ 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");
>   	dt_ident_t	*clid = dt_dlib_get_var(pcb->pcb_hdl, "CLID");
>   
>   	assert(epid != NULL);
> -	assert(prid != NULL);
>   	assert(clid != NULL);
>   
>   	/*
> @@ -451,7 +452,6 @@ 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
>   	 *	dctx->mst->clid = CLID;	// stw [%r0 + DMST_CLID], CLID
>   	 *	*((uint32_t *)&buf[0]) = EPID;
>   	 *				// stw [%r9 + 0], EPID
> @@ -460,7 +460,6 @@ dt_cg_prologue(dt_pcb_t *pcb, dt_node_t *pred)
>   	emit(dlp,  BPF_STORE_IMM(BPF_DW, BPF_REG_0, DMST_FAULT, 0));
>   	emit(dlp,  BPF_STORE_IMM(BPF_DW, BPF_REG_0, DMST_TSTAMP, 0));
>   	emite(dlp, BPF_STORE_IMM(BPF_W, BPF_REG_0, DMST_EPID, -1), epid);
> -	emite(dlp, BPF_STORE_IMM(BPF_W, BPF_REG_0, DMST_PRID, -1), prid);
>   	emite(dlp, BPF_STORE_IMM(BPF_W, BPF_REG_0, DMST_CLID, -1), clid);
>   	emite(dlp, BPF_STORE_IMM(BPF_W, BPF_REG_9, 0, -1), epid);
>   



More information about the DTrace-devel mailing list