12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576 |
- /*
- * completions.c
- */
- #include <linux/completion.h>
- #include <linux/init.h>
- #include <linux/kernel.h>
- #include <linux/kthread.h>
- #include <linux/module.h>
- static struct {
- struct completion crank_comp;
- struct completion flywheel_comp;
- } machine;
- static int machine_crank_thread(void *arg)
- {
- pr_info("Turn the crank\n");
- complete_all(&machine.crank_comp);
- complete_and_exit(&machine.crank_comp, 0);
- }
- static int machine_flywheel_spinup_thread(void *arg)
- {
- wait_for_completion(&machine.crank_comp);
- pr_info("Flywheel spins up\n");
- complete_all(&machine.flywheel_comp);
- complete_and_exit(&machine.flywheel_comp, 0);
- }
- static int completions_init(void)
- {
- struct task_struct *crank_thread;
- struct task_struct *flywheel_thread;
- pr_info("completions example\n");
- init_completion(&machine.crank_comp);
- init_completion(&machine.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 completions_exit(void)
- {
- wait_for_completion(&machine.crank_comp);
- wait_for_completion(&machine.flywheel_comp);
- pr_info("completions exit\n");
- }
- module_init(completions_init);
- module_exit(completions_exit);
- MODULE_DESCRIPTION("Completions example");
- MODULE_LICENSE("GPL");
|