|
|
@@ -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);
|