From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from dpdk.org (dpdk.org [92.243.14.124]) by inbox.dpdk.org (Postfix) with ESMTP id DF5DEA09EF; Mon, 21 Dec 2020 16:51:30 +0100 (CET) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 23DC9CABE; Mon, 21 Dec 2020 16:51:12 +0100 (CET) Received: from foss.arm.com (foss.arm.com [217.140.110.172]) by dpdk.org (Postfix) with ESMTP id B4BBBCAA9 for ; Mon, 21 Dec 2020 16:51:09 +0100 (CET) Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id 3A0A11042; Mon, 21 Dec 2020 07:51:09 -0800 (PST) Received: from net-arm-thunderx2-03.shanghai.arm.com (net-arm-thunderx2-03.shanghai.arm.com [10.169.208.206]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPA id 15D513F6CF; Mon, 21 Dec 2020 07:51:06 -0800 (PST) From: Joyce Kong To: maxime.coquelin@redhat.com, chenbo.xia@intel.com, honnappa.nagarahalli@arm.com, ruifeng.wang@arm.com Cc: dev@dpdk.org, nd@arm.com Date: Mon, 21 Dec 2020 23:50:26 +0800 Message-Id: <20201221155033.6771-2-joyce.kong@arm.com> X-Mailer: git-send-email 2.29.2 In-Reply-To: <20201221155033.6771-1-joyce.kong@arm.com> References: <20201221155033.6771-1-joyce.kong@arm.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Subject: [dpdk-dev] [PATCH v1 1/8] examples/vhost: relax memory ordering when enqueue/dequeue X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" Use C11 atomic APIs with one-way barriers to replace two-way barriers when operating enqueue/dequeue. Used->idx and avail->idx are the synchronization points for split vring. Signed-off-by: Joyce Kong Reviewed-by: Ruifeng Wang --- examples/vhost/virtio_net.c | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/examples/vhost/virtio_net.c b/examples/vhost/virtio_net.c index 8ea6b36d5..64bf3d19f 100644 --- a/examples/vhost/virtio_net.c +++ b/examples/vhost/virtio_net.c @@ -191,7 +191,7 @@ vs_enqueue_pkts(struct vhost_dev *dev, uint16_t queue_id, queue = &dev->queues[queue_id]; vr = &queue->vr; - avail_idx = *((volatile uint16_t *)&vr->avail->idx); + avail_idx = __atomic_load_n(&vr->avail->idx, __ATOMIC_ACQUIRE); start_idx = queue->last_used_idx; free_entries = avail_idx - start_idx; count = RTE_MIN(count, free_entries); @@ -224,9 +224,7 @@ vs_enqueue_pkts(struct vhost_dev *dev, uint16_t queue_id, rte_prefetch0(&vr->desc[desc_indexes[i+1]]); } - rte_smp_wmb(); - - *(volatile uint16_t *)&vr->used->idx += count; + __atomic_add_fetch(&vr->used->idx, count, __ATOMIC_RELEASE); queue->last_used_idx += count; rte_vhost_vring_call(dev->vid, queue_id); @@ -374,7 +372,7 @@ vs_dequeue_pkts(struct vhost_dev *dev, uint16_t queue_id, queue = &dev->queues[queue_id]; vr = &queue->vr; - free_entries = *((volatile uint16_t *)&vr->avail->idx) - + free_entries = __atomic_load_n(&vr->avail->idx, __ATOMIC_ACQUIRE) - queue->last_avail_idx; if (free_entries == 0) return 0; @@ -429,10 +427,8 @@ vs_dequeue_pkts(struct vhost_dev *dev, uint16_t queue_id, queue->last_avail_idx += i; queue->last_used_idx += i; - rte_smp_wmb(); - rte_smp_rmb(); - vr->used->idx += i; + __atomic_add_fetch(&vr->used->idx, i, __ATOMIC_ACQ_REL); rte_vhost_vring_call(dev->vid, queue_id); -- 2.29.2