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, 0); 48 return 0; 49 } 50 51 static void livepatch_callbacks_mod_exit(void) 52 { 53 cancel_delayed_work_sync(&work); 54 pr_info("%s\n", __func__); 55 } 56 57 module_init(livepatch_callbacks_mod_init); 58 module_exit(livepatch_callbacks_mod_exit); 59 MODULE_LICENSE("GPL"); 60