Received: by 10.192.165.156 with SMTP id m28csp338753imm; Tue, 17 Apr 2018 10:59:57 -0700 (PDT) X-Google-Smtp-Source: AIpwx48luf5Cv/Suu0LUGxjPmCNWHmQcfySojDR/Pfm4uGD6/GYebiEnWBey5JYZZzO6MCapoYFb X-Received: by 10.99.181.89 with SMTP id u25mr2494127pgo.302.1523987997244; Tue, 17 Apr 2018 10:59:57 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1523987997; cv=none; d=google.com; s=arc-20160816; b=T0yLF4zE7Vg8RqBchMROa9on9xTGGW33mQl7YMWQj8Zfrctsj3fUDuZjWM/8Tji+7D rWF/f8cUhcdIvL/b4AJw+7momXxbj3lgox/DWvysALkO4mpJexIfONGSvYEBveCtCK56 +ZDc4w+p1an19OLHi9JnpomWWJoCGbzOK56tpgxIM6q1aNXOsD8nXvEjNTIP8wqqNGvl F81jnCdUjTvBKdDpNeN6pDv5HI742M0qOjs7uumpNdcRTpRiIM7UfgymaEX9to8Szplz 1CQ4keYP/z/WVV+HlnjQvfxh07Sir83NkQUqST4RRTzMO3BngLo5cf71Ox/9IypiunVH NgJw== 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=KOoei1VGxcPbdAKaUzuNqoVShnApV1kWjp+Xyjd20/4=; b=n0fXdSHUenP6kx+OWEFqOjEZag4xaQDfiZtZhM9RkpOiC6ul24l6mvM11Q6Xfqul+l eWZo3hJ83gREdK8kka1KJkJrDU0rUfUwVejkbNwF3Q4qfjMS/kKq4y51khaZiJju+e0p 5iaeAbBKg0rt6vafe62JZNg/5gFNvbJpyUaB1+JhejY+UrqOCOKJWvtZdQnZcHnrhIrX mMQv+AKqLS8m+zGJ/Btg+bN9Wp/ZtgcDmfnpMizKLL+BHe1JbgUHMtGkdMxIWSBo+rRB Tf9FO7M7LWs2hW7iaDohjGYhRDUEweszZPN2BphxCFzJXxYGzSLn0gM4iU4fMsYQN0QN K75w== 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 i7si11632455pgq.583.2018.04.17.10.59.42; Tue, 17 Apr 2018 10:59:57 -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 S1752690AbeDQR6L (ORCPT + 99 others); Tue, 17 Apr 2018 13:58:11 -0400 Received: from mx3-rdu2.redhat.com ([66.187.233.73]:38632 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1751211AbeDQR56 (ORCPT ); Tue, 17 Apr 2018 13:57:58 -0400 Received: from smtp.corp.redhat.com (int-mx05.intmail.prod.int.rdu2.redhat.com [10.11.54.5]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 557154023335; Tue, 17 Apr 2018 17:57:58 +0000 (UTC) Received: from treble (ovpn-121-36.rdu2.redhat.com [10.10.121.36]) by smtp.corp.redhat.com (Postfix) with SMTP id 5C02E7C37; Tue, 17 Apr 2018 17:57:55 +0000 (UTC) Date: Tue, 17 Apr 2018 12:57:55 -0500 From: Josh Poimboeuf To: Petr Mladek Cc: Miroslav Benes , Jiri Kosina , Jason Baron , Joe Lawrence , Jessica Yu , Evgenii Shatokhin , live-patching@vger.kernel.org, linux-kernel@vger.kernel.org Subject: Re: [PATCH v10 05/10] livepatch: Support separate list for replaced patches. Message-ID: <20180417175755.tlhb7iza2rgu4nyo@treble> References: <20180406195049.dtfebzfdkbvv6yex@treble> <20180410083455.l26dgo5kx4cy7bc7@pathway.suse.cz> <20180410174206.l3uk6lchhzxvn75x@treble> <20180411123214.mfpkbrirze32phrb@treble> <20180411141711.cwceg7o5ttjgebii@pathway.suse.cz> <20180411154852.3yjab3ot76qicw6m@treble> <20180416145811.x4lvtm5kxyigbp56@pathway.suse.cz> <20180416190425.tk7nnbqbmaxeniud@treble> <20180417153746.fkgcruyxvmyrbynt@pathway.suse.cz> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline In-Reply-To: <20180417153746.fkgcruyxvmyrbynt@pathway.suse.cz> User-Agent: Mutt/1.6.0.1 (2016-04-01) X-Scanned-By: MIMEDefang 2.79 on 10.11.54.5 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.11.55.6]); Tue, 17 Apr 2018 17:57:58 +0000 (UTC) X-Greylist: inspected by milter-greylist-4.5.16 (mx1.redhat.com [10.11.55.6]); Tue, 17 Apr 2018 17:57:58 +0000 (UTC) for IP:'10.11.54.5' DOMAIN:'int-mx05.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 Tue, Apr 17, 2018 at 05:37:46PM +0200, Petr Mladek wrote: > On Mon 2018-04-16 14:04:25, Josh Poimboeuf wrote: > > On Mon, Apr 16, 2018 at 04:58:11PM +0200, Petr Mladek wrote: > > > On Wed 2018-04-11 10:48:52, Josh Poimboeuf wrote: > > > > On Wed, Apr 11, 2018 at 04:17:11PM +0200, Petr Mladek wrote: > > > > > Second, unrelated patches must never patch the same functions. > > > > > Otherwise we would not be able to define which implementation > > > > > should be used. This is especially important when a patch is > > > > > removed and we need to fallback either to another patch or > > > > > original code. Yes, it makes perfect sense. But it needs code > > > > > that will check it, refuse loading the patch, ... It is not > > > > > complicated. But it is rather additional code than > > > > > simplification. I might make livepatching more safe > > > > > but probably not simplify the code. > > > > > > > > We don't need to enforce that. The func stack can stay. If somebody > > > > wants to patch the same function multiple times (without using > > > > 'replace'), that's inadvisable, but it's also their business. They're > > > > responsible for the tooling to ensure the patch stack order is sane. > > > > > > > > > While it might make sense to ignore the patch stack (ordering) for > > > the enable operation. Do we really want to ignore it when disabling > > > a patch. > > > > > > By other words, do we want to allow disabling a patch that is in > > > the middle of the stack, only partly in use? Does not this allow > > > some other crazy scenarios? Is it really the user business? > > > Will it make our life easier? > > > > If there's no longer a patch stack, then there's no concept of a middle. > > We would expect the patches to be independent of one another, and so > > disabling any of them independently would be harmless. > > > > If any of the patches share a func, and the user disables one in the > > "middle", it's not our job to support that. The vendor / patch author > > should prevent such cases from occurring with tooling, packaging, > > documentation, etc. Or they can just use 'replace'. > > > > We can already have similar unexpected situations today. For example, > > what if patch B is a cumulative superset of patch A, but the user > > mistakenly loads patch A (without replace) *after* loading patch B? > > Then some unforeseen craziness could ensue. > > > > We can't control all such scenarios (and that's ok), but we shouldn't > > pretend that we support them. > > I recall some earlier discussion. The aim was to make livepatching > more safe. AFAIK, it was more related to the helper tooling around, > like "automatic" generation of the special relocation entries, ... > Anyway, I feel that the above gets somehow against it. > > The patch stack does not solve everything. But it makes it harder > to do wrong things. It also makes it harder to do _right_ things. For example, disabling a patch in the "middle" should be allowable if there are no patch dependencies. > > > This will not happen if we refuse to load non-replace patches > > > that touch an already patches fucntion. Then the patch stack > > > might become only implementation detail. It will not define > > > the ordering any longer. > > > > I think this would only be a partial solution. Patches can have > > implicit interdependencies, even if they don't patch the same function. > > Also it doesn't solve the problem when patches are loaded in the wrong > > order. We have to trust vendors and admins to do the right thing. > > I would still like to add this check if we remove the stack. > Is it too restrictive? Maybe. But it would help to prevent > creating some ugly mistakes. By other words, we will force > people using proper cumulative patches instead of > dangerous semi-cumulative Frankenstains. > > At least, it would reduce the number of scenarios that > we might meet and eventually need to debug. But the non-replace cumulative model can be perfectly safe, if the packaging/tooling supports the right workflow. I think we're talking about theoretical situations anyway. I'd rather not add any code for theoretical problems. If somebody reports a bug due to dangerous real world usage, then we can decide how to handle it at that point -- though I suspect my response will be "don't do that!" > > > > > > > > > Another possibility would be to get rid of the enable/disable states. > > > > > > > > > I mean that the patch will be automatically enabled during > > > > > > > > > registration and removed during unregistration. > > > > > > OK. What about the following solution? > > > > > > + Enable patch directly from klp_register_patch() > > > + Unregister the patch directly from klp_complete_transition() > > > when the patch is disabled. > > > + Put the module later when all sysfs entries are removed > > > in klp_unregister_patch(). > > > > > > As a result: > > > > > > + module_init() will need to call only klp_register_patch() > > > + module_exit() will do nothing > > > + the module can be removed only when it is not longer needed > > > > Sounds good to me. > > It should be consistent with sysfs interface, see below. > > > > > Some other ideas: > > > > > > + rename /sys/kernel/livepatch//enable -> unregister > > > allow to write into /sys/kernel/livepatch//transition > > > > > > + echo 1 >unregistrer to disable&unregister the patch > > > + echo 0 >transition to revert the running transition > > > > Why not keep the existing sysfs interfaces? So > > > > echo 0 > enable > > > > would disable (and eventually unregister) the patch. > > First, it would be a bit inconsistent. The patch would be added by calling > "register" function and removed by writing into "enabled" file. True. Although from the end user (and tooling) standpoint, it looks the same as before, since the register/unregister and enable are done automatically by the patch module. The only user-visible difference is that the sysfs directory disappears and the patch module can't be re-enabled. > Second, if we remove sysfs entries for disabled patches, it would > make the meaning of "enabled" file a bit useless. I mean that > the patch will always be enabled when the sysfs directory exists > (when ignoring transition states). Though as you mentioned, it does still indicate which direction the transition is going. > BTW: I have just today got a feedback that the user interface is not > ideal. In particular, it is not easy to detect what process is blocking > the transition. It is because the target value in > /proc//patch_state depends on the value in > /sys/kernel/livepatch//enable (direction of the transition). But hopefully tooling can hide the intricacies of the interface. > Anyway, the first problem might be solved by doing patch registration > at the beginning of klp_enable_patch(). Then it will match the > "enabled" sysfs file. > > I would actually feel more comfortable if we do not change the > sysfs interface. > > Well, any better idea for a simplified interface is appreciated. We can just keep the current interface, which I think will make tooling happy since it will function basically the same as before. > > > The question is what to do with the stack of patches. It will have > > > no meaning for the enable operation because it will be done > > > automatically. But what about the disable/unregistrer operation? > > > > Assuming we got rid of the patch stack, would we even need to keep a > > global list of patches anymore? > > As Mirek said, a list still might be useful in some situations > (nops generation, conflicts check). But it would become an > implementation detail. The ordering would not be important > any longer. Ok. -- Josh