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 セットアップコードをリファクタリング
  • 受信ループが必要。受信するクライアント側がさぼって、リングあふれが起きたらパケットは捨ててしまって良いのか?
    • 適切なリングサイズは?