All of lore.kernel.org
 help / color / mirror / Atom feed
From: Yuanhan Liu <yuanhan.liu@linux.intel.com>
To: dev@dpdk.org
Cc: Thomas Monjalon <thomas.monjalon@6wind.com>,
	huawei.xie@intel.com, Panu Matilainen <pmatilai@redhat.com>,
	Tetsuya Mukawa <mukawa@igel.co.jp>,
	Traynor Kevin <kevin.traynor@intel.com>,
	Rich Lane <rich.lane@bigswitch.com>,
	Yuanhan Liu <yuanhan.liu@linux.intel.com>
Subject: [PATCH v2 18/19] vhost: per device virtio net header len
Date: Thu, 12 May 2016 22:25:10 -0700	[thread overview]
Message-ID: <1463117111-27050-19-git-send-email-yuanhan.liu@linux.intel.com> (raw)
In-Reply-To: <1463117111-27050-1-git-send-email-yuanhan.liu@linux.intel.com>

Virtio net header length is set per device, but not per queue. So, there
is no reason to store it in vhost_virtqueue struct, instead, we should
store it in virtio_net struct, to make one copy only.

Signed-off-by: Yuanhan Liu <yuanhan.liu@linux.intel.com>
---
 lib/librte_vhost/vhost-net.h  |  2 +-
 lib/librte_vhost/vhost_rxtx.c | 40 ++++++++++++++++++++--------------------
 lib/librte_vhost/virtio-net.c | 13 ++-----------
 3 files changed, 23 insertions(+), 32 deletions(-)

