1*1ccea77eSThomas 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