diff options
Diffstat (limited to 'drivers/net/xen-netback/netback.c')
| -rw-r--r-- | drivers/net/xen-netback/netback.c | 16 | 
1 files changed, 6 insertions, 10 deletions
| diff --git a/drivers/net/xen-netback/netback.c b/drivers/net/xen-netback/netback.c index 6b62c3eb8e1..e5284bca2d9 100644 --- a/drivers/net/xen-netback/netback.c +++ b/drivers/net/xen-netback/netback.c @@ -476,7 +476,6 @@ static void xenvif_rx_action(struct xenvif *vif)  	unsigned long offset;  	struct skb_cb_overlay *sco;  	bool need_to_notify = false; -	bool ring_full = false;  	struct netrx_pending_operations npo = {  		.copy  = vif->grant_copy_op, @@ -486,7 +485,7 @@ static void xenvif_rx_action(struct xenvif *vif)  	skb_queue_head_init(&rxq);  	while ((skb = skb_dequeue(&vif->rx_queue)) != NULL) { -		int max_slots_needed; +		RING_IDX max_slots_needed;  		int i;  		/* We need a cheap worse case estimate for the number of @@ -509,9 +508,10 @@ static void xenvif_rx_action(struct xenvif *vif)  		if (!xenvif_rx_ring_slots_available(vif, max_slots_needed)) {  			skb_queue_head(&vif->rx_queue, skb);  			need_to_notify = true; -			ring_full = true; +			vif->rx_last_skb_slots = max_slots_needed;  			break; -		} +		} else +			vif->rx_last_skb_slots = 0;  		sco = (struct skb_cb_overlay *)skb->cb;  		sco->meta_slots_used = xenvif_gop_skb(skb, &npo); @@ -522,8 +522,6 @@ static void xenvif_rx_action(struct xenvif *vif)  	BUG_ON(npo.meta_prod > ARRAY_SIZE(vif->meta)); -	vif->rx_queue_stopped = !npo.copy_prod && ring_full; -  	if (!npo.copy_prod)  		goto done; @@ -1473,8 +1471,8 @@ static struct xen_netif_rx_response *make_rx_response(struct xenvif *vif,  static inline int rx_work_todo(struct xenvif *vif)  { -	return (!skb_queue_empty(&vif->rx_queue) && !vif->rx_queue_stopped) || -		vif->rx_event; +	return !skb_queue_empty(&vif->rx_queue) && +	       xenvif_rx_ring_slots_available(vif, vif->rx_last_skb_slots);  }  static inline int tx_work_todo(struct xenvif *vif) @@ -1560,8 +1558,6 @@ int xenvif_kthread(void *data)  		if (!skb_queue_empty(&vif->rx_queue))  			xenvif_rx_action(vif); -		vif->rx_event = false; -  		if (skb_queue_empty(&vif->rx_queue) &&  		    netif_queue_stopped(vif->dev))  			xenvif_start_queue(vif); | 
