aboutsummaryrefslogtreecommitdiffstats
path: root/kernel/livepatch/core.c
diff options
context:
space:
mode:
authorPetr Mladek <pmladek@suse.com>2019-02-04 08:56:53 -0500
committerPetr Mladek <pmladek@suse.com>2019-02-06 05:03:14 -0500
commita087cdd4073b78f4739ce6709daeb4f3267b4dbf (patch)
tree49acb85ad5918dd9c12ccf1e408cf5acd65ad3e6 /kernel/livepatch/core.c
parent49ee4dd2e753cd13d157361d4bd28b548e3d0ee7 (diff)
livepatch: Module coming and going callbacks can proceed with all listed patches
Livepatches can no longer get enabled and disabled repeatedly. The list klp_patches contains only enabled patches and eventually the patch in transition. The module coming and going callbacks do no longer need to check for these state. They have to proceed with all listed patches. Suggested-by: Josh Poimboeuf <jpoimboe@redhat.com> Acked-by: Miroslav Benes <mbenes@suse.cz> Acked-by: Joe Lawrence <joe.lawrence@redhat.com> Signed-off-by: Petr Mladek <pmladek@suse.com>
Diffstat (limited to 'kernel/livepatch/core.c')
-rw-r--r--kernel/livepatch/core.c26
1 files changed, 6 insertions, 20 deletions
diff --git a/kernel/livepatch/core.c b/kernel/livepatch/core.c
index 4b7f55d9e89c..d1af69e9f0e3 100644
--- a/kernel/livepatch/core.c
+++ b/kernel/livepatch/core.c
@@ -1141,21 +1141,14 @@ static void klp_cleanup_module_patches_limited(struct module *mod,
1141 if (!klp_is_module(obj) || strcmp(obj->name, mod->name)) 1141 if (!klp_is_module(obj) || strcmp(obj->name, mod->name))
1142 continue; 1142 continue;
1143 1143
1144 /* 1144 if (patch != klp_transition_patch)
1145 * Only unpatch the module if the patch is enabled or 1145 klp_pre_unpatch_callback(obj);
1146 * is in transition.
1147 */
1148 if (patch->enabled || patch == klp_transition_patch) {
1149
1150 if (patch != klp_transition_patch)
1151 klp_pre_unpatch_callback(obj);
1152 1146
1153 pr_notice("reverting patch '%s' on unloading module '%s'\n", 1147 pr_notice("reverting patch '%s' on unloading module '%s'\n",
1154 patch->mod->name, obj->mod->name); 1148 patch->mod->name, obj->mod->name);
1155 klp_unpatch_object(obj); 1149 klp_unpatch_object(obj);
1156 1150
1157 klp_post_unpatch_callback(obj); 1151 klp_post_unpatch_callback(obj);
1158 }
1159 1152
1160 klp_free_object_loaded(obj); 1153 klp_free_object_loaded(obj);
1161 break; 1154 break;
@@ -1194,13 +1187,6 @@ int klp_module_coming(struct module *mod)
1194 goto err; 1187 goto err;
1195 } 1188 }
1196 1189
1197 /*
1198 * Only patch the module if the patch is enabled or is
1199 * in transition.
1200 */
1201 if (!patch->enabled && patch != klp_transition_patch)
1202 break;
1203
1204 pr_notice("applying patch '%s' to loading module '%s'\n", 1190 pr_notice("applying patch '%s' to loading module '%s'\n",
1205 patch->mod->name, obj->mod->name); 1191 patch->mod->name, obj->mod->name);
1206 1192