On 08/18/2017 10:04 AM, Petr Mladek wrote: > 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... Nicolai, I can add something like "This function releases the memory for this shadow variable instance, callers should stop referencing it accordingly." Similar text for klp_shadow_detach_all(). > 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. FWIW, kpatch calls them "kpatch_shadow_alloc" and "kpatch_shadow_free". Now that it's clear that we're not going separate shadow variable allocation from hash table insertion, going back to alloc/create and destroy/free is fine w/me. -- Joe -- 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