Received: by 10.223.176.46 with SMTP id f43csp2315396wra; Thu, 25 Jan 2018 08:04:27 -0800 (PST) X-Google-Smtp-Source: AH8x225zw1LWdBX+3MTpRgEz7UzL/AJBNE+zL+rH1cDdQZL7RK+o6hgviBRBakSySFBd3iFd6cI0 X-Received: by 2002:a17:902:3225:: with SMTP id y34-v6mr11564965plb.399.1516896267098; Thu, 25 Jan 2018 08:04:27 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1516896267; cv=none; d=google.com; s=arc-20160816; b=Hh+44TvdpXN1yY4bgwnHQhgaCsBqssgagUouAFeCzE/vHWIxxcskxixx+kIKLcDLLw hPhZl3nXobzkDgjyMiIwdIU/M2IK5wwKGTOkMn6lXC7Tf+qPloACQYlTbZQ9MxBPdsPZ EQSJIKvu6hBCN1NeUIQSyAA/1DFFcBzUVDAn3IqOtrxK6lhIezn50Ik4P8glBvk4lo79 fpVKEBw8LIJhSmFVr46ZTFhDVWY8wngJNAlUUNDhTk4iBB7wQdEFNemOyXPNRcDFDW7b +kAeMD5oQykGeijqxoCUyfy1/qB4af2t48AKmzfSqMKNK6GAJlE99ucaHBELoHdG1VVr h1kA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:references:in-reply-to:message-id:date :subject:cc:to:from:arc-authentication-results; bh=qodas23QY2ElAuE0BFRyLEe4jRPsxWMP94kgFi8Dmd0=; b=eUpMuOfcIb8vI9VON/JSt+ZL0VbCRBn4JSg7TWbeziE9W+Fxe7RLr1qH76JnIHwwa2 ljYmhuEyNKMgv9k327y7TNL4uZDgPrjeVHZSD7PvH/l90AvG3rLRk7nKEa5e/MQCin+0 1k2KAOOYFyJoJ5GMrW8LnUyn+mtswCGf3vndRY5ULxfKh1UaUqAvxGoW32viRjObR/7H vNfBiTGj2lWyMZsl+bEJHnj4wpiJQ3uONwbxvmnHllb6gLDPDkgz1a6df0aUWL7b9vq4 Kr9/TYQziX15gdDlfN7Ru0wi71qf2AFa1+TLnhumwqNRLd3LjzR+b8IB4toNsLMtMz9X NlZA== 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 g16-v6si1500585pli.823.2018.01.25.08.04.12; Thu, 25 Jan 2018 08:04:27 -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 S1751354AbeAYQCZ (ORCPT + 99 others); Thu, 25 Jan 2018 11:02:25 -0500 Received: from mx2.suse.de ([195.135.220.15]:59744 "EHLO mx2.suse.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751284AbeAYQCX (ORCPT ); Thu, 25 Jan 2018 11:02:23 -0500 X-Virus-Scanned: by amavisd-new at test-mx.suse.de Received: from relay2.suse.de (charybdis-ext.suse.de [195.135.220.254]) by mx2.suse.de (Postfix) with ESMTP id 2CD47AE1E; Thu, 25 Jan 2018 16:02:22 +0000 (UTC) From: Petr Mladek To: jpoimboe@redhat.com, jikos@kernel.org, mbenes@suse.cz Cc: Jason Baron , jeyu@kernel.org, Evgenii Shatokhin , linux-kernel@vger.kernel.org, live-patching@vger.kernel.org, Petr Mladek Subject: PATCH v6 2/6] livepatch: Free only structures with initialized kobject Date: Thu, 25 Jan 2018 17:01:59 +0100 Message-Id: <20180125160203.28959-3-pmladek@suse.com> X-Mailer: git-send-email 2.13.6 In-Reply-To: <20180125160203.28959-1-pmladek@suse.com> References: <20180125160203.28959-1-pmladek@suse.com> Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org 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. 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..05d60035525d 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. */ -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's that have the kobject initialized. + * Otherwise, nothing is needed. */ -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; } 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); -- 2.13.6