162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-or-later
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * Copyright (C) 2017 Joe Lawrence <joe.lawrence@redhat.com>
462306a36Sopenharmony_ci */
562306a36Sopenharmony_ci
662306a36Sopenharmony_ci/*
762306a36Sopenharmony_ci * livepatch-callbacks-busymod.c - (un)patching callbacks demo support module
862306a36Sopenharmony_ci *
962306a36Sopenharmony_ci *
1062306a36Sopenharmony_ci * Purpose
1162306a36Sopenharmony_ci * -------
1262306a36Sopenharmony_ci *
1362306a36Sopenharmony_ci * Simple module to demonstrate livepatch (un)patching callbacks.
1462306a36Sopenharmony_ci *
1562306a36Sopenharmony_ci *
1662306a36Sopenharmony_ci * Usage
1762306a36Sopenharmony_ci * -----
1862306a36Sopenharmony_ci *
1962306a36Sopenharmony_ci * This module is not intended to be standalone.  See the "Usage"
2062306a36Sopenharmony_ci * section of livepatch-callbacks-mod.c.
2162306a36Sopenharmony_ci */
2262306a36Sopenharmony_ci
2362306a36Sopenharmony_ci#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
2462306a36Sopenharmony_ci
2562306a36Sopenharmony_ci#include <linux/module.h>
2662306a36Sopenharmony_ci#include <linux/kernel.h>
2762306a36Sopenharmony_ci#include <linux/workqueue.h>
2862306a36Sopenharmony_ci#include <linux/delay.h>
2962306a36Sopenharmony_ci
3062306a36Sopenharmony_cistatic int sleep_secs;
3162306a36Sopenharmony_cimodule_param(sleep_secs, int, 0644);
3262306a36Sopenharmony_ciMODULE_PARM_DESC(sleep_secs, "sleep_secs (default=0)");
3362306a36Sopenharmony_ci
3462306a36Sopenharmony_cistatic void busymod_work_func(struct work_struct *work);
3562306a36Sopenharmony_cistatic DECLARE_DELAYED_WORK(work, busymod_work_func);
3662306a36Sopenharmony_ci
3762306a36Sopenharmony_cistatic void busymod_work_func(struct work_struct *work)
3862306a36Sopenharmony_ci{
3962306a36Sopenharmony_ci	pr_info("%s, sleeping %d seconds ...\n", __func__, sleep_secs);
4062306a36Sopenharmony_ci	msleep(sleep_secs * 1000);
4162306a36Sopenharmony_ci	pr_info("%s exit\n", __func__);
4262306a36Sopenharmony_ci}
4362306a36Sopenharmony_ci
4462306a36Sopenharmony_cistatic int livepatch_callbacks_mod_init(void)
4562306a36Sopenharmony_ci{
4662306a36Sopenharmony_ci	pr_info("%s\n", __func__);
4762306a36Sopenharmony_ci	schedule_delayed_work(&work,
4862306a36Sopenharmony_ci		msecs_to_jiffies(1000 * 0));
4962306a36Sopenharmony_ci	return 0;
5062306a36Sopenharmony_ci}
5162306a36Sopenharmony_ci
5262306a36Sopenharmony_cistatic void livepatch_callbacks_mod_exit(void)
5362306a36Sopenharmony_ci{
5462306a36Sopenharmony_ci	cancel_delayed_work_sync(&work);
5562306a36Sopenharmony_ci	pr_info("%s\n", __func__);
5662306a36Sopenharmony_ci}
5762306a36Sopenharmony_ci
5862306a36Sopenharmony_cimodule_init(livepatch_callbacks_mod_init);
5962306a36Sopenharmony_cimodule_exit(livepatch_callbacks_mod_exit);
6062306a36Sopenharmony_ciMODULE_LICENSE("GPL");
61