netdev.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* NAPI vs. interrupts
@ 2003-01-11 22:08 Jeff Garzik
  2003-01-12  3:41 ` jamal
                   ` (2 more replies)
  0 siblings, 3 replies; 5+ messages in thread
From: Jeff Garzik @ 2003-01-11 22:08 UTC (permalink / raw)
  To: netdev, linux-net; +Cc: davem

I am seeing some tg3 reports occasionally that show a fair number of
interrupts-per-second, even though tg3 is 100% NAPI.

It seems to me that as machines get faster, and amount of memory
increase [xlat: less waiting for free RAM in all parts of the kernel,
and less GFP_ATOMIC alloc failures], the likelihood that a NAPI driver
can process 100% of the RX and TX work without having to reqquest
subsequent iterations of dev->poll().

NAPI's benefits kick in when there is some amount of system load.
However if the box is fast enough to eliminate cases where system load
would otherwise exist (interrupt and packet processing overhead), the
NAPI "worst case" kicks in, where a NAPI driver _always_ does
	ack some irqs
	mask irqs
	ack some more irqs
	process events
	unmask irqs

whereas a non-NAPI driver _always_ does
	ack irqs
	process events

When there is load, the obvious NAPI benefits kick in.  However, on
super-fast servers, SMP boxes, etc. it seems likely to me that one can
receive well in excess of 1,000 interrupts per second, simply because
the box is so fast it can run thousands of iterations of the NAPI "worst
case", above.

The purpose of this email is to solicit suggestions to develop a
strategy to fix what I believe is a problem with NAPI.

Here are some comments of mine:

1) Can this problem be alleviated entirely without driver changes?  For
example, would it be reasonable to do pkts-per-second sampling in the
net core, and enable software mitigation based on that?

2) Implement hardware mitigation in addition to NAPI.  Either the driver
does adaptive sampling, or simply hard-locks mitigation settings at
something that averages out to N pkts per second.

3) Implement an alternate driver path that follows the classical,
non-NAPI interrupt handling path in addition to NAPI, by logic similar
to this[warning: off the cuff and not analyzed... i.e. just an idea]:

	ack irqs
	call dev->poll() from irq handler
			[processes events until budget runs out,
		 	 or available events are all processed]
	if budget ran out,
		mask irqs
		netif_rx_schedule()
	
[this, #3, does not address the irq-per-sec problem directly, but does
lessen the effect of "worst case"]

Anyway, for tg3 specifically, I am leaning towards the latter part of #2,
hard-locking mitigation settings at something tests prove is
"reasonable", and in heavy load situations NAPI will kick in as
expected, and perform its magic ;-)

Comments/feedback requested.

	Jeff





^ permalink raw reply	[flat|nested] 5+ messages in thread
* RE: NAPI vs. interrupts
@ 2003-01-15  8:06 Feldman, Scott
  0 siblings, 0 replies; 5+ messages in thread
From: Feldman, Scott @ 2003-01-15  8:06 UTC (permalink / raw)
  To: Jeff Garzik, netdev, linux-net; +Cc: davem

> NAPI driver _always_ does
> 	ack some irqs
> 	mask irqs
> 	ack some more irqs
> 	process events
> 	unmask irqs

e1000+NAPI is this path.

> The purpose of this email is to solicit suggestions to 
> develop a strategy to fix what I believe is a problem with NAPI.
> 
> Here are some comments of mine:
> 
> 1) Can this problem be alleviated entirely without driver 
> changes?  For example, would it be reasonable to do 
> pkts-per-second sampling in the net core, and enable software 
> mitigation based on that?
> 
> 2) Implement hardware mitigation in addition to NAPI.  Either 
> the driver does adaptive sampling, or simply hard-locks 
> mitigation settings at something that averages out to N pkts 
> per second.

I've tried something similar to this while playing around with e1000
recently.  Using ITR (InterruptThrottleRate), dial in a max intr/sec
rate of say 4000 intr/sec, and then just call netif_rx_schedule() for
each interrupt.  Don't mask/unmask interrupts.  If already polling,
netif_rx_schedule does nothing.  The code differences between the NAPI
path and non-NAPI path was minimal, so I liked that, and your worst case
is gone.  If you look at the average size of the Rx packets, you could
fine tune ITR to get a pkt/intr rate to balance your quota to try to
maximize the amount of time spent polling, but this is too fancy for my
taste.  Anyway, worst case, 2*4000 PIO writes/sec was the savings, but I
can't say I could measure a difference.
 
-scott

^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2003-01-15  8:06 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2003-01-11 22:08 NAPI vs. interrupts Jeff Garzik
2003-01-12  3:41 ` jamal
2003-01-13 15:57 ` Robert Olsson
2003-01-13 16:46 ` Ethernet simulation driver for VME bus Zhigang Liu
  -- strict thread matches above, loose matches on Subject: below --
2003-01-15  8:06 NAPI vs. interrupts Feldman, Scott

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).