DORMANTno replies

[PATCH 5/6] net: dsa: Do not reschedule polling if driver removed

From: Neil Armstrong <hidden>
Date: 2015-10-27 14:49:55
Also in: lkml
Subsystem: networking [dsa], networking [general], the rest · Maintainers: Andrew Lunn, Vladimir Oltean, "David S. Miller", Eric Dumazet, Jakub Kicinski, Paolo Abeni, Linus Torvalds

Do not reschedule the delayed work used for polling when
the driver is removed, by testing the 'poll_link_needed'
flag.
Avoids this crash:
 dsa dsa ethmv2 (unregistering): Link is Down
 device eth1 left promiscuous mode
 Unable to handle kernel paging request at virtual address bacc5cf6
 ...
 (run_timer_softirq) from [<c003e810>] (__do_softirq+0xcc/0x320)
 (__do_softirq) from [<c003ed40>] (irq_exit+0xac/0x10c)
 (irq_exit) from [<c007ec20>] (__handle_domain_irq+0x50/0xa8)

Signed-off-by: Frode Isaksen <redacted>
Signed-off-by: Neil Armstrong <redacted>
---
 net/dsa/dsa.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/net/dsa/dsa.c b/net/dsa/dsa.c
index 9240a46..9881b17 100644
--- a/net/dsa/dsa.c
+++ b/net/dsa/dsa.c
@@ -526,7 +526,8 @@ static void dsa_link_poll_work(struct work_struct *ugly)
 			ds->drv->poll_link(ds);
 	}

-	schedule_delayed_work(&dst->link_poll_work, round_jiffies_relative(HZ));
+	if (dst->link_poll_needed)
+		schedule_delayed_work(&dst->link_poll_work, round_jiffies_relative(HZ));
 }

 /* platform driver init and cleanup *****************************************/
@@ -949,6 +950,7 @@ static void dsa_remove_dst(struct dsa_switch_tree *dst)
 	int i;

 	if (dst->link_poll_needed) {
+		dst->link_poll_needed = 0;
 		cancel_delayed_work_sync(&dst->link_poll_work);
 		flush_delayed_work(&dst->link_poll_work);
 	}
-- 
1.9.1
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help