Received: by 10.223.176.5 with SMTP id f5csp477388wra; Fri, 9 Feb 2018 02:08:04 -0800 (PST) X-Google-Smtp-Source: AH8x226VKvGRo1iTaRap3akpw/lKUGOQP/C/F55glERXwLkGIX2+3Scmt0o1VtedOvdDFSwrIKI1 X-Received: by 10.98.73.70 with SMTP id w67mr2289631pfa.61.1518170884063; Fri, 09 Feb 2018 02:08:04 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1518170884; cv=none; d=google.com; s=arc-20160816; b=oVfjPs5+aYrZtE9qHOKi6Hqrj5lGtJY3GOtDA+RLx3uAkbJoDFZN1M0XaDUpA48Goc wRODnU13OVLJ4wkAtYGFVSz5GmgqoW52df8DvRGxfBks4JciBSM0SGY55hLqkjxBu3MP gBx4a99mV0j2bdjVpM72oT0dcczF+YSbzuO+xaQiJX6IIlsYo2Cj3I/CFI/KVy7gFIym kfEVJJykZlfOdJ66D6YfJ9xECkL01YndJ6SN900q93q+Dm8Wk3q+80QmCNvzxDEX65hV nRD/4D6gfGx4wSsoJPWMpTjcpZJfKyrzS1kcaSFJmz+tkgN+mXnFzvB1XaN3rVNkV6ri 7qJg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:mime-version:user-agent:references :message-id:in-reply-to:subject:cc:to:from:date :arc-authentication-results; bh=bPmn8DEJjo4ug2q2JM2APavp14E92jE5bm3Ez+8jRUI=; b=xJYV7N47ODaSTcwodwdlPlYOKDVIRcwDnd0ckyHyRxoCzH/tbRfqdgJYw43mSOlY7F BqFtdClVEeFmx6vdHmOQyZjYUyJs5OE/kNqde6KkirQXS+Q//OzRY0Kyh3wlgM1pZHNE qAvBhAQZKz6tJuUgn37suXk6AxC6Uj7780KSHC+97FcMdW00kGbsCWAzHrc5f7BLl7I5 S3oznDM2Akacqxp3dG4Sfp0iDsZPAdcgZYdiWMJ/I2b4jlo3eWNePcyGK9GpB4nflAKs DA4GYbxMzhNapCcOUUepYk4UDNiyx6CKLnSwbcimrWZDVznRjbFrgkEcdiJudpgDbfoU xj1Q== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id t196si1184586pgc.72.2018.02.09.02.07.50; Fri, 09 Feb 2018 02:08:04 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752135AbeBIKGb (ORCPT + 99 others); Fri, 9 Feb 2018 05:06:31 -0500 Received: from mx2.suse.de ([195.135.220.15]:47560 "EHLO mx2.suse.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751034AbeBIKG3 (ORCPT ); Fri, 9 Feb 2018 05:06:29 -0500 X-Virus-Scanned: by amavisd-new at test-mx.suse.de Received: from relay1.suse.de (charybdis-ext.suse.de [195.135.220.254]) by mx2.suse.de (Postfix) with ESMTP id 1810BAD6D; Fri, 9 Feb 2018 10:06:28 +0000 (UTC) Date: Fri, 9 Feb 2018 11:06:27 +0100 (CET) From: Miroslav Benes To: Petr Mladek cc: Jiri Kosina , Josh Poimboeuf , Jason Baron , Joe Lawrence , Jessica Yu , Evgenii Shatokhin , live-patching@vger.kernel.org, linux-kernel@vger.kernel.org Subject: Re: [PATCH v7 2/7] livepatch: Free only structures with initialized kobject In-Reply-To: <20180206103424.10829-3-pmladek@suse.com> Message-ID: References: <20180206103424.10829-1-pmladek@suse.com> <20180206103424.10829-3-pmladek@suse.com> User-Agent: Alpine 2.21 (LSU 202 2017-01-01) MIME-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Tue, 6 Feb 2018, Petr Mladek wrote: > We are going to add a feature called atomic replace. It will allow to > create a patch that would replace all already registered patches. > For this, we will need to dynamically create funcs and objects > for functions that are not longer patched. s/not longer/no longer/ It applies to the other changelogs as well. > We will want to reuse the existing init() and free() functions. Up to now, > the free() functions checked a limit and were called only for structures > with initialized kobject. But we will want to call them also for structures > that were allocated but where the kobject was not initialized yet. > > This patch removes the limit. It calls klp_free*() functions for all > structures. But only the ones with initialized kobject are freed. > The handling of un-initialized structures will be added later with > the support for dynamic structures. > > This patch does not change the existing behavior. > > Signed-off-by: Petr Mladek > Cc: Josh Poimboeuf > Cc: Jessica Yu > Cc: Jiri Kosina > Cc: Miroslav Benes > Cc: Jason Baron > --- > kernel/livepatch/core.c | 42 ++++++++++++++++++++---------------------- > 1 file changed, 20 insertions(+), 22 deletions(-) > > diff --git a/kernel/livepatch/core.c b/kernel/livepatch/core.c > index 1d525f4a270a..ef7c3b5f561b 100644 > --- a/kernel/livepatch/core.c > +++ b/kernel/livepatch/core.c > @@ -654,16 +654,17 @@ static struct kobj_type klp_ktype_func = { > }; > > /* > - * Free all functions' kobjects in the array up to some limit. When limit is > - * NULL, all kobjects are freed. > + * Free all funcs that have the kobject initialized. Otherwise, > + * nothing is needed. s/needed/done/ ? I'd remove the second sentence in that case. > */ > -static void klp_free_funcs_limited(struct klp_object *obj, > - struct klp_func *limit) > +static void klp_free_funcs(struct klp_object *obj) > { > struct klp_func *func; > > - for (func = obj->funcs; func->old_name && func != limit; func++) > - kobject_put(&func->kobj); > + klp_for_each_func(obj, func) { > + if (func->kobj.state_initialized) > + kobject_put(&func->kobj); > + } > } > > /* Clean up when a patched object is unloaded */ > @@ -678,23 +679,25 @@ static void klp_free_object_loaded(struct klp_object *obj) > } > > /* > - * Free all objects' kobjects in the array up to some limit. When limit is > - * NULL, all kobjects are freed. > + * Free all funcs and objects that have the kobject initialized. > + * Otherwise, nothing is needed. Same here. > */ > -static void klp_free_objects_limited(struct klp_patch *patch, > - struct klp_object *limit) > +static void klp_free_objects(struct klp_patch *patch) > { > struct klp_object *obj; > > - for (obj = patch->objs; obj->funcs && obj != limit; obj++) { > - klp_free_funcs_limited(obj, NULL); > - kobject_put(&obj->kobj); > + klp_for_each_object(patch, obj) { > + klp_free_funcs(obj); > + > + if (obj->kobj.state_initialized) > + kobject_put(&obj->kobj); > } > } > > static void klp_free_patch(struct klp_patch *patch) > { > - klp_free_objects_limited(patch, NULL); > + klp_free_objects(patch); > + > if (!list_empty(&patch->list)) > list_del(&patch->list); > } > @@ -791,21 +794,16 @@ static int klp_init_object(struct klp_patch *patch, struct klp_object *obj) > klp_for_each_func(obj, func) { > ret = klp_init_func(obj, func); > if (ret) > - goto free; > + return ret; > } > > if (klp_is_object_loaded(obj)) { > ret = klp_init_object_loaded(patch, obj); > if (ret) > - goto free; > + return ret; > } > > return 0; > - > -free: > - klp_free_funcs_limited(obj, func); > - kobject_put(&obj->kobj); > - return ret; > } I'm slightly worried about not keeping the error handling here but offloading it to the caller, because we may forget to update it one day. But yes, it keeps things simple and I can live with that. > static int klp_init_patch(struct klp_patch *patch) > @@ -842,7 +840,7 @@ static int klp_init_patch(struct klp_patch *patch) > return 0; > > free: > - klp_free_objects_limited(patch, obj); > + klp_free_objects(patch); > > mutex_unlock(&klp_mutex); With those nits fixed Acked-by: Miroslav Benes Miroslav