virtio-net で受信、送信の割り込みをどう区別するか? - virtio
前回の懸念事項「ICMP と ARP がまじる」というのは検証ミスだった。動作は正しい。受信は正しく動作してコードもまとまってきた。
virtio-net で送受信の割り込みをどう区別するか迷っている。
- 送信時には送信が完了したら割り込みが来る
- パケットを受信すると非同期で割り込みが来る
のだが、直後の ISR を読み込んでも割り込み要因が分からない。
それぞれの vring で vring->used->idx をチェックすればどちらの割り込みか分かるのだが、Mona の割り込み通知メッセージとのかねあいで状態保持が面倒だ。
実装案は 2つ。
- Monaの peekMessage を活用して自分宛の割り込みではなかったら無視する
- 送信はすぐに完了することが期待できるので割り込み通知を OFF にして spin lock で管理
さてどうしようか。
もう一つ思いついた。送信時は割り込みをチェックしない。次回送信時に used->idx を見て前回送信分の完了を確認し終わっていなければ spin lock 。
Todo
- receiver というクラス名はおかしい
- notify のタイミングをそれぞれ確認
- vring セットアップコードをリファクタリング
- 受信ループが必要。受信するクライアント側がさぼって、リングあふれが起きたらパケットは捨ててしまって良いのか?
- 適切なリングサイズは?