1. 25 4月, 2012 4 次提交
    • M
      virtio: order index/descriptor reads · a821ce59
      Michael S. Tsirkin 提交于
      virtio has the equivalent of:
      
      	if (vq->last_avail_index != vring_avail_idx(vq)) {
      		read descriptor head at vq->last_avail_index;
      	}
      
      In theory, processor can reorder descriptor head
      read to happen speculatively before the index read.
      this would trigger the following race:
      
      	host descriptor head read <- reads invalid head from ring
      		guest writes valid descriptor head
      		guest writes avail index
      	host avail index read <- observes valid index
      
      as a result host will use an invalid head value.
      This was not observed in the field by me but after
      the experience with the previous two races
      I think it is prudent to address this theoretical race condition.
      Signed-off-by: NMichael S. Tsirkin <mst@redhat.com>
      a821ce59
    • M
      virtio: add missing mb() on enable notification · 92045d80
      Michael S. Tsirkin 提交于
      This fixes an issue dual to the one fixed by
      patch 'virtio: add missing mb() on notification'
      and applies on top.
      
      In this case, to enable vq kick to exit to host,
      qemu writes out used flag then reads the
      avail index. if these are reordered we get a race:
      
          host avail index read: ring is empty
          		guest avail index write
          		guest flag read: exit disabled
          host used flag write: enable exit
      
      which results in a lost exit: host will never be notified about the
      avail index update.  Again, happens in the field but only seems to
      trigger on some specific hardware.
      
      Insert an smp_mb barrier operation to ensure the correct ordering.
      Signed-off-by: NMichael S. Tsirkin <mst@redhat.com>
      92045d80
    • M
      virtio: add missing mb() on notification · a281ebc1
      Michael S. Tsirkin 提交于
      During normal operation, virtio first writes a used index
      and then checks whether it should interrupt the guest
      by reading guest avail index/flag values.
      
      Guest does the reverse: writes the index/flag,
      then checks the used ring.
      
      The ordering is important: if host avail flag read bypasses the used
      index write, we could in effect get this timing:
      
      host avail flag read
      		guest enable interrupts: avail flag write
      		guest check used ring: ring is empty
      host used index write
      
      which results in a lost interrupt: guest will never be notified
      about the used ring update.
      
      This actually can happen when using kvm with an io thread,
      such that the guest vcpu and qemu run on different host cpus,
      and this has actually been observed in the field
      (but only seems to trigger on very specific processor types)
      with userspace virtio: vhost has the necessary smp_mb()
      in place to prevent the regordering, so the same workload stalls
      forever waiting for an interrupt with vhost=off but works
      fine with vhost=on.
      
      Insert an smp_mb barrier operation in userspace virtio to
      ensure the correct ordering.
      Applying this patch fixed the race condition we have observed.
      Tested on x86_64. I checked the code generated by the new macro
      for i386 and ppc but didn't run virtio.
      
      Note: mb could in theory be implemented by __sync_synchronize, but this
      would make us hit old GCC bugs. Besides old GCC
      not implementing __sync_synchronize at all, there were bugs
      http://gcc.gnu.org/bugzilla/show_bug.cgi?id=36793
      in this functionality as recently as in 4.3.
      
      As we need asm for rmb,wmb anyway, it's just as well to
      use it for mb.
      Signed-off-by: NMichael S. Tsirkin <mst@redhat.com>
      a281ebc1
    • M
      e1000: move reset function earlier in file · 814cd3ac
      Michael S. Tsirkin 提交于
      Make it easier to reuse this function.
      Signed-off-by: NMichael S. Tsirkin <mst@redhat.com>
      814cd3ac
  2. 24 4月, 2012 35 次提交
  3. 23 4月, 2012 1 次提交