aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/xen-netback/netback.c
diff options
context:
space:
mode:
authorDavid Vrabel <david.vrabel@citrix.com>2016-01-15 09:55:34 -0500
committerDavid S. Miller <davem@davemloft.net>2016-01-15 15:13:18 -0500
commit99a2dea50d5deff134b6c346f53a3ad1f583ee96 (patch)
treef25c92ae80136e8ac0cc8fda22f8bce7c704c2a5 /drivers/net/xen-netback/netback.c
parentfb3311853c0f23391fc3441d49a46d076de57757 (diff)
xen-netback: use skb to determine number of required guest Rx requests
Using the MTU or GSO size to determine the number of required guest Rx requests for an skb was subtly broken since these value may change at runtime. After 1650d5455bd2dc6b5ee134bd6fc1a3236c266b5b (xen-netback: always fully coalesce guest Rx packets) we always fully pack a packet into its guest Rx slots. Calculating the number of required slots from the packet length is then easy. Signed-off-by: David Vrabel <david.vrabel@citrix.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/xen-netback/netback.c')
-rw-r--r--drivers/net/xen-netback/netback.c20
1 files changed, 9 insertions, 11 deletions
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)))