1 // SPDX-License-Identifier: GPL-2.0-or-later 2 /* 3 * Copyright (C) 2017 Joe Lawrence <joe.lawrence@redhat.com> 4 */ 5 6 /* 7 * livepatch-callbacks-busymod.c - (un)patching callbacks demo support module 8 * 9 * 10 * Purpose 11 * ------- 12 * 13 * Simple module to demonstrate livepatch (un)patching callbacks. 14 * 15 * 16 * Usage 17 * ----- 18 * 19 * This module is not intended to be standalone. See the "Usage" 20 * section of livepatch-callbacks-mod.c. 21 */ 22 23 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt 24 25 #include <linux/module.h> 26 #include <linux/kernel.h> 27 #include <linux/workqueue.h> 28 #include <linux/delay.h> 29 30 static int sleep_secs; 31 module_param(sleep_secs, int, 0644); 32 MODULE_PARM_DESC(sleep_secs, "sleep_secs (default=0)"); 33 34 static void busymod_work_func(struct work_struct *work); 35 static DECLARE_DELAYED_WORK(work, busymod_work_func); 36 37 static void busymod_work_func(struct work_struct *work) 38 { 39 pr_info("%s, sleeping %d seconds ...\n", __func__, sleep_secs); 40 msleep(sleep_secs * 1000); 41 pr_info("%s exit\n", __func__); 42 } 43 44 static int livepatch_callbacks_mod_init(void) 45 { 46 pr_info("%s\n", __func__); 47 schedule_delayed_work(&work, 48 msecs_to_jiffies(1000 * 0)); 49 return 0; 50 } 51 52 static void livepatch_callbacks_mod_exit(void) 53 { 54 cancel_delayed_work_sync(&work); 55 pr_info("%s\n", __func__); 56 } 57 58 module_init(livepatch_callbacks_mod_init); 59 module_exit(livepatch_callbacks_mod_exit); 60 MODULE_LICENSE("GPL"); 61