Skip to content

Day18 - Blocking I/O and Event-Driven Driver

๐ŸŽฏ Objective

Upgrade mygpio driver to support:

  • blocking read()
  • non-blocking read()
  • poll()
  • event queue + wakeup

๐Ÿ”ง Step 1 โ€” Event Queue Helper

bool mygpio_event_enqueue(...)
bool mygpio_event_dequeue(...)
  • protect with spinlock
  • return success / failure

๐Ÿ”ง Step 2 โ€” Workqueue Handler

if (!enqueue)
    return;

enqueue_done = mygpio_event_enqueue(...);

if (enqueue_done)
    wake_up_interruptible(&dev->read_queue);

๐Ÿ”ง Step 3 โ€” Blocking read()

if (!event_ready) {

    if (file->f_flags & O_NONBLOCK)
        return -EAGAIN;

    ret = wait_event_interruptible(dev->read_queue,
                                   dev->event_count > 0);

    if (ret)
        return ret;
}

๐Ÿ”ง Step 4 โ€” Dequeue + copy_to_user

mygpio_event_dequeue(...);
copy_to_user(...);

๐Ÿ”ง Step 5 โ€” poll()

poll_wait(file, &dev->read_queue, wait);

if (dev->event_count > 0)
    return POLLIN;

๐Ÿงช Test 1 โ€” Blocking

cat /dev/mygpio

Expected:

  • no input โ†’ block
  • press button โ†’ output

๐Ÿงช Test 2 โ€” Non-blocking

open(O_NONBLOCK)

Expected:

  • no event โ†’ -EAGAIN

๐Ÿงช Test 3 โ€” poll

python poll_mygpio.py

Expected:

  • no busy loop
  • event-driven output

๐Ÿงช Test 4 โ€” Overflow

Rapid button press

Expected:

  • event drop log
  • no crash

๐Ÿงช Test 5 โ€” sysfs + ioctl

echo 50 > /sys/class/mygpio/mygpio/debounce_ms

Expected:

  • driver stable
  • debounce updated

โœ… Result

Driver supports:

  • blocking I/O
  • async event notification
  • proper Linux behavior