11ccea77eSThomas Gleixner // SPDX-License-Identifier: GPL-2.0-or-later
293862e38SJoe Lawrence /*
393862e38SJoe Lawrence  * Copyright (C) 2017 Joe Lawrence <joe.lawrence@redhat.com>
493862e38SJoe Lawrence  */
593862e38SJoe Lawrence 
693862e38SJoe Lawrence /*
793862e38SJoe Lawrence  * livepatch-callbacks-busymod.c - (un)patching callbacks demo support module
893862e38SJoe Lawrence  *
993862e38SJoe Lawrence  *
1093862e38SJoe Lawrence  * Purpose
1193862e38SJoe Lawrence  * -------
1293862e38SJoe Lawrence  *
1393862e38SJoe Lawrence  * Simple module to demonstrate livepatch (un)patching callbacks.
1493862e38SJoe Lawrence  *
1593862e38SJoe Lawrence  *
1693862e38SJoe Lawrence  * Usage
1793862e38SJoe Lawrence  * -----
1893862e38SJoe Lawrence  *
1993862e38SJoe Lawrence  * This module is not intended to be standalone.  See the "Usage"
2093862e38SJoe Lawrence  * section of livepatch-callbacks-mod.c.
2193862e38SJoe Lawrence  */
2293862e38SJoe Lawrence 
2393862e38SJoe Lawrence #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
2493862e38SJoe Lawrence 
2593862e38SJoe Lawrence #include <linux/module.h>
2693862e38SJoe Lawrence #include <linux/kernel.h>
2793862e38SJoe Lawrence #include <linux/workqueue.h>
2893862e38SJoe Lawrence #include <linux/delay.h>
2993862e38SJoe Lawrence 
3093862e38SJoe Lawrence static int sleep_secs;
3193862e38SJoe Lawrence module_param(sleep_secs, int, 0644);
3293862e38SJoe Lawrence MODULE_PARM_DESC(sleep_secs, "sleep_secs (default=0)");
3393862e38SJoe Lawrence 
3493862e38SJoe Lawrence static void busymod_work_func(struct work_struct *work);
3593862e38SJoe Lawrence static DECLARE_DELAYED_WORK(work, busymod_work_func);
3693862e38SJoe Lawrence 
busymod_work_func(struct work_struct * work)3793862e38SJoe Lawrence static void busymod_work_func(struct work_struct *work)
3893862e38SJoe Lawrence {
3993862e38SJoe Lawrence 	pr_info("%s, sleeping %d seconds ...\n", __func__, sleep_secs);
4093862e38SJoe Lawrence 	msleep(sleep_secs * 1000);
4193862e38SJoe Lawrence 	pr_info("%s exit\n", __func__);
4293862e38SJoe Lawrence }
4393862e38SJoe Lawrence 
livepatch_callbacks_mod_init(void)4493862e38SJoe Lawrence static int livepatch_callbacks_mod_init(void)
4593862e38SJoe Lawrence {
4693862e38SJoe Lawrence 	pr_info("%s\n", __func__);
4793862e38SJoe Lawrence 	schedule_delayed_work(&work,
4893862e38SJoe Lawrence 		msecs_to_jiffies(1000 * 0));
4993862e38SJoe Lawrence 	return 0;
5093862e38SJoe Lawrence }
5193862e38SJoe Lawrence 
livepatch_callbacks_mod_exit(void)5293862e38SJoe Lawrence static void livepatch_callbacks_mod_exit(void)
5393862e38SJoe Lawrence {
5493862e38SJoe Lawrence 	cancel_delayed_work_sync(&work);
5593862e38SJoe Lawrence 	pr_info("%s\n", __func__);
5693862e38SJoe Lawrence }
5793862e38SJoe Lawrence 
5893862e38SJoe Lawrence module_init(livepatch_callbacks_mod_init);
5993862e38SJoe Lawrence module_exit(livepatch_callbacks_mod_exit);
6093862e38SJoe Lawrence MODULE_LICENSE("GPL");
61