net/virtio: fix interrupt helper for packed ring
authorTiwei Bie <tiwei.bie@intel.com>
Tue, 19 Mar 2019 06:43:04 +0000 (14:43 +0800)
committerFerruh Yigit <ferruh.yigit@intel.com>
Wed, 20 Mar 2019 17:15:42 +0000 (18:15 +0100)
When disabling interrupt, the shadow event flags should also be
updated accordingly. The unnecessary wmb is also dropped.

Fixes: e9f4feb7e622 ("net/virtio: add packed virtqueue helpers")
Cc: stable@dpdk.org
Signed-off-by: Tiwei Bie <tiwei.bie@intel.com>
Reviewed-by: Maxime Coquelin <maxime.coquelin@redhat.com>
drivers/net/virtio/virtqueue.h

index ca9d8e6..24fa873 100644 (file)
@@ -321,12 +321,13 @@ vring_desc_init_split(struct vring_desc *dp, uint16_t n)
 static inline void
 virtqueue_disable_intr_packed(struct virtqueue *vq)
 {
-       uint16_t *event_flags = &vq->ring_packed.driver_event->desc_event_flags;
-
-       *event_flags = RING_EVENT_FLAGS_DISABLE;
+       if (vq->event_flags_shadow != RING_EVENT_FLAGS_DISABLE) {
+               vq->event_flags_shadow = RING_EVENT_FLAGS_DISABLE;
+               vq->ring_packed.driver_event->desc_event_flags =
+                       vq->event_flags_shadow;
+       }
 }
 
-
 /**
  * Tell the backend not to interrupt us.
  */
@@ -348,7 +349,6 @@ virtqueue_enable_intr_packed(struct virtqueue *vq)
        uint16_t *event_flags = &vq->ring_packed.driver_event->desc_event_flags;
 
        if (vq->event_flags_shadow == RING_EVENT_FLAGS_DISABLE) {
-               virtio_wmb(vq->hw->weak_barriers);
                vq->event_flags_shadow = RING_EVENT_FLAGS_ENABLE;
                *event_flags = vq->event_flags_shadow;
        }