From: Greg Kroah-Hartman Date: Tue, 26 Feb 2019 15:02:41 +0000 (+0100) Subject: 4.19-stable patches X-Git-Tag: v4.9.161~2 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=d26240e411135f5257f24ca5d16ea6814e2ac443;p=thirdparty%2Fkernel%2Fstable-queue.git 4.19-stable patches added patches: net-phylink-avoid-resolving-link-state-too-early.patch --- diff --git a/queue-4.19/net-phylink-avoid-resolving-link-state-too-early.patch b/queue-4.19/net-phylink-avoid-resolving-link-state-too-early.patch new file mode 100644 index 00000000000..51f26e20cbe --- /dev/null +++ b/queue-4.19/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 +@@ -502,6 +502,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); +@@ -955,9 +966,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); + +@@ -1664,9 +1673,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.19/series b/queue-4.19/series index e6455f04afb..9cdb3cf5371 100644 --- a/queue-4.19/series +++ b/queue-4.19/series @@ -150,3 +150,4 @@ netfilter-nfnetlink_osf-add-missing-fmatch-check.patch netfilter-ipt_clusterip-fix-sleep-in-atomic-bug-in-clusterip_config_entry_put.patch udlfb-handle-unplug-properly.patch pinctrl-max77620-use-define-directive-for-max77620_pinconf_param-values.patch +net-phylink-avoid-resolving-link-state-too-early.patch