SUNGEM: Fix NAPI assertion failure.
authorDavid S. Miller <davem@davemloft.net>
Mon, 7 Apr 2008 06:37:08 +0000 (23:37 -0700)
committerChris Wright <chrisw@sous-sol.org>
Sat, 19 Apr 2008 01:53:24 +0000 (18:53 -0700)
Upstream commit: da990a2402aeaee84837f29054c4628eb02f7493

As reported by Johannes Berg:

I started getting this warning with recent kernels:

[  773.908927] ------------[ cut here ]------------
[  773.908954] Badness at net/core/dev.c:2204
 ...

If we loop more than once in gem_poll(), we'll
use more than the real budget in our gem_rx()
calls, thus eventually trigger the caller's
assertions in net_rx_action().

Subtract "work_done" from "budget" for the second
arg to gem_rx() to fix the bug.

Signed-off-by: David S. Miller <davem@davemloft.net>
Signed-off-by: Chris Wright <chrisw@sous-sol.org>
drivers/net/sungem.c

index 68872142530b5e5a7807157c0b8e539494e62a1b..6fac216e5bb7fab7fee64754947616c8a706ca13 100644 (file)
@@ -910,7 +910,7 @@ static int gem_poll(struct napi_struct *napi, int budget)
                 * rx ring - must call napi_disable(), which
                 * schedule_timeout()'s if polling is already disabled.
                 */
-               work_done += gem_rx(gp, budget);
+               work_done += gem_rx(gp, budget - work_done);
 
                if (work_done >= budget)
                        return work_done;