Received: by 10.213.65.68 with SMTP id h4csp630188imn; Tue, 13 Mar 2018 15:41:32 -0700 (PDT) X-Google-Smtp-Source: AG47ELvm2kaN7dXIeTnYo9x1F/NqoDYehv55PwjJc4qJNIPy/lmz/KuXxcOVnN74kKgx3B71P8hZ X-Received: by 10.99.164.81 with SMTP id c17mr1821197pgp.114.1520980892789; Tue, 13 Mar 2018 15:41:32 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1520980892; cv=none; d=google.com; s=arc-20160816; b=EjWPTUdBXfBoBidvQrWiuRV52coHvPNu2/AQM7SqB+s0InGeexaJNbpKsOC4exjBBW SMTI7AJ14SUALn81bKm2ttZ3GOnhGEsKiUz15nBSDGgK5NMsr3O/sFxIuwKzE97HoVWX rZbIef07e1JHbjmkPZNDgNecFnCbvCg+OsmZvzeStmKuT6zJX9wvF4D6OFWM48SNUHwC yl4/FN+O4RqBLfF5ZTkskNYsKDpdGNNqyGXqOpY8XYWeXxalCnhCjqwAKCPuJoxO1kO9 0C8R/q1KVrAytgxkVMiGmEBvUya+gBp3rlyfJ4F8/xLk65hsFYYygM0k/J5OqZvfrMRV dXFQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:user-agent:in-reply-to :content-disposition:mime-version:references:message-id:subject:cc :to:from:date:arc-authentication-results; bh=amSXGO4hARThpBsg1F5yGhTyT5oWtX2pVkYJjGXNIdE=; b=NaSTgto2UXkWkgHEMb6ZSMMcOi7l6mBK2JaaVnroXOUHqSAczaQ8d1FH1oCa/lIyVb q7dKwrWLfg1q1KW64gyJd3lOsNCsWmKImCWfov1qIXEZ8EzD8Qv8RRsk8PO0D5gEJhq0 aHqa24td6+pMpEd0BIuVH4dJV2KmCh2F/Z+t3x8Kf0NWxu5whGNP9FVXajBapYBa0abu ZKja1wwo+MR8ri+IkF9IYPNKb0eIsdHyYpPh8XCtGxoNA/0b9GLjVQUBlpWZc2sxQ4A/ K4jjps4sYf79hAaKnLMug2LsuLNVkYmAReU8uzWLz8iPGET0/BUAXSSUHNaxPcMoECgj 4p1w== 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; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=redhat.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id q16si897468pfg.221.2018.03.13.15.41.17; Tue, 13 Mar 2018 15:41:32 -0700 (PDT) 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; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=redhat.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753166AbeCMWjB (ORCPT + 99 others); Tue, 13 Mar 2018 18:39:01 -0400 Received: from mx3-rdu2.redhat.com ([66.187.233.73]:50504 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1752650AbeCMWi7 (ORCPT ); Tue, 13 Mar 2018 18:38:59 -0400 Received: from smtp.corp.redhat.com (int-mx04.intmail.prod.int.rdu2.redhat.com [10.11.54.4]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 5461E8424C; Tue, 13 Mar 2018 22:38:59 +0000 (UTC) Received: from treble (ovpn-122-218.rdu2.redhat.com [10.10.122.218]) by smtp.corp.redhat.com (Postfix) with SMTP id D6A252026DFD; Tue, 13 Mar 2018 22:38:58 +0000 (UTC) Date: Tue, 13 Mar 2018 17:38:58 -0500 From: Josh Poimboeuf To: Petr Mladek Cc: Jiri Kosina , Miroslav Benes , Jason Baron , Joe Lawrence , Jessica Yu , Evgenii Shatokhin , live-patching@vger.kernel.org, linux-kernel@vger.kernel.org Subject: Re: [PATCH v10 02/10] livepatch: Free only structures with initialized kobject Message-ID: <20180313223858.p32bicvp4ohj5mk6@treble> References: <20180307082039.10196-1-pmladek@suse.com> <20180307082039.10196-3-pmladek@suse.com> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline In-Reply-To: <20180307082039.10196-3-pmladek@suse.com> User-Agent: Mutt/1.6.0.1 (2016-04-01) X-Scanned-By: MIMEDefang 2.78 on 10.11.54.4 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.11.55.2]); Tue, 13 Mar 2018 22:38:59 +0000 (UTC) X-Greylist: inspected by milter-greylist-4.5.16 (mx1.redhat.com [10.11.55.2]); Tue, 13 Mar 2018 22:38:59 +0000 (UTC) for IP:'10.11.54.4' DOMAIN:'int-mx04.intmail.prod.int.rdu2.redhat.com' HELO:'smtp.corp.redhat.com' FROM:'jpoimboe@redhat.com' RCPT:'' Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Wed, Mar 07, 2018 at 09:20:31AM +0100, 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 no longer patched. > > 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: Jason Baron > Acked-by: Miroslav Benes > --- > kernel/livepatch/core.c | 44 ++++++++++++++++++-------------------------- > 1 file changed, 18 insertions(+), 26 deletions(-) > > diff --git a/kernel/livepatch/core.c b/kernel/livepatch/core.c > index 1d525f4a270a..69bde95e76f8 100644 > --- a/kernel/livepatch/core.c > +++ b/kernel/livepatch/core.c > @@ -653,17 +653,15 @@ static struct kobj_type klp_ktype_func = { > .sysfs_ops = &kobj_sysfs_ops, > }; > > -/* > - * Free all functions' kobjects in the array up to some limit. When limit is > - * NULL, all kobjects are freed. > - */ > -static void klp_free_funcs_limited(struct klp_object *obj, > - struct klp_func *limit) > +/* Free all funcs that have the kobject initialized. */ > +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); > + } > } Now that this function only has a single caller, personally I think it would become more readable if klp_free_funcs() were inlined into its caller (klp_free_objects()). At the very least it should be moved to be right above it. > > /* Clean up when a patched object is unloaded */ > @@ -677,24 +675,23 @@ static void klp_free_object_loaded(struct klp_object *obj) > func->old_addr = 0; > } > > -/* > - * Free all objects' kobjects in the array up to some limit. When limit is > - * NULL, all kobjects are freed. > - */ > -static void klp_free_objects_limited(struct klp_patch *patch, > - struct klp_object *limit) > +/* Free all funcs and objects that have the kobject initialized. */ > +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 +788,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; > } > > static int klp_init_patch(struct klp_patch *patch) > @@ -842,7 +834,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); > > -- > 2.13.6 > -- Josh