diff options
author | David S. Miller <davem@davemloft.net> | 2016-01-15 15:13:19 -0500 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2016-01-15 15:13:19 -0500 |
commit | 973365dc2de93a79950d2d2483ca8fbc2ad2ca18 (patch) | |
tree | 8240a079a4eb513a9d71565a3051526d71329dda | |
parent | fb3311853c0f23391fc3441d49a46d076de57757 (diff) | |
parent | 9c6f3ffe8200327d1cf2aad2ff2b414adaacbe96 (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.c | 17 | ||||
-rw-r--r-- | drivers/net/xen-netback/netback.c | 20 |
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; |
616 | err_unmap: | 616 | err_unmap: |
617 | xenvif_unmap_frontend_rings(queue); | 617 | xenvif_unmap_frontend_rings(queue); |
618 | netif_napi_del(&queue->napi); | ||
618 | err: | 619 | err: |
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 | ||
685 | void xenvif_free(struct xenvif *vif) | 686 | void 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 | ||
152 | static 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 | |||
160 | static bool xenvif_rx_ring_slots_available(struct xenvif_queue *queue) | 152 | static 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 | ||
2006 | static bool xenvif_have_rx_work(struct xenvif_queue *queue) | 2005 | static 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))) |