-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge branch 'for-4.15/callbacks' into for-linus
This pulls in an infrastructure/API that allows livepatch writers to register pre-patch and post-patch callbacks that allow for running a glue code necessary for finalizing the patching if necessary. Conflicts: kernel/livepatch/core.c - trivial conflict by adding a callback call into module going notifier vs. moving that code block to klp_cleanup_module_patches_limited() Signed-off-by: Jiri Kosina <jkosina@suse.cz>
- Loading branch information
Showing
10 changed files
with
1,114 additions
and
17 deletions.
There are no files selected for viewing
Large diffs are not rendered by default.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,6 +1,46 @@ | ||
#ifndef _LIVEPATCH_CORE_H | ||
#define _LIVEPATCH_CORE_H | ||
|
||
#include <linux/livepatch.h> | ||
|
||
extern struct mutex klp_mutex; | ||
|
||
static inline bool klp_is_object_loaded(struct klp_object *obj) | ||
{ | ||
return !obj->name || obj->mod; | ||
} | ||
|
||
static inline int klp_pre_patch_callback(struct klp_object *obj) | ||
{ | ||
int ret = 0; | ||
|
||
if (obj->callbacks.pre_patch) | ||
ret = (*obj->callbacks.pre_patch)(obj); | ||
|
||
obj->callbacks.post_unpatch_enabled = !ret; | ||
|
||
return ret; | ||
} | ||
|
||
static inline void klp_post_patch_callback(struct klp_object *obj) | ||
{ | ||
if (obj->callbacks.post_patch) | ||
(*obj->callbacks.post_patch)(obj); | ||
} | ||
|
||
static inline void klp_pre_unpatch_callback(struct klp_object *obj) | ||
{ | ||
if (obj->callbacks.pre_unpatch) | ||
(*obj->callbacks.pre_unpatch)(obj); | ||
} | ||
|
||
static inline void klp_post_unpatch_callback(struct klp_object *obj) | ||
{ | ||
if (obj->callbacks.post_unpatch_enabled && | ||
obj->callbacks.post_unpatch) | ||
(*obj->callbacks.post_unpatch)(obj); | ||
|
||
obj->callbacks.post_unpatch_enabled = false; | ||
} | ||
|
||
#endif /* _LIVEPATCH_CORE_H */ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,72 @@ | ||
/* | ||
* Copyright (C) 2017 Joe Lawrence <joe.lawrence@redhat.com> | ||
* | ||
* This program is free software; you can redistribute it and/or | ||
* modify it under the terms of the GNU General Public License | ||
* as published by the Free Software Foundation; either version 2 | ||
* of the License, or (at your option) any later version. | ||
* | ||
* This program is distributed in the hope that it will be useful, | ||
* but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
* GNU General Public License for more details. | ||
* | ||
* You should have received a copy of the GNU General Public License | ||
* along with this program; if not, see <http://www.gnu.org/licenses/>. | ||
*/ | ||
|
||
/* | ||
* livepatch-callbacks-busymod.c - (un)patching callbacks demo support module | ||
* | ||
* | ||
* Purpose | ||
* ------- | ||
* | ||
* Simple module to demonstrate livepatch (un)patching callbacks. | ||
* | ||
* | ||
* Usage | ||
* ----- | ||
* | ||
* This module is not intended to be standalone. See the "Usage" | ||
* section of livepatch-callbacks-mod.c. | ||
*/ | ||
|
||
#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt | ||
|
||
#include <linux/module.h> | ||
#include <linux/kernel.h> | ||
#include <linux/workqueue.h> | ||
#include <linux/delay.h> | ||
|
||
static int sleep_secs; | ||
module_param(sleep_secs, int, 0644); | ||
MODULE_PARM_DESC(sleep_secs, "sleep_secs (default=0)"); | ||
|
||
static void busymod_work_func(struct work_struct *work); | ||
static DECLARE_DELAYED_WORK(work, busymod_work_func); | ||
|
||
static void busymod_work_func(struct work_struct *work) | ||
{ | ||
pr_info("%s, sleeping %d seconds ...\n", __func__, sleep_secs); | ||
msleep(sleep_secs * 1000); | ||
pr_info("%s exit\n", __func__); | ||
} | ||
|
||
static int livepatch_callbacks_mod_init(void) | ||
{ | ||
pr_info("%s\n", __func__); | ||
schedule_delayed_work(&work, | ||
msecs_to_jiffies(1000 * 0)); | ||
return 0; | ||
} | ||
|
||
static void livepatch_callbacks_mod_exit(void) | ||
{ | ||
cancel_delayed_work_sync(&work); | ||
pr_info("%s\n", __func__); | ||
} | ||
|
||
module_init(livepatch_callbacks_mod_init); | ||
module_exit(livepatch_callbacks_mod_exit); | ||
MODULE_LICENSE("GPL"); |
Oops, something went wrong.