aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid Vrabel <david.vrabel@citrix.com>2016-10-04 05:29:15 -0400
committerDavid S. Miller <davem@davemloft.net>2016-10-06 20:37:35 -0400
commit7c0b1a23e6f983fe392c8ffa71d05189ae52ebb5 (patch)
tree23e2a43b4eb1c8effe25848939163dd4d36562e3
parenteb1723a29b9a75dd787510a39096a68dba6cc200 (diff)
xen-netback: immediately wake tx queue when guest rx queue has space
When an skb is removed from the guest rx queue, immediately wake the tx queue, instead of after processing them. Signed-off-by: David Vrabel <david.vrabel@citrix.com> [re-based] Signed-off-by: Paul Durrant <paul.durrant@citrix.com> Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r--drivers/net/xen-netback/rx.c24
1 files changed, 8 insertions, 16 deletions
diff --git a/drivers/net/xen-netback/rx.c b/drivers/net/xen-netback/rx.c
index b0ce4c6e9b21..95487091763c 100644
--- a/drivers/net/xen-netback/rx.c
+++ b/drivers/net/xen-netback/rx.c
@@ -92,25 +92,19 @@ static struct sk_buff *xenvif_rx_dequeue(struct xenvif_queue *queue)
92 spin_lock_irq(&queue->rx_queue.lock); 92 spin_lock_irq(&queue->rx_queue.lock);
93 93
94 skb = __skb_dequeue(&queue->rx_queue); 94 skb = __skb_dequeue(&queue->rx_queue);
95 if (skb) 95 if (skb) {
96 queue->rx_queue_len -= skb->len; 96 queue->rx_queue_len -= skb->len;
97 if (queue->rx_queue_len < queue->rx_queue_max) {
98 struct netdev_queue *txq;
97 99
98 spin_unlock_irq(&queue->rx_queue.lock); 100 txq = netdev_get_tx_queue(queue->vif->dev, queue->id);
99 101 netif_tx_wake_queue(txq);
100 return skb; 102 }
101}
102
103static void xenvif_rx_queue_maybe_wake(struct xenvif_queue *queue)
104{
105 spin_lock_irq(&queue->rx_queue.lock);
106
107 if (queue->rx_queue_len < queue->rx_queue_max) {
108 struct net_device *dev = queue->vif->dev;
109
110 netif_tx_wake_queue(netdev_get_tx_queue(dev, queue->id));
111 } 103 }
112 104
113 spin_unlock_irq(&queue->rx_queue.lock); 105 spin_unlock_irq(&queue->rx_queue.lock);
106
107 return skb;
114} 108}
115 109
116static void xenvif_rx_queue_purge(struct xenvif_queue *queue) 110static void xenvif_rx_queue_purge(struct xenvif_queue *queue)
@@ -585,8 +579,6 @@ int xenvif_kthread_guest_rx(void *data)
585 */ 579 */
586 xenvif_rx_queue_drop_expired(queue); 580 xenvif_rx_queue_drop_expired(queue);
587 581
588 xenvif_rx_queue_maybe_wake(queue);
589
590 cond_resched(); 582 cond_resched();
591 } 583 }
592 584