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 F3B82A0613 for ; Wed, 25 Sep 2019 21:31:27 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 9A1C81E2B; Wed, 25 Sep 2019 21:31:26 +0200 (CEST) Received: from mail.lysator.liu.se (mail.lysator.liu.se [130.236.254.3]) by dpdk.org (Postfix) with ESMTP id 4A0821E25 for ; Wed, 25 Sep 2019 21:31:25 +0200 (CEST) Received: from mail.lysator.liu.se (localhost [127.0.0.1]) by mail.lysator.liu.se (Postfix) with ESMTP id C94944000C for ; Wed, 25 Sep 2019 21:31:24 +0200 (CEST) Received: by mail.lysator.liu.se (Postfix, from userid 1004) id B741540002; Wed, 25 Sep 2019 21:31:24 +0200 (CEST) X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on bernadotte.lysator.liu.se X-Spam-Level: X-Spam-Status: No, score=-1.0 required=5.0 tests=ALL_TRUSTED,AWL autolearn=disabled version=3.4.2 X-Spam-Score: -1.0 Received: from [192.168.1.59] (host-90-232-207-236.mobileonline.telia.com [90.232.207.236]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.lysator.liu.se (Postfix) with ESMTPSA id A1C8E40002; Wed, 25 Sep 2019 21:31:22 +0200 (CEST) To: Marvin Liu , maxime.coquelin@redhat.com, tiwei.bie@intel.com, zhihong.wang@intel.com, stephen@networkplumber.org, gavin.hu@arm.com Cc: dev@dpdk.org References: <20190919163643.24130-2-yong.liu@intel.com> <20190925171329.63734-1-yong.liu@intel.com> <20190925171329.63734-4-yong.liu@intel.com> From: =?UTF-8?Q?Mattias_R=c3=b6nnblom?= Message-ID: Date: Wed, 25 Sep 2019 21:31:21 +0200 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101 Thunderbird/60.8.0 MIME-Version: 1.0 In-Reply-To: <20190925171329.63734-4-yong.liu@intel.com> Content-Type: text/plain; charset=utf-8; format=flowed Content-Language: en-US Content-Transfer-Encoding: 7bit X-Virus-Scanned: ClamAV using ClamSMTP Subject: Re: [dpdk-dev] [PATCH v3 03/15] vhost: add batch enqueue function for packed ring 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" On 2019-09-25 19:13, Marvin Liu wrote: > Batch enqueue function will first check whether descriptors are cache > aligned. It will also check prerequisites in the beginning. Batch > enqueue function not support chained mbufs, single packet enqueue > function will handle it. > > Signed-off-by: Marvin Liu > > diff --git a/lib/librte_vhost/vhost.h b/lib/librte_vhost/vhost.h > index 4cba8c5ef..e241436c7 100644 > --- a/lib/librte_vhost/vhost.h > +++ b/lib/librte_vhost/vhost.h > @@ -39,6 +39,10 @@ > > #define VHOST_LOG_CACHE_NR 32 > > +#define PACKED_BATCH_SIZE (RTE_CACHE_LINE_SIZE / \ > + sizeof(struct vring_packed_desc)) > +#define PACKED_BATCH_MASK (PACKED_BATCH_SIZE - 1) > + > #ifdef SUPPORT_GCC_UNROLL_PRAGMA > #define UNROLL_PRAGMA_PARAM "GCC unroll 4" > #endif > diff --git a/lib/librte_vhost/virtio_net.c b/lib/librte_vhost/virtio_net.c > index 520c4c6a8..5e08f7d9b 100644 > --- a/lib/librte_vhost/virtio_net.c > +++ b/lib/librte_vhost/virtio_net.c > @@ -883,6 +883,86 @@ virtio_dev_rx_split(struct virtio_net *dev, struct vhost_virtqueue *vq, > return pkt_idx; > } > > +static __rte_unused int > +virtio_dev_rx_batch_packed(struct virtio_net *dev, struct vhost_virtqueue *vq, > + struct rte_mbuf **pkts) > +{ > + bool wrap_counter = vq->avail_wrap_counter; > + struct vring_packed_desc *descs = vq->desc_packed; > + uint16_t avail_idx = vq->last_avail_idx; > + uint64_t desc_addrs[PACKED_BATCH_SIZE]; > + struct virtio_net_hdr_mrg_rxbuf *hdrs[PACKED_BATCH_SIZE]; > + uint32_t buf_offset = dev->vhost_hlen; > + uint64_t lens[PACKED_BATCH_SIZE]; > + uint16_t i; > + > + if (unlikely(avail_idx & PACKED_BATCH_MASK)) > + return -1; Does this really generate better code than just "avail_idx < PACKED_BATCH_SIZE"? and+jne vs cmp+jbe. > + > + if (unlikely((avail_idx + PACKED_BATCH_SIZE) > vq->size)) > + return -1; > + > + UNROLL_PRAGMA(UNROLL_PRAGMA_PARAM) > + for (i = 0; i < PACKED_BATCH_SIZE; i++) { > + if (unlikely(pkts[i]->next != NULL)) > + return -1; > + if (unlikely(!desc_is_avail(&descs[avail_idx + i], > + wrap_counter))) > + return -1; > + } > + > + rte_smp_rmb(); > + > + UNROLL_PRAGMA(UNROLL_PRAGMA_PARAM) > + for (i = 0; i < PACKED_BATCH_SIZE; i++) > + lens[i] = descs[avail_idx + i].len; > + > + UNROLL_PRAGMA(UNROLL_PRAGMA_PARAM) > + for (i = 0; i < PACKED_BATCH_SIZE; i++) { > + if (unlikely(pkts[i]->pkt_len > (lens[i] - buf_offset))) > + return -1; > + } > + > + UNROLL_PRAGMA(UNROLL_PRAGMA_PARAM) > + for (i = 0; i < PACKED_BATCH_SIZE; i++) > + desc_addrs[i] = vhost_iova_to_vva(dev, vq, > + descs[avail_idx + i].addr, > + &lens[i], > + VHOST_ACCESS_RW); > + UNROLL_PRAGMA(UNROLL_PRAGMA_PARAM) > + for (i = 0; i < PACKED_BATCH_SIZE; i++) { > + if (unlikely(lens[i] != descs[avail_idx + i].len)) > + return -1; > + } > + > + UNROLL_PRAGMA(UNROLL_PRAGMA_PARAM) > + for (i = 0; i < PACKED_BATCH_SIZE; i++) { > + rte_prefetch0((void *)(uintptr_t)desc_addrs[i]); > + hdrs[i] = (struct virtio_net_hdr_mrg_rxbuf *) > + (uintptr_t)desc_addrs[i]; > + lens[i] = pkts[i]->pkt_len + dev->vhost_hlen; > + } > + > + UNROLL_PRAGMA(UNROLL_PRAGMA_PARAM) > + for (i = 0; i < PACKED_BATCH_SIZE; i++) > + virtio_enqueue_offload(pkts[i], &hdrs[i]->hdr); > + > + vq->last_avail_idx += PACKED_BATCH_SIZE; > + if (vq->last_avail_idx >= vq->size) { > + vq->last_avail_idx -= vq->size; > + vq->avail_wrap_counter ^= 1; > + } > + > + UNROLL_PRAGMA(UNROLL_PRAGMA_PARAM) > + for (i = 0; i < PACKED_BATCH_SIZE; i++) { > + rte_memcpy((void *)(uintptr_t)(desc_addrs[i] + buf_offset), > + rte_pktmbuf_mtod_offset(pkts[i], void *, 0), > + pkts[i]->pkt_len); > + } > + > + return 0; > +} > + > static __rte_unused int16_t > virtio_dev_rx_single_packed(struct virtio_net *dev, struct vhost_virtqueue *vq, > struct rte_mbuf *pkt) >