diff --git a/lib/librte_vhost/vhost-net.h b/lib/librte_vhost/vhost-net.h
index dbd2d62..590a039 100644
--- a/lib/librte_vhost/vhost-net.h
+++ b/lib/librte_vhost/vhost-net.h
@@ -69,7 +69,6 @@ struct vhost_virtqueue {
 	struct vring_avail	*avail;
 	struct vring_used	*used;
 	uint32_t		size;
-	uint16_t		vhost_hlen;
 
 	/* Last index used on the available ring */
 	volatile uint16_t	last_used_idx;
@@ -129,6 +128,7 @@ struct virtio_net {
 	uint64_t		protocol_features;
 	int			vid;
 	uint32_t		flags;
+	uint16_t		vhost_hlen;
 #define IF_NAME_SZ (PATH_MAX > IFNAMSIZ ? PATH_MAX : IFNAMSIZ)
 	char			ifname[IF_NAME_SZ];
 	uint32_t		virt_qp_nb;
diff --git a/lib/librte_vhost/vhost_rxtx.c b/lib/librte_vhost/vhost_rxtx.c
index 65278bb..c9cd1c5 100644
--- a/lib/librte_vhost/vhost_rxtx.c
+++ b/lib/librte_vhost/vhost_rxtx.c
@@ -126,10 +126,10 @@ virtio_enqueue_offload(struct rte_mbuf *m_buf, struct virtio_net_hdr *net_hdr)
 }
 
 static inline void
-copy_virtio_net_hdr(struct vhost_virtqueue *vq, uint64_t desc_addr,
+copy_virtio_net_hdr(struct virtio_net *dev, uint64_t desc_addr,
 		    struct virtio_net_hdr_mrg_rxbuf hdr)
 {
-	if (vq->vhost_hlen == sizeof(struct virtio_net_hdr_mrg_rxbuf))
+	if (dev->vhost_hlen == sizeof(struct virtio_net_hdr_mrg_rxbuf))
 		*(struct virtio_net_hdr_mrg_rxbuf *)(uintptr_t)desc_addr = hdr;
 	else
 		*(struct virtio_net_hdr *)(uintptr_t)desc_addr = hdr.hdr;
@@ -147,19 +147,19 @@ copy_mbuf_to_desc(struct virtio_net *dev, struct vhost_virtqueue *vq,
 	struct virtio_net_hdr_mrg_rxbuf virtio_hdr = {{0, 0, 0, 0, 0, 0}, 0};
 
 	desc = &vq->desc[desc_idx];
-	if (unlikely(desc->len < vq->vhost_hlen))
+	if (unlikely(desc->len < dev->vhost_hlen))
 		return -1;
 
 	desc_addr = gpa_to_vva(dev, desc->addr);
 	rte_prefetch0((void *)(uintptr_t)desc_addr);
 
 	virtio_enqueue_offload(m, &virtio_hdr.hdr);
-	copy_virtio_net_hdr(vq, desc_addr, virtio_hdr);
-	vhost_log_write(dev, desc->addr, vq->vhost_hlen);
-	PRINT_PACKET(dev, (uintptr_t)desc_addr, vq->vhost_hlen, 0);
+	copy_virtio_net_hdr(dev, desc_addr, virtio_hdr);
+	vhost_log_write(dev, desc->addr, dev->vhost_hlen);
+	PRINT_PACKET(dev, (uintptr_t)desc_addr, dev->vhost_hlen, 0);
 
-	desc_offset = vq->vhost_hlen;
-	desc_avail  = desc->len - vq->vhost_hlen;
+	desc_offset = dev->vhost_hlen;
+	desc_avail  = desc->len - dev->vhost_hlen;
 
 	*copied = rte_pktmbuf_pkt_len(m);
 	mbuf_avail  = rte_pktmbuf_data_len(m);
@@ -300,9 +300,9 @@ virtio_dev_rx(struct virtio_net *dev, uint16_t queue_id,
 
 		vq->used->ring[used_idx].id = desc_idx;
 		if (unlikely(err))
-			vq->used->ring[used_idx].len = vq->vhost_hlen;
+			vq->used->ring[used_idx].len = dev->vhost_hlen;
 		else
-			vq->used->ring[used_idx].len = copied + vq->vhost_hlen;
+			vq->used->ring[used_idx].len = copied + dev->vhost_hlen;
 		vhost_log_used_vring(dev, vq,
 			offsetof(struct vring_used, ring[used_idx]),
 			sizeof(vq->used->ring[used_idx]));
@@ -444,7 +444,7 @@ copy_mbuf_to_desc_mergeable(struct virtio_net *dev, struct vhost_virtqueue *vq,
 	LOG_DEBUG(VHOST_DATA, "(%d) current index %d | end index %d\n",
 		dev->vid, cur_idx, res_end_idx);
 
-	if (vq->buf_vec[vec_idx].buf_len < vq->vhost_hlen)
+	if (vq->buf_vec[vec_idx].buf_len < dev->vhost_hlen)
 		return -1;
 
 	desc_addr = gpa_to_vva(dev, vq->buf_vec[vec_idx].buf_addr);
@@ -455,12 +455,12 @@ copy_mbuf_to_desc_mergeable(struct virtio_net *dev, struct vhost_virtqueue *vq,
 		dev->vid, virtio_hdr.num_buffers);
 
 	virtio_enqueue_offload(m, &virtio_hdr.hdr);
-	copy_virtio_net_hdr(vq, desc_addr, virtio_hdr);
-	vhost_log_write(dev, vq->buf_vec[vec_idx].buf_addr, vq->vhost_hlen);
-	PRINT_PACKET(dev, (uintptr_t)desc_addr, vq->vhost_hlen, 0);
+	copy_virtio_net_hdr(dev, desc_addr, virtio_hdr);
+	vhost_log_write(dev, vq->buf_vec[vec_idx].buf_addr, dev->vhost_hlen);
+	PRINT_PACKET(dev, (uintptr_t)desc_addr, dev->vhost_hlen, 0);
 
-	desc_avail  = vq->buf_vec[vec_idx].buf_len - vq->vhost_hlen;
-	desc_offset = vq->vhost_hlen;
+	desc_avail  = vq->buf_vec[vec_idx].buf_len - dev->vhost_hlen;
+	desc_offset = dev->vhost_hlen;
 
 	mbuf_avail  = rte_pktmbuf_data_len(m);
 	mbuf_offset = 0;
@@ -546,7 +546,7 @@ virtio_dev_merge_rx(struct virtio_net *dev, uint16_t queue_id,
 		return 0;
 
 	for (pkt_idx = 0; pkt_idx < count; pkt_idx++) {
-		uint32_t pkt_len = pkts[pkt_idx]->pkt_len + vq->vhost_hlen;
+		uint32_t pkt_len = pkts[pkt_idx]->pkt_len + dev->vhost_hlen;
 
 		if (unlikely(reserve_avail_buf_mergeable(vq, pkt_len,
 							 &start, &end) < 0)) {
@@ -747,7 +747,7 @@ copy_desc_to_mbuf(struct virtio_net *dev, struct vhost_virtqueue *vq,
 	uint32_t nr_desc = 1;
 
 	desc = &vq->desc[desc_idx];
-	if (unlikely(desc->len < vq->vhost_hlen))
+	if (unlikely(desc->len < dev->vhost_hlen))
 		return -1;
 
 	desc_addr = gpa_to_vva(dev, desc->addr);
@@ -755,8 +755,8 @@ copy_desc_to_mbuf(struct virtio_net *dev, struct vhost_virtqueue *vq,
 
 	/* Retrieve virtio net header */
 	hdr = (struct virtio_net_hdr *)((uintptr_t)desc_addr);
-	desc_avail  = desc->len - vq->vhost_hlen;
-	desc_offset = vq->vhost_hlen;
+	desc_avail  = desc->len - dev->vhost_hlen;
+	desc_offset = dev->vhost_hlen;
 
 	mbuf_offset = 0;
 	mbuf_avail  = m->buf_len - RTE_PKTMBUF_HEADROOM;
diff --git a/lib/librte_vhost/virtio-net.c b/lib/librte_vhost/virtio-net.c
index 13dc021..835ab3a 100644
--- a/lib/librte_vhost/virtio-net.c
+++ b/lib/librte_vhost/virtio-net.c
@@ -387,8 +387,6 @@ int
 vhost_set_features(int vid, uint64_t *pu)
 {
 	struct virtio_net *dev;
-	uint16_t vhost_hlen;
-	uint16_t i;
 
 	dev = get_device(vid);
 	if (dev == NULL)
@@ -399,9 +397,9 @@ vhost_set_features(int vid, uint64_t *pu)
 	dev->features = *pu;
 	if (dev->features &
 		((1 << VIRTIO_NET_F_MRG_RXBUF) | (1ULL << VIRTIO_F_VERSION_1))) {
-		vhost_hlen = sizeof(struct virtio_net_hdr_mrg_rxbuf);
+		dev->vhost_hlen = sizeof(struct virtio_net_hdr_mrg_rxbuf);
 	} else {
-		vhost_hlen = sizeof(struct virtio_net_hdr);
+		dev->vhost_hlen = sizeof(struct virtio_net_hdr);
 	}
 	LOG_DEBUG(VHOST_CONFIG,
 		"(%d) mergeable RX buffers %s, virtio 1 %s\n",
@@ -409,13 +407,6 @@ vhost_set_features(int vid, uint64_t *pu)
 		(dev->features & (1 << VIRTIO_NET_F_MRG_RXBUF)) ? "on" : "off",
 		(dev->features & (1ULL << VIRTIO_F_VERSION_1)) ? "on" : "off");
 
-	for (i = 0; i < dev->virt_qp_nb; i++) {
-		uint16_t base_idx = i * VIRTIO_QNUM;
-
-		dev->virtqueue[base_idx + VIRTIO_RXQ]->vhost_hlen = vhost_hlen;
-		dev->virtqueue[base_idx + VIRTIO_TXQ]->vhost_hlen = vhost_hlen;
-	}
-
 	return 0;
 }
 
-- 
1.9.0

  parent reply	other threads:[~2016-05-13  5:21 UTC|newest]

Thread overview: 76+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-05-02 22:25 [PATCH 00/16] vhost ABI/API refactoring Yuanhan Liu
2016-05-02 22:25 ` [PATCH 01/16] vhost: declare backend with int type Yuanhan Liu
2016-05-02 22:25 ` [PATCH 02/16] vhost: set/reset dev flags internally Yuanhan Liu
2016-05-02 22:25 ` [PATCH 03/16] vhost: declare device_fh as int Yuanhan Liu
2016-05-02 22:25 ` [PATCH 04/16] example/vhost: make a copy of virtio device id Yuanhan Liu
2016-05-02 22:25 ` [PATCH 05/16] vhost: rename device_fh to vid Yuanhan Liu
2016-05-02 22:25 ` [PATCH 06/16] vhost: get device by vid only Yuanhan Liu
2016-05-02 22:25 ` [PATCH 07/16] vhost: move vhost_device_ctx to cuse Yuanhan Liu
2016-05-02 22:25 ` [PATCH 08/16] vhost: query pmd internal by vid Yuanhan Liu
2016-05-02 22:25 ` [PATCH 09/16] vhost: add few more functions Yuanhan Liu
2016-05-02 22:25 ` [PATCH 10/16] vhost: export vid as the only interface to applications Yuanhan Liu
2016-05-10 16:17   ` Rich Lane
2016-05-10 16:39     ` Yuanhan Liu
2016-05-10 17:13       ` Rich Lane
2016-05-10 17:29         ` Yuanhan Liu
2016-05-10 19:22           ` Thomas Monjalon
2016-05-02 22:25 ` [PATCH 11/16] vhost: hide internal structs/macros/functions Yuanhan Liu
2016-05-02 22:25 ` [PATCH 12/16] vhost: remove unnecessary fields Yuanhan Liu
2016-05-02 22:25 ` [PATCH 13/16] vhost: remove virtio-net.h Yuanhan Liu
2016-05-02 22:25 ` [PATCH 14/16] vhost: reserve few more space for future extension Yuanhan Liu
2016-05-02 22:25 ` [PATCH 15/16] vhost: per device vhost_hlen Yuanhan Liu
2016-05-02 22:25 ` [PATCH 16/16] vhost: make buf vector for scatter Rx local Yuanhan Liu
2016-05-13  5:24 ` [PATCH v2 00/19] vhost ABI/API refactoring Yuanhan Liu
2016-05-13  5:24   ` [PATCH v2 01/19] vhost: declare backend with int type Yuanhan Liu
2016-05-13  5:24   ` [PATCH v2 02/19] vhost: set/reset dev flags internally Yuanhan Liu
2016-05-13  5:24   ` [PATCH v2 03/19] vhost: declare device fh as int Yuanhan Liu
2016-05-13  5:24   ` [PATCH v2 04/19] examples/vhost: make a copy of virtio device id Yuanhan Liu
2016-05-13  5:24   ` [PATCH v2 05/19] vhost: rename device fh to vid Yuanhan Liu
2016-05-13  5:24   ` [PATCH v2 06/19] vhost: get device by vid only Yuanhan Liu
2016-05-13  5:24   ` [PATCH v2 07/19] vhost: move vhost device ctx to cuse Yuanhan Liu
2016-05-13  5:25   ` [PATCH v2 08/19] vhost: introduce new API to export numa node Yuanhan Liu
2016-05-13  5:25   ` [PATCH v2 09/19] vhost: introduce new API to export number of queues Yuanhan Liu
2016-05-13  5:25   ` [PATCH v2 10/19] vhost: introduce new API to export ifname Yuanhan Liu
2016-05-13  5:25   ` [PATCH v2 11/19] vhost: introduce new API to export queue free entries Yuanhan Liu
2016-05-13  5:25   ` [PATCH v2 12/19] vhost: remove dependency on priv field Yuanhan Liu
2016-05-13  5:25   ` [PATCH v2 13/19] vhost: export vid as the only interface to applications Yuanhan Liu
2016-05-13  5:25   ` [PATCH v2 14/19] vhost: hide internal structs/macros/functions Yuanhan Liu
2016-05-13  5:25   ` [PATCH v2 15/19] vhost: remove unnecessary fields Yuanhan Liu
2016-05-13  5:25   ` [PATCH v2 16/19] vhost: remove virtio-net.h Yuanhan Liu
2016-05-13  5:25   ` [PATCH v2 17/19] vhost: reserve few more space for future extension Yuanhan Liu
2016-05-13  5:25   ` Yuanhan Liu [this message]
2016-05-13  5:25   ` [PATCH v2 19/19] vhost: make buf vector for scatter Rx local Yuanhan Liu
2016-05-26 17:04   ` [PATCH v2 00/19] vhost ABI/API refactoring Rich Lane
2016-05-27  1:36     ` Yuanhan Liu
2016-06-07  3:51   ` [PATCH v3 00/20] " Yuanhan Liu
2016-06-07  3:51     ` [PATCH v3 01/20] vhost: declare backend with int type Yuanhan Liu
2016-06-07  3:51     ` [PATCH v3 02/20] vhost: set/reset dev flags internally Yuanhan Liu
2016-06-07  3:51     ` [PATCH v3 03/20] vhost: declare device fh as int Yuanhan Liu
2016-06-07  3:51     ` [PATCH v3 04/20] examples/vhost: make a copy of virtio device id Yuanhan Liu
2016-06-07  3:51     ` [PATCH v3 05/20] vhost: rename device fh to vid Yuanhan Liu
2016-06-07  3:51     ` [PATCH v3 06/20] vhost: get device by vid only Yuanhan Liu
2016-06-07  3:51     ` [PATCH v3 07/20] vhost: move vhost device ctx to cuse Yuanhan Liu
2016-06-07  3:51     ` [PATCH v3 08/20] vhost: introduce new API to export numa node Yuanhan Liu
2016-06-07 11:42       ` Panu Matilainen
2016-06-07 12:45         ` Yuanhan Liu
2016-06-08 21:51       ` Rich Lane
2016-06-09  4:45         ` Yuanhan Liu
2016-06-13 10:05           ` Yuanhan Liu
2016-06-07  3:51     ` [PATCH v3 09/20] vhost: introduce new API to export number of queues Yuanhan Liu
2016-06-07  3:52     ` [PATCH v3 10/20] vhost: introduce new API to export ifname Yuanhan Liu
2016-06-07  3:52     ` [PATCH v3 11/20] vhost: introduce new API to export queue free entries Yuanhan Liu
2016-06-07  3:52     ` [PATCH v3 12/20] vhost: remove dependency on priv field Yuanhan Liu
2016-06-07  3:52     ` [PATCH v3 13/20] vhost: export vid as the only interface to applications Yuanhan Liu
2016-06-07  3:52     ` [PATCH v3 14/20] vhost: hide internal structs/macros/functions Yuanhan Liu
2016-06-07  3:52     ` [PATCH v3 15/20] vhost: remove unnecessary fields Yuanhan Liu
2016-06-07  3:52     ` [PATCH v3 16/20] vhost: remove virtio-net.h Yuanhan Liu
2016-06-07  3:52     ` [PATCH v3 17/20] vhost: reserve few more space for future extension Yuanhan Liu
2016-06-07  3:52     ` [PATCH v3 18/20] examples/tep_term: adapt to new vhost ABI/API changes Yuanhan Liu
2016-06-07  3:52     ` [PATCH v3 19/20] vhost: per device virtio net header len Yuanhan Liu
2016-06-07  3:52     ` [PATCH v3 20/20] vhost: make buf vector for scatter Rx local Yuanhan Liu
2016-06-14 12:00     ` [PATCH v3 00/20] vhost ABI/API refactoring Yuanhan Liu
2016-06-30  7:39     ` Panu Matilainen
2016-06-30  7:57       ` Yuanhan Liu
2016-06-30  9:05         ` Panu Matilainen
2016-06-30 11:15           ` Mcnamara, John
2016-06-30 11:40             ` Thomas Monjalon

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1463117111-27050-19-git-send-email-yuanhan.liu@linux.intel.com \
    --to=yuanhan.liu@linux.intel.com \
    --cc=dev@dpdk.org \
    --cc=huawei.xie@intel.com \
    --cc=kevin.traynor@intel.com \
    --cc=mukawa@igel.co.jp \
    --cc=pmatilai@redhat.com \
    --cc=rich.lane@bigswitch.com \
    --cc=thomas.monjalon@6wind.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.