[DTrace-devel] [PATCH 12/12] Implement TLS variables
Kris Van Hees
kris.van.hees at oracle.com
Wed Nov 24 20:07:03 UTC 2021
On Wed, Nov 24, 2021 at 10:37:01AM -0500, Eugene Loh via DTrace-devel wrote:
> On 11/24/21 12:20 AM, Kris Van Hees wrote:
>
> > On Tue, Nov 23, 2021 at 08:52:45PM -0500, Eugene Loh via DTrace-devel wrote:
> > > On 11/23/21 2:45 AM, Kris Van Hees wrote:
> > > > On Mon, Nov 22, 2021 at 06:08:18PM -0500, Eugene Loh via DTrace-devel wrote:
> > > > > On 11/20/21 12:44 AM, Kris Van Hees via DTrace-devel wrote:
> > > > > > diff --git a/bpf/get_tvar.c b/bpf/get_tvar.c
> > > > > > @@ -10,12 +10,40 @@
> > > > > > # define noinline __attribute__((noinline))
> > > > > > #endif
> > > > > > -extern struct bpf_map_def tvars;
> > > > > > +extern struct bpf_map_def dvars;
> > > > > > +extern uint64_t NCPUS;
> > > > > > -noinline uint64_t dt_get_tvar(uint32_t id)
> > > > > > +noinline void *dt_get_tvar(uint32_t id)
> > > > > > {
> > > > > > - uint64_t *val;
> > > > > > + uint64_t key;
> > > > > > + uint64_t dflt_key = 0;;
> > > > > > + void *val;
> > > > > > - val = bpf_map_lookup_elem(&tvars, &id);
> > > > > > - return val ? *val : 0;
> > > > > > + key = bpf_get_current_pid_tgid();
> > > > > > + key &= 0x00000000ffffffffUL;
> > > > > > + if (key == 0)
> > > > > > + key = bpf_get_smp_processor_id();
> > > > > > + else
> > > > > > + key += (uint32_t)(uint64_t)&NCPUS;
> > > > > > +
> > > > > > + key++;
> > > > > > + key = (key << 32) | id;
> > > > > > diff --git a/libdtrace/dt_bpf.c b/libdtrace/dt_bpf.c
> > > > > > @@ -213,36 +213,21 @@ populate_probes_map(dtrace_hdl_t *dtp, int fd)
> > > > > > * use.
> > > > > > * - gvars: Global variables map. This is a global map with a singleton
> > > > > > * element (key 0) addressed by variable offset.
> > > > > > + * - dvars: Dynamic variables map. This is a global hash map index with
> > > > > > + * a unique numeric identifier for each variable.
> > > > > Well, variable/pid combo.
> > > again not just per variable but also per pid
> > No, we look at it as distict variables, and thus each numeric identifier relates
> > to a single variable. So, a single variable name (identifier) maps to multiple
> > variables (internally).
> There is apparently some point here that I'm not getting but that I'd like
> to understand. The BPF map is indexed by keys that combine varid with pid.
> The map knows nothing about varid apart from pid. As far as the BPF map is
> concerned, there is nothing magic about varid apart from pid. One could
> exchange varid and pid in the key, interweave varid and pid bits to form the
> key, etc. None of that would impact the BPF map.
The map does not need to know anything about how the key is generated. As far
as the map is concerned, each entry is its own variable, or rather its own
(key, value) pair where the value is the value of a variable. Given that the
mapping between the variable, task, and other factors can change, I do not see
why we would add informtion here about that. It is not relevant.
More information about the DTrace-devel
mailing list