Matthew Dillon wrote:
> Hmm. That doesn't look quite right.... the mbuf is being put on the
> ifq but then it is also being passed to NETISR_USB. NETISR_USB
> (usbintr() in usb/usb_ethersubr.c) takes the passed mbuf and
> IF_DEQUEUE's it... so far so good. But then it *LOOPS* on the ifq
> to get the next mbuf... but that means the same mbuf may be IF_DEQUEUE'd
> more then once since the other mbufs on the ifq also had an ISR queued
> for them.
If usbintr gets called multiple times, it will find an empty queue. The
loops empties out the queue, leaving no work the next time usbintr gets
called.
> It sounds like if more then one packet is queued to the NETISR, the
> system ought to crash :-(.
It doesn't. It will panic on shutdown, but after disks are sync-ed for
completely different reasons.
> It seems to me that instead of IF_ENQUEUE'ing the mbuf in
> usb_ether_input() and usb_tx_done() we should have the usbintr() code
> not try to dequeue it.
There should be two functions, usbintr_rx and usbintr_tx. The messaging
functions already create an implicit queue for us, so why not take
advantage of it? But at least this patch gets me operational enough, so
I can actually set up a proper CVS repo and generate proper diffs and a
proper solution.
-scooter