From c33cdd8704246887e11d7c353f773f7b488a47f2 Mon Sep 17 00:00:00 2001 From: Luke Gorrie Date: Thu, 9 Apr 2015 05:54:57 +0200 Subject: [PATCH] virtq: Use hardware memory barrier in "call" This fixes a subtle bug where the guest can become stuck due to missing an interrupt. This happens with e.g. Linux kernel guests that use interrupts and not e.g. DPDK guests that are polling. See details on snabb-devel: https://groups.google.com/d/msg/snabb-devel/8oGjqlSkiqw/4Yi9CVEdjD0J --- src/lib/virtio/virtq.lua | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/lib/virtio/virtq.lua b/src/lib/virtio/virtq.lua index eaa0704500..20aeee9c87 100644 --- a/src/lib/virtio/virtq.lua +++ b/src/lib/virtio/virtq.lua @@ -101,9 +101,10 @@ end -- Prepared argument for writing a 1 to an eventfd. local eventfd_one = ffi.new("uint64_t[1]", {1}) -function VirtioVirtq:signal_used() +function VirtioVirtq:signal_used () if self.virtq.used.idx ~= self.used then self.virtq.used.idx = self.used + C.full_memory_barrier() if band(self.virtq.avail.flags, C.VRING_F_NO_INTERRUPT) == 0 then C.write(self.callfd, eventfd_one, 8) end