On Fri, 4 Aug 2006, Herbert Xu wrote: > jamal <[EMAIL PROTECTED]> wrote: > > > > There is no need for tx_locking if you are already netif stopped > > (transmit path will never be entered). > > With this change under high speed forwarding i see anywhere > > between 2-4Kpps improvement on a 2 CPU environment with twoo e1000s tied > > to different CPUs forwarding between each other. Actually the > > performance improvement should be attributed to the use of > > TX_WAKE_THRESHOLD - more drivers should use that technique. > > > > diff --git a/drivers/net/e1000/e1000_main.c > > b/drivers/net/e1000/e1000_main.c > > index da62db8..559e334 100644 > > --- a/drivers/net/e1000/e1000_main.c > > +++ b/drivers/net/e1000/e1000_main.c > > @@ -3517,11 +3517,8 @@ #endif > > #define TX_WAKE_THRESHOLD 32 > > if (unlikely(cleaned && netif_queue_stopped(netdev) && > > netif_carrier_ok(netdev))) { > > - spin_lock(&tx_ring->tx_lock); > > - if (netif_queue_stopped(netdev) && > > - (E1000_DESC_UNUSED(tx_ring) >= TX_WAKE_THRESHOLD)) > > + if (E1000_DESC_UNUSED(tx_ring) >= TX_WAKE_THRESHOLD) > > netif_wake_queue(netdev); > > - spin_unlock(&tx_ring->tx_lock); > > } > > > > if (adapter->detect_tx_hung) { > > Looks good to me.
jamal, thanks for the investigation, but this doesn't look so good to me. > Even if we get it wrong and wake up something that we shouldn't have, > the xmit function will simply bail out and stop the queue for us. I followed the example of tg3 when attempting to optimize this code. For the normal case we remove a lock acquisition. Jamals case is not normal. :-) we specifically added this lock originally to fix a problem we saw where the netif_stop and netif_start would race, and we would end up with a queue that was stopped, and no way to restart it because we didn't have any more TX packets to clean up (even if we DID get an interrupt from a receive) > Since this is exceedingly unlikely we should drop the locks rather > than bother about it. I think that would be nice, but I still think the current driver solution is a good stable solution that has made it through several rounds of testing here, not to mention is in the tg3.c code. Unless someone can come up with a way to avoid the race between start and stop *inside* the start and stop code (which would be ideal) then I think we have to have a solution like this in the driver. Jesse - To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html