Re: [RFC PATCH 8/9] livepatch: allow patch modules to be removed

Josh Poimboeuf
2015-02-11T18:39:59Z

On Wed, Feb 11, 2015 at 11:55:05AM +0100, Jiri Slaby wrote:
> On 02/10/2015, 08:57 PM, Josh Poimboeuf wrote:
> > On Tue, Feb 10, 2015 at 08:02:34PM +0100, Jiri Slaby wrote:
> >> On 02/09/2015, 06:31 PM, Josh Poimboeuf wrote:
> >>> --- a/kernel/livepatch/core.c
> >>> +++ b/kernel/livepatch/core.c
> >> ...
> >>> @@ -497,10 +500,6 @@ static struct attribute *klp_patch_attrs[] = {
> >>>
> >>> static void klp_kobj_release_patch(struct kobject *kobj)
> >>> {
> >>> - /*
> >>> - * Once we have a consistency model we'll need to module_put() the
> >>> - * patch module here. See klp_register_patch() for more details.
> >>> - */
> >>
> >> I deliberately let you write the note in there :). What happens when I
> >> leave some attribute in /sys open and you remove the module in the meantime?
> >
> > You're right, as was I the first time :-)
> >
> > The only problem is that it would be nice if we could call
> > klp_unregister_patch() from the patch module's exit function, so that
> > doing an rmmod on the patch module unregisters it. But if we put
> > module_put() in the patch release function, then we have a circular
> > dependency and we could never rmmod it.
> >
> > How about instead we do a klp_is_patch_registered() at the beginning of
> > all the attribute accessor functions? It's kind of ugly, but I can't
> > think of a better idea at the moment.
>
> Ugh, no :). You even have the kobject proper in the module which would
> be gone.
>
> However we can take inspiration in kgraft. I introduced a completion
> there and wait for it in rmmod. This completion is made complete in
> kobject's release. See:
> https://git.kernel.org/cgit/linux/kernel/git/jirislaby/kgraft.git/tree/kernel/kgraft_files.c?h=kgraft#n30
> https://git.kernel.org/cgit/linux/kernel/git/jirislaby/kgraft.git/tree/kernel/kgraft_files.c?h=kgraft#n138
>
> This should IMO work here too.

Thanks, that sounds a lot better. I'll try to do something like that.

--
Josh