[DTrace-devel] [PATCH 2/3] Store a pointer to the activity state in the DTrace context

Kris Van Hees kris.van.hees at oracle.com
Tue Sep 29 16:14:39 PDT 2020


Rather than accessing the activity state by performing a BPF map lookup
whenever we need it or want to modify it, we now store a pointer to the
BPF map value in the DTrace context (dt_dctx) and access/update the
value through that pointer.

Signed-off-by: Kris Van Hees <kris.van.hees at oracle.com>
---
 libdtrace/dt_cg.c                        | 39 +++++++-----------------
 libdtrace/dt_dctx.h                      | 17 ++++++-----
 test/unittest/codegen/tst.stack_layout.r | 28 ++++++++---------
 3 files changed, 35 insertions(+), 49 deletions(-)

diff --git a/libdtrace/dt_cg.c b/libdtrace/dt_cg.c
index d43cea41..707c368c 100644
--- a/libdtrace/dt_cg.c
+++ b/libdtrace/dt_cg.c
@@ -79,8 +79,10 @@ dt_cg_tramp_prologue_act(dt_pcb_t *pcb, dt_activity_t act)
 	 *				//     (%r0 = map value)
 	 *	if (rc == 0)		// jeq %r0, 0, lbl_exit
 	 *		goto exit;
-	 *	if (*rc == act)		// ldw %r0, [%r0 + 0]
-	 *		goto exit;	// jne %r0, act, lbl_exit
+	 *	if (*rc != act)		// ldw %r1, [%r0 + 0]
+	 *		goto exit;	// jne %r1, act, lbl_exit
+	 *
+	 *	dctx.act = rc;		// stdw [%fp + DCTX_FP(DCTX_ACT)], %r0
 	 */
 	instr = BPF_STORE_IMM(BPF_W, BPF_REG_FP, DCTX_FP(DCTX_MST),
 			      DT_STATE_ACTIVITY);
@@ -94,9 +96,11 @@ dt_cg_tramp_prologue_act(dt_pcb_t *pcb, dt_activity_t act)
 	dt_irlist_append(dlp, dt_cg_node_alloc(DT_LBL_NONE, instr));
 	instr = BPF_BRANCH_IMM(BPF_JEQ, BPF_REG_0, 0, lbl_exit);
 	dt_irlist_append(dlp, dt_cg_node_alloc(DT_LBL_NONE, instr));
-	instr = BPF_LOAD(BPF_W, BPF_REG_0, BPF_REG_0, 0);
+	instr = BPF_LOAD(BPF_W, BPF_REG_1, BPF_REG_0, 0);
+	dt_irlist_append(dlp, dt_cg_node_alloc(DT_LBL_NONE, instr));
+	instr = BPF_BRANCH_IMM(BPF_JNE, BPF_REG_1, act, lbl_exit);
 	dt_irlist_append(dlp, dt_cg_node_alloc(DT_LBL_NONE, instr));
-	instr = BPF_BRANCH_IMM(BPF_JNE, BPF_REG_0, act, lbl_exit);
+	instr = BPF_STORE(BPF_DW, BPF_REG_FP, DCTX_FP(DCTX_ACT), BPF_REG_0);
 	dt_irlist_append(dlp, dt_cg_node_alloc(DT_LBL_NONE, instr));
 
 	/*
@@ -218,37 +222,16 @@ void
 dt_cg_tramp_epilogue_advance(dt_pcb_t *pcb, uint_t lbl_exit)
 {
 	dt_irlist_t	*dlp = &pcb->pcb_ir;
-	dt_ident_t	*state = dt_dlib_get_map(pcb->pcb_hdl, "state");
 	struct bpf_insn	instr;
 
 	dt_cg_tramp_call_clauses(pcb);
 
 	/*
-	 *	key = DT_STATE_ACTIVITY;// stw [%fp + DCTX_FP(DCTX_MST)],
-	 *				//		DT_STATE_ACTIVITY
-	 *	rc = bpf_map_lookup_elem(&state, &key);
-	 *				// lddw %r1, &state
-	 *				// mov %r2, %fp
-	 *				// add %r2, DCTX_FP(DCTX_MST)
-	 *				// call bpf_map_lookup_elem
-	 *				//     (%r1 ... %r5 clobbered)
-	 *				//     (%r0 = map value)
-	 *	if (rc == 0)		// jeq %r0, 0, lbl_exit
-	 *		goto exit;
-	 *	(*rc)++;		// mov %r1, 1
+	 *	(*dctx.act)++;		// lddw %r0, [%fp + DCTX_FP(DCTX_ACT)]
+	 *				// mov %r1, 1
 	 *				// xadd [%r0 + 0], %r1
 	 */
