パケット遅延調査 - 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);
        }