Received: by 10.223.176.5 with SMTP id f5csp898072wra; Tue, 6 Feb 2018 09:09:01 -0800 (PST) X-Google-Smtp-Source: AH8x224eNl1hejgLmH2nWOaFqkYZZlYvvQDwf8SZ1hH7nTD/l4LooRLkcU/103nd+FZx37144DZg X-Received: by 10.98.200.133 with SMTP id i5mr3036312pfk.241.1517936940909; Tue, 06 Feb 2018 09:09:00 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1517936940; cv=none; d=google.com; s=arc-20160816; b=uQG/e5Vgg5mljfBEEX+OmzZNOd0fwiQFjbDgKq5S82W3Je30soWCSQN5o+ovF/R6aV VGoavyxPeH4OIhspIM3K0W6vADvJheM4bU6T9j2wdGNgqKzRHDm5y1Z5OXXxVw1E+9EN sTPrAhfPtaGj7ViO/siJNBOK5668jvkGZ2TuIVJUdmJcNhxgSR4qCKSISIFHBjpH9dij g4g7X+dqcux8/nm+28MksPRCCm14RKhyGMk5uCHmwj2Bejhblc0BdbVdaC/BvW4OdzpA niMdW4ziwpvKSEAtJjZZOcvYmkopAWfnpv//Ar5w6z1Tn0AK+/7lbiFweFGtTFlkXtw5 8zrA== 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=/5aJLCw0fiHQ8NF5TVwVx/6CxyaBcWbczqfVlDfWPfU=; b=VK6cPuHkBBHpFUav1C0HqFdwaqVfIF/mTMc7UaY70uPW/3gSV2bFSY0Ov3WTHAe7Lb Qadq9uajoGZacj9Ce9lY+lE+fmJhnzqTxTw7w02Q92/9gFz1LRRK41ctdqiD+KqN/mvt 2+/M/NkQpeuv0jtD3UpTGD0wH8LbgTqOxIxMDHtnN5vBIrOZimhmlhlO6pyg7/g1h9F+ Iltpr0pl9eh7kruyJHpqbYiZso8j/7LLN3ry827NSrF/MFfFvH+mBHxusJr3/TRNAW11 ztBk+3vSZk08kSduQJqs3y3za128G/5wUPv3MRdnWey/oAvw8186OpLdzLnawHe2P3o4 K0kA== 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 w16si848245pge.666.2018.02.06.09.08.45; Tue, 06 Feb 2018 09:09:00 -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; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=redhat.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752687AbeBFRIN (ORCPT + 99 others); Tue, 6 Feb 2018 12:08:13 -0500 Received: from mx1.redhat.com ([209.132.183.28]:49576 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752838AbeBFRHq (ORCPT ); Tue, 6 Feb 2018 12:07:46 -0500 Received: from smtp.corp.redhat.com (int-mx05.intmail.prod.int.phx2.redhat.com [10.5.11.15]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id A7214C04513A; Tue, 6 Feb 2018 17:07:45 +0000 (UTC) Received: from redhat.com (dhcp-17-208.bos.redhat.com [10.18.17.208]) by smtp.corp.redhat.com (Postfix) with ESMTPS id C891E5EDE6; Tue, 6 Feb 2018 17:07:42 +0000 (UTC) Date: Tue, 6 Feb 2018 12:07:42 -0500 From: Joe Lawrence To: Petr Mladek Cc: Jiri Kosina , Josh Poimboeuf , Miroslav Benes , Jason Baron , Jessica Yu , Evgenii Shatokhin , live-patching@vger.kernel.org, linux-kernel@vger.kernel.org Subject: Re: [PATCH v7 7/7] livepatch: Atomic replace and cumulative patches documentation Message-ID: <20180206170742.ldamdwztn2bs2t25@redhat.com> References: <20180206103424.10829-1-pmladek@suse.com> <20180206103424.10829-8-pmladek@suse.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20180206103424.10829-8-pmladek@suse.com> User-Agent: Mutt/1.6.2-neo (2016-08-08) X-Scanned-By: MIMEDefang 2.79 on 10.5.11.15 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.32]); Tue, 06 Feb 2018 17:07:45 +0000 (UTC) Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Tue, Feb 06, 2018 at 11:34:24AM +0100, Petr Mladek wrote: > User documentation for the atomic replace feature. It makes it easier > to maintain livepatches using so-called cumulative patches. Thanks for adding this doc. A few minor wording suggestions and typos below... > > Signed-off-by: Petr Mladek > --- > Documentation/livepatch/cumulative-patches.txt | 76 ++++++++++++++++++++++++++ > 1 file changed, 76 insertions(+) > create mode 100644 Documentation/livepatch/cumulative-patches.txt > > diff --git a/Documentation/livepatch/cumulative-patches.txt b/Documentation/livepatch/cumulative-patches.txt > new file mode 100644 > index 000000000000..5f1f3760b840 > --- /dev/null > +++ b/Documentation/livepatch/cumulative-patches.txt > @@ -0,0 +1,76 @@ > +=================================== > +Atomic Replace & Cumulative Patches > +=================================== > + > +There are dependencies between livepatches when more patches modify the same s/more/multiple > +function(s). Then any newer livepatch must include changes from the older ones. If the new patch wants to maintain the original change that is. (Perhaps that's implied here.) Also this might be a good place to formally introduce the "cumulative patch" as a recurring term. > +Also the patches must be registered in the right order. > + > +This might become a maintenance nightmare. Especially if anyone would want > +to remove a patch that is in the middle of the stack. > + > +An elegant solution comes with the feature called "Atomic Replace". It allows > +to create cumulative patches that completely replace all older livepatches. > + > + > +Usage > +----- > + > +The atomic replace can be enabled by setting "replace" flag in struct klp_patch, > +for example: > + > + static struct klp_patch patch = { > + .mod = THIS_MODULE, > + .objs = objs, > + .replace = true, > + }; > + > +Such a patch is added on top of the livepatch stack when registered. It might > +be enabled even when some earlier patches have not been enabled yet. "It can be enabled" reads a little more naturally I think. > + > +All processes are then migrated to use the code only from the new patch. > +Once the transition is finished, all older patches are removed from the stack > +of patches. Even the older not-enabled patches mentioned above. > + > +Ftrace handlers are transparently removed from functions that are not > +longer modified by the new cumulative patch. > + s/not longer/no longer > +As a result, the livepatch author might maintain sources only for one > +cumulative patch. It helps to keep the patch consistent while adding or > +removing various fixes or features. > + > + > +Limitations: > +------------ > + > + + Replaced patches can not longer be enabled. But if the transition s/not longer/no longer and "the transition" refers to the older patch transition, right? (Not the cumulative patching transition.) > + was not forced, the older patches might be unregistered, removed > + and eventually used again. > + > + > + + Only the (un)patching callbacks from the _new_ cumulative livepatch are > + proceed. Any callbacks from the replaced patches are ignored. s/proceed/executed > + > + By other words, the cumulative patch is responsible for doing any actions > + that are necessary to properly replace any older patch. > + > + As a result, it might be dangerous to replace newer cumulative patches by > + older ones. The old livepatches might not provide the necessary callbacks. > + > + This might be seen as a limitation in some scenarios. But it makes the life > + easier in many others. Only the new cumulative livepatch knows what > + fixes/features are added/removed and what special actions are necessary > + for a smooth transition. > + > + In each case, it would be a nightmare to think about the order of > + the various callbacks and their interactions if the callbacks from all > + enabled patches were called. I wonder if this deserves comment or an example in the callbacks document, even if its a simple, contrived callback. (I'll think on this.) > + > + > + + There is no special handling of shadow variables. Livepatch authors > + must create their own rules how to pass them from one cumulative > + patch to the other. Especially they should not blindly remove them > + in module_exit() functions. > + > + A good practice might be to remove shadow variables in the post-unpatch > + callback. It is called only when the livepatch is properly disabled. Same here. -- Joe