[kernel] r22235 - in dists/sid/linux/debian: . patches patches/bugfix/all
Ian James Campbell
ijc at moszumanska.debian.org
Mon Dec 29 23:16:40 UTC 2014
Author: ijc
Date: Mon Dec 29 23:16:40 2014
New Revision: 22235
Log:
[xen] More netback fixes
(including reintroducing support for feature-rx-notify, which was regressed by
the fix to #767261).
Added:
dists/sid/linux/debian/patches/bugfix/all/netback-don-t-store-invalid-vif-pointer.patch
dists/sid/linux/debian/patches/bugfix/all/xen-netback-Disable-NAPI-after-disabling-interrupts.patch
dists/sid/linux/debian/patches/bugfix/all/xen-netback-do-not-report-success-if-backend_create_.patch
dists/sid/linux/debian/patches/bugfix/all/xen-netback-support-frontends-without-feature-rx-not.patch
Modified:
dists/sid/linux/debian/changelog
dists/sid/linux/debian/patches/series
Modified: dists/sid/linux/debian/changelog
==============================================================================
--- dists/sid/linux/debian/changelog Mon Dec 29 23:16:37 2014 (r22234)
+++ dists/sid/linux/debian/changelog Mon Dec 29 23:16:40 2014 (r22235)
@@ -34,6 +34,8 @@
- [/orion5x]: Make SERIO and dependants modular
* [arhmf] Add device-tree for LinkSprite pcDuino V3. Patch from Karsten
Merker (Closes: #774067)
+ * [xen] More netback fixes (including reintroducing support for
+ feature-rx-notify, which was regressed by the fix to #767261).
-- Ben Hutchings <ben at decadent.org.uk> Sat, 13 Dec 2014 11:45:48 +0000
Added: dists/sid/linux/debian/patches/bugfix/all/netback-don-t-store-invalid-vif-pointer.patch
==============================================================================
--- /dev/null 00:00:00 1970 (empty, because file is newly added)
+++ dists/sid/linux/debian/patches/bugfix/all/netback-don-t-store-invalid-vif-pointer.patch Mon Dec 29 23:16:40 2014 (r22235)
@@ -0,0 +1,50 @@
+From e67d8dd0e2c1b8b4573a6a3f05f609be230dfaff Mon Sep 17 00:00:00 2001
+From: Jan Beulich <JBeulich at suse.com>
+Date: Tue, 9 Dec 2014 11:47:04 +0000
+Subject: [PATCH 3/4] netback: don't store invalid vif pointer
+Origin: https://git.kernel.org/linus/f15650b7f94879667f253bc32de7431c1baf2d6e
+
+When xenvif_alloc() fails, it returns a non-NULL error indicator. To
+avoid eventual races, we shouldn't store that into struct backend_info
+as readers of it only check for NULL.
+
+Signed-off-by: Jan Beulich <jbeulich at suse.com>
+Acked-by: Ian Campbell <ian.campbell at citrix.com>
+Signed-off-by: David S. Miller <davem at davemloft.net>
+---
+ drivers/net/xen-netback/xenbus.c | 9 +++++----
+ 1 file changed, 5 insertions(+), 4 deletions(-)
+
+diff --git a/drivers/net/xen-netback/xenbus.c b/drivers/net/xen-netback/xenbus.c
+index 0b4f1c7..cc8f8ba 100644
+--- a/drivers/net/xen-netback/xenbus.c
++++ b/drivers/net/xen-netback/xenbus.c
+@@ -404,6 +404,7 @@ static int backend_create_xenvif(struct backend_info *be)
+ int err;
+ long handle;
+ struct xenbus_device *dev = be->dev;
++ struct xenvif *vif;
+
+ if (be->vif != NULL)
+ return 0;
+@@ -414,13 +415,13 @@ static int backend_create_xenvif(struct backend_info *be)
+ return (err < 0) ? err : -EINVAL;
+ }
+
+- be->vif = xenvif_alloc(&dev->dev, dev->otherend_id, handle);
+- if (IS_ERR(be->vif)) {
+- err = PTR_ERR(be->vif);
+- be->vif = NULL;
++ vif = xenvif_alloc(&dev->dev, dev->otherend_id, handle);
++ if (IS_ERR(vif)) {
++ err = PTR_ERR(vif);
+ xenbus_dev_fatal(dev, err, "creating interface");
+ return err;
+ }
++ be->vif = vif;
+
+ kobject_uevent(&dev->dev.kobj, KOBJ_ONLINE);
+ return 0;
+--
+1.7.10.4
+
Added: dists/sid/linux/debian/patches/bugfix/all/xen-netback-Disable-NAPI-after-disabling-interrupts.patch
==============================================================================
--- /dev/null 00:00:00 1970 (empty, because file is newly added)
+++ dists/sid/linux/debian/patches/bugfix/all/xen-netback-Disable-NAPI-after-disabling-interrupts.patch Mon Dec 29 23:16:40 2014 (r22235)
@@ -0,0 +1,38 @@
+From bafb73e2d50d3addd0f79e09ea3f2e2950505733 Mon Sep 17 00:00:00 2001
+From: Zoltan Kiss <zoltan.kiss at linaro.org>
+Date: Tue, 28 Oct 2014 15:29:30 +0000
+Subject: [PATCH 1/4] xen-netback: Disable NAPI after disabling interrupts
+Origin: https://git.kernel.org/linus/8fe78989c3445a221cfcc54964e7e62718883615
+
+Otherwise the interrupt handler still calls napi_complete. Although it
+won't schedule NAPI again as either NAPI_STATE_DISABLE or
+NAPI_STATE_SCHED is set, it is just unnecessary, and it makes more
+sense to do this way.
+
+Signed-off-by: Zoltan Kiss <zoltan.kiss at linaro.org>
+Signed-off-by: David Vrabel <david.vrabel at citrix.com>
+Acked-by: Wei Liu <wei.liu2 at citrix.com>
+Signed-off-by: David S. Miller <davem at davemloft.net>
+---
+ drivers/net/xen-netback/interface.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/drivers/net/xen-netback/interface.c b/drivers/net/xen-netback/interface.c
+index 21d8db8..ddcb757 100644
+--- a/drivers/net/xen-netback/interface.c
++++ b/drivers/net/xen-netback/interface.c
+@@ -235,10 +235,10 @@ static void xenvif_down(struct xenvif *vif)
+
+ for (queue_index = 0; queue_index < num_queues; ++queue_index) {
+ queue = &vif->queues[queue_index];
+- napi_disable(&queue->napi);
+ disable_irq(queue->tx_irq);
+ if (queue->tx_irq != queue->rx_irq)
+ disable_irq(queue->rx_irq);
++ napi_disable(&queue->napi);
+ del_timer_sync(&queue->credit_timeout);
+ }
+ }
+--
+1.7.10.4
+
Added: dists/sid/linux/debian/patches/bugfix/all/xen-netback-do-not-report-success-if-backend_create_.patch
==============================================================================
--- /dev/null 00:00:00 1970 (empty, because file is newly added)
+++ dists/sid/linux/debian/patches/bugfix/all/xen-netback-do-not-report-success-if-backend_create_.patch Mon Dec 29 23:16:40 2014 (r22235)
@@ -0,0 +1,84 @@
+From 0a640486cd7694015eaa7221714f9a2ce654f7a7 Mon Sep 17 00:00:00 2001
+From: Alexey Khoroshilov <khoroshilov at ispras.ru>
+Date: Mon, 24 Nov 2014 13:58:00 +0300
+Subject: [PATCH 2/4] xen-netback: do not report success if
+ backend_create_xenvif() fails
+Origin: https://git.kernel.org/linus/2dd34339ac6305c4f2f4e589b858212e339d31e9
+
+If xenvif_alloc() or xenbus_scanf() fail in backend_create_xenvif(),
+xenbus is left in offline mode but netback_probe() reports success.
+
+The patch implements propagation of error code for backend_create_xenvif().
+
+Found by Linux Driver Verification project (linuxtesting.org).
+
+Signed-off-by: Alexey Khoroshilov <khoroshilov at ispras.ru>
+Acked-by: Wei Liu <wei.liu2 at citrix.com>
+Signed-off-by: David S. Miller <davem at davemloft.net>
+---
+ drivers/net/xen-netback/xenbus.c | 15 +++++++++------
+ 1 file changed, 9 insertions(+), 6 deletions(-)
+
+diff --git a/drivers/net/xen-netback/xenbus.c b/drivers/net/xen-netback/xenbus.c
+index 396b3d9..0b4f1c7 100644
+--- a/drivers/net/xen-netback/xenbus.c
++++ b/drivers/net/xen-netback/xenbus.c
+@@ -39,7 +39,7 @@ struct backend_info {
+ static int connect_rings(struct backend_info *be, struct xenvif_queue *queue);
+ static void connect(struct backend_info *be);
+ static int read_xenbus_vif_flags(struct backend_info *be);
+-static void backend_create_xenvif(struct backend_info *be);
++static int backend_create_xenvif(struct backend_info *be);
+ static void unregister_hotplug_status_watch(struct backend_info *be);
+ static void set_backend_state(struct backend_info *be,
+ enum xenbus_state state);
+@@ -352,7 +352,9 @@ static int netback_probe(struct xenbus_device *dev,
+ be->state = XenbusStateInitWait;
+
+ /* This kicks hotplug scripts, so do it immediately. */
+- backend_create_xenvif(be);
++ err = backend_create_xenvif(be);
++ if (err)
++ goto fail;
+
+ return 0;
+
+@@ -397,19 +399,19 @@ static int netback_uevent(struct xenbus_device *xdev,
+ }
+
+
+-static void backend_create_xenvif(struct backend_info *be)
++static int backend_create_xenvif(struct backend_info *be)
+ {
+ int err;
+ long handle;
+ struct xenbus_device *dev = be->dev;
+
+ if (be->vif != NULL)
+- return;
++ return 0;
+
+ err = xenbus_scanf(XBT_NIL, dev->nodename, "handle", "%li", &handle);
+ if (err != 1) {
+ xenbus_dev_fatal(dev, err, "reading handle");
+- return;
++ return (err < 0) ? err : -EINVAL;
+ }
+
+ be->vif = xenvif_alloc(&dev->dev, dev->otherend_id, handle);
+@@ -417,10 +419,11 @@ static void backend_create_xenvif(struct backend_info *be)
+ err = PTR_ERR(be->vif);
+ be->vif = NULL;
+ xenbus_dev_fatal(dev, err, "creating interface");
+- return;
++ return err;
+ }
+
+ kobject_uevent(&dev->dev.kobj, KOBJ_ONLINE);
++ return 0;
+ }
+
+ static void backend_disconnect(struct backend_info *be)
+--
+1.7.10.4
+
Added: dists/sid/linux/debian/patches/bugfix/all/xen-netback-support-frontends-without-feature-rx-not.patch
==============================================================================
--- /dev/null 00:00:00 1970 (empty, because file is newly added)
+++ dists/sid/linux/debian/patches/bugfix/all/xen-netback-support-frontends-without-feature-rx-not.patch Mon Dec 29 23:16:40 2014 (r22235)
@@ -0,0 +1,188 @@
+From 0baa6f7d5b0ed21b28768d151b1d74cb9b88dacf Mon Sep 17 00:00:00 2001
+From: David Vrabel <david.vrabel at citrix.com>
+Date: Thu, 18 Dec 2014 11:13:06 +0000
+Subject: [PATCH 4/4] xen-netback: support frontends without feature-rx-notify
+ again
+Origin: https://git.kernel.org/linus/26c0e102585d5a4d311f5d6eb7f524d288e7f6b7
+
+Commit bc96f648df1bbc2729abbb84513cf4f64273a1f1 (xen-netback: make
+feature-rx-notify mandatory) incorrectly assumed that there were no
+frontends in use that did not support this feature. But the frontend
+driver in MiniOS does not and since this is used by (qemu) stubdoms,
+these stopped working.
+
+Netback sort of works as-is in this mode except:
+
+- If there are no Rx requests and the internal Rx queue fills, only
+ the drain timeout will wake the thread. The default drain timeout
+ of 10 s would give unacceptable pauses.
+
+- If an Rx stall was detected and the internal Rx queue is drained,
+ then the Rx thread would never wake.
+
+Handle these two cases (when feature-rx-notify is disabled) by:
+
+- Reducing the drain timeout to 30 ms.
+
+- Disabling Rx stall detection.
+
+Reported-by: John <jw at nuclearfallout.net>
+Tested-by: John <jw at nuclearfallout.net>
+Signed-off-by: David Vrabel <david.vrabel at citrix.com>
+Reviewed-by: Wei Liu <wei.liu2 at citrix.com>
+Signed-off-by: David S. Miller <davem at davemloft.net>
+---
+ drivers/net/xen-netback/common.h | 4 +++-
+ drivers/net/xen-netback/interface.c | 4 +++-
+ drivers/net/xen-netback/netback.c | 27 ++++++++++++++-------------
+ drivers/net/xen-netback/xenbus.c | 12 +++++++++---
+ 4 files changed, 29 insertions(+), 18 deletions(-)
+
+diff --git a/drivers/net/xen-netback/common.h b/drivers/net/xen-netback/common.h
+index 083ecc9..5f1fda4 100644
+--- a/drivers/net/xen-netback/common.h
++++ b/drivers/net/xen-netback/common.h
+@@ -230,6 +230,8 @@ struct xenvif {
+ */
+ bool disabled;
+ unsigned long status;
++ unsigned long drain_timeout;
++ unsigned long stall_timeout;
+
+ /* Queues */
+ struct xenvif_queue *queues;
+@@ -328,7 +330,7 @@ irqreturn_t xenvif_interrupt(int irq, void *dev_id);
+ extern bool separate_tx_rx_irq;
+
+ extern unsigned int rx_drain_timeout_msecs;
+-extern unsigned int rx_drain_timeout_jiffies;
++extern unsigned int rx_stall_timeout_msecs;
+ extern unsigned int xenvif_max_queues;
+
+ #ifdef CONFIG_DEBUG_FS
+diff --git a/drivers/net/xen-netback/interface.c b/drivers/net/xen-netback/interface.c
+index ddcb757..af047c2 100644
+--- a/drivers/net/xen-netback/interface.c
++++ b/drivers/net/xen-netback/interface.c
+@@ -166,7 +166,7 @@ static int xenvif_start_xmit(struct sk_buff *skb, struct net_device *dev)
+ goto drop;
+
+ cb = XENVIF_RX_CB(skb);
+- cb->expires = jiffies + rx_drain_timeout_jiffies;
++ cb->expires = jiffies + vif->drain_timeout;
+
+ xenvif_rx_queue_tail(queue, skb);
+ xenvif_kick_thread(queue);
+@@ -414,6 +414,8 @@ struct xenvif *xenvif_alloc(struct device *parent, domid_t domid,
+ vif->ip_csum = 1;
+ vif->dev = dev;
+ vif->disabled = false;
++ vif->drain_timeout = msecs_to_jiffies(rx_drain_timeout_msecs);
++ vif->stall_timeout = msecs_to_jiffies(rx_stall_timeout_msecs);
+
+ /* Start out with no queues. */
+ vif->queues = NULL;
+diff --git a/drivers/net/xen-netback/netback.c b/drivers/net/xen-netback/netback.c
+index 6563f07..c39aace 100644
+--- a/drivers/net/xen-netback/netback.c
++++ b/drivers/net/xen-netback/netback.c
+@@ -60,14 +60,12 @@ module_param(separate_tx_rx_irq, bool, 0644);
+ */
+ unsigned int rx_drain_timeout_msecs = 10000;
+ module_param(rx_drain_timeout_msecs, uint, 0444);
+-unsigned int rx_drain_timeout_jiffies;
+
+ /* The length of time before the frontend is considered unresponsive
+ * because it isn't providing Rx slots.
+ */
+-static unsigned int rx_stall_timeout_msecs = 60000;
++unsigned int rx_stall_timeout_msecs = 60000;
+ module_param(rx_stall_timeout_msecs, uint, 0444);
+-static unsigned int rx_stall_timeout_jiffies;
+
+ unsigned int xenvif_max_queues;
+ module_param_named(max_queues, xenvif_max_queues, uint, 0644);
+@@ -2022,7 +2020,7 @@ static bool xenvif_rx_queue_stalled(struct xenvif_queue *queue)
+ return !queue->stalled
+ && prod - cons < XEN_NETBK_RX_SLOTS_MAX
+ && time_after(jiffies,
+- queue->last_rx_time + rx_stall_timeout_jiffies);
++ queue->last_rx_time + queue->vif->stall_timeout);
+ }
+
+ static bool xenvif_rx_queue_ready(struct xenvif_queue *queue)
+@@ -2040,8 +2038,9 @@ static bool xenvif_have_rx_work(struct xenvif_queue *queue)
+ {
+ return (!skb_queue_empty(&queue->rx_queue)
+ && xenvif_rx_ring_slots_available(queue, XEN_NETBK_RX_SLOTS_MAX))
+- || xenvif_rx_queue_stalled(queue)
+- || xenvif_rx_queue_ready(queue)
++ || (queue->vif->stall_timeout &&
++ (xenvif_rx_queue_stalled(queue)
++ || xenvif_rx_queue_ready(queue)))
+ || kthread_should_stop()
+ || queue->vif->disabled;
+ }
+@@ -2094,6 +2093,9 @@ int xenvif_kthread_guest_rx(void *data)
+ struct xenvif_queue *queue = data;
+ struct xenvif *vif = queue->vif;
+
++ if (!vif->stall_timeout)
++ xenvif_queue_carrier_on(queue);
++
+ for (;;) {
+ xenvif_wait_for_rx_work(queue);
+
+@@ -2120,10 +2122,12 @@ int xenvif_kthread_guest_rx(void *data)
+ * while it's probably not responsive, drop the
+ * carrier so packets are dropped earlier.
+ */
+- if (xenvif_rx_queue_stalled(queue))
+- xenvif_queue_carrier_off(queue);
+- else if (xenvif_rx_queue_ready(queue))
+- xenvif_queue_carrier_on(queue);
++ if (vif->stall_timeout) {
++ if (xenvif_rx_queue_stalled(queue))
++ xenvif_queue_carrier_off(queue);
++ else if (xenvif_rx_queue_ready(queue))
++ xenvif_queue_carrier_on(queue);
++ }
+
+ /* Queued packets may have foreign pages from other
+ * domains. These cannot be queued indefinitely as
+@@ -2194,9 +2198,6 @@ static int __init netback_init(void)
+ if (rc)
+ goto failed_init;
+
+- rx_drain_timeout_jiffies = msecs_to_jiffies(rx_drain_timeout_msecs);
+- rx_stall_timeout_jiffies = msecs_to_jiffies(rx_stall_timeout_msecs);
+-
+ #ifdef CONFIG_DEBUG_FS
+ xen_netback_dbg_root = debugfs_create_dir("xen-netback", NULL);
+ if (IS_ERR_OR_NULL(xen_netback_dbg_root))
+diff --git a/drivers/net/xen-netback/xenbus.c b/drivers/net/xen-netback/xenbus.c
+index cc8f8ba..60f7c7d 100644
+--- a/drivers/net/xen-netback/xenbus.c
++++ b/drivers/net/xen-netback/xenbus.c
+@@ -887,9 +887,15 @@ static int read_xenbus_vif_flags(struct backend_info *be)
+ return -EOPNOTSUPP;
+
+ if (xenbus_scanf(XBT_NIL, dev->otherend,
+- "feature-rx-notify", "%d", &val) < 0 || val == 0) {
+- xenbus_dev_fatal(dev, -EINVAL, "feature-rx-notify is mandatory");
+- return -EINVAL;
++ "feature-rx-notify", "%d", &val) < 0)
++ val = 0;
++ if (!val) {
++ /* - Reduce drain timeout to poll more frequently for
++ * Rx requests.
++ * - Disable Rx stall detection.
++ */
++ be->vif->drain_timeout = msecs_to_jiffies(30);
++ be->vif->stall_timeout = 0;
+ }
+
+ if (xenbus_scanf(XBT_NIL, dev->otherend, "feature-sg",
+--
+1.7.10.4
+
Modified: dists/sid/linux/debian/patches/series
==============================================================================
--- dists/sid/linux/debian/patches/series Mon Dec 29 23:16:37 2014 (r22234)
+++ dists/sid/linux/debian/patches/series Mon Dec 29 23:16:40 2014 (r22235)
@@ -157,6 +157,10 @@
bugfix/all/xen-netback-make-feature-rx-notify-mandatory.patch
bugfix/all/xen-netback-fix-unlimited-guest-Rx-internal-queue-an.patch
bugfix/all/xen-netback-reintroduce-guest-Rx-stall-detection.patch
+bugfix/all/xen-netback-Disable-NAPI-after-disabling-interrupts.patch
+bugfix/all/xen-netback-do-not-report-success-if-backend_create_.patch
+bugfix/all/netback-don-t-store-invalid-vif-pointer.patch
+bugfix/all/xen-netback-support-frontends-without-feature-rx-not.patch
bugfix/all/of-fdt-memblock_reserve-memreserve-regions-in-the-ca.patch
# memfd_create() & kdbus backport
More information about the Kernel-svn-changes
mailing list