xen-devel.lists.xenproject.org archive mirror
 help / color / mirror / Atom feed
From: Joao Martins <joao.martins@neclab.eu>
To: xen-devel@lists.xenproject.org, netdev@vger.kernel.org
Cc: wei.liu2@citrix.com, ian.campbell@citrix.com,
	Joao Martins <joao.martins@neclab.eu>,
	david.vrabel@citrix.com, boris.ostrovsky@oracle.com
Subject: [RFC PATCH 12/13] xen-netfront: implement TX persistent grants
Date: Tue, 12 May 2015 19:18:36 +0200	[thread overview]
Message-ID: <1431451117-70051-13-git-send-email-joao.martins@neclab.eu> (raw)
In-Reply-To: <1431451117-70051-1-git-send-email-joao.martins@neclab.eu>

Instead of grant/revoking the buffer related to the skb, it will use
an already granted page and memcpy  to it. The grants will be mapped
by xen-netback and reused overtime, but only unmapped when the vif
disconnects, as opposed to every packet.

This only happens if the backend supports persistent grants since it
would, otherwise, introduce the overhead of a memcpy on top of the
grant map.

Signed-off-by: Joao Martins <joao.martins@neclab.eu>
---
 drivers/net/xen-netfront.c | 45 ++++++++++++++++++++++++++++++---------------
 1 file changed, 30 insertions(+), 15 deletions(-)

diff --git a/drivers/net/xen-netfront.c b/drivers/net/xen-netfront.c
index 7f44cc7..ae0a13b 100644
--- a/drivers/net/xen-netfront.c
+++ b/drivers/net/xen-netfront.c
@@ -408,6 +408,7 @@ static void xennet_tx_buf_gc(struct netfront_queue *queue)
 	RING_IDX cons, prod;
 	unsigned short id;
 	struct sk_buff *skb;
+	unsigned use_persistent_gnts = queue->info->feature_persistent;
 
 	BUG_ON(!netif_carrier_ok(queue->info->netdev));
 
@@ -425,13 +426,16 @@ static void xennet_tx_buf_gc(struct netfront_queue *queue)
 			id  = txrsp->id;
 			skb = queue->tx_skbs[id].skb;
 
-			release_grant(queue->grant_tx[id].ref,
-				      &queue->gref_tx_head,
-				      queue->info->xbdev->otherend_id,
-				      GNTMAP_readonly);
+			if (!use_persistent_gnts) {
+				release_grant(queue->grant_tx[id].ref,
+					      &queue->gref_tx_head,
+					      queue->info->xbdev->otherend_id,
+					      GNTMAP_readonly);
+
+				queue->grant_tx[id].ref = GRANT_INVALID_REF;
+				queue->grant_tx[id].page = NULL;
+			}
 
-			queue->grant_tx[id].ref = GRANT_INVALID_REF;
-			queue->grant_tx[id].page = NULL;
 			add_id_to_freelist(&queue->tx_skb_freelist, queue->tx_skbs, id);
 			dev_kfree_skb_irq(skb);
 		}
