From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id 84C85A0547; Tue, 26 Oct 2021 18:30:17 +0200 (CEST) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id E59A14114F; Tue, 26 Oct 2021 18:29:41 +0200 (CEST) Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [216.205.24.124]) by mails.dpdk.org (Postfix) with ESMTP id 95D8941169 for ; Tue, 26 Oct 2021 18:29:40 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1635265780; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=cbIn/QfLIWc6JUHbVSRIYgRDFuzRl8w0JaK8zWtydUA=; b=Z3+w4+coz6f62heAjoI3la62f2UxFBd7Gz/YgWQxGNYDm/5i5VZxUnq/kkg/HvMyPDFX0Y 3qI7IB8rJqq0aNN3VXXbDAQYmoJvnKYoMEcnwKqTiEActqOGlWL/RtjhFIOplBKhqa5diK 7GaAt+3yyxH8BDxMQzEmfahVXVNHDMM= Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-389-BjKMVvHNMs6UQqA3wcfiQw-1; Tue, 26 Oct 2021 12:29:37 -0400 X-MC-Unique: BjKMVvHNMs6UQqA3wcfiQw-1 Received: from smtp.corp.redhat.com (int-mx07.intmail.prod.int.phx2.redhat.com [10.5.11.22]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id ACB9B1006AA2; Tue, 26 Oct 2021 16:29:35 +0000 (UTC) Received: from max-t490s.redhat.com (unknown [10.39.208.37]) by smtp.corp.redhat.com (Postfix) with ESMTP id CCC05100E809; Tue, 26 Oct 2021 16:29:30 +0000 (UTC) From: Maxime Coquelin To: dev@dpdk.org, chenbo.xia@intel.com, jiayu.hu@intel.com, yuanx.wang@intel.com, wenwux.ma@intel.com, bruce.richardson@intel.com, john.mcnamara@intel.com Cc: Maxime Coquelin Date: Tue, 26 Oct 2021 18:28:58 +0200 Message-Id: <20211026162904.482987-10-maxime.coquelin@redhat.com> In-Reply-To: <20211026162904.482987-1-maxime.coquelin@redhat.com> References: <20211026162904.482987-1-maxime.coquelin@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.84 on 10.5.11.22 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=maxime.coquelin@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: 8bit Content-Type: text/plain; charset="US-ASCII" Subject: [dpdk-dev] [PATCH v2 09/15] vhost: remove notion of async descriptor X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.29 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" Now that IO vectors iterator have been simplified, the rte_vhost_async_desc struct only contains a pointer on the iterator array stored in the async metadata. This patch removes it, and pass directly the iterators array pointer to the transfer_data callback. Doing that, we avoid declaring the descriptor array in the stack, and also avoid the cost of filling it. Signed-off-by: Maxime Coquelin --- examples/vhost/ioat.c | 10 +++++----- examples/vhost/ioat.h | 4 ++-- lib/vhost/rte_vhost_async.h | 16 ++++------------ lib/vhost/virtio_net.c | 19 ++----------------- 4 files changed, 13 insertions(+), 36 deletions(-) diff --git a/examples/vhost/ioat.c b/examples/vhost/ioat.c index a8c588deff..9aeeb12fd9 100644 --- a/examples/vhost/ioat.c +++ b/examples/vhost/ioat.c @@ -124,10 +124,10 @@ open_ioat(const char *value) int32_t ioat_transfer_data_cb(int vid, uint16_t queue_id, - struct rte_vhost_async_desc *descs, + struct rte_vhost_iov_iter *iov_iter, struct rte_vhost_async_status *opaque_data, uint16_t count) { - uint32_t i_desc; + uint32_t i_iter; uint16_t dev_id = dma_bind[vid].dmas[queue_id * 2 + VIRTIO_RXQ].dev_id; struct rte_vhost_iov_iter *iter = NULL; unsigned long i_seg; @@ -135,8 +135,8 @@ ioat_transfer_data_cb(int vid, uint16_t queue_id, unsigned short write = cb_tracker[dev_id].next_write; if (!opaque_data) { - for (i_desc = 0; i_desc < count; i_desc++) { - iter = descs[i_desc].iter; + for (i_iter = 0; i_iter < count; i_iter++) { + iter = iov_iter + i_iter; i_seg = 0; if (cb_tracker[dev_id].ioat_space < iter->nr_segs) break; @@ -161,7 +161,7 @@ ioat_transfer_data_cb(int vid, uint16_t queue_id, /* ring the doorbell */ rte_ioat_perform_ops(dev_id); cb_tracker[dev_id].next_write = write; - return i_desc; + return i_iter; } int32_t diff --git a/examples/vhost/ioat.h b/examples/vhost/ioat.h index 62e163c585..d9bf717e8d 100644 --- a/examples/vhost/ioat.h +++ b/examples/vhost/ioat.h @@ -29,7 +29,7 @@ int open_ioat(const char *value); int32_t ioat_transfer_data_cb(int vid, uint16_t queue_id, - struct rte_vhost_async_desc *descs, + struct rte_vhost_iov_iter *iov_iter, struct rte_vhost_async_status *opaque_data, uint16_t count); int32_t @@ -44,7 +44,7 @@ static int open_ioat(const char *value __rte_unused) static int32_t ioat_transfer_data_cb(int vid __rte_unused, uint16_t queue_id __rte_unused, - struct rte_vhost_async_desc *descs __rte_unused, + struct rte_vhost_iov_iter *iov_iter __rte_unused, struct rte_vhost_async_status *opaque_data __rte_unused, uint16_t count __rte_unused) { diff --git a/lib/vhost/rte_vhost_async.h b/lib/vhost/rte_vhost_async.h index 4ea5cfab10..a87ea6ba37 100644 --- a/lib/vhost/rte_vhost_async.h +++ b/lib/vhost/rte_vhost_async.h @@ -26,14 +26,6 @@ struct rte_vhost_iov_iter { unsigned long nr_segs; }; -/** - * dma transfer descriptor - */ -struct rte_vhost_async_desc { - /* memory iov_iter */ - struct rte_vhost_iov_iter *iter; -}; - /** * dma transfer status */ @@ -55,17 +47,17 @@ struct rte_vhost_async_channel_ops { * id of vhost device to perform data copies * @param queue_id * queue id to perform data copies - * @param descs - * an array of DMA transfer memory descriptors + * @param iov_iter + * an array of IOV iterators * @param opaque_data * opaque data pair sending to DMA engine * @param count * number of elements in the "descs" array * @return - * number of descs processed, negative value means error + * number of IOV iterators processed, negative value means error */ int32_t (*transfer_data)(int vid, uint16_t queue_id, - struct rte_vhost_async_desc *descs, + struct rte_vhost_iov_iter *iov_iter, struct rte_vhost_async_status *opaque_data, uint16_t count); /** diff --git a/lib/vhost/virtio_net.c b/lib/vhost/virtio_net.c index a2044aae1b..dfe864b3e9 100644 --- a/lib/vhost/virtio_net.c +++ b/lib/vhost/virtio_net.c @@ -995,15 +995,6 @@ async_iter_reset(struct vhost_async *async) async->iovec_idx = 0; } -static __rte_always_inline void -async_fill_descs(struct vhost_async *async, struct rte_vhost_async_desc *descs) -{ - int i; - - for (i = 0; i < async->iter_idx; i++) - descs[i].iter = async->iov_iter + i; -} - static __rte_always_inline int async_mbuf_to_desc(struct virtio_net *dev, struct vhost_virtqueue *vq, struct rte_mbuf *m, struct buf_vector *buf_vec, @@ -1550,7 +1541,6 @@ virtio_dev_rx_async_submit_split(struct virtio_net *dev, uint16_t avail_head; struct vhost_async *async = vq->async; - struct rte_vhost_async_desc async_descs[MAX_PKT_BURST]; struct async_inflight_info *pkts_info = async->pkts_info; uint32_t pkt_err = 0; int32_t n_xfer; @@ -1595,9 +1585,7 @@ virtio_dev_rx_async_submit_split(struct virtio_net *dev, if (unlikely(pkt_idx == 0)) return 0; - async_fill_descs(async, async_descs); - - n_xfer = async->ops.transfer_data(dev->vid, queue_id, async_descs, 0, pkt_idx); + n_xfer = async->ops.transfer_data(dev->vid, queue_id, async->iov_iter, 0, pkt_idx); if (unlikely(n_xfer < 0)) { VHOST_LOG_DATA(ERR, "(%d) %s: failed to transfer data for queue id %d.\n", dev->vid, __func__, queue_id); @@ -1812,7 +1800,6 @@ virtio_dev_rx_async_submit_packed(struct virtio_net *dev, uint16_t num_descs; struct vhost_async *async = vq->async; - struct rte_vhost_async_desc async_descs[MAX_PKT_BURST]; struct async_inflight_info *pkts_info = async->pkts_info; uint32_t pkt_err = 0; uint16_t slot_idx = 0; @@ -1840,9 +1827,7 @@ virtio_dev_rx_async_submit_packed(struct virtio_net *dev, if (unlikely(pkt_idx == 0)) return 0; - async_fill_descs(async, async_descs); - - n_xfer = async->ops.transfer_data(dev->vid, queue_id, async_descs, 0, pkt_idx); + n_xfer = async->ops.transfer_data(dev->vid, queue_id, async->iov_iter, 0, pkt_idx); if (unlikely(n_xfer < 0)) { VHOST_LOG_DATA(ERR, "(%d) %s: failed to transfer data for queue id %d.\n", dev->vid, __func__, queue_id); -- 2.31.1