On Fri 2017-08-18 15:44:29, Nicolai Stange wrote: > Joe Lawrence <joe.lawrence@xxxxxxxxxx> writes: > > <snip> > > + > > +/** > > + * klp_shadow_get() - retrieve a shadow variable data pointer > > + * @obj: pointer to parent object > > + * @id: data identifier > > + * > > + * Return: the shadow variable data element, NULL on failure. > > + */ > > +void *klp_shadow_get(void *obj, unsigned long id) > > +{ > > + struct klp_shadow *shadow; > > + > > + rcu_read_lock(); > > + > > + hash_for_each_possible_rcu(klp_shadow_hash, shadow, node, > > + (unsigned long)obj) { > > + > > + if (klp_shadow_match(shadow, obj, id)) { > > + rcu_read_unlock(); > > + return shadow->data; > > I had to think a moment about what protects shadow from getting freed by > a concurrent detach after that rcu_read_unlock(). Then I noticed that if > obj and the livepatch are alive, then so is shadow, because there > obviously hasn't been any reason to detach it. > > So maybe it would be nice to have an additional comment at > klp_shadow_detach() that it's the API user's responsibility not to use a > shadow instance after detaching it... Good point. In fact, it might make sense to rename the functions: attach -> create detach -> destroy The name detach suggests that the variable is just not connected to the parent object but that it is still accessible/usable. Best Regards, Petr -- To unsubscribe from this list: send the line "unsubscribe live-patching" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html