Thread (36 messages) flat view 36 messages, 4 authors, 2016-12-20

Re: [PATCH 1/2] net: ethernet: sxgbe: remove private tx queue lock

From: Lino Sanfilippo <LinoSanfilippo@gmx.de>
Date: 2016-12-10 02:26:08
Also in: lkml

Hi,

On 09.12.2016 12:21, Pavel Machek wrote:
On Fri 2016-12-09 00:19:43, Francois Romieu wrote:
quoted
Lino Sanfilippo [off-list ref] :
[...]
quoted
OTOH Pavel said that he actually could produce a deadlock. Now I wonder if
this is caused by that locking scheme (in a way I have not figured out yet)
or if it is a different issue.
stmmac_tx_err races with stmmac_xmit.
Umm, yes, that looks real.

And that means that removing tx_lock will not be completely trivial
:-(. Lino, any ideas there?
Ok, the race is there but it looks like a problem that is not related to 
the use or removal of the private lock.
By a glimpse into other drivers (e.g sky2 or e1000), a possible way to handle a 
tx error is to start a separate task and restart the tx path in that task instead
the irq handler (or timer in case of the watchdog).

In that task we could do:
1. deactivate napi
2. deactivate irqs
3. wait for running napi/irqs do complete (_sync)
4. call stmmac_tx_err()
5. reenable napi
6. reenable irqs

We have to ensure that no xmit() is executing while stmmac_tx_err() does the cleanup,
so stmmac_tx_err() should IMO rather call netif_tx_disable() instead of netif_stop_queue()
(the former grabs the xmit lock before it sets __QUEUE_STATE_DRV_XOFF to disable
the queue).

Regards,
Lino
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help