All of lore.kernel.org
 help / color / mirror / Atom feed
From: Paul Durrant <paul.durrant@citrix.com>
To: <netdev@vger.kernel.org>, <xen-devel@lists.xenproject.org>
Cc: Ross Lagerwall <ross.lagerwall@citrix.com>,
	Paul Durrant <paul.durrant@citrix.com>,
	Wei Liu <wei.liu2@citrix.com>
Subject: [PATCH v2 net-next 7/7] xen/netback: add fraglist support for to-guest rx
Date: Tue, 4 Oct 2016 10:29:18 +0100	[thread overview]
Message-ID: <1475573358-32414-8-git-send-email-paul.durrant@citrix.com> (raw)
In-Reply-To: <1475573358-32414-1-git-send-email-paul.durrant@citrix.com>

From: Ross Lagerwall <ross.lagerwall@citrix.com>

This allows full 64K skbuffs (with 1500 mtu ethernet, composed of 45
fragments) to be handled by netback for to-guest rx.

Signed-off-by: Ross Lagerwall <ross.lagerwall@citrix.com>
[re-based]
Signed-off-by: Paul Durrant <paul.durrant@citrix.com>
---
Cc: Wei Liu <wei.liu2@citrix.com>
---
 drivers/net/xen-netback/interface.c |  2 +-
 drivers/net/xen-netback/rx.c        | 38 ++++++++++++++++++++++++++++---------
 2 files changed, 30 insertions(+), 10 deletions(-)

