Skip to content

Commit

Permalink
drivers: net: generalize napi_complete_done()
Browse files Browse the repository at this point in the history
napi_complete_done() allows to opt-in for gro_flush_timeout,
added back in linux-3.19, commit 3b47d30
("net: gro: add a per device gro flush timer")

This allows for more efficient GRO aggregation without
sacrifying latencies.

Signed-off-by: Eric Dumazet <edumazet@google.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
Eric Dumazet authored and David S. Miller committed Jan 30, 2017
1 parent 63a6fff commit 6ad2016
Show file tree
Hide file tree
Showing 109 changed files with 132 additions and 137 deletions.
2 changes: 1 addition & 1 deletion drivers/net/can/at91_can.c
Original file line number Diff line number Diff line change
Expand Up @@ -813,7 +813,7 @@ static int at91_poll(struct napi_struct *napi, int quota)
u32 reg_ier = AT91_IRQ_ERR_FRAME;
reg_ier |= get_irq_mb_rx(priv) & ~AT91_MB_MASK(priv->rx_next);

napi_complete(napi);
napi_complete_done(napi, work_done);
at91_write(priv, AT91_IER, reg_ier);
}

Expand Down
2 changes: 1 addition & 1 deletion drivers/net/can/c_can/c_can.c
Original file line number Diff line number Diff line change
Expand Up @@ -1070,7 +1070,7 @@ static int c_can_poll(struct napi_struct *napi, int quota)

