[DTrace-devel] [PATCH] Record clause id in mstate

Kris Van Hees kris.van.hees at oracle.com
Sat Jan 16 00:21:08 PST 2021


Support for the ERROR probe requires a per-probe unique id to identify
the clause the ERROR probe was triggered from.  Add a clid member to
the machine state, and initialize it in the prologue.

Signed-off-by: Kris Van Hees <kris.van.hees at oracle.com>
---
 libdtrace/dt_bpf.h   |  3 ++-
 libdtrace/dt_cc.c    | 16 +++++++++++-----
 libdtrace/dt_cg.c    |  3 +++
 libdtrace/dt_dctx.h  |  2 ++
 libdtrace/dt_dlibs.c |  1 +
 5 files changed, 19 insertions(+), 6 deletions(-)

diff --git a/libdtrace/dt_bpf.h b/libdtrace/dt_bpf.h
index fdae76b9..77848088 100644
--- a/libdtrace/dt_bpf.h
+++ b/libdtrace/dt_bpf.h
@@ -20,7 +20,8 @@ extern "C" {
 
 #define DT_CONST_EPID	1
 #define DT_CONST_ARGC	2
-#define DT_CONST_PRID	3
+#define DT_CONST_CLID	3
+#define DT_CONST_PRID	4
 
 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 9c02a416..691c31f2 100644
--- a/libdtrace/dt_cc.c
+++ b/libdtrace/dt_cc.c
@@ -2324,7 +2324,8 @@ dt_link_layout(dtrace_hdl_t *dtp, const dtrace_difo_t *dp, uint_t *pcp,
 static int
 dt_link_construct(dtrace_hdl_t *dtp, const dt_probe_t *prp, dtrace_difo_t *dp,
 		  const dtrace_difo_t *sdp, dt_strtab_t *stab,
-		  uint_t *pcp, uint_t *rcp, uint_t *vcp, dtrace_epid_t epid)
+		  uint_t *pcp, uint_t *rcp, uint_t *vcp, dtrace_epid_t epid,
+		  uint_t clid)
 {
 	uint_t			pc = *pcp;
 	uint_t			rc = *rcp;
@@ -2412,6 +2413,9 @@ dt_link_construct(dtrace_hdl_t *dtp, const dt_probe_t *prp, dtrace_difo_t *dp,
 			case DT_CONST_PRID:
 				nrp->dofr_data = prp->desc->id;
 				break;
+			case DT_CONST_CLID:
+				nrp->dofr_data = clid;
+				break;
 			case DT_CONST_ARGC:
 				nrp->dofr_data = 0;	/* FIXME */
 				break;
@@ -2427,13 +2431,14 @@ dt_link_construct(dtrace_hdl_t *dtp, const dt_probe_t *prp, dtrace_difo_t *dp,
 			rdp = dt_dlib_get_func_difo(dtp, idp);
 			if (rdp == NULL)
 				return -1;
-			if (rdp->dtdo_ddesc != NULL)
+			if (rdp->dtdo_ddesc != NULL) {
 				nepid = dt_epid_add(dtp, rdp->dtdo_ddesc,
 						    prp->desc->id);
-			else
+				clid++;
+			} else
 				nepid = 0;
 			ipc = dt_link_construct(dtp, prp, dp, rdp, stab,
-						pcp, rcp, vcp, nepid);
+						pcp, rcp, vcp, nepid, clid);
 			if (ipc == -1)
 				return -1;
 
@@ -2543,7 +2548,8 @@ dt_link(dtrace_hdl_t *dtp, const dt_probe_t *prp, dtrace_difo_t *dp)
 	if (stab == NULL)
 		goto nomem;
 
-	rc = dt_link_construct(dtp, prp, fdp, dp, stab, &insc, &relc, &varc, 0);
+	rc = dt_link_construct(dtp, prp, fdp, dp, stab, &insc, &relc, &varc,
+			       0, 0);
 	dt_dlib_reset(dtp, B_FALSE);
 	if (rc == -1)
 		goto fail;
diff --git a/libdtrace/dt_cg.c b/libdtrace/dt_cg.c
index ed7c2053..f55fd6b6 100644
--- a/libdtrace/dt_cg.c
+++ b/libdtrace/dt_cg.c
@@ -263,6 +263,7 @@ 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);
@@ -292,6 +293,7 @@ dt_cg_prologue(dt_pcb_t *pcb, dt_node_t *pred)
 	 *	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->prid = CLID;	// stw [%r0 + DMST_CLID], CLID
 	 *	*((uint32_t *)&buf[0]) = EPID;
 	 *				// stw [%r9 + 0], EPID
 	 */
@@ -300,6 +302,7 @@ dt_cg_prologue(dt_pcb_t *pcb, dt_node_t *pred)
 	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);
 
 	/*
diff --git a/libdtrace/dt_dctx.h b/libdtrace/dt_dctx.h
index 7ebf4aea..e226606e 100644
--- a/libdtrace/dt_dctx.h
+++ b/libdtrace/dt_dctx.h
@@ -20,6 +20,7 @@
 typedef struct dt_mstate {
 	uint32_t	epid;		/* Enabled probe ID */
 	uint32_t	prid;		/* Probe ID */
+	uint32_t	clid;		/* Clause ID (unique per probe) */
 	uint32_t	tag;		/* Tag (for future use) */
 	uint64_t	fault;		/* DTrace fault flags */
 	uint64_t	tstamp;		/* cached timestamp value */
@@ -55,6 +56,7 @@ typedef struct dt_dctx {
 
 #define DMST_EPID	offsetof(dt_mstate_t, epid)
 #define DMST_PRID	offsetof(dt_mstate_t, prid)
+#define DMST_CLID	offsetof(dt_mstate_t, clid)
 #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 72bc65ad..2175271e 100644
--- a/libdtrace/dt_dlibs.c
+++ b/libdtrace/dt_dlibs.c
@@ -74,6 +74,7 @@ static const dt_ident_t		dt_bpf_symbols[] = {
 	/* 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(CLID, DT_IDENT_SCALAR, DT_CONST_CLID),
 	DT_BPF_SYMBOL_ID(ARGC, DT_IDENT_SCALAR, DT_CONST_ARGC),
 	/* End-of-list marker */
 	{ NULL, }
-- 
2.28.0




More information about the DTrace-devel mailing list