-	instr = BPF_STORE_IMM(BPF_W, BPF_REG_FP, DCTX_FP(DCTX_MST),
-			      DT_STATE_ACTIVITY);
-	dt_irlist_append(dlp, dt_cg_node_alloc(DT_LBL_NONE, instr));
-	dt_cg_xsetx(dlp, state, DT_LBL_NONE, BPF_REG_1, state->di_id);
-	instr = BPF_MOV_REG(BPF_REG_2, BPF_REG_FP);
-	dt_irlist_append(dlp, dt_cg_node_alloc(DT_LBL_NONE, instr));
-	instr = BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, DCTX_FP(DCTX_MST));
-	dt_irlist_append(dlp, dt_cg_node_alloc(DT_LBL_NONE, instr));
-	instr = BPF_CALL_HELPER(BPF_FUNC_map_lookup_elem);
-	dt_irlist_append(dlp, dt_cg_node_alloc(DT_LBL_NONE, instr));
-	instr = BPF_BRANCH_IMM(BPF_JEQ, BPF_REG_0, 0, lbl_exit);
+	instr = BPF_LOAD(BPF_DW, BPF_REG_0, BPF_REG_FP, DCTX_FP(DCTX_ACT));
 	dt_irlist_append(dlp, dt_cg_node_alloc(DT_LBL_NONE, instr));
 	instr = BPF_MOV_IMM(BPF_REG_1, 1);
 	dt_irlist_append(dlp, dt_cg_node_alloc(DT_LBL_NONE, instr));
diff --git a/libdtrace/dt_dctx.h b/libdtrace/dt_dctx.h
index 8f3a44ba..45eba4aa 100644
--- a/libdtrace/dt_dctx.h
+++ b/libdtrace/dt_dctx.h
@@ -12,6 +12,7 @@
 #include <linux/bpf.h>
 #include <bpf_asm.h>
 #include <dt_pt_regs.h>
+#include <dt_state.h>
 
 /*
  * The DTrace machine state.
@@ -33,11 +34,13 @@ typedef struct dt_mstate {
  */
 typedef struct dt_dctx {
 	void		*ctx;		/* BPF context */
+	dt_activity_t	*act;		/* pointer to activity state */
 	dt_mstate_t	*mst;		/* DTrace machine state */
 	char		*buf;		/* Output buffer scratch memory */
 } dt_dctx_t;
 
 #define DCTX_CTX	offsetof(dt_dctx_t, ctx)
+#define DCTX_ACT	offsetof(dt_dctx_t, act)
 #define DCTX_MST	offsetof(dt_dctx_t, mst)
 #define DCTX_BUF	offsetof(dt_dctx_t, buf)
 #define DCTX_SIZE	((int16_t)sizeof(dt_dctx_t))
@@ -89,23 +92,23 @@ typedef struct dt_dctx {
  *                             +----------------+
  *         SCRATCH_BASE = -512 | Scratch Memory |
  *                             +----------------+
- *   LVAR_END = LVAR(n) = -256 | LVAR n         | (n = DT_VAR_LOCAL_MAX = 19)
+ *   LVAR_END = LVAR(n) = -256 | LVAR n         | (n = DT_VAR_LOCAL_MAX = 18)
  *                             +----------------+
  *                             |      ...       |
  *                             +----------------+
- *              LVAR(1) = -112 | LVAR 1         |
+ *              LVAR(1) = -120 | LVAR 1         |
  *                             +----------------+
- *  LVAR_BASE = LVAR(0) = -104 | LVAR 0         |
+ *  LVAR_BASE = LVAR(0) = -112 | LVAR 0         |
  *                             +----------------+
- *              SPILL(n) = -96 | %r8            | (n = DT_STK_NREGS - 1 = 8)
+ *             SPILL(n) = -104 | %r8            | (n = DT_STK_NREGS - 1 = 8)
  *                             +----------------+
  *                             |      ...       |
  *                             +----------------+
- *              SPILL(1) = -40 | %r1            |
+ *              SPILL(1) = -48 | %r1            |
  *                             +----------------+
- * SPILL_BASE = SPILL(0) = -32 | %r0            |
+ * SPILL_BASE = SPILL(0) = -40 | %r0            |
  *                             +----------------+
- *                  DCTX = -24 | DTrace Context | -1
+ *                  DCTX = -32 | DTrace Context | -1
  *                             +----------------+
  */
 #define DT_STK_BASE		((int16_t)0)
diff --git a/test/unittest/codegen/tst.stack_layout.r b/test/unittest/codegen/tst.stack_layout.r
index 2155e785..2333cf95 100644
--- a/test/unittest/codegen/tst.stack_layout.r
+++ b/test/unittest/codegen/tst.stack_layout.r
@@ -1,17 +1,17 @@
 Base:          0
-dctx:        -24
-%r0:         -32
-%r1:         -40
-%r2:         -48
-%r3:         -56
-%r4:         -64
-%r5:         -72
-%r6:         -80
-%r7:         -88
-%r8:         -96
-lvar[ -1]:  -103 (ID  -1)
-lvar[  0]:  -104 (ID   0)
-lvar[  1]:  -112 (ID   1)
-lvar[ 19]:  -256 (ID  19)
+dctx:        -32
+%r0:         -40
+%r1:         -48
+%r2:         -56
+%r3:         -64
+%r4:         -72
+%r5:         -80
+%r6:         -88
+%r7:         -96
+%r8:        -104
+lvar[ -1]:  -111 (ID  -1)
+lvar[  0]:  -112 (ID   0)
+lvar[  1]:  -120 (ID   1)
+lvar[ 18]:  -256 (ID  18)
 lvar[ -1]:  -257 (ID  -1)
 scratch:    -257 .. -512
-- 
2.28.0




More information about the DTrace-devel mailing list