diff options
Diffstat (limited to 'kernel/livepatch/patch.c')
-rw-r--r-- | kernel/livepatch/patch.c | 31 |
1 files changed, 26 insertions, 5 deletions
diff --git a/kernel/livepatch/patch.c b/kernel/livepatch/patch.c index 0ff466ab4b5a..99cb3ad05eb4 100644 --- a/kernel/livepatch/patch.c +++ b/kernel/livepatch/patch.c | |||
@@ -246,15 +246,26 @@ err: | |||
246 | return ret; | 246 | return ret; |
247 | } | 247 | } |
248 | 248 | ||
249 | void klp_unpatch_object(struct klp_object *obj) | 249 | static void __klp_unpatch_object(struct klp_object *obj, bool nops_only) |
250 | { | 250 | { |
251 | struct klp_func *func; | 251 | struct klp_func *func; |
252 | 252 | ||
253 | klp_for_each_func(obj, func) | 253 | klp_for_each_func(obj, func) { |
254 | if (nops_only && !func->nop) | ||
255 | continue; | ||
256 | |||
254 | if (func->patched) | 257 | if (func->patched) |
255 | klp_unpatch_func(func); | 258 | klp_unpatch_func(func); |
259 | } | ||
256 | 260 | ||
257 | obj->patched = false; | 261 | if (obj->dynamic || !nops_only) |
262 | obj->patched = false; | ||
263 | } | ||
264 | |||
265 | |||
266 | void klp_unpatch_object(struct klp_object *obj) | ||
267 | { | ||
268 | __klp_unpatch_object(obj, false); | ||
258 | } | 269 | } |
259 | 270 | ||
260 | int klp_patch_object(struct klp_object *obj) | 271 | int klp_patch_object(struct klp_object *obj) |
@@ -277,11 +288,21 @@ int klp_patch_object(struct klp_object *obj) | |||
277 | return 0; | 288 | return 0; |
278 | } | 289 | } |
279 | 290 | ||
280 | void klp_unpatch_objects(struct klp_patch *patch) | 291 | static void __klp_unpatch_objects(struct klp_patch *patch, bool nops_only) |
281 | { | 292 | { |
282 | struct klp_object *obj; | 293 | struct klp_object *obj; |
283 | 294 | ||
284 | klp_for_each_object(patch, obj) | 295 | klp_for_each_object(patch, obj) |
285 | if (obj->patched) | 296 | if (obj->patched) |
286 | klp_unpatch_object(obj); | 297 | __klp_unpatch_object(obj, nops_only); |
298 | } | ||
299 | |||
300 | void klp_unpatch_objects(struct klp_patch *patch) | ||
301 | { | ||
302 | __klp_unpatch_objects(patch, false); | ||
303 | } | ||
304 | |||
305 | void klp_unpatch_objects_dynamic(struct klp_patch *patch) | ||
306 | { | ||
307 | __klp_unpatch_objects(patch, true); | ||
287 | } | 308 | } |