From: Greg Kroah-Hartman Date: Tue, 26 Feb 2019 15:02:58 +0000 (+0100) Subject: 4.20-stable patches X-Git-Tag: v4.9.161~1 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=fe5eea7abe000f97872a217c56bc7159cb289ab1;p=thirdparty%2Fkernel%2Fstable-queue.git 4.20-stable patches added patches: net-phylink-avoid-resolving-link-state-too-early.patch --- diff --git a/queue-4.20/net-phylink-avoid-resolving-link-state-too-early.patch b/queue-4.20/net-phylink-avoid-resolving-link-state-too-early.patch new file mode 100644 index 00000000000..743a8644a2e --- /dev/null +++ b/queue-4.20/net-phylink-avoid-resolving-link-state-too-early.patch @@ -0,0 +1,70 @@ +From 87454b6edc1b0143fdb3d9853285477e95af74a4 Mon Sep 17 00:00:00 2001 +From: Russell King +Date: Mon, 11 Feb 2019 15:04:24 +0000 +Subject: net: phylink: avoid resolving link state too early + +From: Russell King + +commit 87454b6edc1b0143fdb3d9853285477e95af74a4 upstream. + +During testing on Armada 388 platforms, it was found with a certain +module configuration that it was possible to trigger a kernel oops +during the module load process, caused by the phylink resolver being +triggered for a currently disabled interface. + +This problem was introduced by changing the way the SFP registration +works, which now can result in the sfp link down notification being +called during phylink_create(). + +Fixes: b5bfc21af5cb ("net: sfp: do not probe SFP module before we're attached") +Signed-off-by: Russell King +Signed-off-by: David S. Miller +Cc: Sasha Levin +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/net/phy/phylink.c | 19 +++++++++++++------ + 1 file changed, 13 insertions(+), 6 deletions(-) + +--- a/drivers/net/phy/phylink.c ++++ b/drivers/net/phy/phylink.c +@@ -475,6 +475,17 @@ static void phylink_run_resolve(struct p + queue_work(system_power_efficient_wq, &pl->resolve); + } + ++static void phylink_run_resolve_and_disable(struct phylink *pl, int bit) ++{ ++ unsigned long state = pl->phylink_disable_state; ++ ++ set_bit(bit, &pl->phylink_disable_state); ++ if (state == 0) { ++ queue_work(system_power_efficient_wq, &pl->resolve); ++ flush_work(&pl->resolve); ++ } ++} ++ + static void phylink_fixed_poll(struct timer_list *t) + { + struct phylink *pl = container_of(t, struct phylink, link_poll); +@@ -928,9 +939,7 @@ void phylink_stop(struct phylink *pl) + if (pl->link_an_mode == MLO_AN_FIXED && !IS_ERR(pl->link_gpio)) + del_timer_sync(&pl->link_poll); + +- set_bit(PHYLINK_DISABLE_STOPPED, &pl->phylink_disable_state); +- queue_work(system_power_efficient_wq, &pl->resolve); +- flush_work(&pl->resolve); ++ phylink_run_resolve_and_disable(pl, PHYLINK_DISABLE_STOPPED); + } + EXPORT_SYMBOL_GPL(phylink_stop); + +@@ -1637,9 +1646,7 @@ static void phylink_sfp_link_down(void * + + ASSERT_RTNL(); + +- set_bit(PHYLINK_DISABLE_LINK, &pl->phylink_disable_state); +- queue_work(system_power_efficient_wq, &pl->resolve); +- flush_work(&pl->resolve); ++ phylink_run_resolve_and_disable(pl, PHYLINK_DISABLE_LINK); + } + + static void phylink_sfp_link_up(void *upstream) diff --git a/queue-4.20/series b/queue-4.20/series index cc24dfcd3ca..7dd675d7363 100644 --- a/queue-4.20/series +++ b/queue-4.20/series @@ -181,3 +181,4 @@ netfilter-ipv6-don-t-preserve-original-oif-for-loopback-address.patch netfilter-nfnetlink_osf-add-missing-fmatch-check.patch netfilter-ipt_clusterip-fix-sleep-in-atomic-bug-in-clusterip_config_entry_put.patch pinctrl-max77620-use-define-directive-for-max77620_pinconf_param-values.patch +net-phylink-avoid-resolving-link-state-too-early.patch