Re: [PATCH v14 03/11] livepatch: Consolidate klp_free functions

From: Petr Mladek
Date: Tue Dec 04 2018 - 09:00:19 EST


On Mon 2018-12-03 15:59:57, Miroslav Benes wrote:
> On Thu, 29 Nov 2018, Petr Mladek wrote:
>
> > -static int klp_init_patch(struct klp_patch *patch)
> > +/* Init operations that must succeed before klp_free_patch() can be called. */
> > +static int klp_init_patch_before_free(struct klp_patch *patch)
>
> There is no klp_free_patch() now, so the comment is not correct. Also I
> don't know if the function name is ideal, but I don't have a better one.
>
> > {
> > struct klp_object *obj;
> > - int ret;
> > + struct klp_func *func;
> >
> > if (!patch->objs)
> > return -EINVAL;
> >
> > - mutex_lock(&klp_mutex);
> > -
> > + INIT_LIST_HEAD(&patch->list);
> > + patch->kobj_alive = false;
> > patch->enabled = false;
> > init_completion(&patch->finish);
> >
> > - ret = kobject_init_and_add(&patch->kobj, &klp_ktype_patch,
> > - klp_root_kobj, "%s", patch->mod->name);
> > + klp_for_each_object(patch, obj) {
> > + if (!obj->funcs)
> > + return -EINVAL;
> > +
> > + obj->kobj_alive = false;
> > +
> > + klp_for_each_func(obj, func)
> > + func->kobj_alive = false;
> > + }
> > +
> > + return 0;
> > +}
> > +
> > +static int klp_init_patch(struct klp_patch *patch)
> > +{
> > + struct klp_object *obj;
> > + int ret;
> > +
> > + mutex_lock(&klp_mutex);
> > +
> > + ret = klp_init_patch_before_free(patch);
> > if (ret) {
> > mutex_unlock(&klp_mutex);
> > return ret;
> > }
> >
> > + ret = kobject_init_and_add(&patch->kobj, &klp_ktype_patch,
> > + klp_root_kobj, "%s", patch->mod->name);
> > + if (ret)
> > + goto free;
>
> Is this intentional? It should be sufficient (and it was before the patch) to
> unlock the mutex and return ret. We do not need to free anything here. Only
> klp_patch instance was initialized and that is all.

It will get needed later when try_module_get() is moved into
klp_init_patch_before_free(), see the 5th patch. I'll do it
in the right order in v15.

BTW: I remember that I did this by intention. I updated the patchset
step by step according to the feedback. The init_before_free() was
growing and growing. I did many rebases, shuffling changes between
patches, just wanted to be on the safe side, and maybe save one hunk.
But it seems that no shortcut can slip the careful review ;-)


> Otherwise it looks good. kobj_alive feels safer than state_initialized.

Yup.

Best Regards,
Petr