end:
if (work_done < quota) {
napi_complete(napi);
napi_complete_done(napi, work_done);
/* enable all IRQs if we are not in bus off state */
if (priv->can.state != CAN_STATE_BUS_OFF)
c_can_irq_control(priv, true);
Expand Down
2 changes: 1 addition & 1 deletion drivers/net/can/flexcan.c
Original file line number Diff line number Diff line change
Expand Up @@ -703,7 +703,7 @@ static int flexcan_poll(struct napi_struct *napi, int quota)
work_done += flexcan_poll_bus_err(dev, reg_esr);

if (work_done < quota) {
napi_complete(napi);
napi_complete_done(napi, work_done);
/* enable IRQs */
flexcan_write(FLEXCAN_IFLAG_DEFAULT, &regs->imask1);
flexcan_write(priv->reg_ctrl_default, &regs->ctrl);
Expand Down
2 changes: 1 addition & 1 deletion drivers/net/can/ifi_canfd/ifi_canfd.c
Original file line number Diff line number Diff line change
Expand Up @@ -578,7 +578,7 @@ static int ifi_canfd_poll(struct napi_struct *napi, int quota)
work_done += ifi_canfd_do_rx_poll(ndev, quota - work_done);

if (work_done < quota) {
napi_complete(napi);
napi_complete_done(napi, work_done);
ifi_canfd_irq_enable(ndev, 1);
}

Expand Down
2 changes: 1 addition & 1 deletion drivers/net/can/janz-ican3.c
Original file line number Diff line number Diff line change
Expand Up @@ -1475,7 +1475,7 @@ static int ican3_napi(struct napi_struct *napi, int budget)
/* We have processed all packets that the adapter had, but it
* was less than our budget, stop polling */
if (received < budget)
napi_complete(napi);
napi_complete_done(napi, received);

spin_lock_irqsave(&mod->lock, flags);

Expand Down
2 changes: 1 addition & 1 deletion drivers/net/can/m_can/m_can.c
Original file line number Diff line number Diff line change
Expand Up @@ -730,7 +730,7 @@ static int m_can_poll(struct napi_struct *napi, int quota)
work_done += m_can_do_rx_poll(dev, (quota - work_done));

if (work_done < quota) {
napi_complete(napi);
napi_complete_done(napi, work_done);
m_can_enable_all_interrupts(priv);
}

Expand Down
2 changes: 1 addition & 1 deletion drivers/net/can/rcar/rcar_can.c
Original file line number Diff line number Diff line change
Expand Up @@ -695,7 +695,7 @@ static int rcar_can_rx_poll(struct napi_struct *napi, int quota)
}
/* All packets processed */
if (num_pkts < quota) {
napi_complete(napi);
napi_complete_done(napi, num_pkts);
priv->ier |= RCAR_CAN_IER_RXFIE;
writeb(priv->ier, &priv->regs->ier);
}
Expand Down
2 changes: 1 addition & 1 deletion drivers/net/can/rcar/rcar_canfd.c
Original file line number Diff line number Diff line change
Expand Up @@ -1512,7 +1512,7 @@ static int rcar_canfd_rx_poll(struct napi_struct *napi, int quota)

/* All packets processed */
if (num_pkts < quota) {
napi_complete(napi);
napi_complete_done(napi, num_pkts);
/* Enable Rx FIFO interrupts */
rcar_canfd_set_bit(priv->base, RCANFD_RFCC(ridx),
RCANFD_RFCC_RFIE);
Expand Down
2 changes: 1 addition & 1 deletion drivers/net/can/xilinx_can.c
Original file line number Diff line number Diff line change
Expand Up @@ -726,7 +726,7 @@ static int xcan_rx_poll(struct napi_struct *napi, int quota)
can_led_event(ndev, CAN_LED_EVENT_RX);

if (work_done < quota) {
napi_complete(napi);
napi_complete_done(napi, work_done);
ier = priv->read_reg(priv, XCAN_IER_OFFSET);
ier |= (XCAN_IXR_RXOK_MASK | XCAN_IXR_RXNEMP_MASK);
priv->write_reg(priv, XCAN_IER_OFFSET, ier);
Expand Down
2 changes: 1 addition & 1 deletion drivers/net/ethernet/3com/typhoon.c
Original file line number Diff line number Diff line change
Expand Up @@ -1753,7 +1753,7 @@ typhoon_poll(struct napi_struct *napi, int budget)
}

if (work_done < budget) {
napi_complete(napi);
napi_complete_done(napi, work_done);
iowrite32(TYPHOON_INTR_NONE,
tp->ioaddr + TYPHOON_REG_INTR_MASK);
typhoon_post_pci_writes(tp->ioaddr);
Expand Down
2 changes: 1 addition & 1 deletion drivers/net/ethernet/adi/bfin_mac.c
Original file line number Diff line number Diff line change
Expand Up @@ -1274,7 +1274,7 @@ static int bfin_mac_poll(struct napi_struct *napi, int budget)
}

if (i < budget) {
napi_complete(napi);
napi_complete_done(napi, i);
if (test_and_clear_bit(BFIN_MAC_RX_IRQ_DISABLED, &lp->flags))
enable_irq(IRQ_MAC_RX);
}
Expand Down
2 changes: 1 addition & 1 deletion drivers/net/ethernet/agere/et131x.c
Original file line number Diff line number Diff line change
Expand Up @@ -3575,7 +3575,7 @@ static int et131x_poll(struct napi_struct *napi, int budget)
et131x_handle_send_pkts(adapter);

if (work_done < budget) {
napi_complete(&adapter->napi);
napi_complete_done(&adapter->napi, work_done);
et131x_enable_interrupts(adapter);
}

Expand Down
2 changes: 1 addition & 1 deletion drivers/net/ethernet/altera/altera_tse_main.c
Original file line number Diff line number Diff line change
Expand Up @@ -513,7 +513,7 @@ static int tse_poll(struct napi_struct *napi, int budget)

if (rxcomplete < budget) {

napi_complete(napi);
napi_complete_done(napi, rxcomplete);

netdev_dbg(priv->dev,
"NAPI Complete, did %d packets with budget %d\n",
Expand Down
2 changes: 1 addition & 1 deletion drivers/net/ethernet/apm/xgene/xgene_enet_main.c
Original file line number Diff line number Diff line change
Expand Up @@ -840,7 +840,7 @@ static int xgene_enet_napi(struct napi_struct *napi, const int budget)
processed = xgene_enet_process_ring(ring, budget);

if (processed != budget) {
napi_complete(napi);
napi_complete_done(napi, processed);
enable_irq(ring->irq);
}

Expand Down
2 changes: 1 addition & 1 deletion drivers/net/ethernet/aquantia/atlantic/aq_vec.c
Original file line number Diff line number Diff line change
Expand Up @@ -97,7 +97,7 @@ __acquires(&self->lock)
work_done = budget;

if (work_done < budget) {
napi_complete(napi);
napi_complete_done(napi, work_done);
self->aq_hw_ops->hw_irq_enable(self->aq_hw,
1U << self->aq_ring_param.vec_idx);
}
Expand Down
2 changes: 1 addition & 1 deletion drivers/net/ethernet/arc/emac_main.c
Original file line number Diff line number Diff line change
Expand Up @@ -275,7 +275,7 @@ static int arc_emac_poll(struct napi_struct *napi, int budget)

work_done = arc_emac_rx(ndev, budget);
if (work_done < budget) {
napi_complete(napi);
napi_complete_done(napi, work_done);
arc_reg_or(priv, R_ENABLE, RXINT_MASK | TXINT_MASK);
}

Expand Down
2 changes: 1 addition & 1 deletion drivers/net/ethernet/atheros/alx/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -311,7 +311,7 @@ static int alx_poll(struct napi_struct *napi, int budget)
if (!tx_complete || work == budget)
return budget;

napi_complete(&np->napi);
napi_complete_done(&np->napi, work);

/* enable interrupt */
if (alx->flags & ALX_FLAG_USING_MSIX) {
Expand Down
2 changes: 1 addition & 1 deletion drivers/net/ethernet/atheros/atl1c/atl1c_main.c
Original file line number Diff line number Diff line change
Expand Up @@ -1892,7 +1892,7 @@ static int atl1c_clean(struct napi_struct *napi, int budget)

if (work_done < budget) {
quit_polling:
napi_complete(napi);
napi_complete_done(napi, work_done);
adapter->hw.intr_mask |= ISR_RX_PKT;
AT_WRITE_REG(&adapter->hw, REG_IMR, adapter->hw.intr_mask);
}
Expand Down
2 changes: 1 addition & 1 deletion drivers/net/ethernet/atheros/atl1e/atl1e_main.c
Original file line number Diff line number Diff line change
Expand Up @@ -1526,7 +1526,7 @@ static int atl1e_clean(struct napi_struct *napi, int budget)
/* If no Tx and not enough Rx work done, exit the polling mode */
if (work_done < budget) {
quit_polling:
napi_complete(napi);
napi_complete_done(napi, work_done);
imr_data = AT_READ_REG(&adapter->hw, REG_IMR);
AT_WRITE_REG(&adapter->hw, REG_IMR, imr_data | ISR_RX_EVENT);
/* test debug */
Expand Down
2 changes: 1 addition & 1 deletion drivers/net/ethernet/atheros/atlx/atl1.c
Original file line number Diff line number Diff line change
Expand Up @@ -2457,7 +2457,7 @@ static int atl1_rings_clean(struct napi_struct *napi, int budget)
if (work_done >= budget)
return work_done;

napi_complete(napi);
napi_complete_done(napi, work_done);
/* re-enable Interrupt */
if (likely(adapter->int_enabled))
atlx_imr_set(adapter, IMR_NORMAL_MASK);
Expand Down
2 changes: 1 addition & 1 deletion drivers/net/ethernet/broadcom/b44.c
Original file line number Diff line number Diff line change
Expand Up @@ -902,7 +902,7 @@ static int b44_poll(struct napi_struct *napi, int budget)
}

if (work_done < budget) {
napi_complete(napi);
napi_complete_done(napi, work_done);
b44_enable_ints(bp);
}

Expand Down
2 changes: 1 addition & 1 deletion drivers/net/ethernet/broadcom/bcm63xx_enet.c
Original file line number Diff line number Diff line change
Expand Up @@ -511,7 +511,7 @@ static int bcm_enet_poll(struct napi_struct *napi, int budget)

/* no more packet in rx/tx queue, remove device from poll
* queue */
napi_complete(napi);
napi_complete_done(napi, rx_work_done);

/* restore rx/tx interrupt */
enet_dmac_writel(priv, priv->dma_chan_int_mask,
Expand Down
2 changes: 1 addition & 1 deletion drivers/net/ethernet/broadcom/bgmac.c
Original file line number Diff line number Diff line change
Expand Up @@ -1148,7 +1148,7 @@ static int bgmac_poll(struct napi_struct *napi, int weight)
return weight;

if (handled < weight) {
napi_complete(napi);
napi_complete_done(napi, handled);
bgmac_chip_intrs_on(bgmac);
}

Expand Down
4 changes: 2 additions & 2 deletions drivers/net/ethernet/broadcom/bnx2.c
Original file line number Diff line number Diff line change
Expand Up @@ -3515,7 +3515,7 @@ static int bnx2_poll_msix(struct napi_struct *napi, int budget)
rmb();
if (likely(!bnx2_has_fast_work(bnapi))) {

napi_complete(napi);
napi_complete_done(napi, work_done);
BNX2_WR(bp, BNX2_PCICFG_INT_ACK_CMD, bnapi->int_num |
BNX2_PCICFG_INT_ACK_CMD_INDEX_VALID |
bnapi->last_status_idx);
Expand Down Expand Up @@ -3552,7 +3552,7 @@ static int bnx2_poll(struct napi_struct *napi, int budget)

rmb();
if (likely(!bnx2_has_work(bnapi))) {
napi_complete(napi);
napi_complete_done(napi, work_done);
if (likely(bp->flags & BNX2_FLAG_USING_MSI_OR_MSIX)) {
BNX2_WR(bp, BNX2_PCICFG_INT_ACK_CMD,
BNX2_PCICFG_INT_ACK_CMD_INDEX_VALID |
Expand Down
2 changes: 1 addition & 1 deletion drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c
Original file line number Diff line number Diff line change
Expand Up @@ -3224,7 +3224,7 @@ static int bnx2x_poll(struct napi_struct *napi, int budget)
* has been updated when NAPI was scheduled.
*/
if (IS_FCOE_FP(fp)) {
napi_complete(napi);
napi_complete_done(napi, rx_work_done);
} else {
bnx2x_update_fpsb_idx(fp);
/* bnx2x_has_rx_work() reads the status block,
Expand Down
2 changes: 1 addition & 1 deletion drivers/net/ethernet/broadcom/bnxt/bnxt.c
Original file line number Diff line number Diff line change
Expand Up @@ -1759,7 +1759,7 @@ static int bnxt_poll_nitroa0(struct napi_struct *napi, int budget)
}

if (!bnxt_has_work(bp, cpr) && rx_pkts < budget) {
napi_complete(napi);
napi_complete_done(napi, rx_pkts);
BNXT_CP_DB_REARM(cpr->cp_doorbell, cpr->cp_raw_cons);
}
return rx_pkts;
Expand Down
2 changes: 1 addition & 1 deletion drivers/net/ethernet/broadcom/sb1250-mac.c
Original file line number Diff line number Diff line change
Expand Up @@ -2537,7 +2537,7 @@ static int sbmac_poll(struct napi_struct *napi, int budget)
sbdma_tx_process(sc, &(sc->sbm_txdma), 1);

if (work_done < budget) {
napi_complete(napi);
napi_complete_done(napi, work_done);

#ifdef CONFIG_SBMAC_COALESCE
__raw_writeq(((M_MAC_INT_EOP_COUNT | M_MAC_INT_EOP_TIMER) << S_MAC_TX_CH0) |
Expand Down
2 changes: 1 addition & 1 deletion drivers/net/ethernet/brocade/bna/bnad.c
Original file line number Diff line number Diff line change
Expand Up @@ -1881,7 +1881,7 @@ bnad_napi_poll_rx(struct napi_struct *napi, int budget)
return rcvd;

poll_exit:
napi_complete(napi);
napi_complete_done(napi, rcvd);

rx_ctrl->rx_complete++;

Expand Down
2 changes: 1 addition & 1 deletion drivers/net/ethernet/cadence/macb.c
Original file line number Diff line number Diff line change
Expand Up @@ -1090,7 +1090,7 @@ static int macb_poll(struct napi_struct *napi, int budget)

work_done = bp->macbgem_ops.mog_rx(bp, budget);
if (work_done < budget) {
napi_complete(napi);
napi_complete_done(napi, work_done);

/* Packets received while interrupts were disabled */
status = macb_readl(bp, RSR);
Expand Down
2 changes: 1 addition & 1 deletion drivers/net/ethernet/calxeda/xgmac.c
Original file line number Diff line number Diff line change
Expand Up @@ -1247,7 +1247,7 @@ static int xgmac_poll(struct napi_struct *napi, int budget)
work_done = xgmac_rx(priv, budget);

if (work_done < budget) {
napi_complete(napi);
napi_complete_done(napi, work_done);
__raw_writel(DMA_INTR_DEFAULT_MASK, priv->base + XGMAC_DMA_INTR_ENA);
}
return work_done;
Expand Down
2 changes: 1 addition & 1 deletion drivers/net/ethernet/cavium/liquidio/lio_main.c
Original file line number Diff line number Diff line change
Expand Up @@ -2446,7 +2446,7 @@ static int liquidio_napi_poll(struct napi_struct *napi, int budget)
}

if ((work_done < budget) && (tx_done)) {
napi_complete(napi);
napi_complete_done(napi, work_done);
octeon_process_droq_poll_cmd(droq->oct_dev, droq->q_no,
POLL_EVENT_ENABLE_INTR, 0);
return 0;
Expand Down
2 changes: 1 addition & 1 deletion drivers/net/ethernet/cavium/liquidio/lio_vf_main.c
Original file line number Diff line number Diff line change
Expand Up @@ -1631,7 +1631,7 @@ static int liquidio_napi_poll(struct napi_struct *napi, int budget)
}

if ((work_done < budget) && (tx_done)) {
napi_complete(napi);
napi_complete_done(napi, work_done);
octeon_process_droq_poll_cmd(droq->oct_dev, droq->q_no,
POLL_EVENT_ENABLE_INTR, 0);
return 0;
Expand Down
2 changes: 1 addition & 1 deletion drivers/net/ethernet/cavium/octeon/octeon_mgmt.c
Original file line number Diff line number Diff line change
Expand Up @@ -501,7 +501,7 @@ static int octeon_mgmt_napi_poll(struct napi_struct *napi, int budget)

if (work_done < budget) {
/* We stopped because no more packets were available. */
napi_complete(napi);
napi_complete_done(napi, work_done);
octeon_mgmt_enable_rx_irq(p);
}
octeon_mgmt_update_rx_stats(netdev);
Expand Down
2 changes: 1 addition & 1 deletion drivers/net/ethernet/cavium/thunder/nicvf_main.c
Original file line number Diff line number Diff line change
Expand Up @@ -749,7 +749,7 @@ static int nicvf_poll(struct napi_struct *napi, int budget)

if (work_done < budget) {
/* Slow packet rate, exit polling */
napi_complete(napi);
napi_complete_done(napi, work_done);
/* Re-enable interrupts */
cq_head = nicvf_queue_reg_read(nic, NIC_QSET_CQ_0_7_HEAD,
cq->cq_idx);
Expand Down
2 changes: 1 addition & 1 deletion drivers/net/ethernet/chelsio/cxgb/sge.c
Original file line number Diff line number Diff line change
Expand Up @@ -1605,7 +1605,7 @@ int t1_poll(struct napi_struct *napi, int budget)
int work_done = process_responses(adapter, budget);

if (likely(work_done < budget)) {
napi_complete(napi);
napi_complete_done(napi, work_done);
writel(adapter->sge->respQ.cidx,
adapter->regs + A_SG_SLEEPING);
}
Expand Down
4 changes: 2 additions & 2 deletions drivers/net/ethernet/chelsio/cxgb3/sge.c
Original file line number Diff line number Diff line change
Expand Up @@ -1843,7 +1843,7 @@ static int ofld_poll(struct napi_struct *napi, int budget)
__skb_queue_head_init(&queue);
skb_queue_splice_init(&q->rx_queue, &queue);
if (skb_queue_empty(&queue)) {
napi_complete(napi);
napi_complete_done(napi, work_done);
spin_unlock_irq(&q->lock);
return work_done;
}
Expand Down Expand Up @@ -2414,7 +2414,7 @@ static int napi_rx_handler(struct napi_struct *napi, int budget)
int work_done = process_responses(adap, qs, budget);

if (likely(work_done < budget)) {
napi_complete(napi);
napi_complete_done(napi, work_done);

/*
* Because we don't atomically flush the following
Expand Down
2 changes: 1 addition & 1 deletion drivers/net/ethernet/chelsio/cxgb4vf/sge.c
Original file line number Diff line number Diff line change
Expand Up @@ -1889,7 +1889,7 @@ static int napi_rx_handler(struct napi_struct *napi, int budget)
u32 val;

if (likely(work_done < budget)) {
napi_complete(napi);
napi_complete_done(napi, work_done);
intr_params = rspq->next_intr_params;
rspq->next_intr_params = rspq->intr_params;
} else
Expand Down
4 changes: 2 additions & 2 deletions drivers/net/ethernet/cisco/enic/enic_main.c
Original file line number Diff line number Diff line change
Expand Up @@ -1343,7 +1343,7 @@ static int enic_poll(struct napi_struct *napi, int budget)
* exit polling
*/

napi_complete(napi);
napi_complete_done(napi, rq_work_done);
if (enic->rx_coalesce_setting.use_adaptive_rx_coalesce)
enic_set_int_moderation(enic, &enic->rq[0]);
vnic_intr_unmask(&enic->intr[intr]);
Expand Down Expand Up @@ -1500,7 +1500,7 @@ static int enic_poll_msix_rq(struct napi_struct *napi, int budget)
* exit polling
*/

napi_complete(napi);
napi_complete_done(napi, work_done);
if (enic->rx_coalesce_setting.use_adaptive_rx_coalesce)
enic_set_int_moderation(enic, &enic->rq[rq]);
vnic_intr_unmask(&enic->intr[intr]);
Expand Down
6 changes: 3 additions & 3 deletions drivers/net/ethernet/dec/tulip/interrupt.c
Original file line number Diff line number Diff line change
Expand Up @@ -319,8 +319,8 @@ int tulip_poll(struct napi_struct *napi, int budget)

/* Remove us from polling list and enable RX intr. */

napi_complete(napi);
iowrite32(tulip_tbl[tp->chip_id].valid_intrs, tp->base_addr+CSR7);
napi_complete_done(napi, work_done);
iowrite32(tulip_tbl[tp->chip_id].valid_intrs, tp->base_addr+CSR7);

/* The last op happens after poll completion. Which means the following:
* 1. it can race with disabling irqs in irq handler
Expand Down Expand Up @@ -355,7 +355,7 @@ int tulip_poll(struct napi_struct *napi, int budget)
* before we did napi_complete(). See? We would lose it. */

/* remove ourselves from the polling list */
napi_complete(napi);
napi_complete_done(napi, work_done);

return work_done;
}
Expand Down
2 changes: 1 addition & 1 deletion drivers/net/ethernet/dnet.c
Original file line number Diff line number Diff line change
Expand Up @@ -415,7 +415,7 @@ static int dnet_poll(struct napi_struct *napi, int budget)
/* We processed all packets available. Tell NAPI it can
* stop polling then re-enable rx interrupts.
*/
napi_complete(napi);
napi_complete_done(napi, npackets);
int_enable = dnet_readl(bp, INTR_ENB);
int_enable |= DNET_INTR_SRC_RX_CMDFIFOAF;
dnet_writel(bp, int_enable, INTR_ENB);
Expand Down
Loading

0 comments on commit 6ad2016

Please sign in to comment.