Received: by 2002:ac0:a5a6:0:0:0:0:0 with SMTP id m35-v6csp7177965imm; Tue, 28 Aug 2018 07:38:30 -0700 (PDT) X-Google-Smtp-Source: ANB0VdaUzfGctHB3jltTr6Y42vgRqcm61TtrmB4WySIEpYAU+AbkcuSiORjig7l5y8n+9lRc5aHN X-Received: by 2002:a62:fcd2:: with SMTP id e201-v6mr1924098pfh.101.1535467109932; Tue, 28 Aug 2018 07:38:29 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1535467109; cv=none; d=google.com; s=arc-20160816; b=rImP1S2mOC6jbjx/R06TKpV1SBKnhuo+wpZloochjy2pIV9eWV/cSSTM7SJ56Yq0E3 SPXxVCYAj2OunfIStsgr5JS9EiN9wsyMDv7XsoZgVAOJDGptOaA9ZYr7HuEk62efd5Gx 7QWlSR+NEKnSm7gcr6m1B8FqoCaTxanLIshdEce/+71X5kTPVupJvV2pH3XLAohCFq97 V8K7qAb6crTfJg/A0njWWVB5lvx4U1uE4qli++rKdiaCjtlLxW50uVytenaCEGLsddnR AeJQLshnnNcSRhsv6FwZqWzCZih7334hs6jKJp/ODSCqkwsnDZ9gBfYHqtZ7WYJpztvG W1cA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:message-id:date:subject:cc:to:from :arc-authentication-results; bh=5A8zoa0F+Bv0IVsHuR9EK7Y7ugB5t74QS02vJaUY5u8=; b=zT6dBaWgq2gONJukB5XFFtMly30FF3DypeiyPzpoJJiZTSx25bUtBVchmHRFkp1xeO +RBSVQZJeV9rhFHqnzH0Ndvihbx3NJldLbdcr+oxKWLwrNeZxzOqQyzgbiDolAnvNaoQ AVYqbuNbeqYeuRLc8J6BwP/1AzCb2NxjbRbHaiqm1KeGZmdIoTwe7eX17UdkAOqTnXXz hz5RFip87hvCeu2Fwi6ppuE/GN6B0YJ92iuCQg0OoZcRcEezBVzW5LiRGATiwY/lJMGG DDP937Dr8C6JRYG4xNAv4r/x9y84o6CPDJ3FT40/ysdhK+2Sa/Yi5sBx9r2brb9zL5n4 7LqA== 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 b31-v6si1011576pgl.437.2018.08.28.07.38.14; Tue, 28 Aug 2018 07:38:29 -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 S1728228AbeH1S20 (ORCPT + 99 others); Tue, 28 Aug 2018 14:28:26 -0400 Received: from mx2.suse.de ([195.135.220.15]:38794 "EHLO mx1.suse.de" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1726120AbeH1S20 (ORCPT ); Tue, 28 Aug 2018 14:28:26 -0400 X-Virus-Scanned: by amavisd-new at test-mx.suse.de Received: from relay1.suse.de (unknown [195.135.220.254]) by mx1.suse.de (Postfix) with ESMTP id 4EB31AEA7; Tue, 28 Aug 2018 14:36:26 +0000 (UTC) From: Petr Mladek To: Jiri Kosina , Josh Poimboeuf , Miroslav Benes Cc: Jason Baron , Joe Lawrence , Jessica Yu , Evgenii Shatokhin , live-patching@vger.kernel.org, linux-kernel@vger.kernel.org, Petr Mladek Subject: [PATCH v12 00/12] Date: Tue, 28 Aug 2018 16:35:51 +0200 Message-Id: <20180828143603.4442-1-pmladek@suse.com> X-Mailer: git-send-email 2.13.7 Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org livepatch: Atomic replace feature The atomic replace allows to create cumulative patches. They are useful when you maintain many livepatches and want to remove one that is lower on the stack. In addition it is very useful when more patches touch the same function and there are dependencies between them. This version does another big refactoring based on feedback against v11[*]. In particular, it removes the registration step, changes the API and handling of livepatch dependencies. The aim is to keep the number of possible variants on a sane level. It helps the keep the feature "easy" to use and maintain. [*] https://lkml.kernel.org/r/20180323120028.31451-1-pmladek@suse.com Changes against v11: + Functional changes: + Livepatches get automatically unregistered when disabled. Note that the sysfs interface disappears at this point. It simplifies the API and code. The only drawback is that the patch can be enabled again only by reloading the module. + Refuse to load conflicting patches. The same function can be patched again only by a new cumulative patch that replaces all older ones. + Non-conflicting patches can be loaded and disabled in any order. + API related changes: + Change void *new_func -> unsigned long new_addr in struct klp_func. + Several new macros to hide implementation details and avoid casting when defining struct klp-func and klp_object. + Remove obsolete klp_register_patch() klp_unregister_patch() API + Change in selftest against v4: + Use new macros to define struct klp_func and klp_object. + Remove klp_register_patch()/klp_unregister_patch() calls. + Replace load_mod() + wait_for_transition() with three variants load_mod(), load_lp(), load_lp_nowait(). IMHO, it is easier to use because we need to detect the end of transaction another way after disable_lp() now. + Replaced unload_mod() with two variants unload_mod(), unload_lp() to match the above change. + Wait for the end of transition in disable_lp() instead of the unreliable check of the sysfs interface. Note that I did not touch the logs with expected result. They stay exactly the same as in v4 posted by Joe. I hope that it is a good sign ;-) Changes against v10: + Bug fixes and functional changes: + Handle Nops in klp_ftrace_handled() to avoid infinite loop [Mirek] + Really add dynamically allocated klp_object into the list [Petr] + Clear patch->replace when transition finishes [Josh] + Refactoring and clean up [Josh]: + Replace enum types with bools + Avoid using ERR_PTR + Remove too paranoid warnings + Distinguish registered patches by a flag instead of a list + Squash some functions + Update comments, documentation, and commit messages + Squashed and split patches to do more controversial changes later Changes against v9: + Fixed check of valid NOPs for already loaded objects, regression introduced in v9 [Joe, Mirek] + Allow to replace even disabled patches [Evgenii] Changes against v8: + Fixed handling of statically defined struct klp_object with empty array of functions [Joe, Mirek] + Removed redundant func->new_func assignment for NOPs [Mirek] + Improved some wording [Mirek] Changes against v7: + Fixed handling of NOPs for not-yet-loaded modules + Made klp_replaced_patches list static [Mirek] + Made klp_free_object() public later [Mirek] + Fixed several reported typos [Mirek, Joe] + Updated documentation according to the feedback [Joe] + Added some Acks [Mirek] Changes against v6: + used list_move when disabling replaced patches [Jason] + renamed KLP_FUNC_ORIGINAL -> KLP_FUNC_STATIC [Mirek] + used klp_is_func_type() in klp_unpatch_object() [Mirek] + moved static definition of klp_get_or_add_object() [Mirek] + updated comment about synchronization in forced mode [Mirek] + added user documentation + fixed several typos Jason Baron (2): livepatch: Use lists to manage patches, objects and functions livepatch: Add atomic replace Joe Lawrence (1): selftests/livepatch: introduce tests Petr Mladek (9): livepatch: Change void *new_func -> unsigned long new_addr in struct klp_func livepatch: Helper macros to define livepatch structures livepatch: Shuffle klp_enable_patch()/klp_disable_patch() code livepatch: Consolidate klp_free functions livepatch: Refuse to unload only livepatches available during a forced transition livepatch: Simplify API by removing registration step livepatch: Remove Nop structures when unused livepatch: Atomic replace and cumulative patches documentation livepatch: Remove ordering and refuse loading conflicting patches Documentation/livepatch/callbacks.txt | 489 +----------- Documentation/livepatch/cumulative-patches.txt | 105 +++ Documentation/livepatch/livepatch.txt | 131 ++-- MAINTAINERS | 1 + include/linux/livepatch.h | 84 ++- kernel/livepatch/core.c | 833 ++++++++++++++------- kernel/livepatch/core.h | 4 + kernel/livepatch/patch.c | 41 +- kernel/livepatch/patch.h | 1 + kernel/livepatch/transition.c | 26 +- lib/Kconfig.debug | 21 + lib/Makefile | 2 + lib/livepatch/Makefile | 15 + lib/livepatch/test_klp_atomic_replace.c | 53 ++ lib/livepatch/test_klp_callbacks_busy.c | 43 ++ lib/livepatch/test_klp_callbacks_demo.c | 109 +++ lib/livepatch/test_klp_callbacks_demo2.c | 89 +++ lib/livepatch/test_klp_callbacks_mod.c | 24 + lib/livepatch/test_klp_livepatch.c | 47 ++ lib/livepatch/test_klp_shadow_vars.c | 236 ++++++ samples/livepatch/livepatch-callbacks-demo.c | 68 +- samples/livepatch/livepatch-sample.c | 26 +- samples/livepatch/livepatch-shadow-fix1.c | 34 +- samples/livepatch/livepatch-shadow-fix2.c | 34 +- tools/testing/selftests/Makefile | 1 + tools/testing/selftests/livepatch/Makefile | 8 + tools/testing/selftests/livepatch/README | 43 ++ tools/testing/selftests/livepatch/config | 1 + tools/testing/selftests/livepatch/functions.sh | 203 +++++ .../testing/selftests/livepatch/test-callbacks.sh | 587 +++++++++++++++ .../testing/selftests/livepatch/test-livepatch.sh | 168 +++++ .../selftests/livepatch/test-shadow-vars.sh | 60 ++ 32 files changed, 2603 insertions(+), 984 deletions(-) create mode 100644 Documentation/livepatch/cumulative-patches.txt create mode 100644 lib/livepatch/Makefile create mode 100644 lib/livepatch/test_klp_atomic_replace.c create mode 100644 lib/livepatch/test_klp_callbacks_busy.c create mode 100644 lib/livepatch/test_klp_callbacks_demo.c create mode 100644 lib/livepatch/test_klp_callbacks_demo2.c create mode 100644 lib/livepatch/test_klp_callbacks_mod.c create mode 100644 lib/livepatch/test_klp_livepatch.c create mode 100644 lib/livepatch/test_klp_shadow_vars.c create mode 100644 tools/testing/selftests/livepatch/Makefile create mode 100644 tools/testing/selftests/livepatch/README create mode 100644 tools/testing/selftests/livepatch/config create mode 100644 tools/testing/selftests/livepatch/functions.sh create mode 100755 tools/testing/selftests/livepatch/test-callbacks.sh create mode 100755 tools/testing/selftests/livepatch/test-livepatch.sh create mode 100755 tools/testing/selftests/livepatch/test-shadow-vars.sh -- 2.13.7