[DTrace-devel] [PATCH v2 01/19] Change probes from having lists of clauses to lists of stmts
Kris Van Hees
kris.van.hees at oracle.com
Thu Sep 19 09:06:00 UTC 2024
On Wed, Sep 18, 2024 at 08:30:41PM -0400, eugene.loh at oracle.com wrote:
> From: Eugene Loh <eugene.loh at oracle.com>
>
> Each stmt has a clause and a probe description. Traditionally,
> we have added clauses to probes. Further, we have generated an
> enabled probe ID for each probe/clause combination, and the
> consumer has used the EPID to determine the PRID as well as the
> data descriptor for the clause.
>
> In this patch, change from probes having clauses associated
> with them to having stmts.
>
> Signed-off-by: Eugene Loh <eugene.loh at oracle.com>
Reviewed-by: Kris Van Hees <kris.van.hees at oracle.com>
> ---
> libdtrace/dt_cg.c | 17 +++++-----
> libdtrace/dt_probe.c | 73 ++++++++++++++++++++++--------------------
> libdtrace/dt_probe.h | 12 +++----
> libdtrace/dt_program.c | 8 ++---
> 4 files changed, 56 insertions(+), 54 deletions(-)
>
> diff --git a/libdtrace/dt_cg.c b/libdtrace/dt_cg.c
> index 166627fba..f6c88c5ca 100644
> --- a/libdtrace/dt_cg.c
> +++ b/libdtrace/dt_cg.c
> @@ -844,9 +844,10 @@ typedef struct {
> } dt_clause_arg_t;
>
> static int
> -dt_cg_call_clause(dtrace_hdl_t *dtp, dt_ident_t *idp, dt_clause_arg_t *arg)
> +dt_cg_call_clause(dtrace_hdl_t *dtp, dtrace_stmtdesc_t *sdp, dt_clause_arg_t *arg)
> {
> dt_irlist_t *dlp = arg->dlp;
> + dt_ident_t *idp = sdp->dtsd_clause;
>
> /*
> * if (*dctx.act != act) // ldw %r0, [%r9 + DCTX_ACT]
> @@ -874,14 +875,12 @@ dt_cg_call_clause(dtrace_hdl_t *dtp, dt_ident_t *idp, dt_clause_arg_t *arg)
> }
>
> void
> -dt_cg_tramp_call_clauses(dt_pcb_t *pcb, const dt_probe_t *prp,
> - dt_activity_t act)
> +dt_cg_tramp_call_clauses(dt_pcb_t *pcb, const dt_probe_t *prp, dt_activity_t act)
> {
> dt_irlist_t *dlp = &pcb->pcb_ir;
> dt_clause_arg_t arg = { dlp, act, pcb->pcb_exitlbl };
>
> - dt_probe_clause_iter(pcb->pcb_hdl, prp,
> - (dt_clause_f *)dt_cg_call_clause, &arg);
> + dt_probe_stmt_iter(pcb->pcb_hdl, prp, (dt_stmt_f *)dt_cg_call_clause, &arg);
> }
>
> static int
> @@ -990,9 +989,10 @@ dt_cg_tramp_epilogue_advance(dt_pcb_t *pcb, dt_activity_t act)
> }
>
> static int
> -dt_cg_tramp_error_call_clause(dtrace_hdl_t *dtp, dt_ident_t *idp,
> - dt_irlist_t *dlp)
> +dt_cg_tramp_error_call_clause(dtrace_hdl_t *dtp, dtrace_stmtdesc_t *sdp, dt_irlist_t *dlp)
> {
> + dt_ident_t *idp = sdp->dtsd_clause;
> +
> /*
> * dt_error_#(dctx); // mov %r1, %r9
> * // call dt_error_#
> @@ -1029,8 +1029,7 @@ dt_cg_tramp_error(dt_pcb_t *pcb)
> TRACE_REGSET("Trampoline: Begin");
> emit(dlp, BPF_MOV_REG(BPF_REG_9, BPF_REG_1));
>
> - dt_probe_clause_iter(dtp, dtp->dt_error,
> - (dt_clause_f *)dt_cg_tramp_error_call_clause, dlp);
> + dt_probe_stmt_iter(dtp, dtp->dt_error, (dt_stmt_f *)dt_cg_tramp_error_call_clause, dlp);
>
> emit(dlp, BPF_MOV_IMM(BPF_REG_0, 0));
> emit(dlp, BPF_RETURN());
> diff --git a/libdtrace/dt_probe.c b/libdtrace/dt_probe.c
> index 01a0196af..686e2a661 100644
> --- a/libdtrace/dt_probe.c
> +++ b/libdtrace/dt_probe.c
> @@ -24,10 +24,10 @@
> #include <dt_list.h>
> #include <dt_bpf.h>
>
> -typedef struct dt_probe_clause {
> - dt_list_t list;
> - dt_ident_t *clause;
> -} dt_probe_clause_t;
> +typedef struct dt_probe_stmt {
> + dt_list_t list;
> + dtrace_stmtdesc_t *stmt;
> +} dt_probe_stmt_t;
>
> typedef struct dt_probe_dependent {
> dt_list_t list;
> @@ -335,7 +335,7 @@ dt_probe_enable(dtrace_hdl_t *dtp, dt_probe_t *prp)
> void
> dt_probe_destroy(dt_probe_t *prp)
> {
> - dt_probe_clause_t *pcp, *pcp_next;
> + dt_probe_stmt_t *psp, *psp_next;
> dt_probe_instance_t *pip, *pip_next;
> dt_probe_dependent_t *dep, *dep_next;
> dtrace_hdl_t *dtp;
> @@ -367,9 +367,9 @@ dt_probe_destroy(dt_probe_t *prp)
> dt_free(dtp, prp->nargv);
> dt_free(dtp, prp->xargv);
>
> - for (pcp = dt_list_next(&prp->clauses); pcp != NULL; pcp = pcp_next) {
> - pcp_next = dt_list_next(pcp);
> - dt_free(dtp, pcp);
> + for (psp = dt_list_next(&prp->stmts); psp != NULL; psp = psp_next) {
> + psp_next = dt_list_next(psp);
> + dt_free(dtp, psp);
> }
>
> for (dep = dt_list_next(&prp->dependents); dep != NULL; dep = dep_next) {
> @@ -1147,24 +1147,24 @@ dtrace_probe_iter(dtrace_hdl_t *dtp, const dtrace_probedesc_t *pdp,
> }
>
> /*
> - * Create an ERROR-probe specific copy of a given clause.
> - *
> - * A modified copy of the clause is necessary because the ERROR probe may share
> - * some clauses with other probes, and yet it needs to be handled differently.
> + * Create an ERROR-probe specific copy of a given stmt.
> *
> - * The following modifications are made in the copy of the clause:
> + * A modified copy of the stmt is necessary because the ERROR probe may share
> + * some stmts with other probes, and yet it needs to be handled differently.
> *
> - * - it is named dt_error_N where N is taken from the original clause
> - * dt_clause_N (which also guarantees uniqueness)
> + * In the copy of the stmt, the clause is named dt_error_N, where N is taken
> + * from the original stmt's dt_clause_N (which also guarantees uniqueness).
> */
> -dt_ident_t *
> -dt_probe_error_clause(dtrace_hdl_t *dtp, dt_ident_t *idp)
> +static dtrace_stmtdesc_t *
> +dt_probe_error_stmt(dtrace_hdl_t *dtp, dtrace_stmtdesc_t *sdp)
> {
> char *name;
> int len;
> + dt_ident_t *idp = sdp->dtsd_clause;
> dtrace_difo_t *dp = dt_dlib_get_func_difo(dtp, idp);
> dt_ident_t *nidp = NULL;
> dtrace_difo_t *ndp;
> + dtrace_stmtdesc_t *nsdp = NULL;
>
> /*
> * Copy the DIFO.
> @@ -1180,7 +1180,6 @@ dt_probe_error_clause(dtrace_hdl_t *dtp, dt_ident_t *idp)
> name = dt_alloc(dtp, len);
> if (name == NULL)
> goto no_mem;
> -
> snprintf(name, len, "dt_error_%s", idp->di_name + strlen("dt_clause_"));
>
> /*
> @@ -1194,7 +1193,12 @@ dt_probe_error_clause(dtrace_hdl_t *dtp, dt_ident_t *idp)
>
> dt_ident_set_data(nidp, ndp);
>
> - return nidp;
> + nsdp = dt_alloc(dtp, sizeof(dtrace_stmtdesc_t));
> + if (nsdp == NULL)
> + goto no_mem;
> + nsdp->dtsd_clause = nidp;
> +
> + return nsdp;
>
> no_mem:
> if (ndp != NULL)
> @@ -1207,40 +1211,39 @@ no_mem:
> }
>
> int
> -dt_probe_add_clause(dtrace_hdl_t *dtp, dt_probe_t *prp, dt_ident_t *idp)
> +dt_probe_add_stmt(dtrace_hdl_t *dtp, dt_probe_t *prp, dtrace_stmtdesc_t *sdp)
> {
> - dt_probe_clause_t *pcp;
> + dt_probe_stmt_t *psp;
>
> - pcp = dt_zalloc(dtp, sizeof(dt_probe_clause_t));
> - if (pcp == NULL)
> + psp = dt_zalloc(dtp, sizeof(dt_probe_stmt_t));
> + if (psp == NULL)
> return dt_set_errno(dtp, EDT_NOMEM);
>
> if (prp == dtp->dt_error) {
> - pcp->clause = dt_probe_error_clause(dtp, idp);
> - if (pcp->clause == NULL) {
> - dt_free(dtp, pcp);
> + psp->stmt = dt_probe_error_stmt(dtp, sdp);
> + if (psp->stmt == NULL) {
> + dt_free(dtp, psp);
> return 0;
> }
> } else
> - pcp->clause = idp;
> + psp->stmt = sdp;
>
> - dt_list_append(&prp->clauses, pcp);
> + dt_list_append(&prp->stmts, psp);
>
> return 0;
> }
>
> int
> -dt_probe_clause_iter(dtrace_hdl_t *dtp, const dt_probe_t *prp,
> - dt_clause_f *func, void *arg)
> +dt_probe_stmt_iter(dtrace_hdl_t *dtp, const dt_probe_t *prp, dt_stmt_f *func, void *arg)
> {
> - dt_probe_clause_t *pcp;
> - int rc;
> + dt_probe_stmt_t *psp;
> + int rc;
>
> assert(func != NULL);
>
> - for (pcp = dt_list_next(&prp->clauses); pcp != NULL;
> - pcp = dt_list_next(pcp)) {
> - rc = func(dtp, pcp->clause, arg);
> + for (psp = dt_list_next(&prp->stmts); psp != NULL;
> + psp = dt_list_next(psp)) {
> + rc = func(dtp, psp->stmt, arg);
>
> if (rc != 0)
> return rc;
> diff --git a/libdtrace/dt_probe.h b/libdtrace/dt_probe.h
> index b4c1a3e40..2a78cb9ca 100644
> --- a/libdtrace/dt_probe.h
> +++ b/libdtrace/dt_probe.h
> @@ -32,7 +32,7 @@ typedef struct dt_probe_instance {
>
> typedef struct dt_probe {
> dt_list_t list; /* prev/next in enablings chain */
> - dt_list_t clauses; /* clauses to attach */
> + dt_list_t stmts; /* stmts */
> dt_list_t dependents; /* dependenct probes to attach */
> const dtrace_probedesc_t *desc; /* probe description (id, name) */
> dt_provider_t *prov; /* pointer to containing provider */
> @@ -86,11 +86,11 @@ typedef int dt_probe_f(dtrace_hdl_t *dtp, dt_probe_t *prp, void *arg);
> extern int dt_probe_iter(dtrace_hdl_t *dtp, const dtrace_probedesc_t *pdp,
> dt_probe_f *pfunc, dtrace_probe_f *dfunc, void *arg);
>
> -extern int dt_probe_add_clause(dtrace_hdl_t *dtp, dt_probe_t *prp,
> - dt_ident_t *idp);
> -typedef int dt_clause_f(dtrace_hdl_t *dtp, dt_ident_t *idp, void *arg);
> -extern int dt_probe_clause_iter(dtrace_hdl_t *dtp, const dt_probe_t *prp,
> - dt_clause_f *func, void *arg);
> +extern int dt_probe_add_stmt(dtrace_hdl_t *dtp, dt_probe_t *prp,
> + dtrace_stmtdesc_t *sdp);
> +typedef int dt_stmt_f(dtrace_hdl_t *dtp, dtrace_stmtdesc_t *sdp, void *arg);
> +extern int dt_probe_stmt_iter(dtrace_hdl_t *dtp, const dt_probe_t *prp,
> + dt_stmt_f *func, void *arg);
>
> extern int dt_probe_add_dependent(dtrace_hdl_t *dtp, dt_probe_t *prp,
> dt_probe_t *idprp);
> diff --git a/libdtrace/dt_program.c b/libdtrace/dt_program.c
> index a4b052fc4..0e2c1e2af 100644
> --- a/libdtrace/dt_program.c
> +++ b/libdtrace/dt_program.c
> @@ -139,8 +139,8 @@ dtrace_program_info(dtrace_hdl_t *dtp, dtrace_prog_t *pgp,
> }
>
> typedef struct pi_state {
> - int *cnt;
> - dt_ident_t *idp;
> + int *cnt;
> + dtrace_stmtdesc_t *sdp;
> } pi_state_t;
>
> static int
> @@ -151,7 +151,7 @@ dt_stmt_probe(dtrace_hdl_t *dtp, dt_probe_t *prp, pi_state_t *st)
> dt_probe_info(dtp, prp->desc, &p);
> dt_probe_enable(dtp, prp);
>
> - dt_probe_add_clause(dtp, prp, st->idp);
> + dt_probe_add_stmt(dtp, prp, st->sdp);
> (*st->cnt)++;
>
> return 0;
> @@ -166,7 +166,7 @@ dt_prog_stmt(dtrace_hdl_t *dtp, dtrace_prog_t *pgp, dtrace_stmtdesc_t *sdp,
> int rc;
>
> st.cnt = cnt;
> - st.idp = sdp->dtsd_clause;
> + st.sdp = sdp;
> rc = dt_probe_iter(dtp, pdp, (dt_probe_f *)dt_stmt_probe, NULL, &st);
>
> /*
> --
> 2.43.5
>
More information about the DTrace-devel
mailing list