Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 81a2e36d authored by stephen hemminger's avatar stephen hemminger Committed by David S. Miller
Browse files

forcedeth: Stay in NAPI as long as there's work



The following does the same thing without the extra overhead
of testing all the registers. It also handles the out of memory
case.

Signed-off-by: default avatarStephen Hemminger <shemminger@vyatta.com>
Tested-by: default avatarTom Herbert <therbert@google.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent f84af32c
Loading
Loading
Loading
Loading
+17 −14
Original line number Diff line number Diff line
@@ -3743,23 +3743,26 @@ static int nv_napi_poll(struct napi_struct *napi, int budget)
	u8 __iomem *base = get_hwbase(dev);
	unsigned long flags;
	int retcode;
	int tx_work, rx_work;
	int rx_count, tx_work=0, rx_work=0;

	do {
		if (!nv_optimized(np)) {
			spin_lock_irqsave(&np->lock, flags);
		tx_work = nv_tx_done(dev, np->tx_ring_size);
			tx_work += nv_tx_done(dev, np->tx_ring_size);
			spin_unlock_irqrestore(&np->lock, flags);

		rx_work = nv_rx_process(dev, budget);
			rx_count = nv_rx_process(dev, budget);
			retcode = nv_alloc_rx(dev);
		} else {
			spin_lock_irqsave(&np->lock, flags);
		tx_work = nv_tx_done_optimized(dev, np->tx_ring_size);
			tx_work += nv_tx_done_optimized(dev, np->tx_ring_size);
			spin_unlock_irqrestore(&np->lock, flags);

		rx_work = nv_rx_process_optimized(dev, budget);
			rx_count = nv_rx_process_optimized(dev, budget);
			retcode = nv_alloc_rx_optimized(dev);
		}
	} while (retcode == 0 &&
		 rx_count > 0 && (rx_work += rx_count) < budget);

	if (retcode) {
		spin_lock_irqsave(&np->lock, flags);