in build/gve_main.c [381:440]
int gve_napi_poll(struct napi_struct *napi, int budget)
{
struct gve_notify_block *block;
__be32 __iomem *irq_doorbell;
bool reschedule = false;
struct gve_priv *priv;
int work_done = 0;
block = container_of(napi, struct gve_notify_block, napi);
priv = block->priv;
if (block->tx) {
if (block->tx->q_num < priv->tx_cfg.num_queues)
reschedule |= gve_tx_poll(block, budget);
else if (budget)
reschedule |= gve_xdp_poll(block, budget);
}
if (!budget)
return 0;
if (block->rx) {
work_done = gve_rx_poll(block, budget);
reschedule |= work_done == budget;
}
if (reschedule)
return budget;
/* Complete processing - don't unmask irq if busy polling is enabled */
#if LINUX_VERSION_CODE >= KERNEL_VERSION(4,10,0) || RHEL_RELEASE_CODE >= RHEL_RELEASE_VERSION(7, 5)
if (likely(napi_complete_done(napi, work_done)))
#elif LINUX_VERSION_CODE >= KERNEL_VERSION(3,19,0) || RHEL_RELEASE_CODE >= RHEL_RELEASE_VERSION(7, 3)
napi_complete_done(napi, work_done);
#else /* LINUX_VERSION_CODE < KERNEL_VERSION(3,19,0) || RHEL_RELEASE_CODE < RHEL_RELEASE_VERSION(7, 3) */
napi_complete(napi);
#endif /* LINUX_VERSION_CODE >= KERNEL_VERSION(4,10,0) || RHEL_RELEASE_CODE >= RHEL_RELEASE_VERSION(7, 5) */
{
irq_doorbell = gve_irq_doorbell(priv, block);
iowrite32be(GVE_IRQ_ACK | GVE_IRQ_EVENT, irq_doorbell);
/* Ensure IRQ ACK is visible before we check pending work.
* If queue had issued updates, it would be truly visible.
*/
mb();
if (block->tx)
reschedule |= gve_tx_clean_pending(priv, block->tx);
if (block->rx)
reschedule |= gve_rx_work_pending(block->rx);
#if LINUX_VERSION_CODE >= KERNEL_VERSION(6,7,0) || RHEL_RELEASE_CODE >= RHEL_RELEASE_VERSION(9,4) || (RHEL_RELEASE_CODE >= RHEL_RELEASE_VERSION(8,10) && RHEL_RELEASE_CODE < RHEL_RELEASE_VERSION(9,0))
if (reschedule && napi_schedule(napi))
#else /* LINUX_VERSION_CODE >= KERNEL_VERSION(6,7,0) || RHEL_RELEASE_CODE >= RHEL_RELEASE_VERSION(9,4) || (RHEL_RELEASE_CODE >= RHEL_RELEASE_VERSION(8,10) && RHEL_RELEASE_CODE < RHEL_RELEASE_VERSION(9,0)) */
if (reschedule && napi_reschedule(napi))
#endif /* LINUX_VERSION_CODE >= KERNEL_VERSION(6,7,0) || RHEL_RELEASE_CODE >= RHEL_RELEASE_VERSION(9,4) || (RHEL_RELEASE_CODE >= RHEL_RELEASE_VERSION(8,10) && RHEL_RELEASE_CODE < RHEL_RELEASE_VERSION(9,0)) */
iowrite32be(GVE_IRQ_MASK, irq_doorbell);
}
return work_done;
}