aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid S. Miller <davem@davemloft.net>2016-01-15 15:13:19 -0500
committerDavid S. Miller <davem@davemloft.net>2016-01-15 15:13:19 -0500
commit973365dc2de93a79950d2d2483ca8fbc2ad2ca18 (patch)
tree8240a079a4eb513a9d71565a3051526d71329dda
parentfb3311853c0f23391fc3441d49a46d076de57757 (diff)
parent9c6f3ffe8200327d1cf2aad2ff2b414adaacbe96 (diff)
Merge branch 'xen-netback-fixes'
David Vrabel says: ==================== xen-netback: use skb to determine number of required (etc.) "xen-netback: use skb to determine number of required" plus two other minor fixes I found down the back of the sofa. ==================== Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r--drivers/net/xen-netback/interface.c17
-rw-r--r--drivers/net/xen-netback/netback.c20
2 files changed, 15 insertions, 22 deletions
diff --git a/drivers/net/xen-netback/interface.c b/drivers/net/xen-netback/interface.c
index e7bd63eb2876..f5231a2dd2ac 100644
--- a/drivers/net/xen-netback/interface.c
+++ b/drivers/net/xen-netback/interface.c
@@ -615,6 +615,7 @@ err_tx_unbind:
615 queue->tx_irq = 0; 615 queue->tx_irq = 0;
616err_unmap: 616err_unmap:
617 xenvif_unmap_frontend_rings(queue); 617 xenvif_unmap_frontend_rings(queue);
618 netif_napi_del(&queue->napi);
618err: 619err:
619 module_put(THIS_MODULE); 620 module_put(THIS_MODULE);
620 return err; 621 return err;
@@ -684,22 +685,16 @@ void xenvif_deinit_queue(struct xenvif_queue *queue)
684 685
685void xenvif_free(struct xenvif *vif) 686void xenvif_free(struct xenvif *vif)
686{ 687{
687 struct xenvif_queue *queue = NULL; 688 struct xenvif_queue *queues = vif->queues;
688 unsigned int num_queues = vif->num_queues; 689 unsigned int num_queues = vif->num_queues;
689 unsigned int queue_index; 690 unsigned int queue_index;
690 691
691 unregister_netdev(vif->dev); 692 unregister_netdev(vif->dev);
692
693 for (queue_index = 0; queue_index < num_queues; ++queue_index) {
694 queue = &vif->queues[queue_index];
695 xenvif_deinit_queue(queue);
696 }
697
698 vfree(vif->queues);
699 vif->queues = NULL;
700 vif->num_queues = 0;
701
702 free_netdev(vif->dev); 693 free_netdev(vif->dev);
703 694
695 for (queue_index = 0; queue_index < num_queues; ++queue_index)
696 xenvif_deinit_queue(&queues[queue_index]);
697 vfree(queues);
698
704 module_put(THIS_MODULE); 699 module_put(THIS_MODULE);
705} 700}
diff --git a/drivers/net/xen-netback/netback.c b/drivers/net/xen-netback/netback.c
index 1049c34e7d43..61b97c34bb3b 100644
--- a/drivers/net/xen-netback/netback.c
+++ b/drivers/net/xen-netback/netback.c
@@ -149,20 +149,19 @@ static inline pending_ring_idx_t pending_index(unsigned i)
149 return i & (MAX_PENDING_REQS-1); 149 return i & (MAX_PENDING_REQS-1);
150} 150}
151 151
152static int xenvif_rx_ring_slots_needed(struct xenvif *vif)
153{
154 if (vif->gso_mask)
155 return DIV_ROUND_UP(vif->dev->gso_max_size, XEN_PAGE_SIZE) + 1;
156 else
157 return DIV_ROUND_UP(vif->dev->mtu, XEN_PAGE_SIZE);
158}
159
160static bool xenvif_rx_ring_slots_available(struct xenvif_queue *queue) 152static bool xenvif_rx_ring_slots_available(struct xenvif_queue *queue)
161{ 153{
162 RING_IDX prod, cons; 154 RING_IDX prod, cons;
155 struct sk_buff *skb;
163 int needed; 156 int needed;
164 157
165 needed = xenvif_rx_ring_slots_needed(queue->vif); 158 skb = skb_peek(&queue->rx_queue);
159 if (!skb)
160 return false;
161
162 needed = DIV_ROUND_UP(skb->len, XEN_PAGE_SIZE);
163 if (skb_is_gso(skb))
164 needed++;
166 165
167 do { 166 do {
168 prod = queue->rx.sring->req_prod; 167 prod = queue->rx.sring->req_prod;
@@ -2005,8 +2004,7 @@ static bool xenvif_rx_queue_ready(struct xenvif_queue *queue)
2005 2004
2006static bool xenvif_have_rx_work(struct xenvif_queue *queue) 2005static bool xenvif_have_rx_work(struct xenvif_queue *queue)
2007{ 2006{
2008 return (!skb_queue_empty(&queue->rx_queue) 2007 return xenvif_rx_ring_slots_available(queue)
2009 && xenvif_rx_ring_slots_available(queue))
2010 || (queue->vif->stall_timeout && 2008 || (queue->vif->stall_timeout &&
2011 (xenvif_rx_queue_stalled(queue) 2009 (xenvif_rx_queue_stalled(queue)
2012 || xenvif_rx_queue_ready(queue))) 2010 || xenvif_rx_queue_ready(queue)))