@@ -460,23 +464,31 @@ static struct xen_netif_tx_request *xennet_make_one_txreq(
 {
 	unsigned int id;
 	struct xen_netif_tx_request *tx;
-	grant_ref_t ref;
+	struct grant *gnt;
 
 	len = min_t(unsigned int, PAGE_SIZE - offset, len);
 
 	id = get_id_from_freelist(&queue->tx_skb_freelist, queue->tx_skbs);
 	tx = RING_GET_REQUEST(&queue->tx, queue->tx.req_prod_pvt++);
-	ref = claim_grant(page,
-			  &queue->gref_tx_head,
-			  queue->info->xbdev->otherend_id,
-			  GNTMAP_readonly);
+	gnt = &queue->grant_tx[id];
+
+	if (queue->info->feature_persistent)
+		memcpy(pfn_to_kaddr(page_to_pfn(gnt->page)) + offset,
+		       pfn_to_kaddr(page_to_pfn(page)) + offset,
+		       len);
+	else
+		gnt->page = page;
+
+	if (gnt->ref == GRANT_INVALID_REF)
+		gnt->ref = claim_grant(gnt->page,
+				       &queue->gref_tx_head,
+				       queue->info->xbdev->otherend_id,
+				       GNTMAP_readonly);
 
 	queue->tx_skbs[id].skb = skb;
-	queue->grant_tx[id].page = page;
-	queue->grant_tx[id].ref = ref;
 
 	tx->id = id;
-	tx->gref = ref;
+	tx->gref = gnt->ref;
 	tx->offset = offset;
 	tx->size = len;
 	tx->flags = 0;
@@ -1610,7 +1622,10 @@ static int xennet_init_queue(struct netfront_queue *queue)
 	for (i = 0; i < NET_TX_RING_SIZE; i++) {
 		skb_entry_set_link(&queue->tx_skbs[i], i+1);
 		queue->grant_tx[i].ref = GRANT_INVALID_REF;
-		queue->grant_tx[i].page = NULL;
+		if (queue->info->feature_persistent)
+			queue->grant_tx[i].page = alloc_page(GFP_NOIO);
+		else
+			queue->grant_tx[i].page = NULL;
 	}
 
 	/* Clear out rx_skbs */
-- 
2.1.3

  parent reply	other threads:[~2015-05-12 17:23 UTC|newest]

Thread overview: 49+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-05-12 17:18 [RFC PATCH 00/13] Persistent grant maps for xen net drivers Joao Martins
2015-05-12 17:18 ` [RFC PATCH 01/13] xen-netback: add persistent grant tree ops Joao Martins
2015-05-12 17:18 ` [RFC PATCH 02/13] xen-netback: xenbus feature persistent support Joao Martins
2015-05-19 15:19   ` Wei Liu
     [not found]   ` <20150519151929.GA26335@zion.uk.xensource.com>
2015-05-22 10:24     ` Joao Martins
2015-05-12 17:18 ` [RFC PATCH 03/13] xen-netback: implement TX persistent grants Joao Martins
2015-05-19 15:23   ` Wei Liu
     [not found]   ` <20150519152342.GB26335@zion.uk.xensource.com>
2015-05-22 10:24     ` Joao Martins
     [not found]     ` <30CF0FF9-3B1D-48AF-AFB4-73E20C404357@neclab.eu>
2015-06-02 14:53       ` Wei Liu
     [not found]       ` <20150602145359.GP19403@zion.uk.xensource.com>
2015-06-03 17:07         ` Joao Martins
     [not found]         ` <B1B43019-3C94-4FBA-9139-7683FEC2901E@neclab.eu>
2015-06-07 12:04           ` Wei Liu
2015-05-12 17:18 ` [RFC PATCH 04/13] xen-netback: implement RX " Joao Martins
2015-05-19 15:32   ` Wei Liu
     [not found]   ` <20150519153205.GC26335@zion.uk.xensource.com>
2015-05-22 10:25     ` Joao Martins
     [not found]     ` <65A385A5-4D11-4032-BB1B-82180AF76477@neclab.eu>
2015-06-02 15:07       ` Wei Liu
     [not found]       ` <20150602150704.GQ19403@zion.uk.xensource.com>
2015-06-03 17:08         ` Joao Martins
2015-05-12 17:18 ` [RFC PATCH 05/13] xen-netback: refactor xenvif_rx_action Joao Martins
2015-05-19 15:32   ` Wei Liu
2015-05-12 17:18 ` [RFC PATCH 06/13] xen-netback: copy buffer on xenvif_start_xmit() Joao Martins
2015-05-19 15:35   ` Wei Liu
     [not found]   ` <20150519153558.GE26335@zion.uk.xensource.com>
2015-05-22 10:26     ` Joao Martins
     [not found]     ` <915BCC85-25D1-4960-A1BA-0C6459ABC953@neclab.eu>
2015-06-02 15:10       ` Wei Liu
2015-05-12 17:18 ` [RFC PATCH 07/13] xen-netback: add persistent tree counters to debugfs Joao Martins
2015-05-19 15:36   ` Wei Liu
2015-05-12 17:18 ` [RFC PATCH 08/13] xen-netback: clone skb if skb->xmit_more is set Joao Martins
2015-05-19 15:36   ` Wei Liu
     [not found]   ` <20150519153613.GG26335@zion.uk.xensource.com>
2015-05-22 17:14     ` Joao Martins
2015-05-12 17:18 ` [RFC PATCH 09/13] xen-netfront: move grant_{ref, page} to struct grant Joao Martins
2015-05-18 15:44   ` David Vrabel
     [not found]   ` <555A08F4.1030202@citrix.com>
2015-05-19 10:19     ` Joao Martins
2015-05-12 17:18 ` [RFC PATCH 10/13] xen-netfront: refactor claim/release grant Joao Martins
2015-05-18 15:48   ` David Vrabel
     [not found]   ` <555A09D1.50902@citrix.com>
2015-05-19 10:19     ` Joao Martins
2015-05-12 17:18 ` [RFC PATCH 11/13] xen-netfront: feature-persistent xenbus support Joao Martins
2015-05-18 15:51   ` David Vrabel
     [not found]   ` <555A0A95.20409@citrix.com>
2015-05-19 10:19     ` Joao Martins
2015-05-12 17:18 ` Joao Martins [this message]
2015-05-18 15:55   ` [RFC PATCH 12/13] xen-netfront: implement TX persistent grants David Vrabel
     [not found]   ` <555A0B5D.3090505@citrix.com>
2015-05-19 10:20     ` Joao Martins
     [not found]     ` <77896F5F-DC2C-4F2A-9BB3-CE5F404DCECC@neclab.eu>
2015-05-19 10:23       ` David Vrabel
2015-05-12 17:18 ` [RFC PATCH 13/13] xen-netfront: implement RX " Joao Martins
2015-05-18 16:04   ` David Vrabel
     [not found]   ` <555A0D8C.4020309@citrix.com>
2015-05-19 10:22     ` Joao Martins
2015-05-13 10:50 ` [RFC PATCH 00/13] Persistent grant maps for xen net drivers David Vrabel
     [not found] ` <55532C86.8020409@citrix.com>
2015-05-13 13:01   ` Joao Martins
2015-05-19 15:39 ` Wei Liu
     [not found] ` <20150519153901.GH26335@zion.uk.xensource.com>
2015-05-22 10:27   ` Joao Martins
     [not found]   ` <191EF54A-D8DE-4BAA-B15D-41B2BA35353F@neclab.eu>
2015-05-29  6:53     ` Yuzhou (C)
     [not found]     ` <47498F109986134D9A5B42B82F405EBBA3244CB6@SZXEMA502-MBX.china.huawei.com>
2015-05-29 14:51       ` Joao Martins

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=1431451117-70051-13-git-send-email-joao.martins@neclab.eu \
    --to=joao.martins@neclab.eu \
    --cc=boris.ostrovsky@oracle.com \
    --cc=david.vrabel@citrix.com \
    --cc=ian.campbell@citrix.com \
    --cc=netdev@vger.kernel.org \
    --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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).