livepatch: add (un)patch callbacks
[muen/linux.git] / samples / livepatch / livepatch-callbacks-busymod.c
1 /*
2  * Copyright (C) 2017 Joe Lawrence <joe.lawrence@redhat.com>
3  *
4  * This program is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU General Public License
6  * as published by the Free Software Foundation; either version 2
7  * of the License, or (at your option) any later version.
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, see <http://www.gnu.org/licenses/>.
16  */
17
18 /*
19  * livepatch-callbacks-busymod.c - (un)patching callbacks demo support module
20  *
21  *
22  * Purpose
23  * -------
24  *
25  * Simple module to demonstrate livepatch (un)patching callbacks.
26  *
27  *
28  * Usage
29  * -----
30  *
31  * This module is not intended to be standalone.  See the "Usage"
32  * section of livepatch-callbacks-mod.c.
33  */
34
35 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
36
37 #include <linux/module.h>
38 #include <linux/kernel.h>
39 #include <linux/workqueue.h>
40 #include <linux/delay.h>
41
42 static int sleep_secs;
43 module_param(sleep_secs, int, 0644);
44 MODULE_PARM_DESC(sleep_secs, "sleep_secs (default=0)");
45
46 static void busymod_work_func(struct work_struct *work);
47 static DECLARE_DELAYED_WORK(work, busymod_work_func);
48
49 static void busymod_work_func(struct work_struct *work)
50 {
51         pr_info("%s, sleeping %d seconds ...\n", __func__, sleep_secs);
52         msleep(sleep_secs * 1000);
53         pr_info("%s exit\n", __func__);
54 }
55
56 static int livepatch_callbacks_mod_init(void)
57 {
58         pr_info("%s\n", __func__);
59         schedule_delayed_work(&work,
60                 msecs_to_jiffies(1000 * 0));
61         return 0;
62 }
63
64 static void livepatch_callbacks_mod_exit(void)
65 {
66         cancel_delayed_work_sync(&work);
67         pr_info("%s\n", __func__);
68 }
69
70 module_init(livepatch_callbacks_mod_init);
71 module_exit(livepatch_callbacks_mod_exit);
72 MODULE_LICENSE("GPL");