|  | ====================== | 
|  | (Un)patching Callbacks | 
|  | ====================== | 
|  |  | 
|  | Livepatch (un)patch-callbacks provide a mechanism for livepatch modules | 
|  | to execute callback functions when a kernel object is (un)patched.  They | 
|  | can be considered a **power feature** that **extends livepatching abilities** | 
|  | to include: | 
|  |  | 
|  | - Safe updates to global data | 
|  |  | 
|  | - "Patches" to init and probe functions | 
|  |  | 
|  | - Patching otherwise unpatchable code (i.e. assembly) | 
|  |  | 
|  | In most cases, (un)patch callbacks will need to be used in conjunction | 
|  | with memory barriers and kernel synchronization primitives, like | 
|  | mutexes/spinlocks, or even stop_machine(), to avoid concurrency issues. | 
|  |  | 
|  | 1. Motivation | 
|  | ============= | 
|  |  | 
|  | Callbacks differ from existing kernel facilities: | 
|  |  | 
|  | - Module init/exit code doesn't run when disabling and re-enabling a | 
|  | patch. | 
|  |  | 
|  | - A module notifier can't stop a to-be-patched module from loading. | 
|  |  | 
|  | Callbacks are part of the klp_object structure and their implementation | 
|  | is specific to that klp_object.  Other livepatch objects may or may not | 
|  | be patched, irrespective of the target klp_object's current state. | 
|  |  | 
|  | 2. Callback types | 
|  | ================= | 
|  |  | 
|  | Callbacks can be registered for the following livepatch actions: | 
|  |  | 
|  | * Pre-patch | 
|  | - before a klp_object is patched | 
|  |  | 
|  | * Post-patch | 
|  | - after a klp_object has been patched and is active | 
|  | across all tasks | 
|  |  | 
|  | * Pre-unpatch | 
|  | - before a klp_object is unpatched (ie, patched code is | 
|  | active), used to clean up post-patch callback | 
|  | resources | 
|  |  | 
|  | * Post-unpatch | 
|  | - after a klp_object has been patched, all code has | 
|  | been restored and no tasks are running patched code, | 
|  | used to cleanup pre-patch callback resources | 
|  |  | 
|  | 3. How it works | 
|  | =============== | 
|  |  | 
|  | Each callback is optional, omitting one does not preclude specifying any | 
|  | other.  However, the livepatching core executes the handlers in | 
|  | symmetry: pre-patch callbacks have a post-unpatch counterpart and | 
|  | post-patch callbacks have a pre-unpatch counterpart.  An unpatch | 
|  | callback will only be executed if its corresponding patch callback was | 
|  | executed.  Typical use cases pair a patch handler that acquires and | 
|  | configures resources with an unpatch handler tears down and releases | 
|  | those same resources. | 
|  |  | 
|  | A callback is only executed if its host klp_object is loaded.  For | 
|  | in-kernel vmlinux targets, this means that callbacks will always execute | 
|  | when a livepatch is enabled/disabled.  For patch target kernel modules, | 
|  | callbacks will only execute if the target module is loaded.  When a | 
|  | module target is (un)loaded, its callbacks will execute only if the | 
|  | livepatch module is enabled. | 
|  |  | 
|  | The pre-patch callback, if specified, is expected to return a status | 
|  | code (0 for success, -ERRNO on error).  An error status code indicates | 
|  | to the livepatching core that patching of the current klp_object is not | 
|  | safe and to stop the current patching request.  (When no pre-patch | 
|  | callback is provided, the transition is assumed to be safe.)  If a | 
|  | pre-patch callback returns failure, the kernel's module loader will: | 
|  |  | 
|  | - Refuse to load a livepatch, if the livepatch is loaded after | 
|  | targeted code. | 
|  |  | 
|  | or: | 
|  |  | 
|  | - Refuse to load a module, if the livepatch was already successfully | 
|  | loaded. | 
|  |  | 
|  | No post-patch, pre-unpatch, or post-unpatch callbacks will be executed | 
|  | for a given klp_object if the object failed to patch, due to a failed | 
|  | pre_patch callback or for any other reason. | 
|  |  | 
|  | If a patch transition is reversed, no pre-unpatch handlers will be run | 
|  | (this follows the previously mentioned symmetry -- pre-unpatch callbacks | 
|  | will only occur if their corresponding post-patch callback executed). | 
|  |  | 
|  | If the object did successfully patch, but the patch transition never | 
|  | started for some reason (e.g., if another object failed to patch), | 
|  | only the post-unpatch callback will be called. | 
|  |  | 
|  | 4. Use cases | 
|  | ============ | 
|  |  | 
|  | Sample livepatch modules demonstrating the callback API can be found in | 
|  | samples/livepatch/ directory.  These samples were modified for use in | 
|  | kselftests and can be found in the lib/livepatch directory. | 
|  |  | 
|  | Global data update | 
|  | ------------------ | 
|  |  | 
|  | A pre-patch callback can be useful to update a global variable.  For | 
|  | example, 75ff39ccc1bd ("tcp: make challenge acks less predictable") | 
|  | changes a global sysctl, as well as patches the tcp_send_challenge_ack() | 
|  | function. | 
|  |  | 
|  | In this case, if we're being super paranoid, it might make sense to | 
|  | patch the data *after* patching is complete with a post-patch callback, | 
|  | so that tcp_send_challenge_ack() could first be changed to read | 
|  | sysctl_tcp_challenge_ack_limit with READ_ONCE. | 
|  |  | 
|  | __init and probe function patches support | 
|  | ----------------------------------------- | 
|  |  | 
|  | Although __init and probe functions are not directly livepatch-able, it | 
|  | may be possible to implement similar updates via pre/post-patch | 
|  | callbacks. | 
|  |  | 
|  | The commit ``48900cb6af42 ("virtio-net: drop NETIF_F_FRAGLIST")`` change the way that | 
|  | virtnet_probe() initialized its driver's net_device features.  A | 
|  | pre/post-patch callback could iterate over all such devices, making a | 
|  | similar change to their hw_features value.  (Client functions of the | 
|  | value may need to be updated accordingly.) |