2016-09-07 12 views
0

私は、外部クロックを使ってタイミング機能を実行するカーネルモジュールを作成しています。基本的に、このモジュールは、クロックからのパルスをカウントし、頻繁にカウントを繰り返します。ユーザープロセスはioctlを使用して、特定のカウントで起きるように要求することができます。次に、いくつかのタスクを実行し、次回同じカウントが来るまで同じioctlを呼び出します。このようにして、これらの外部タイミングを使用して定期的に実行することができます。wait_event_interruptibleを使って定期的なイベントを待つ

私はwait_queue_head_tの配列を、利用可能なスケジュールスロットごとに1つずつ作成しました(つまり、上記のように各「カウント」)。ユーザプロセスがioctlを呼び出すとき、私は単にsleep_on()にioctl引数を指定して、スケジュールスロットを指定して待機キューを指定します。カーネルモジュールがクロックパルスを受信して​​カウントをインクリメントすると、カーネルモジュールはそのカウントに対応する待ち行列を起動します。

私は、プロセスがスリープするかどうかを確認するためのテスト、およびsleep_on()に対応するコールの間で変更する状態の可能性がありますので、それは、sleep_on()を使用するconsidered bad practiceであることを知っています。しかし、この場合、私は覚醒する事象が周期的であるため、睡眠前にそのような検査を行わない。まもなく別のものが来るので、ちょうど覚醒しているイベントを "見逃す"かどうかは関係ありません(実際には、ioctlが指定されたスケジュールスロットに非常に近く呼び出された場合、何かがうまくいかず、次のスロットとにかく)。

私はwait_event_interruptible()を使用して見ましたが、これはより安全だと考えられていますが、wait_event_interruptibleが必要とする条件引数には何を入れるべきかわかりません。 wait_event_interruptibleはスリープ状態に入る前にこの状態をチェックしますが、ioctlが呼び出されると常にスリープ状態にします。私は眠る前にクリアして目を覚ます前に設定するフラグを使うことができますが、待機キューに複数のプロセスがある場合にはうまくいかないかもしれないと心配しています。起きた。

私はこれについて心配していますか?または、wait_queue内のすべてのプロセスが起動する前にウェイクアップされることが保証されている(したがってフラグをクリアすることができますか?)このようなシステムを実装するより良い方法はありますか?実際にsleep_on()を使用するだけでいいですか? (もしそうなら、割り込み可能なsleep_on()のバージョンがありますか?)

答えて

1

中断可能なバージョンsleep_oninterruptible_sleep_onです。 sleep関数はカーネル3.15以降に削除されていることに注意してください。

wait_event_interruptibleについては、要件I want it to always sleep when the ioctl is invoked.が珍しいです。フラグを使用することもできますが、このフラグはプロセスごと(またはスケジュールごとのスロット)にする必要があります。または、待ちの回数を少なくともcurrent_count + 1に変更することができます。

このような珍しいシナリオでは、マクロwait_event_interruptibleの代わりに、それが構成するブロックを使用して、必要な方法で配置することができます。一般的に、待ちはどんな方法でも達成できます。

+0

ありがとうございました。私のカーネルはまだ 'interruptible_sleep_on()'を持っているので、今のところそれを使用します。私は、プロセスごとのフラグを実装し、それをioctlに渡すことは考えていませんでした。私が必要な場合には、wait_event_interruptible()を使う最良の方法のように聞こえます。 – llakais

関連する問題