On Thu, Feb 02, 2023 at 11:14:15AM +0100, Petr Mladek wrote: > On Tue 2023-01-31 16:18:17, Josh Poimboeuf wrote: > > On Wed, Oct 26, 2022 at 04:41:22PM -0300, Marcos Paulo de Souza wrote: > > > The shadow variable type might then be added into a new @shadow_types > > > member of struct klp_object. They will get then automatically registered > > > and unregistered when the object is being livepatched. The registration > > > increments the reference count. Unregistration decreases the reference > > > count. All shadow variables of the given type are freed when the reference > > > count reaches zero. > > > > How does the automatic unregistration work for replaced patches? > > > > I see klp_unpatch_replaced_patches() is called, but I don't see where it > > ends up calling klp_shadow_unregister() for the replaced patch(es). > > Great catch! I forgot that replaced patches are handled separately. > We should do the following (on top of this patch): > > --- a/kernel/livepatch/transition.c > +++ b/kernel/livepatch/transition.c > @@ -123,8 +123,11 @@ static void klp_complete_transition(void) > continue; > if (klp_target_state == KLP_PATCHED) > klp_post_patch_callback(obj); > - else if (klp_target_state == KLP_UNPATCHED) { > + else if (klp_target_state == KLP_UNPATCHED) > klp_post_unpatch_callback(obj); > + > + if (klp_target_state == KLP_UNPATCHED || > + klp_transition_patch->replace) { > klp_unregister_shadow_types(obj); > } > } That calls klp_unregister_shadow_types() on the objects for klp_transition_patch, which is the replacement patch, not the replaced patch(es). -- Josh