an order in which the patches will be installed. And function implementations
from any newer livepatch must be done on top of the older ones.
-This might become a maintenance nightmare. Especially if anyone would want
-to remove a patch that is in the middle of the stack.
+This might become a maintenance nightmare. Especially when more patches
+modified the same function in different ways.
An elegant solution comes with the feature called "Atomic Replace". It allows
creation of so called "Cumulative Patches". They include all wanted changes
.replace = true,
};
-Such a patch is added on top of the livepatch stack when enabled.
-
All processes are then migrated to use the code only from the new patch.
Once the transition is finished, all older patches are automatically
-disabled and removed from the stack of patches.
+disabled.
Ftrace handlers are transparently removed from functions that are no
longer modified by the new cumulative patch.
+ Remove eventual performance impact caused by core redirection
for functions that are no longer patched.
- + Decrease user confusion about stacking order and what code
- is actually in use.
+ + Decrease user confusion about dependencies between livepatches.
Limitations:
the kernel livepatching.
The /sys/kernel/livepatch/<patch>/transition file shows whether a patch
-is in transition. Only a single patch (the topmost patch on the stack)
-can be in transition at a given time. A patch can remain in transition
-indefinitely, if any of the tasks are stuck in the initial patch state.
+is in transition. Only a single patch can be in transition at a given
+time. A patch can remain in transition indefinitely, if any of the tasks
+are stuck in the initial patch state.
A transition can be reversed and effectively canceled by writing the
opposite value to the /sys/kernel/livepatch/<patch>/enabled file while
The right implementation is selected by the ftrace handler, see
the "Consistency model" section.
+ That said, it is highly recommended to use cumulative livepatches
+ because they help keeping the consistency of all changes. In this case,
+ functions might be patched two times only during the transition period.
+
5.3. Replacing
--------------
Third, the sysfs interface is destroyed.
-Note that patches must be disabled in exactly the reverse order in which
-they were enabled. It makes the problem and the implementation much easier.
-
5.5. Removing
-------------
if (klp_transition_patch)
return -EBUSY;
- /* enforce stacking: only the last enabled patch can be disabled */
- if (!list_is_last(&patch->list, &klp_patches))
- return -EBUSY;
-
klp_init_transition(patch, KLP_UNPATCHED);
klp_for_each_object(patch, obj)