По этому запросу
ssize_t foo_read(struct file *filp, char *buf, size_t count,loff_t *ppos)
{
foo_dev_t * foo_dev = filp->private_data;
if (down_interruptible(&foo_dev->sem)
return -ERESTARTSYS;
foo_dev->intr = 0;
outb(DEV_FOO_READ, DEV_FOO_CONTROL_PORT);
wait_event_interruptible(foo_dev->wait, (foo_dev->intr= =1));
if (put_user(foo_dev->data, buf))
return -EFAULT;
up(&foo_dev->sem);
return 1;
}
С таким завершением
irqreturn_t foo_interrupt(int irq, void *dev_id, struct pt_regs *regs)
{
foo->data = inb(DEV_FOO_DATA_PORT);
foo->intr = 1;
wake_up_interruptible(&foo->wait);
return 1;
}
При условии, что foo_dev-> sem изначально равен 1, тогда только одному потоку разрешено выполнять раздел после down_interruptible (& foo_dev-> sem) и потоки, ожидающие этого семафора, имеют смысл поместить в очередь. (Как я понимаю, создание в foo_dev-> sem больше единицы будет проблемой в этом коде).
Так что, если только один проходВсегда, что использовать foo_dev-> очередь ожидания, нельзя ли приостановить текущий поток, сохранить его указатель как глобальный * curr и разбудить его, когда он завершит свой запрос?