On Thu, 2006-03-08 at 17:09 -0700, Michael Chan wrote: > On Thu, 2006-08-03 at 18:08 -0400, jamal wrote: > > > > > Yes in your case you need to hold the lock but not in the e1000 case. > > I dont understand though why you need to check for wake in the tx path. > > > > tg3_start_xmit() > > if (tx_ring_empty) > <- tg3_tx() > netif_stop_queue() > > > At the arrow, tg3_tx() can come in and clean up the entire ring but will > not see that the queue is stopped and therefore will not call > netif_wake_queue(). As a result, the tx_queue is stopped forever. >
Indeed - if you do it that way. What about (actually e1000 is not exactly like this but closer than tg3 is): tg3_start_xmit(): prepare skb grab ring tx lock irq safe put skb on ring if (full-ring) stop release ring tx lock and restore flags blah and in tg3_tx(): if likely(stopped) { // essentially no lock needed here .... prune tx ring if prunned > threshold wake } else if not stopped { // need a lock here ... grab ring tx lock irq safe prune tx ring release ring tx lock } The above is safe to run tg3_start_xmit on one CPU and tg3_tx an another. And you can then take advantage of asynchronous wakes and remove the paranoia checks you have on tx. cheers, jamal - 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