[DTrace-devel] [PATCH v2] print() action: identify ctf object used for print
Kris Van Hees
kris.van.hees at oracle.com
Wed Apr 24 17:35:55 UTC 2024
On Wed, Apr 24, 2024 at 01:19:59PM -0400, Kris Van Hees via DTrace-devel wrote:
> On Fri, Apr 19, 2024 at 10:27:11AM +0100, Alan Maguire via DTrace-devel wrote:
> > [resending since appears to have bounced last time]
> >
> > when generating code for print() action we need to identify source
> > of CTF; is it shared CTF, cdefs or ddefs or another module?
> > Use DTRACE_OBJ* values for the first three cases, falling back
> > to using module name pointer as a record argument if these fail.
>
> I am thinking about this... It seems unnecessary to add the conditionals
> in the code since every module *has* a name. So just passing in the module
> name pointer as value would work for all cases anyway. No need to use any
> special cases.
>
> But that brings up a different issue... should we be passing in pointer
> values and expect that they can be retrieved and used as pointers again on
> the consumer end. While that currently would work, it feels a bit fragile.
> Especially if we might have to deal with modules getting unloaded (and that
> might result in the module getting removed from dtrace also - I don't think it
> does right now, but if we start looking towards long running dtrace sessions,
> that might become something to do).
>
> Perhaps we should store the module *name* itself? Slightly less efficient
> but also less fragile?
>
> > Then when consuming records we can use either shared CTF,
> > cdef, ddef or module CTF as appropriate. Nick pointed out that
> > the initial solution will not work for module-defined types.
> >
> > This fixes an issue encountered when using a shared kernel type
> > with alloca()ed memory; DTrace assumed the type was in ddefs
> > and it wasn't so it wasn't displayed. This change fixes that and
> > all tests continue to pass. Also tested that it works with
> > kernel module-defined types now:
> >
> > dtrace: description 'fbt::ieee80211_rx_napi:entry ' matched 1 probe
> > CPU ID FUNCTION:NAME
> > 7 123161 ieee80211_rx_napi:entry 0xffff9f8980fa08e0 = *
> > (struct ieee80211_hw) {
> > .conf = (struct
> > ieee80211_conf) {
> > .listen_interval = (u16)10,
> > .long_frame_max_tx_count =
> > (u8)4,
> > .short_frame_max_tx_count
> > = (u8)7,
> > },
> >
> > Signed-off-by: Alan Maguire <alan.maguire at oracle.com>
> > ---
> > libdtrace/dt_cg.c | 18 +++++++++++++++++-
> > libdtrace/dt_consume.c | 7 +++++--
> > libdtrace/dt_printf.c | 24 +++++++++++++++++++++---
> > libdtrace/dt_printf.h | 2 +-
> > 4 files changed, 44 insertions(+), 7 deletions(-)
> >
> > diff --git a/libdtrace/dt_cg.c b/libdtrace/dt_cg.c
> > index 27246a40..542fb887 100644
> > --- a/libdtrace/dt_cg.c
> > +++ b/libdtrace/dt_cg.c
> > @@ -20,6 +20,7 @@
> > #include <dt_dctx.h>
> > #include <dt_cg.h>
> > #include <dt_grammar.h>
> > +#include <dt_module.h>
> > #include <dt_parser.h>
> > #include <dt_printf.h>
> > #include <dt_provider.h>
> > @@ -2831,6 +2832,7 @@ dt_cg_act_print(dt_pcb_t *pcb, dt_node_t *dnp,
> > dtrace_actkind_t kind)
> > ctf_file_t *fp = addr->dn_ctfp;
> > ctf_id_t type = addr->dn_type;
> > char n[DT_TYPE_NAMELEN];
> > + const char *ctf_obj;
> > size_t size;
> > type = ctf_type_reference(fp, type);
> > @@ -2842,9 +2844,23 @@ dt_cg_act_print(dt_pcb_t *pcb, dt_node_t *dnp,
> > dtrace_actkind_t kind)
> > "print( ) argument #1 reference has type '%s' with size 0; cannot
> > print( ) it.\n",
> > ctf_type_name(fp, type, n, sizeof(n)));
> > - /* reserve space for addr/type, data/size */
> > + /* reserve space for addr/type, ctf file identification, data/size */
> > addr_off = dt_rec_add(dtp, dt_cg_fill_gap, DTRACEACT_PRINT,
> > sizeof(uint64_t), 8, NULL, type);
> > + /* Use DTRACE_OBJ_* where possible, falling back to module name if
> > + * none of these match.
> > + */
> > + if (fp == dtp->dt_shared_ctf) {
> > + ctf_obj = DTRACE_OBJ_KMODS;
> > + } else if (fp == dtp->dt_cdefs->dm_ctfp) {
> > + ctf_obj = DTRACE_OBJ_CDEFS;
> > + } else if (fp == dtp->dt_ddefs->dm_ctfp) {
> > + ctf_obj = DTRACE_OBJ_DDEFS;
> > + } else {
> > + ctf_obj = dt_module_lookup_by_ctf(dtp, fp)->dm_name;
> > + }
> > + dt_rec_add(dtp, dt_cg_fill_gap, DTRACEACT_PRINT,
> > + sizeof(uint64_t), 8, NULL, (uint64_t)ctf_obj);
> > data_off = dt_rec_add(dtp, dt_cg_fill_gap, DTRACEACT_PRINT,
> > size, 8, NULL, size);
> > diff --git a/libdtrace/dt_consume.c b/libdtrace/dt_consume.c
> > index dec2314b..0d6f2642 100644
> > --- a/libdtrace/dt_consume.c
> > +++ b/libdtrace/dt_consume.c
> > @@ -1987,9 +1987,11 @@ static int
> > dt_print_print(dtrace_hdl_t *dtp, FILE *fp, dtrace_recdesc_t *rec,
> > const caddr_t buf)
> > {
> > - dtrace_recdesc_t *data_rec = rec + 1;
> > + dtrace_recdesc_t *ctf_rec = rec + 1;
> > + dtrace_recdesc_t *data_rec = rec + 2;
> > size_t max_size = dtp->dt_options[DTRACEOPT_PRINTSIZE];
> > size_t size = (size_t)data_rec->dtrd_arg;
> > + const char *ctf_obj = (const char *)ctf_rec->dtrd_arg;
> > uint64_t printaddr;
> > if (size > max_size)
> > @@ -1998,7 +2000,8 @@ dt_print_print(dtrace_hdl_t *dtp, FILE *fp,
> > dtrace_recdesc_t *rec,
> > if (dt_read_scalar(buf, rec, &printaddr) < 0)
> > return dt_set_errno(dtp, EDT_PRINT);
> > - return dt_print_type(dtp, fp, printaddr, (ctf_id_t)rec->dtrd_arg,
> > + return dt_print_type(dtp, fp, printaddr, ctf_obj,
> > + (ctf_id_t)rec->dtrd_arg,
> > (caddr_t)buf + data_rec->dtrd_offset, size);
> > }
> > diff --git a/libdtrace/dt_printf.c b/libdtrace/dt_printf.c
> > index 50842216..2b5e4e0a 100644
> > --- a/libdtrace/dt_printf.c
> > +++ b/libdtrace/dt_printf.c
> > @@ -14,6 +14,7 @@
> > #include <limits.h>
> > #include <port.h>
> > +#include <dt_module.h>
> > #include <dt_printf.h>
> > #include <dt_string.h>
> > #include <dt_impl.h>
> > @@ -2236,13 +2237,30 @@ err:
> > int
> > dt_print_type(dtrace_hdl_t *dtp, FILE *fp, uint64_t printaddr,
> > - ctf_id_t type, caddr_t data, size_t size)
> > + const char *ctf_obj, ctf_id_t type, caddr_t data, size_t size)
> > {
> > struct dt_visit_arg dva;
> > dva.dv_dtp = dtp;
> > dva.dv_fp = fp;
> > - dva.dv_ctfp = dtp->dt_ddefs->dm_ctfp;
> > +
> > + if (ctf_obj == DTRACE_OBJ_KMODS) {
> > + dva.dv_ctfp = dtp->dt_shared_ctf;
> > + } else if (ctf_obj == DTRACE_OBJ_CDEFS) {
> > + dva.dv_ctfp = dtp->dt_cdefs->dm_ctfp;
> > + } else if (ctf_obj == DTRACE_OBJ_DDEFS) {
> > + dva.dv_ctfp = dtp->dt_ddefs->dm_ctfp;
> > + } else {
> > + struct dt_module *dm = dt_module_lookup_by_name(dtp, ctf_obj);
> > +
> > + if (dm)
> > + dva.dv_ctfp = dt_module_getctf(dtp, dm);
> > + if (!dm || !dva.dv_ctfp) {
> > + dt_dprintf("error retrieving CTF for print() action\n");
> > + return dt_set_errno(dtp, EDT_CTF);
> > + }
> > + }
> > +
> > dva.dv_data = data;
> > dva.dv_size = size;
> > dva.dv_last_depth = 0;
> > @@ -2260,5 +2278,5 @@ dt_print_type(dtrace_hdl_t *dtp, FILE *fp,
> > uint64_t printaddr,
> > if (dt_print_close_parens(&dva, 0) < 0)
> > return -1;
> > - return 2;
> > + return 3;
> > }
> > diff --git a/libdtrace/dt_printf.h b/libdtrace/dt_printf.h
> > index 9771c4a8..b72ff55b 100644
> > --- a/libdtrace/dt_printf.h
> > +++ b/libdtrace/dt_printf.h
> > @@ -108,7 +108,7 @@ extern int dt_print_ustack(dtrace_hdl_t *, FILE *,
> > const char *, caddr_t, uint64_t);
> > extern int dt_print_mod(dtrace_hdl_t *, FILE *, const char *, caddr_t);
> > extern int dt_print_umod(dtrace_hdl_t *, FILE *, const char *, caddr_t);
> > -extern int dt_print_type(dtrace_hdl_t *, FILE *, uint64_t, ctf_id_t,
> > +extern int dt_print_type(dtrace_hdl_t *, FILE *, uint64_t, const char
> > *, ctf_id_t,
> > caddr_t, size_t);
> > #ifdef __cplusplus
> > --
> > 2.39.3
> >
> >
> > _______________________________________________
> > DTrace-devel mailing list
> > DTrace-devel at oss.oracle.com
> > https://oss.oracle.com/mailman/listinfo/dtrace-devel
>
> _______________________________________________
> DTrace-devel mailing list
> DTrace-devel at oss.oracle.com
> https://oss.oracle.com/mailman/listinfo/dtrace-devel
More information about the DTrace-devel
mailing list