cvs commit: src/sys/dev/em if_em.c if_em.h

Andrew Gallatin gallatin at cs.duke.edu
Thu Jan 12 14:06:49 PST 2006


Scott Long writes:
 > 
 > Touching the APIC is tricky.  First, you have to pay the cost of a 
 > spinlock.  Then you have to may the cost of at least one read and write 
 > across the FSB.  Even though the APIC registers are memory mapped, they 
 > are still uncached.  It's not terribly expensive, but it does add up.
 > Bypassing this and using a fast interrupt means that you pay the cost of
 > 1 PCI read, which you would have to do anyways with either method, and 1 
 > PCI write, which will be posted at the host-pci bridge and thus only as 
 > expensive as an FSB write.  Overall, I don't think that the cost 
 > difference is a whole lot, but when you are talking about thousands of
 > interrupts per second, especially if multiple interfaces are running 
 > under load, it might be important.  And the 750x and 752x chipsets are
 > so common that it is worthwhile to deal with them (and there are reports
 > that the aliasing problem is happening on more chipsets than just these 
 > now).

I think you've sold me.

I'm in the process of trying to justify time to write a FreeBSD driver
for our PCIe 10GbE cards, and I find what you're doing fascinating.
I'd like to use some of your techniques for the driver I'm writing.

 > As for latency, the taskqueue runs at the same PI_NET priority as an the
 > ithread would.  I thought that there was an optimization on some 
 > platforms to encourage quick preemption for ithreads when they are 
 > scheduled, but I can't find it now.  So, the taskqueue shouldn't be all
 > that different from an ithread, and it even means that there won't be
 > any sharing between instances even if the interrupt vector is shared.

OK that (a taskqueue not getting the same fast preemption an ithread
would) was just what I was afraid of.  I'm glad that it is not a
problem.

<...>

 > However, taskqueues are really just a proof of concept for what I really
 > want, which is to allow drivers to register both a fast handler and an
 > ithread handler.  For drivers doing this, the ithread would be private

Ah, the darwin / MacOSX model.  That would be very cool. 

Anyway, keep up the good work.  It is inspiring!


Drew


More information about the cvs-src mailing list