From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by dpdk.org (Postfix) with ESMTP id 079BF5B36 for ; Thu, 25 Oct 2018 15:48:20 +0200 (CEST) Received: from smtp.corp.redhat.com (int-mx03.intmail.prod.int.phx2.redhat.com [10.5.11.13]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 4765E300C230; Thu, 25 Oct 2018 13:48:20 +0000 (UTC) Received: from localhost (ovpn-116-70.ams2.redhat.com [10.36.116.70]) by smtp.corp.redhat.com (Postfix) with ESMTPS id BBE3B60A9E; Thu, 25 Oct 2018 13:48:19 +0000 (UTC) Date: Thu, 25 Oct 2018 15:48:17 +0200 From: Jens Freimann To: Tiwei Bie Cc: dev@dpdk.org, maxime.coquelin@redhat.com, zhihong.wang@intel.com Message-ID: <20181025134737.vzstdn5td7b55nej@jenstp.localdomain> References: <20181024143236.21271-1-jfreimann@redhat.com> <20181024143236.21271-2-jfreimann@redhat.com> <20181025092115.GA22179@debian> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii; format=flowed Content-Disposition: inline In-Reply-To: <20181025092115.GA22179@debian> User-Agent: NeoMutt/20180716 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.13 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.47]); Thu, 25 Oct 2018 13:48:20 +0000 (UTC) Subject: Re: [dpdk-dev] [PATCH v9 1/8] net/virtio: vring init for packed queues 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: , X-List-Received-Date: Thu, 25 Oct 2018 13:48:21 -0000 On Thu, Oct 25, 2018 at 05:21:15PM +0800, Tiwei Bie wrote: >On Wed, Oct 24, 2018 at 04:32:29PM +0200, Jens Freimann wrote: >> Add and initialize descriptor data structures. >> >> Signed-off-by: Jens Freimann >> --- >> drivers/net/virtio/virtio_ethdev.c | 18 ++++---- >> drivers/net/virtio/virtio_pci.h | 7 +++ >> drivers/net/virtio/virtio_ring.h | 74 ++++++++++++++++++++++++++---- >> drivers/net/virtio/virtqueue.h | 15 +++++- >> 4 files changed, 95 insertions(+), 19 deletions(-) >> >> diff --git a/drivers/net/virtio/virtio_ethdev.c b/drivers/net/virtio/virtio_ethdev.c >> index 730c41707..6130aef16 100644 >> --- a/drivers/net/virtio/virtio_ethdev.c >> +++ b/drivers/net/virtio/virtio_ethdev.c >> @@ -299,19 +299,21 @@ virtio_init_vring(struct virtqueue *vq) >> >> PMD_INIT_FUNC_TRACE(); >> >> - /* >> - * Reinitialise since virtio port might have been stopped and restarted >> - */ > >Why above comments are removed? by mistake, I'll put them back in next version. > >> memset(ring_mem, 0, vq->vq_ring_size); >> - vring_init(vr, size, ring_mem, VIRTIO_PCI_VRING_ALIGN); >> + vring_init(vq->hw, vr, size, ring_mem, VIRTIO_PCI_VRING_ALIGN); >> + >> vq->vq_used_cons_idx = 0; >> vq->vq_desc_head_idx = 0; >> vq->vq_avail_idx = 0; >> vq->vq_desc_tail_idx = (uint16_t)(vq->vq_nentries - 1); >> vq->vq_free_cnt = vq->vq_nentries; >> memset(vq->vq_descx, 0, sizeof(struct vq_desc_extra) * vq->vq_nentries); >> - >> - vring_desc_init(vr->desc, size); >> + if (vtpci_packed_queue(vq->hw)) { >> + if (!vtpci_with_feature(vq->hw, VIRTIO_F_IN_ORDER)) >> + vring_desc_init_packed(vq, size); > >Don't we need to initialize descs in IN-ORDER case? Yes, I missed this here. I'll fix it. > >> + } else { >> + vring_desc_init_split(vr->desc, size); >> + } >> >> /* >> * Disable device(host) interrupting guest >> @@ -386,7 +388,7 @@ virtio_init_queue(struct rte_eth_dev *dev, uint16_t vtpci_queue_idx) >> /* >> * Reserve a memzone for vring elements >> */ >> - size = vring_size(vq_size, VIRTIO_PCI_VRING_ALIGN); >> + size = vring_size(hw, vq_size, VIRTIO_PCI_VRING_ALIGN); >> vq->vq_ring_size = RTE_ALIGN_CEIL(size, VIRTIO_PCI_VRING_ALIGN); >> PMD_INIT_LOG(DEBUG, "vring_size: %d, rounded_vring_size: %d", >> size, vq->vq_ring_size); >> @@ -489,7 +491,7 @@ virtio_init_queue(struct rte_eth_dev *dev, uint16_t vtpci_queue_idx) >> for (i = 0; i < vq_size; i++) { >> struct vring_desc *start_dp = txr[i].tx_indir; >> >> - vring_desc_init(start_dp, RTE_DIM(txr[i].tx_indir)); >> + vring_desc_init_split(start_dp, RTE_DIM(txr[i].tx_indir)); >> >> /* first indirect descriptor is always the tx header */ >> start_dp->addr = txvq->virtio_net_hdr_mem >> diff --git a/drivers/net/virtio/virtio_pci.h b/drivers/net/virtio/virtio_pci.h >> index 58fdd3d45..c487d2be0 100644 >> --- a/drivers/net/virtio/virtio_pci.h >> +++ b/drivers/net/virtio/virtio_pci.h >> @@ -113,6 +113,7 @@ struct virtnet_ctl; >> >> #define VIRTIO_F_VERSION_1 32 >> #define VIRTIO_F_IOMMU_PLATFORM 33 >> +#define VIRTIO_F_RING_PACKED 34 >> >> /* >> * Some VirtIO feature bits (currently bits 28 through 31) are >> @@ -314,6 +315,12 @@ vtpci_with_feature(struct virtio_hw *hw, uint64_t bit) >> return (hw->guest_features & (1ULL << bit)) != 0; >> } >> >> +static inline int >> +vtpci_packed_queue(struct virtio_hw *hw) >> +{ >> + return vtpci_with_feature(hw, VIRTIO_F_RING_PACKED); >> +} >> + >> /* >> * Function declaration from virtio_pci.c >> */ >> diff --git a/drivers/net/virtio/virtio_ring.h b/drivers/net/virtio/virtio_ring.h >> index 9e3c2a015..e65da100b 100644 >> --- a/drivers/net/virtio/virtio_ring.h >> +++ b/drivers/net/virtio/virtio_ring.h >> @@ -54,11 +54,38 @@ struct vring_used { >> struct vring_used_elem ring[0]; >> }; >> >> +/* For support of packed virtqueues in Virtio 1.1 the format of descriptors >> + * looks like this. >> + */ >> +struct vring_desc_packed { >> + uint64_t addr; >> + uint32_t len; >> + uint16_t index; > >s/index/id/ ok > >> + uint16_t flags; >> +} __attribute__ ((aligned(16))); > >We don't need the "__attribute__ ((aligned(16)))" in descriptor >structure's definition. Someone requested this in an earlier round of reviews, but I'll check again. > >> + >> +#define RING_EVENT_FLAGS_ENABLE 0x0 >> +#define RING_EVENT_FLAGS_DISABLE 0x1 >> +#define RING_EVENT_FLAGS_DESC 0x2 > >Please add an empty line here. ok > >> +struct vring_packed_desc_event { >> + uint16_t desc_event_off_wrap; >> + uint16_t desc_event_flags; >> +}; >> + >> struct vring { >> unsigned int num; >> - struct vring_desc *desc; >> - struct vring_avail *avail; >> - struct vring_used *used; >> + union { >> + struct vring_desc_packed *desc_packed; >> + struct vring_desc *desc; >> + }; >> + union { >> + struct vring_avail *avail; >> + struct vring_packed_desc_event *driver_event; >> + }; >> + union { >> + struct vring_used *used; >> + struct vring_packed_desc_event *device_event; >> + }; >> }; >> > >We should define a new `vring` structure for packed ring. I think it was requested to have it as a union before, but I can do it. Thanks for your review! regards, Jens > >Thanks