summaryrefslogtreecommitdiffstats
path: root/Documentation/livepatch
diff options
context:
space:
mode:
authorPetr Mladek <pmladek@suse.com>2019-01-09 07:43:28 -0500
committerJiri Kosina <jkosina@suse.cz>2019-01-11 14:51:24 -0500
commitd67a53720966f2ef5be5c8f238d13512b8260868 (patch)
treef42526876b6b2d822611345dc219d514d60ef448 /Documentation/livepatch
parentc4e6874f2a2965e932f4a5cf2631bc6024e55021 (diff)
livepatch: Remove ordering (stacking) of the livepatches
The atomic replace and cumulative patches were introduced as a more secure way to handle dependent patches. They simplify the logic: + Any new cumulative patch is supposed to take over shadow variables and changes made by callbacks from previous livepatches. + All replaced patches are discarded and the modules can be unloaded. As a result, there is only one scenario when a cumulative livepatch gets disabled. The different handling of "normal" and cumulative patches might cause confusion. It would make sense to keep only one mode. On the other hand, it would be rude to enforce using the cumulative livepatches even for trivial and independent (hot) fixes. However, the stack of patches is not really necessary any longer. The patch ordering was never clearly visible via the sysfs interface. Also the "normal" patches need a lot of caution anyway. Note that the list of enabled patches is still necessary but the ordering is not longer enforced. Otherwise, the code is ready to disable livepatches in an random order. Namely, klp_check_stack_func() always looks for the function from the livepatch that is being disabled. klp_func structures are just removed from the related func_stack. Finally, the ftrace handlers is removed only when the func_stack becomes empty. Signed-off-by: Petr Mladek <pmladek@suse.com> Acked-by: Miroslav Benes <mbenes@suse.cz> Acked-by: Josh Poimboeuf <jpoimboe@redhat.com> Signed-off-by: Jiri Kosina <jkosina@suse.cz>
Diffstat (limited to 'Documentation/livepatch')
-rw-r--r--Documentation/livepatch/cumulative-patches.txt11
-rw-r--r--Documentation/livepatch/livepatch.txt13
2 files changed, 11 insertions, 13 deletions
diff --git a/Documentation/livepatch/cumulative-patches.txt b/Documentation/livepatch/cumulative-patches.txt
index e7cf5be69f23..0012808e8d44 100644
--- a/Documentation/livepatch/cumulative-patches.txt
+++ b/Documentation/livepatch/cumulative-patches.txt
@@ -7,8 +7,8 @@ to do different changes to the same function(s) then we need to define
7an order in which the patches will be installed. And function implementations 7an order in which the patches will be installed. And function implementations
8from any newer livepatch must be done on top of the older ones. 8from any newer livepatch must be done on top of the older ones.
9 9
10This might become a maintenance nightmare. Especially if anyone would want 10This might become a maintenance nightmare. Especially when more patches
11to remove a patch that is in the middle of the stack. 11modified the same function in different ways.
12 12
13An elegant solution comes with the feature called "Atomic Replace". It allows 13An elegant solution comes with the feature called "Atomic Replace". It allows
14creation of so called "Cumulative Patches". They include all wanted changes 14creation of so called "Cumulative Patches". They include all wanted changes
@@ -26,11 +26,9 @@ for example:
26 .replace = true, 26 .replace = true,
27 }; 27 };
28 28
29Such a patch is added on top of the livepatch stack when enabled.
30
31All processes are then migrated to use the code only from the new patch. 29All processes are then migrated to use the code only from the new patch.
32Once the transition is finished, all older patches are automatically 30Once the transition is finished, all older patches are automatically
33disabled and removed from the stack of patches. 31disabled.
34 32
35Ftrace handlers are transparently removed from functions that are no 33Ftrace handlers are transparently removed from functions that are no
36longer modified by the new cumulative patch. 34longer modified by the new cumulative patch.
@@ -57,8 +55,7 @@ The atomic replace allows:
57 + Remove eventual performance impact caused by core redirection 55 + Remove eventual performance impact caused by core redirection
58 for functions that are no longer patched. 56 for functions that are no longer patched.
59 57
60 + Decrease user confusion about stacking order and what code 58 + Decrease user confusion about dependencies between livepatches.
61 is actually in use.
62 59
63 60
64Limitations: 61Limitations:
diff --git a/Documentation/livepatch/livepatch.txt b/Documentation/livepatch/livepatch.txt
index 6f32d6ea2fcb..71d7f286ec4d 100644
--- a/Documentation/livepatch/livepatch.txt
+++ b/Documentation/livepatch/livepatch.txt
@@ -143,9 +143,9 @@ without HAVE_RELIABLE_STACKTRACE are not considered fully supported by
143the kernel livepatching. 143the kernel livepatching.
144 144
145The /sys/kernel/livepatch/<patch>/transition file shows whether a patch 145The /sys/kernel/livepatch/<patch>/transition file shows whether a patch
146is in transition. Only a single patch (the topmost patch on the stack) 146is in transition. Only a single patch can be in transition at a given
147can be in transition at a given time. A patch can remain in transition 147time. A patch can remain in transition indefinitely, if any of the tasks
148indefinitely, if any of the tasks are stuck in the initial patch state. 148are stuck in the initial patch state.
149 149
150A transition can be reversed and effectively canceled by writing the 150A transition can be reversed and effectively canceled by writing the
151opposite value to the /sys/kernel/livepatch/<patch>/enabled file while 151opposite value to the /sys/kernel/livepatch/<patch>/enabled file while
@@ -351,6 +351,10 @@ to '0'.
351 The right implementation is selected by the ftrace handler, see 351 The right implementation is selected by the ftrace handler, see
352 the "Consistency model" section. 352 the "Consistency model" section.
353 353
354 That said, it is highly recommended to use cumulative livepatches
355 because they help keeping the consistency of all changes. In this case,
356 functions might be patched two times only during the transition period.
357
354 358
3555.3. Replacing 3595.3. Replacing
356-------------- 360--------------
@@ -389,9 +393,6 @@ becomes empty.
389 393
390Third, the sysfs interface is destroyed. 394Third, the sysfs interface is destroyed.
391 395
392Note that patches must be disabled in exactly the reverse order in which
393they were enabled. It makes the problem and the implementation much easier.
394
395 396
3965.5. Removing 3975.5. Removing
397------------- 398-------------