lkmpg/examples/completions.c
Amit Dhingra bf523b2332 Simplify code by removal of outer struct
Two struct completion(s) are encapsulated within another 'struct machine'.
Simplify the code by removing the outer struct and let the struct
completion(s) be self-standing.

Update description in tex to match code.
2023-09-28 06:02:39 +00:00

85 lines
1.9 KiB
C

/*
* completions.c
*/
#include <linux/completion.h>
#include <linux/err.h> /* for IS_ERR() */
#include <linux/init.h>
#include <linux/kthread.h>
#include <linux/module.h>
#include <linux/printk.h>
#include <linux/version.h>
static struct completion crank_comp;
static struct completion flywheel_comp;
static int machine_crank_thread(void *arg)
{
pr_info("Turn the crank\n");
complete_all(&crank_comp);
#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 17, 0)
kthread_complete_and_exit(&crank_comp, 0);
#else
complete_and_exit(&crank_comp, 0);
#endif
}
static int machine_flywheel_spinup_thread(void *arg)
{
wait_for_completion(&crank_comp);
pr_info("Flywheel spins up\n");
complete_all(&flywheel_comp);
#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 17, 0)
kthread_complete_and_exit(&flywheel_comp, 0);
#else
complete_and_exit(&flywheel_comp, 0);
#endif
}
static int __init completions_init(void)
{
struct task_struct *crank_thread;
struct task_struct *flywheel_thread;
pr_info("completions example\n");
init_completion(&crank_comp);
init_completion(&flywheel_comp);
crank_thread = kthread_create(machine_crank_thread, NULL, "KThread Crank");
if (IS_ERR(crank_thread))
goto ERROR_THREAD_1;
flywheel_thread = kthread_create(machine_flywheel_spinup_thread, NULL,
"KThread Flywheel");
if (IS_ERR(flywheel_thread))
goto ERROR_THREAD_2;
wake_up_process(flywheel_thread);
wake_up_process(crank_thread);
return 0;
ERROR_THREAD_2:
kthread_stop(crank_thread);
ERROR_THREAD_1:
return -1;
}
static void __exit completions_exit(void)
{
wait_for_completion(&crank_comp);
wait_for_completion(&flywheel_comp);
pr_info("completions exit\n");
}
module_init(completions_init);
module_exit(completions_exit);
MODULE_DESCRIPTION("Completions example");
MODULE_LICENSE("GPL");