static int xenvif_poll(struct napi_struct *napi, int budget) { struct xenvif_queue *queue = container_of(napi, struct xenvif_queue, napi); int work_done; /* This vif is rogue, we pretend we've there is nothing to do * for this vif to deschedule it from NAPI. But this interface * will be turned off in thread context later. */ if (unlikely(queue->vif->disabled)) { napi_complete(napi); return 0; } work_done = xenvif_tx_action(queue, budget); if (work_done < budget) { napi_complete_done(napi, work_done); /* If the queue is rate-limited, it shall be * rescheduled in the timer callback. */ if (likely(!queue->rate_limited)) xenvif_napi_schedule_or_enable_events(queue); } return work_done; }
int xenvif_poll(struct napi_struct *napi, int budget) { struct xenvif_queue *queue = container_of(napi, struct xenvif_queue, napi); int work_done; /* This vif is rogue, we pretend we've there is nothing to do * for this vif to deschedule it from NAPI. But this interface * will be turned off in thread context later. * Also, if a guest doesn't post enough slots to receive data on one of * its queues, the carrier goes down and NAPI is descheduled here so * the guest can't send more packets until it's ready to receive. */ if (unlikely(queue->vif->disabled || !netif_carrier_ok(queue->vif->dev))) { napi_complete(napi); return 0; } work_done = xenvif_tx_action(queue, budget); if (work_done < budget) { napi_complete(napi); xenvif_napi_schedule_or_enable_events(queue); } return work_done; }
static void xenvif_up(struct xenvif *vif) { napi_enable(&vif->napi); enable_irq(vif->tx_irq); if (vif->tx_irq != vif->rx_irq) enable_irq(vif->rx_irq); xenvif_napi_schedule_or_enable_events(vif); }
static void xenvif_up(struct xenvif *vif) { struct xenvif_queue *queue = NULL; unsigned int num_queues = vif->num_queues; unsigned int queue_index; for (queue_index = 0; queue_index < num_queues; ++queue_index) { queue = &vif->queues[queue_index]; napi_enable(&queue->napi); enable_irq(queue->tx_irq); if (queue->tx_irq != queue->rx_irq) enable_irq(queue->rx_irq); xenvif_napi_schedule_or_enable_events(queue); } }
static int xenvif_poll(struct napi_struct *napi, int budget) { struct xenvif *vif = container_of(napi, struct xenvif, napi); int work_done; /* This vif is rogue, we pretend we've there is nothing to do * for this vif to deschedule it from NAPI. But this interface * will be turned off in thread context later. */ if (unlikely(vif->disabled)) { napi_complete(napi); return 0; } work_done = xenvif_tx_action(vif, budget); if (work_done < budget) { napi_complete(napi); xenvif_napi_schedule_or_enable_events(vif); } return work_done; }