Received: by 10.213.65.68 with SMTP id h4csp3646680imn; Tue, 10 Apr 2018 02:17:35 -0700 (PDT) X-Google-Smtp-Source: AIpwx49iBezJrwqA94Xq4DEzJCdmAlaKN6RBk0r0scse1WJh0igIuSftAmvTWYs3nz8d7I7HHx33 X-Received: by 2002:a17:902:9349:: with SMTP id g9-v6mr41905761plp.243.1523351855398; Tue, 10 Apr 2018 02:17:35 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1523351855; cv=none; d=google.com; s=arc-20160816; b=Ntz7Cm1437Lxw5OqHawttnZYHbTtSIZEz0p5MZkbUffOPlb6MNtIKmMNEd3RYeUO+5 kzKQfVE7QgXlOCXDjLTR7Nm2vxyfR4uwNMRCvUHm8zdMKWHSyp34x8GD+NXVlDoqpKLy GQJvBu6b7EE1pZAT5Xko2fMsNXAXug9Q4qQr0MKL/hHCc3FGO4SnyGcYX0Xa8jh4Moee /Iu3X1y7G9dMUv8lQFMqq2PfwLZUjRG1gyVmsIKdk7czTUQa2OPOIraai+HWHyGch6v5 CiFe7tt6cKwjdovLLRI9FkE0l4Nwp4CvFtMTgxCMO/VDVnWiLvLE+T/L98LY84wSM6tG zeZw== 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=fYVrUm61p7MJKIKS5xnolfOGH3CDU16RQyfq+gkM6P0=; b=X8Wmk/G2wo+K9DLNNh8pC7KAjW3crZhPXmmdUmH4d6H+pMRwb4UuuGkbrY0G9s107x s7wnZcoQQLSSw5T5OjhzfWTWxlEFc6CwpgVnaNWqSMfpmzO/JfgSb5N+SMwEplrXAG5o /CH9texP8q7Zldx9k+tqcb15dhT/nGFywk+rME88bE3Jb7pUg7r66U/IokZwVPZMubrH lWpXyc/VUXeX1FsWT5WaRi3ZTldEuGDMmD3dWsUFRjJYbF1OkSmjkTJQxXtBrZaEG0u4 vXW9i8WYnzQkpBZZx27Whz6JzvqruebERnt2yHHStoipIu6p9QmQz6EOx+W6o8gWUb2J fT7w== 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 q10si1725100pff.124.2018.04.10.02.16.58; Tue, 10 Apr 2018 02:17:35 -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 Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752959AbeDJJOY (ORCPT + 99 others); Tue, 10 Apr 2018 05:14:24 -0400 Received: from mx2.suse.de ([195.135.220.15]:48456 "EHLO mx2.suse.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752426AbeDJJOX (ORCPT ); Tue, 10 Apr 2018 05:14:23 -0400 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 1396CAD21; Tue, 10 Apr 2018 09:14:22 +0000 (UTC) Date: Tue, 10 Apr 2018 11:14:21 +0200 (CEST) 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 6/8] livepatch: Remove Nop structures when unused In-Reply-To: <20180323120028.31451-7-pmladek@suse.com> Message-ID: References: <20180323120028.31451-1-pmladek@suse.com> <20180323120028.31451-7-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 Fri, 23 Mar 2018, Petr Mladek wrote: > Replaced patches are removed from the stack when the transition is > finished. It means that Nop structures will never be needed again > and can be removed. Why should we care? > > + Nop structures make false feeling that the function is patched > even though the ftrace handler has no effect. > > + Ftrace handlers are not completely for free. They cause slowdown that > might be visible in some workloads. The ftrace-related slowdown might > actually be the reason why the function is not longer patched in > the new cumulative patch. One would expect that cumulative patch > would allow to solve these problems as well. > > + Cumulative patches are supposed to replace any earlier version of > the patch. The amount of NOPs depends on which version was replaced. > This multiplies the amount of scenarios that might happen. > > One might say that NOPs are innocent. But there are even optimized > NOP instructions for different processor, for example, see > arch/x86/kernel/alternative.c. And klp_ftrace_handler() is much > more complicated. > > + It sounds natural to clean up a mess that is not longer needed. > It could only be worse if we do not do it. > > This patch allows to unpatch and free the dynamic structures independently > when the transition finishes. > > The free part is a bit tricky because kobject free callbacks are called > asynchronously. We could not wait for them easily. Fortunately, we do > not have to. Any further access can be avoided by removing them from > the dynamic lists. > > Finally, the patch become the first on the stack when enabled. The replace > functionality will not longer be needed. Let's clear patch->replace to > avoid the special handling when it is eventually disabled/enabled again. > > Signed-off-by: Petr Mladek > --- > include/linux/livepatch.h | 6 ++++++ > kernel/livepatch/core.c | 42 +++++++++++++++++++++++++++++++++++------- > kernel/livepatch/core.h | 1 + > kernel/livepatch/patch.c | 31 ++++++++++++++++++++++++++----- > kernel/livepatch/patch.h | 1 + > kernel/livepatch/transition.c | 26 +++++++++++++++++++++++++- > 6 files changed, 94 insertions(+), 13 deletions(-) > > diff --git a/include/linux/livepatch.h b/include/linux/livepatch.h > index d6e6d8176995..1635b30bb1ec 100644 > --- a/include/linux/livepatch.h > +++ b/include/linux/livepatch.h > @@ -172,6 +172,9 @@ struct klp_patch { > #define klp_for_each_object_static(patch, obj) \ > for (obj = patch->objs; obj->funcs || obj->name; obj++) > > +#define klp_for_each_object_safe(patch, obj, tmp_obj) \ > + list_for_each_entry_safe(obj, tmp_obj, &patch->obj_list, node) > + > #define klp_for_each_object(patch, obj) \ > list_for_each_entry(obj, &patch->obj_list, node) > > @@ -180,6 +183,9 @@ struct klp_patch { > func->old_name || func->new_func || func->old_sympos; \ > func++) > > +#define klp_for_each_func_safe(obj, func, tmp_func) \ > + list_for_each_entry_safe(func, tmp_func, &obj->func_list, node) > + > #define klp_for_each_func(obj, func) \ > list_for_each_entry(func, &obj->func_list, node) Is there a benefit of the newly added iterators? Miroslav