From mboxrd@z Thu Jan 1 00:00:00 1970 From: Ilya Maximets Subject: [PATCH v3 1/3] net/virtio: add missing barrier before reading the flags Date: Wed, 9 Jan 2019 17:50:13 +0300 Message-ID: <20190109145015.3010-2-i.maximets@samsung.com> References: <20181226163712.31596-1-i.maximets@samsung.com> <20190109145015.3010-1-i.maximets@samsung.com> Content-Type: text/plain; charset="utf-8" Cc: Tiwei Bie , Zhihong Wang , jfreimann@redhat.com, Jason Wang , xiaolong.ye@intel.com, alejandro.lucero@netronome.com, Ilya Maximets , stable@dpdk.org To: dev@dpdk.org, Maxime Coquelin , "Michael S . Tsirkin" , Xiao Wang Return-path: Received: from mailout1.w1.samsung.com (mailout1.w1.samsung.com [210.118.77.11]) by dpdk.org (Postfix) with ESMTP id 2DA241B483 for ; Wed, 9 Jan 2019 15:50:29 +0100 (CET) Received: from eucas1p1.samsung.com (unknown [182.198.249.206]) by mailout1.w1.samsung.com (KnoxPortal) with ESMTP id 20190109145029euoutp012c32c5518147c31a2ab9c8d22f112ec0~4NZ7-JpG32916829168euoutp01W for ; Wed, 9 Jan 2019 14:50:29 +0000 (GMT) In-Reply-To: <20190109145015.3010-1-i.maximets@samsung.com> List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" Reading the used->flags could be reordered with avail->idx update. vhost in kernel disables notifications for the time of packets receiving, like this: 1. disable notify 2. process packets 3. enable notify 4. has more packets ? goto 1 In case of reordering, virtio driver could read the flags on step 2 while notifications disabled and update avail->idx after the step 4, i.e. vhost will exit the loop on step 4 with notifications enabled, but virtio will not notify. Fixes: c1f86306a026 ("virtio: add new driver") CC: stable@dpdk.org Reported-by: Shahaf Shuler Signed-off-by: Ilya Maximets --- drivers/net/virtio/virtqueue.h | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/drivers/net/virtio/virtqueue.h b/drivers/net/virtio/virtqueue.h index d8ae5cdec..dffa03669 100644 --- a/drivers/net/virtio/virtqueue.h +++ b/drivers/net/virtio/virtqueue.h @@ -415,6 +415,11 @@ vq_update_avail_ring(struct virtqueue *vq, uint16_t desc_idx) static inline int virtqueue_kick_prepare(struct virtqueue *vq) { + /* + * Ensure updated avail->idx is visible to vhost before reading + * the used->flags. + */ + virtio_mb(); return !(vq->vq_ring.used->flags & VRING_USED_F_NO_NOTIFY); } @@ -423,6 +428,9 @@ virtqueue_kick_prepare_packed(struct virtqueue *vq) { uint16_t flags; + /* + * Ensure updated data is visible to vhost before reading the flags. + */ virtio_mb(); flags = vq->ring_packed.device_event->desc_event_flags; -- 2.17.1