diff options
Diffstat (limited to 'drivers/net/xen-netback/netback.c')
-rw-r--r-- | drivers/net/xen-netback/netback.c | 27 |
1 files changed, 14 insertions, 13 deletions
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 | */ |
61 | unsigned int rx_drain_timeout_msecs = 10000; | 61 | unsigned int rx_drain_timeout_msecs = 10000; |
62 | module_param(rx_drain_timeout_msecs, uint, 0444); | 62 | module_param(rx_drain_timeout_msecs, uint, 0444); |
63 | unsigned 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 | */ |
68 | static unsigned int rx_stall_timeout_msecs = 60000; | 67 | unsigned int rx_stall_timeout_msecs = 60000; |
69 | module_param(rx_stall_timeout_msecs, uint, 0444); | 68 | module_param(rx_stall_timeout_msecs, uint, 0444); |
70 | static unsigned int rx_stall_timeout_jiffies; | ||
71 | 69 | ||
72 | unsigned int xenvif_max_queues; | 70 | unsigned int xenvif_max_queues; |
73 | module_param_named(max_queues, xenvif_max_queues, uint, 0644); | 71 | module_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 | ||
2026 | static bool xenvif_rx_queue_ready(struct xenvif_queue *queue) | 2024 | static 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)) |