Skip to content

waitqueue

MarekBykowski edited this page Feb 13, 2026 · 7 revisions

Home

wait_event(my_wq, condition) does:

  • Add current task to wait queue
  • Set state TASK_UNINTERRUPTIBLE
  • Schedule
  • Wakeup
  • Re-check condition
  • Exit when true

wake_up(&my_wq):

  • Iterates wait queue list
  • Marks tasks runnable
  • Moves them to runqueue
  • They resume after schedule()
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/kthread.h>
#include <linux/wait.h>
#include <linux/delay.h>

static DECLARE_WAIT_QUEUE_HEAD(my_wq);
static int data_ready;

static struct task_struct *consumer_task;
static struct task_struct *producer_task;

static int consumer_thread(void *arg)
{
    pr_info("Consumer: waiting...\n");

    wait_event(my_wq, data_ready != 0);

    pr_info("Consumer: woken up!\n");

    return 0;
}

static int producer_thread(void *arg)
{
    msleep(1000);

    pr_info("Producer: setting data_ready\n");

    /* Important: condition first */
    WRITE_ONCE(data_ready, 1);

    /* Then wake */
    wake_up(&my_wq);

    return 0;
}

static int __init my_init(void)
{
    data_ready = 0;

    consumer_task = kthread_run(consumer_thread, NULL, "consumer");
    producer_task = kthread_run(producer_thread, NULL, "producer");

    return 0;
}

static void __exit my_exit(void)
{
    pr_info("Module exit\n");
}

module_init(my_init);
module_exit(my_exit);
MODULE_LICENSE("GPL");

Clone this wiki locally