[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