[kernel] r22513 - in dists/jessie-security/linux/debian: . patches patches/bugfix/all

Ian James Campbell ijc at moszumanska.debian.org
Fri Apr 17 06:27:53 UTC 2015


Author: ijc
Date: Fri Apr 17 06:27:53 2015
New Revision: 22513

Log:
[xen] release per-queue Tx and Rx resource when disconnecting

Fixing network after save/restore or migration. (Closes: #782698)

Added:
   dists/jessie-security/linux/debian/patches/bugfix/all/xen-netfront-release-per-queue-Tx-and-Rx-resource-wh.patch
Modified:
   dists/jessie-security/linux/debian/changelog
   dists/jessie-security/linux/debian/patches/series

Modified: dists/jessie-security/linux/debian/changelog
==============================================================================
--- dists/jessie-security/linux/debian/changelog	Fri Apr 17 06:27:43 2015	(r22512)
+++ dists/jessie-security/linux/debian/changelog	Fri Apr 17 06:27:53 2015	(r22513)
@@ -1,8 +1,13 @@
 linux (3.16.7-ckt9-3~deb8u1) UNRELEASED; urgency=medium
 
+  [ Ben Hutchings ]
   * [x86] crypto: aesni - fix memory usage in GCM decryption (Closes: #782561)
   * tcp: Fix crash in TCP Fast Open (Closes: #782515)
 
+  [ Ian Campbell ]
+  * [xen] release per-queue Tx and Rx resource when disconnecting, fixing
+    network after save/restore or migration. (Closes: #782698)
+
  -- Ben Hutchings <ben at decadent.org.uk>  Wed, 15 Apr 2015 17:17:13 +0100
 
 linux (3.16.7-ckt9-2) unstable; urgency=medium

Added: dists/jessie-security/linux/debian/patches/bugfix/all/xen-netfront-release-per-queue-Tx-and-Rx-resource-wh.patch
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ dists/jessie-security/linux/debian/patches/bugfix/all/xen-netfront-release-per-queue-Tx-and-Rx-resource-wh.patch	Fri Apr 17 06:27:53 2015	(r22513)
@@ -0,0 +1,137 @@
+From a5b5dc3ce4df4f05f4d81c7d3c56a7604b242093 Mon Sep 17 00:00:00 2001
+From: David Vrabel <david.vrabel at citrix.com>
+Date: Thu, 31 Jul 2014 17:38:23 +0100
+Subject: [PATCH] xen-netfront: release per-queue Tx and Rx resource when
+ disconnecting
+Origin: https://git.kernel.org/linus/a5b5dc3ce4df4f05f4d81c7d3c56a7604b242093
+
+Since netfront may reconnect to a backend with a different number of
+queues, all per-queue Rx and Tx resources (skbs and grant references)
+should be freed when disconnecting.
+
+Without this fix, the Tx and Rx grant refs are not released and
+netfront will exhaust them after only a few reconnections.  netfront
+will fail to connect when no free grant references are available.
+
+Since all Rx bufs are freed and reallocated instead of reused this
+will add some additional delay to the reconnection but this is
+expected to be small compared to the time taken by any backend hotplug
+scripts etc.
+
+Signed-off-by: David Vrabel <david.vrabel at citrix.com>
+Signed-off-by: David S. Miller <davem at davemloft.net>
+---
+ drivers/net/xen-netfront.c | 68 +++++-----------------------------------------
+ 1 file changed, 7 insertions(+), 61 deletions(-)
+
+diff --git a/drivers/net/xen-netfront.c b/drivers/net/xen-netfront.c
+index 1cc46d0..0b133a3 100644
+--- a/drivers/net/xen-netfront.c
++++ b/drivers/net/xen-netfront.c
+@@ -1196,22 +1196,6 @@ static void xennet_release_rx_bufs(struct netfront_queue *queue)
+ 	spin_unlock_bh(&queue->rx_lock);
+ }
+ 
+-static void xennet_uninit(struct net_device *dev)
+-{
+-	struct netfront_info *np = netdev_priv(dev);
+-	unsigned int num_queues = dev->real_num_tx_queues;
+-	struct netfront_queue *queue;
+-	unsigned int i;
+-
+-	for (i = 0; i < num_queues; ++i) {
+-		queue = &np->queues[i];
+-		xennet_release_tx_bufs(queue);
+-		xennet_release_rx_bufs(queue);
+-		gnttab_free_grant_references(queue->gref_tx_head);
+-		gnttab_free_grant_references(queue->gref_rx_head);
+-	}
+-}
+-
+ static netdev_features_t xennet_fix_features(struct net_device *dev,
+ 	netdev_features_t features)
+ {
+@@ -1313,7 +1297,6 @@ static void xennet_poll_controller(struct net_device *dev)
+ 
+ static const struct net_device_ops xennet_netdev_ops = {
+ 	.ndo_open            = xennet_open,
+-	.ndo_uninit          = xennet_uninit,
+ 	.ndo_stop            = xennet_close,
+ 	.ndo_start_xmit      = xennet_start_xmit,
+ 	.ndo_change_mtu	     = xennet_change_mtu,
+@@ -1455,6 +1438,11 @@ static void xennet_disconnect_backend(struct netfront_info *info)
+ 
+ 		napi_synchronize(&queue->napi);
+ 
++		xennet_release_tx_bufs(queue);
++		xennet_release_rx_bufs(queue);
++		gnttab_free_grant_references(queue->gref_tx_head);
++		gnttab_free_grant_references(queue->gref_rx_head);
++
+ 		/* End access and free the pages */
+ 		xennet_end_access(queue->tx_ring_ref, queue->tx.sring);
+ 		xennet_end_access(queue->rx_ring_ref, queue->rx.sring);
+@@ -2010,10 +1998,7 @@ static int xennet_connect(struct net_device *dev)
+ {
+ 	struct netfront_info *np = netdev_priv(dev);
+ 	unsigned int num_queues = 0;
+-	int i, requeue_idx, err;
+-	struct sk_buff *skb;
+-	grant_ref_t ref;
+-	struct xen_netif_rx_request *req;
++	int err;
+ 	unsigned int feature_rx_copy;
+ 	unsigned int j = 0;
+ 	struct netfront_queue *queue = NULL;
+@@ -2040,47 +2025,8 @@ static int xennet_connect(struct net_device *dev)
+ 	netdev_update_features(dev);
+ 	rtnl_unlock();
+ 
+-	/* By now, the queue structures have been set up */
+-	for (j = 0; j < num_queues; ++j) {
+-		queue = &np->queues[j];
+-
+-		/* Step 1: Discard all pending TX packet fragments. */
+-		spin_lock_irq(&queue->tx_lock);
+-		xennet_release_tx_bufs(queue);
+-		spin_unlock_irq(&queue->tx_lock);
+-
+-		/* Step 2: Rebuild the RX buffer freelist and the RX ring itself. */
+-		spin_lock_bh(&queue->rx_lock);
+-
+-		for (requeue_idx = 0, i = 0; i < NET_RX_RING_SIZE; i++) {
+-			skb_frag_t *frag;
+-			const struct page *page;
+-			if (!queue->rx_skbs[i])
+-				continue;
+-
+-			skb = queue->rx_skbs[requeue_idx] = xennet_get_rx_skb(queue, i);
+-			ref = queue->grant_rx_ref[requeue_idx] = xennet_get_rx_ref(queue, i);
+-			req = RING_GET_REQUEST(&queue->rx, requeue_idx);
+-
+-			frag = &skb_shinfo(skb)->frags[0];
+-			page = skb_frag_page(frag);
+-			gnttab_grant_foreign_access_ref(
+-				ref, queue->info->xbdev->otherend_id,
+-				pfn_to_mfn(page_to_pfn(page)),
+-				0);
+-			req->gref = ref;
+-			req->id   = requeue_idx;
+-
+-			requeue_idx++;
+-		}
+-
+-		queue->rx.req_prod_pvt = requeue_idx;
+-
+-		spin_unlock_bh(&queue->rx_lock);
+-	}
+-
+ 	/*
+-	 * Step 3: All public and private state should now be sane.  Get
++	 * All public and private state should now be sane.  Get
+ 	 * ready to start sending and receiving packets and give the driver
+ 	 * domain a kick because we've probably just requeued some
+ 	 * packets.
+-- 
+2.1.4
+

Modified: dists/jessie-security/linux/debian/patches/series
==============================================================================
--- dists/jessie-security/linux/debian/patches/series	Fri Apr 17 06:27:43 2015	(r22512)
+++ dists/jessie-security/linux/debian/patches/series	Fri Apr 17 06:27:53 2015	(r22513)
@@ -193,6 +193,7 @@
 bugfix/all/ipv6-don-t-reduce-hop-limit-for-an-interface.patch
 bugfix/all/hid-thingm-fix-workqueue-race-on-remove.patch
 debian/emmc-don-t-initialize-partitions-on-rpmb-flagged-areas.patch
+bugfix/all/xen-netfront-release-per-queue-Tx-and-Rx-resource-wh.patch
 
 # memfd_create() & kdbus backport
 features/all/kdbus/mm-allow-drivers-to-prevent-new-writable-mappings.patch



More information about the Kernel-svn-changes mailing list