diff --git a/drivers/net/xen-netback/interface.c b/drivers/net/xen-netback/interface.c
index 211d542..4af532a 100644
--- a/drivers/net/xen-netback/interface.c
+++ b/drivers/net/xen-netback/interface.c
@@ -467,7 +467,7 @@ struct xenvif *xenvif_alloc(struct device *parent, domid_t domid,
 	dev->netdev_ops	= &xenvif_netdev_ops;
 	dev->hw_features = NETIF_F_SG |
 		NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM |
-		NETIF_F_TSO | NETIF_F_TSO6;
+		NETIF_F_TSO | NETIF_F_TSO6 | NETIF_F_FRAGLIST;
 	dev->features = dev->hw_features | NETIF_F_RXCSUM;
 	dev->ethtool_ops = &xenvif_ethtool_ops;
 
diff --git a/drivers/net/xen-netback/rx.c b/drivers/net/xen-netback/rx.c
index 8c8c5b5..8e9ade6 100644
--- a/drivers/net/xen-netback/rx.c
+++ b/drivers/net/xen-netback/rx.c
@@ -215,7 +215,8 @@ static unsigned int xenvif_gso_type(struct sk_buff *skb)
 struct xenvif_pkt_state {
 	struct sk_buff *skb;
 	size_t remaining_len;
-	int frag; /* frag == -1 => skb->head */
+	struct sk_buff *frag_iter;
+	int frag; /* frag == -1 => frag_iter->head */
 	unsigned int frag_offset;
 	struct xen_netif_extra_info extras[XEN_NETIF_EXTRA_TYPE_MAX - 1];
 	unsigned int extra_count;
@@ -237,6 +238,7 @@ static void xenvif_rx_next_skb(struct xenvif_queue *queue,
 	memset(pkt, 0, sizeof(struct xenvif_pkt_state));
 
 	pkt->skb = skb;
+	pkt->frag_iter = skb;
 	pkt->remaining_len = skb->len;
 	pkt->frag = -1;
 
@@ -293,20 +295,40 @@ static void xenvif_rx_complete(struct xenvif_queue *queue,
 	__skb_queue_tail(queue->rx_copy.completed, pkt->skb);
 }
 
+static void xenvif_rx_next_frag(struct xenvif_pkt_state *pkt)
+{
+	struct sk_buff *frag_iter = pkt->frag_iter;
+	unsigned int nr_frags = skb_shinfo(frag_iter)->nr_frags;
+
+	pkt->frag++;
+	pkt->frag_offset = 0;
+
+	if (pkt->frag >= nr_frags) {
+		if (frag_iter == pkt->skb)
+			pkt->frag_iter = skb_shinfo(frag_iter)->frag_list;
+		else
+			pkt->frag_iter = frag_iter->next;
+
+		pkt->frag = -1;
+	}
+}
+
 static void xenvif_rx_next_chunk(struct xenvif_queue *queue,
 				 struct xenvif_pkt_state *pkt,
 				 unsigned int offset, void **data,
 				 size_t *len)
 {
-	struct sk_buff *skb = pkt->skb;
+	struct sk_buff *frag_iter = pkt->frag_iter;
 	void *frag_data;
 	size_t frag_len, chunk_len;
 
+	BUG_ON(!frag_iter);
+
 	if (pkt->frag == -1) {
-		frag_data = skb->data;
-		frag_len = skb_headlen(skb);
+		frag_data = frag_iter->data;
+		frag_len = skb_headlen(frag_iter);
 	} else {
-		skb_frag_t *frag = &skb_shinfo(skb)->frags[pkt->frag];
+		skb_frag_t *frag = &skb_shinfo(frag_iter)->frags[pkt->frag];
 
 		frag_data = skb_frag_address(frag);
 		frag_len = skb_frag_size(frag);
@@ -322,10 +344,8 @@ static void xenvif_rx_next_chunk(struct xenvif_queue *queue,
 	pkt->frag_offset += chunk_len;
 
 	/* Advance to next frag? */
-	if (frag_len == chunk_len) {
-		pkt->frag++;
-		pkt->frag_offset = 0;
-	}
+	if (frag_len == chunk_len)
+		xenvif_rx_next_frag(pkt);
 
 	*data = frag_data;
 	*len = chunk_len;
-- 
2.1.4

  parent reply	other threads:[~2016-10-04  9:49 UTC|newest]

Thread overview: 40+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-10-04  9:29 [PATCH v2 net-next 0/7] xen-netback: guest rx side refactor Paul Durrant
2016-10-04  9:29 ` [PATCH v2 net-next 1/7] xen-netback: separate guest side rx code into separate module Paul Durrant
2016-10-04  9:29 ` Paul Durrant
2016-10-04  9:29 ` [PATCH v2 net-next 2/7] xen-netback: retire guest rx side prefix GSO feature Paul Durrant
2016-10-04 10:14   ` David Vrabel
2016-10-04 10:14   ` [Xen-devel] " David Vrabel
2016-10-04 12:52   ` Konrad Rzeszutek Wilk
2016-10-04 12:52   ` [Xen-devel] " Konrad Rzeszutek Wilk
2016-10-04 13:35     ` Paul Durrant
2016-10-04 13:35     ` [Xen-devel] " Paul Durrant
2016-10-04 14:24       ` Konrad Rzeszutek Wilk
2016-10-04 14:24       ` [Xen-devel] " Konrad Rzeszutek Wilk
2016-10-05 15:30         ` Roger Pau Monné
2016-10-05 15:30         ` [Xen-devel] " Roger Pau Monné
2016-10-05 15:40           ` Manuel Bouyer
2016-10-04  9:29 ` Paul Durrant
2016-10-04  9:29 ` [PATCH v2 net-next 3/7] xen-netback: refactor guest rx Paul Durrant
2016-10-04  9:29 ` Paul Durrant
2016-10-04  9:29 ` [PATCH v2 net-next 4/7] xen-netback: immediately wake tx queue when guest rx queue has space Paul Durrant
2016-10-04  9:29 ` Paul Durrant
2016-10-04 12:48   ` [Xen-devel] " Konrad Rzeszutek Wilk
2016-10-04 13:56     ` Paul Durrant
2016-10-04 13:56     ` Paul Durrant
2016-10-04 12:48   ` Konrad Rzeszutek Wilk
2016-10-04  9:29 ` [PATCH v2 net-next 5/7] xen-netback: process guest rx packets in batches Paul Durrant
2016-10-04 12:47   ` Konrad Rzeszutek Wilk
2016-10-04 12:47   ` [Xen-devel] " Konrad Rzeszutek Wilk
2016-10-04 14:02     ` Paul Durrant
2016-10-04 14:02     ` [Xen-devel] " Paul Durrant
2016-10-04 14:51     ` David Vrabel
2016-10-04 14:51     ` [Xen-devel] " David Vrabel
2016-10-04  9:29 ` Paul Durrant
2016-10-04  9:29 ` [PATCH v2 net-next 6/7] xen-netback: batch copies for multiple to-guest rx packets Paul Durrant
2016-10-04  9:29 ` Paul Durrant
2016-10-04  9:29 ` Paul Durrant [this message]
2016-10-04 10:56   ` [PATCH v2 net-next 7/7] xen/netback: add fraglist support for to-guest rx David Vrabel
2016-10-04 10:56   ` [Xen-devel] " David Vrabel
2016-10-04  9:29 ` Paul Durrant
2016-10-07  0:38 ` [PATCH v2 net-next 0/7] xen-netback: guest rx side refactor David Miller
2016-10-07  0:38 ` David Miller

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=1475573358-32414-8-git-send-email-paul.durrant@citrix.com \
    --to=paul.durrant@citrix.com \
    --cc=netdev@vger.kernel.org \
    --cc=ross.lagerwall@citrix.com \
    --cc=wei.liu2@citrix.com \
    --cc=xen-devel@lists.xenproject.org \
    /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.