memo

体調悪い。へろへろなんですがメモ。
デバイスドライバな課題。
仮想 FIFO なデバイスのためのドライバを云々との事。バッファの容量を越える書き込みに対応するために sleep() だの wakeup() だのが必要との事ですが、こうしたナニが 2.6 系でどうなのか。
ググッたら プロセスのBlockとWakeup というドキュメントに hit。DECLARE_WAITQUEUE というマクロは include/linux/wait.h にて定義されている。

#define __WAITQUEUE_INITIALIZER(name, tsk) {				\
	.private	= tsk,						\
	.func		= default_wake_function,			\
	.task_list	= { NULL, NULL } }

#define DECLARE_WAITQUEUE(name, tsk)					\
	wait_queue_t name = __WAITQUEUE_INITIALIZER(name, tsk)

ちなみに wait_queue_t は

typedef struct __wait_queue wait_queue_t;

と定義。struct __wait_queue は以下

struct __wait_queue {
	unsigned int flags;
#define WQ_FLAG_EXCLUSIVE	0x01
	void *private;
	wait_queue_func_t func;
	struct list_head task_list;
};

サンドイッチされてる define は何だろ。struct list_head は include/linux/list.h にて定義

struct list_head {
	struct list_head *next, *prev;
};

あと、default_wake_function は kernel/sched.c にて以下の定義

int default_wake_function(wait_queue_t *curr, unsigned mode, int sync,
			  void *key)
{
	return try_to_wake_up(curr->private, mode, sync);
}
EXPORT_SYMBOL(default_wake_function);

ちょっとまだ具体的な方法が見えてません。大体が open したプロセスをドライバがどうやって知るのか、が分からねぇ。
色々見てるに sleep_on() とか wake_up() なんてのはまだある模様。

void fastcall __sched sleep_on(wait_queue_head_t *q)
{
	SLEEP_ON_VAR

	current->state = TASK_UNINTERRUPTIBLE;

	SLEEP_ON_HEAD
	schedule();
	SLEEP_ON_TAIL
}
EXPORT_SYMBOL(sleep_on);

これは open したプロセスをドライバが知らなくても良いな。ってか current って何だ。