aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/xen-netback
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/net/xen-netback')
-rw-r--r--drivers/net/xen-netback/common.h4
-rw-r--r--drivers/net/xen-netback/interface.c4
-rw-r--r--drivers/net/xen-netback/netback.c27
-rw-r--r--drivers/net/xen-netback/xenbus.c12
4 files changed, 29 insertions, 18 deletions
diff --git a/drivers/net/xen-netback/common.h b/drivers/net/xen-netback/common.h
index 083ecc93fe5e..5f1fda44882b 100644
--- a/drivers/net/xen-netback/common.h
+++ b/drivers/net/xen-netback/common.h
@@ -230,6 +230,8 @@ struct xenvif {
230 */ 230 */
231 bool disabled; 231 bool disabled;
232 unsigned long status; 232 unsigned long status;
233 unsigned long drain_timeout;
234 unsigned long stall_timeout;
233 235
234 /* Queues */ 236 /* Queues */
235 struct xenvif_queue *queues; 237 struct xenvif_queue *queues;
@@ -328,7 +330,7 @@ irqreturn_t xenvif_interrupt(int irq, void *dev_id);
328extern bool separate_tx_rx_irq; 330extern bool separate_tx_rx_irq;
329 331
330extern unsigned int rx_drain_timeout_msecs; 332extern unsigned int rx_drain_timeout_msecs;
331extern unsigned int rx_drain_timeout_jiffies; 333extern unsigned int rx_stall_timeout_msecs;
332extern unsigned int xenvif_max_queues; 334extern unsigned int xenvif_max_queues;
333 335
334#ifdef CONFIG_DEBUG_FS 336#ifdef CONFIG_DEBUG_FS
diff --git a/drivers/net/xen-netback/interface.c b/drivers/net/xen-netback/interface.c
index a6a32d337bbb..9259a732e8a4 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)
166 goto drop; 166 goto drop;
167 167
168 cb = XENVIF_RX_CB(skb); 168 cb = XENVIF_RX_CB(skb);
169 cb->expires = jiffies + rx_drain_timeout_jiffies; 169 cb->expires = jiffies + vif->drain_timeout;
170 170
171 xenvif_rx_queue_tail(queue, skb); 171 xenvif_rx_queue_tail(queue, skb);
172 xenvif_kick_thread(queue); 172 xenvif_kick_thread(queue);
@@ -414,6 +414,8 @@ struct xenvif *xenvif_alloc(struct device *parent, domid_t domid,
414 vif->ip_csum = 1; 414 vif->ip_csum = 1;
415 vif->dev = dev; 415 vif->dev = dev;
416 vif->disabled = false; 416 vif->disabled = false;
417 vif->drain_timeout = msecs_to_jiffies(rx_drain_timeout_msecs);
418 vif->stall_timeout = msecs_to_jiffies(rx_stall_timeout_msecs);
417 419
418 /* Start out with no queues. */ 420 /* Start out with no queues. */
419 vif->queues = NULL; 421 vif->queues = NULL;
diff --git a/drivers/net/xen-netback/netback.c b/drivers/net/xen-netback/netback.c
index 4a509f715fe8..908e65e9b821 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);
60 */ 60 */
61unsigned int rx_drain_timeout_msecs = 10000; 61unsigned int rx_drain_timeout_msecs = 10000;
62module_param(rx_drain_timeout_msecs, uint, 0444); 62module_param(rx_drain_timeout_msecs, uint, 0444);
63unsigned int rx_drain_timeout_jiffies;
64 63
65/* The length of time before the frontend is considered unresponsive 64/* The length of time before the frontend is considered unresponsive
66 * because it isn't providing Rx slots. 65 * because it isn't providing Rx slots.
67 */ 66 */
68static unsigned int rx_stall_timeout_msecs = 60000; 67unsigned int rx_stall_timeout_msecs = 60000;
69module_param(rx_stall_timeout_msecs, uint, 0444); 68module_param(rx_stall_timeout_msecs, uint, 0444);
70static unsigned int rx_stall_timeout_jiffies;
71 69
72unsigned int xenvif_max_queues; 70unsigned int xenvif_max_queues;
73module_param_named(max_queues, xenvif_max_queues, uint, 0644); 71module_param_named(max_queues, xenvif_max_queues, uint, 0644);
@@ -2020,7 +2018,7 @@ static bool xenvif_rx_queue_stalled(struct xenvif_queue *queue)
2020 return !queue->stalled 2018 return !queue->stalled
2021 && prod - cons < XEN_NETBK_RX_SLOTS_MAX 2019 && prod - cons < XEN_NETBK_RX_SLOTS_MAX
2022 && time_after(jiffies, 2020 && time_after(jiffies,
2023 queue->last_rx_time + rx_stall_timeout_jiffies); 2021 queue->last_rx_time + queue->vif->stall_timeout);
2024} 2022}
2025 2023
2026static bool xenvif_rx_queue_ready(struct xenvif_queue *queue) 2024static bool xenvif_rx_queue_ready(struct xenvif_queue *queue)
@@ -2038,8 +2036,9 @@ static bool xenvif_have_rx_work(struct xenvif_queue *queue)
2038{ 2036{
2039 return (!skb_queue_empty(&queue->rx_queue) 2037 return (!skb_queue_empty(&queue->rx_queue)
2040 && xenvif_rx_ring_slots_available(queue, XEN_NETBK_RX_SLOTS_MAX)) 2038 && xenvif_rx_ring_slots_available(queue, XEN_NETBK_RX_SLOTS_MAX))
2041 || xenvif_rx_queue_stalled(queue) 2039 || (queue->vif->stall_timeout &&
2042 || xenvif_rx_queue_ready(queue) 2040 (xenvif_rx_queue_stalled(queue)
2041 || xenvif_rx_queue_ready(queue)))
2043 || kthread_should_stop() 2042 || kthread_should_stop()
2044 || queue->vif->disabled; 2043 || queue->vif->disabled;
2045} 2044}
@@ -2092,6 +2091,9 @@ int xenvif_kthread_guest_rx(void *data)
2092 struct xenvif_queue *queue = data; 2091 struct xenvif_queue *queue = data;
2093 struct xenvif *vif = queue->vif; 2092 struct xenvif *vif = queue->vif;
2094 2093
2094 if (!vif->stall_timeout)
2095 xenvif_queue_carrier_on(queue);
2096
2095 for (;;) { 2097 for (;;) {
2096 xenvif_wait_for_rx_work(queue); 2098 xenvif_wait_for_rx_work(queue);
2097 2099
@@ -2118,10 +2120,12 @@ int xenvif_kthread_guest_rx(void *data)
2118 * while it's probably not responsive, drop the 2120 * while it's probably not responsive, drop the
2119 * carrier so packets are dropped earlier. 2121 * carrier so packets are dropped earlier.
2120 */ 2122 */
2121 if (xenvif_rx_queue_stalled(queue)) 2123 if (vif->stall_timeout) {
2122 xenvif_queue_carrier_off(queue); 2124 if (xenvif_rx_queue_stalled(queue))
2123 else if (xenvif_rx_queue_ready(queue)) 2125 xenvif_queue_carrier_off(queue);
2124 xenvif_queue_carrier_on(queue); 2126 else if (xenvif_rx_queue_ready(queue))
2127 xenvif_queue_carrier_on(queue);
2128 }
2125 2129
2126 /* Queued packets may have foreign pages from other 2130 /* Queued packets may have foreign pages from other
2127 * domains. These cannot be queued indefinitely as 2131 * domains. These cannot be queued indefinitely as
@@ -2192,9 +2196,6 @@ static int __init netback_init(void)
2192 if (rc) 2196 if (rc)
2193 goto failed_init; 2197 goto failed_init;
2194 2198
2195 rx_drain_timeout_jiffies = msecs_to_jiffies(rx_drain_timeout_msecs);
2196 rx_stall_timeout_jiffies = msecs_to_jiffies(rx_stall_timeout_msecs);
2197
2198#ifdef CONFIG_DEBUG_FS 2199#ifdef CONFIG_DEBUG_FS
2199 xen_netback_dbg_root = debugfs_create_dir("xen-netback", NULL); 2200 xen_netback_dbg_root = debugfs_create_dir("xen-netback", NULL);
2200 if (IS_ERR_OR_NULL(xen_netback_dbg_root)) 2201 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 d44cd19169bd..efbaf2ae1999 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)
887 return -EOPNOTSUPP; 887 return -EOPNOTSUPP;
888 888
889 if (xenbus_scanf(XBT_NIL, dev->otherend, 889 if (xenbus_scanf(XBT_NIL, dev->otherend,
890 "feature-rx-notify", "%d", &val) < 0 || val == 0) { 890 "feature-rx-notify", "%d", &val) < 0)
891 xenbus_dev_fatal(dev, -EINVAL, "feature-rx-notify is mandatory"); 891 val = 0;
892 return -EINVAL; 892 if (!val) {
893 /* - Reduce drain timeout to poll more frequently for
894 * Rx requests.
895 * - Disable Rx stall detection.
896 */
897 be->vif->drain_timeout = msecs_to_jiffies(30);
898 be->vif->stall_timeout = 0;
893 } 899 }
894 900
895 if (xenbus_scanf(XBT_NIL, dev->otherend, "feature-sg", 901 if (xenbus_scanf(XBT_NIL, dev->otherend, "feature-sg",