パケット遅延調査 - virtio
QEMU にログを吐かせて調べたところ、予想していなかった部分の spin lock で 1000 msec 待たされていることが分かった。
ほぼ 1000 msec ってのが怪しいなあ。
bool receive(Ether::Frame* dst) { waitInterrupt(); // ここから while (readVring_->used->idx == lastUsedIndexRead_) { VIRT_LOG("waiting in lastUsedIndexRead_=%d", lastUsedIndexRead_); } // ここ int next_used = readVring_->used->idx; if (!(readVring_->used->flags & VRING_USED_F_NO_NOTIFY)) { VIRT_LOG("NOTIFY"); outp16(baseAddress_ + VIRTIO_PCI_QUEUE_NOTIFY, 0); }