€•D\Œsphinx.addnodes”Œdocument”“”)”}”(Œ rawsource”Œ”Œchildren”]”(Œ translations”Œ LanguagesNode”“”)”}”(hhh]”(hŒ pending_xref”“”)”}”(hhh]”Œdocutils.nodes”ŒText”“”ŒChinese (Simplified)”…””}”Œparent”hsbaŒ attributes”}”(Œids”]”Œclasses”]”Œnames”]”Œdupnames”]”Œbackrefs”]”Œ refdomain”Œstd”Œreftype”Œdoc”Œ reftarget”Œ'/translations/zh_CN/livepatch/callbacks”Œmodname”NŒ classname”NŒ refexplicit”ˆuŒtagname”hhh ubh)”}”(hhh]”hŒChinese (Traditional)”…””}”hh2sbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ'/translations/zh_TW/livepatch/callbacks”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)”}”(hhh]”hŒItalian”…””}”hhFsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ'/translations/it_IT/livepatch/callbacks”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)”}”(hhh]”hŒJapanese”…””}”hhZsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ'/translations/ja_JP/livepatch/callbacks”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)”}”(hhh]”hŒKorean”…””}”hhnsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ'/translations/ko_KR/livepatch/callbacks”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)”}”(hhh]”hŒSpanish”…””}”hh‚sbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ'/translations/sp_SP/livepatch/callbacks”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubeh}”(h]”h ]”h"]”h$]”h&]”Œcurrent_language”ŒEnglish”uh1h hhŒ _document”hŒsource”NŒline”NubhŒsection”“”)”}”(hhh]”(hŒtitle”“”)”}”(hŒ(Un)patching Callbacks”h]”hŒ(Un)patching Callbacks”…””}”(hh¨hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h¦hh£hžhhŸŒA/var/lib/git/docbuild/linux/Documentation/livepatch/callbacks.rst”h KubhŒ paragraph”“”)”}”(hŒê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:”h]”(hŒ¥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 ”…””}”(hh¹hžhhŸNh NubhŒstrong”“”)”}”(hŒ**power feature**”h]”hŒ power feature”…””}”(hhÃhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÁhh¹ubhŒ that ”…””}”(hh¹hžhhŸNh NubhÂ)”}”(hŒ"**extends livepatching abilities**”h]”hŒextends livepatching abilities”…””}”(hhÕhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÁhh¹ubhŒ to include:”…””}”(hh¹hžhhŸNh Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1h·hŸh¶h Khh£hžhubhŒ block_quote”“”)”}”(hŒ~- Safe updates to global data - "Patches" to init and probe functions - Patching otherwise unpatchable code (i.e. assembly) ”h]”hŒ bullet_list”“”)”}”(hhh]”(hŒ list_item”“”)”}”(hŒSafe updates to global data ”h]”h¸)”}”(hŒSafe updates to global data”h]”hŒSafe updates to global data”…””}”(hhþhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h·hŸh¶h K hhúubah}”(h]”h ]”h"]”h$]”h&]”uh1høhhõubhù)”}”(hŒ&"Patches" to init and probe functions ”h]”h¸)”}”(hŒ%"Patches" to init and probe functions”h]”hŒ)“Patches†to init and probe functions”…””}”(hjhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h·hŸh¶h K hjubah}”(h]”h ]”h"]”h$]”h&]”uh1høhhõubhù)”}”(hŒ4Patching otherwise unpatchable code (i.e. assembly) ”h]”h¸)”}”(hŒ3Patching otherwise unpatchable code (i.e. assembly)”h]”hŒ3Patching otherwise unpatchable code (i.e. assembly)”…””}”(hj.hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h·hŸh¶h Khj*ubah}”(h]”h ]”h"]”h$]”h&]”uh1høhhõubeh}”(h]”h ]”h"]”h$]”h&]”Œbullet”Œ-”uh1hóhŸh¶h K hhïubah}”(h]”h ]”h"]”h$]”h&]”uh1híhŸh¶h K hh£hžhubh¸)”}”(hŒÏ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.”h]”hŒÏ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.”…””}”(hjPhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h·hŸh¶h Khh£hžhubh¢)”}”(hhh]”(h§)”}”(hŒ 1. Motivation”h]”hŒ 1. Motivation”…””}”(hjahžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h¦hj^hžhhŸh¶h Kubh¸)”}”(hŒ1Callbacks differ from existing kernel facilities:”h]”hŒ1Callbacks differ from existing kernel facilities:”…””}”(hjohžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h·hŸh¶h Khj^hžhubhî)”}”(hŒ“- 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. ”h]”hô)”}”(hhh]”(hù)”}”(hŒJModule init/exit code doesn't run when disabling and re-enabling a patch. ”h]”h¸)”}”(hŒIModule init/exit code doesn't run when disabling and re-enabling a patch.”h]”hŒKModule init/exit code doesn’t run when disabling and re-enabling a patch.”…””}”(hjˆhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h·hŸh¶h Khj„ubah}”(h]”h ]”h"]”h$]”h&]”uh1høhjubhù)”}”(hŒBA module notifier can't stop a to-be-patched module from loading. ”h]”h¸)”}”(hŒAA module notifier can't stop a to-be-patched module from loading.”h]”hŒCA module notifier can’t stop a to-be-patched module from loading.”…””}”(hj hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h·hŸh¶h Khjœubah}”(h]”h ]”h"]”h$]”h&]”uh1høhjubeh}”(h]”h ]”h"]”h$]”h&]”jHjIuh1hóhŸh¶h Khj}ubah}”(h]”h ]”h"]”h$]”h&]”uh1híhŸh¶h Khj^hžhubh¸)”}”(hŒÒ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.”h]”hŒÔ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.”…””}”(hjÀhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h·hŸh¶h Khj^hžhubeh}”(h]”Œ motivation”ah ]”h"]”Œ 1. motivation”ah$]”h&]”uh1h¡hh£hžhhŸh¶h Kubh¢)”}”(hhh]”(h§)”}”(hŒ2. Callback types”h]”hŒ2. Callback types”…””}”(hjÙhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h¦hjÖhžhhŸh¶h K#ubh¸)”}”(hŒ@Callbacks can be registered for the following livepatch actions:”h]”hŒ@Callbacks can be registered for the following livepatch actions:”…””}”(hjçhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h·hŸh¶h K%hjÖhžhubhî)”}”(hX6* 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 ”h]”hô)”}”(hhh]”(hù)”}”(hŒ8Pre-patch - before a klp_object is patched ”h]”hŒdefinition_list”“”)”}”(hhh]”hŒdefinition_list_item”“”)”}”(hŒ+Pre-patch - before a klp_object is patched ”h]”(hŒterm”“”)”}”(hŒ Pre-patch”h]”hŒ Pre-patch”…””}”(hj hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j hŸh¶h K(hjubhŒ definition”“”)”}”(hhh]”hô)”}”(hhh]”hù)”}”(hŒbefore a klp_object is patched ”h]”h¸)”}”(hŒbefore a klp_object is patched”h]”hŒbefore a klp_object is patched”…””}”(hj'hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h·hŸh¶h K(hj#ubah}”(h]”h ]”h"]”h$]”h&]”uh1høhj ubah}”(h]”h ]”h"]”h$]”h&]”jHjIuh1hóhŸh¶h K(hjubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjubeh}”(h]”h ]”h"]”h$]”h&]”uh1jhŸh¶h K(hjubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjüubah}”(h]”h ]”h"]”h$]”h&]”uh1høhjùubhù)”}”(hŒlPost-patch - after a klp_object has been patched and is active across all tasks ”h]”j)”}”(hhh]”j)”}”(hŒRPost-patch - after a klp_object has been patched and is active across all tasks ”h]”(j )”}”(hŒ Post-patch”h]”hŒ Post-patch”…””}”(hjdhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j hŸh¶h K,hj`ubj)”}”(hhh]”hô)”}”(hhh]”hù)”}”(hŒCafter a klp_object has been patched and is active across all tasks ”h]”h¸)”}”(hŒBafter a klp_object has been patched and is active across all tasks”h]”hŒBafter a klp_object has been patched and is active across all tasks”…””}”(hj|hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h·hŸh¶h K+hjxubah}”(h]”h ]”h"]”h$]”h&]”uh1høhjuubah}”(h]”h ]”h"]”h$]”h&]”jHjIuh1hóhŸh¶h K+hjrubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj`ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jhŸh¶h K,hj]ubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjYubah}”(h]”h ]”h"]”h$]”h&]”uh1høhjùubhù)”}”(hŒ§Pre-unpatch - before a klp_object is unpatched (ie, patched code is active), used to clean up post-patch callback resources ”h]”j)”}”(hhh]”j)”}”(hŒ€Pre-unpatch - before a klp_object is unpatched (ie, patched code is active), used to clean up post-patch callback resources ”h]”(j )”}”(hŒ Pre-unpatch”h]”hŒ Pre-unpatch”…””}”(hj¹hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j hŸh¶h K1hjµubj)”}”(hhh]”hô)”}”(hhh]”hù)”}”(hŒnbefore a klp_object is unpatched (ie, patched code is active), used to clean up post-patch callback resources ”h]”h¸)”}”(hŒmbefore a klp_object is unpatched (ie, patched code is active), used to clean up post-patch callback resources”h]”hŒmbefore a klp_object is unpatched (ie, patched code is active), used to clean up post-patch callback resources”…””}”(hjÑhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h·hŸh¶h K/hjÍubah}”(h]”h ]”h"]”h$]”h&]”uh1høhjÊubah}”(h]”h ]”h"]”h$]”h&]”jHjIuh1hóhŸh¶h K/hjÇubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjµubeh}”(h]”h ]”h"]”h$]”h&]”uh1jhŸh¶h K1hj²ubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj®ubah}”(h]”h ]”h"]”h$]”h&]”uh1høhjùubhù)”}”(hŒÎ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 ”h]”j)”}”(hhh]”j)”}”(hŒ§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 ”h]”(j )”}”(hŒ Post-unpatch”h]”hŒ Post-unpatch”…””}”(hjhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j hŸh¶h K6hj ubj)”}”(hhh]”hô)”}”(hhh]”hù)”}”(hŒ”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 ”h]”h¸)”}”(hŒ“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”h]”hŒ“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”…””}”(hj&hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h·hŸh¶h K4hj"ubah}”(h]”h ]”h"]”h$]”h&]”uh1høhjubah}”(h]”h ]”h"]”h$]”h&]”jHjIuh1hóhŸh¶h K4hjubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jhŸh¶h K6hjubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjubah}”(h]”h ]”h"]”h$]”h&]”uh1høhjùubeh}”(h]”h ]”h"]”h$]”h&]”jHŒ*”uh1hóhŸh¶h K'hjõubah}”(h]”h ]”h"]”h$]”h&]”uh1híhŸh¶h K'hjÖhžhubeh}”(h]”Œcallback-types”ah ]”h"]”Œ2. callback types”ah$]”h&]”uh1h¡hh£hžhhŸh¶h K#ubh¢)”}”(hhh]”(h§)”}”(hŒ3. How it works”h]”hŒ3. How it works”…””}”(hjphžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h¦hjmhžhhŸh¶h K9ubh¸)”}”(hXñ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.”h]”hXñ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.”…””}”(hj~hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h·hŸh¶h K;hjmhžhubh¸)”}”(hXxA 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.”h]”hXxA 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.”…””}”(hjŒhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h·hŸh¶h KDhjmhžhubh¸)”}”(hXž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:”h]”hX 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:”…””}”(hjšhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h·hŸh¶h KKhjmhžhubhî)”}”(hŒ§- 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. ”h]”hô)”}”(hhh]”(hù)”}”(hŒQRefuse to load a livepatch, if the livepatch is loaded after targeted code. or: ”h]”(h¸)”}”(hŒKRefuse to load a livepatch, if the livepatch is loaded after targeted code.”h]”hŒKRefuse to load a livepatch, if the livepatch is loaded after targeted code.”…””}”(hj³hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h·hŸh¶h KRhj¯ubh¸)”}”(hŒor:”h]”hŒor:”…””}”(hjÁhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h·hŸh¶h KUhj¯ubeh}”(h]”h ]”h"]”h$]”h&]”uh1høhj¬ubhù)”}”(hŒKRefuse to load a module, if the livepatch was already successfully loaded. ”h]”h¸)”}”(hŒJRefuse to load a module, if the livepatch was already successfully loaded.”h]”hŒJRefuse to load a module, if the livepatch was already successfully loaded.”…””}”(hjÙhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h·hŸh¶h KWhjÕubah}”(h]”h ]”h"]”h$]”h&]”uh1høhj¬ubeh}”(h]”h ]”h"]”h$]”h&]”jHjIuh1hóhŸh¶h KRhj¨ubah}”(h]”h ]”h"]”h$]”h&]”uh1híhŸh¶h KRhjmhžhubh¸)”}”(hŒ¸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.”h]”hŒ¸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.”…””}”(hjùhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h·hŸh¶h KZhjmhžhubh¸)”}”(hŒÕ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).”h]”hŒÕ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).”…””}”(hjhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h·hŸh¶h K^hjmhžhubh¸)”}”(hŒ¶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.”h]”hŒ¶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.”…””}”(hjhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h·hŸh¶h Kbhjmhžhubeh}”(h]”Œ how-it-works”ah ]”h"]”Œ3. how it works”ah$]”h&]”uh1h¡hh£hžhhŸh¶h K9ubh¢)”}”(hhh]”(h§)”}”(hŒ 4. Use cases”h]”hŒ 4. Use cases”…””}”(hj.hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h¦hj+hžhhŸh¶h Kgubh¸)”}”(hŒÉ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.”h]”hŒÉ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.”…””}”(hj<hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h·hŸh¶h Kihj+hžhubh¢)”}”(hhh]”(h§)”}”(hŒGlobal data update”h]”hŒGlobal data update”…””}”(hjMhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h¦hjJhžhhŸh¶h Knubh¸)”}”(hŒâA pre-patch callback can be useful to update a global variable. For example, commit 75ff39ccc1bd ("tcp: make challenge acks less predictable") changes a global sysctl, as well as patches the tcp_send_challenge_ack() function.”h]”hŒæA pre-patch callback can be useful to update a global variable. For example, commit 75ff39ccc1bd (“tcp: make challenge acks less predictableâ€) changes a global sysctl, as well as patches the tcp_send_challenge_ack() function.”…””}”(hj[hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h·hŸh¶h KphjJhžhubh¸)”}”(hŒú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.”h]”(hŒUIn this case, if we’re being super paranoid, it might make sense to patch the data ”…””}”(hjihžhhŸNh NubhŒemphasis”“”)”}”(hŒ*after*”h]”hŒafter”…””}”(hjshžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jqhjiubhŒ  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.”…””}”(hjihžhhŸNh Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1h·hŸh¶h KuhjJhžhubeh}”(h]”Œglobal-data-update”ah ]”h"]”Œglobal data update”ah$]”h&]”uh1h¡hj+hžhhŸh¶h Knubh¢)”}”(hhh]”(h§)”}”(hŒ)__init and probe function patches support”h]”hŒ)__init and probe function patches support”…””}”(hj–hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h¦hj“hžhhŸh¶h K{ubh¸)”}”(hŒ’Although __init and probe functions are not directly livepatch-able, it may be possible to implement similar updates via pre/post-patch callbacks.”h]”hŒ’Although __init and probe functions are not directly livepatch-able, it may be possible to implement similar updates via pre/post-patch callbacks.”…””}”(hj¤hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h·hŸh¶h K}hj“hžhubh¸)”}”(hXHThe 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.)”h]”hXNThe 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.)”…””}”(hj²hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h·hŸh¶h Khj“hžhubeh}”(h]”Œ'init-and-probe-function-patches-support”ah ]”h"]”Œ)__init and probe function patches support”ah$]”h&]”uh1h¡hj+hžhhŸh¶h K{ubeh}”(h]”Œ use-cases”ah ]”h"]”Œ 4. use cases”ah$]”h&]”uh1h¡hh£hžhhŸh¶h Kgubeh}”(h]”Œun-patching-callbacks”ah ]”h"]”Œ(un)patching callbacks”ah$]”h&]”uh1h¡hhhžhhŸh¶h Kubeh}”(h]”h ]”h"]”h$]”h&]”Œsource”h¶uh1hŒcurrent_source”NŒ current_line”NŒsettings”Œdocutils.frontend”ŒValues”“”)”}”(h¦NŒ generator”NŒ datestamp”NŒ source_link”NŒ source_url”NŒ toc_backlinks”Œentry”Œfootnote_backlinks”KŒ sectnum_xform”KŒstrip_comments”NŒstrip_elements_with_classes”NŒ strip_classes”NŒ report_level”KŒ halt_level”KŒexit_status_level”KŒdebug”NŒwarning_stream”NŒ traceback”ˆŒinput_encoding”Œ utf-8-sig”Œinput_encoding_error_handler”Œstrict”Œoutput_encoding”Œutf-8”Œoutput_encoding_error_handler”jûŒerror_encoding”Œutf-8”Œerror_encoding_error_handler”Œbackslashreplace”Œ language_code”Œen”Œrecord_dependencies”NŒconfig”NŒ id_prefix”hŒauto_id_prefix”Œid”Œ dump_settings”NŒdump_internals”NŒdump_transforms”NŒdump_pseudo_xml”NŒexpose_internals”NŒstrict_visitor”NŒ_disable_config”NŒ_source”h¶Œ _destination”NŒ _config_files”]”Œ7/var/lib/git/docbuild/linux/Documentation/docutils.conf”aŒfile_insertion_enabled”ˆŒ raw_enabled”KŒline_length_limit”M'Œpep_references”NŒ pep_base_url”Œhttps://peps.python.org/”Œpep_file_url_template”Œpep-%04d”Œrfc_references”NŒ rfc_base_url”Œ&https://datatracker.ietf.org/doc/html/”Œ tab_width”KŒtrim_footnote_reference_space”‰Œsyntax_highlight”Œlong”Œ smart_quotes”ˆŒsmartquotes_locales”]”Œcharacter_level_inline_markup”‰Œdoctitle_xform”‰Œ docinfo_xform”KŒsectsubtitle_xform”‰Œ image_loading”Œlink”Œembed_stylesheet”‰Œcloak_email_addresses”ˆŒsection_self_link”‰Œenv”NubŒreporter”NŒindirect_targets”]”Œsubstitution_defs”}”Œsubstitution_names”}”Œrefnames”}”Œrefids”}”Œnameids”}”(jÕjÒjÓjÐjjjgj(j%jÍjÊjjjÅjÂuŒ nametypes”}”(jÕ‰jÓ‰jj‰j(‰j͉j‰jʼnuh}”(jÒh£jÐj^jgjÖj%jmjÊj+jjJjÂj“uŒ footnote_refs”}”Œ citation_refs”}”Œ autofootnotes”]”Œautofootnote_refs”]”Œsymbol_footnotes”]”Œsymbol_footnote_refs”]”Œ footnotes”]”Œ citations”]”Œautofootnote_start”KŒsymbol_footnote_start”KŒ id_counter”Œ collections”ŒCounter”“”}”…”R”Œparse_messages”]”Œtransform_messages”]”Œ transformer”NŒ include_log”]”Œ decoration”Nhžhub.