OSDN Git Service

net: ethernet: ti: cpdma: fix lockup in cpdma_ctlr_destroy()
authorGrygorii Strashko <grygorii.strashko@ti.com>
Thu, 28 Jul 2016 17:50:34 +0000 (20:50 +0300)
committerDavid S. Miller <davem@davemloft.net>
Sun, 31 Jul 2016 04:00:33 +0000 (21:00 -0700)
commitfccd5badb84de03fef9b072e7ae72fe0ea8348e3
tree7cce76270e9aeac5c519b335bd78f5234288cb8c
parentc882219ae43ed8d2a06583d24d2ed42d09ca93cf
net: ethernet: ti: cpdma: fix lockup in cpdma_ctlr_destroy()

Fix deadlock in cpdma_ctlr_destroy() which is triggered now on
cpsw module removal:
 cpsw_remove()
 - cpdma_ctlr_destroy()
   - spin_lock_irqsave(&ctlr->lock, flags)
   - cpdma_ctlr_stop()
     - spin_lock_irqsave(&ctlr->lock, flags);
   - cpdma_chan_destroy()
     - spin_lock_irqsave(&ctlr->lock, flags);

The issue has not been observed before because CPDMA channels have
been destroyed manually by CPSW until commit d941ebe88a41 ("net:
ethernet: ti: cpsw: use destroy ctlr to destroy channels") was merged.

Signed-off-by: Grygorii Strashko <grygorii.strashko@ti.com>
Reviewed-by: Mugunthan V N <mugunthanvnm@ti.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/ti/davinci_cpdma.c