net: fec: fix spin_lock dead lock
========================================================= [ INFO: possible irq lock inversion dependency detected ] 3.8.0-rc5+ #82 Not tainted --------------------------------------------------------- swapper/0/0 just changed the state of lock: (&(&fep->hw_lock)->rlock){..-...}, at: [<8034e2f8>] fec_enet_start_xmit+0x48/0x 2cc but this lock took another, SOFTIRQ-unsafe lock in the past: (prepare_lock){+.+.+.} and interrupts could create inverse lock ordering between them. other info that might help us debug this: Possible interrupt unsafe locking scenario: CPU0 CPU1 ---- ---- lock(prepare_lock); local_irq_disable() lock(&(&fep->hw_lock)->rlock); lock(prepare_lock); <Interrupt> lock(&(&fep->hw_lock)->rlock); *** DEADLOCK *** Signed-off-by: Frank Li <Frank.Li@freescale.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
365cc17464
commit
85bd1798b2
|
@ -104,7 +104,7 @@ void fec_ptp_start_cyclecounter(struct net_device *ndev)
|
|||
unsigned long flags;
|
||||
int inc;
|
||||
|
||||
inc = 1000000000 / clk_get_rate(fep->clk_ptp);
|
||||
inc = 1000000000 / fep->cycle_speed;
|
||||
|
||||
/* grab the ptp lock */
|
||||
spin_lock_irqsave(&fep->tmreg_lock, flags);
|
||||
|
@ -363,6 +363,8 @@ void fec_ptp_init(struct net_device *ndev, struct platform_device *pdev)
|
|||
fep->ptp_caps.settime = fec_ptp_settime;
|
||||
fep->ptp_caps.enable = fec_ptp_enable;
|
||||
|
||||
fep->cycle_speed = clk_get_rate(fep->clk_ptp);
|
||||
|
||||
spin_lock_init(&fep->tmreg_lock);
|
||||
|
||||
fec_ptp_start_cyclecounter(ndev);
|
||||
|
|
Loading…
Reference in New Issue