[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