From: Greg Kroah-Hartman Date: Mon, 19 Jul 2021 13:06:55 +0000 (+0200) Subject: 5.13-stable patches X-Git-Tag: v5.13.4~31 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=ad4e7b09d6dea677e5f3b7508666dbd43ef2b754;p=thirdparty%2Fkernel%2Fstable-queue.git 5.13-stable patches added patches: drm-dp_mst-add-missing-drm-parameters-to-recently-added-call-to-drm_dbg_kms.patch drm-dp_mst-avoid-to-mess-up-payload-table-by-ports-in-stale-topology.patch drm-dp_mst-do-not-set-proposed-vcpi-directly.patch net-bridge-multicast-fix-mrd-advertisement-router-port-marking-race.patch net-bridge-multicast-fix-pim-hello-router-port-marking-race.patch --- diff --git a/queue-5.13/drm-dp_mst-add-missing-drm-parameters-to-recently-added-call-to-drm_dbg_kms.patch b/queue-5.13/drm-dp_mst-add-missing-drm-parameters-to-recently-added-call-to-drm_dbg_kms.patch new file mode 100644 index 00000000000..468362ee1bf --- /dev/null +++ b/queue-5.13/drm-dp_mst-add-missing-drm-parameters-to-recently-added-call-to-drm_dbg_kms.patch @@ -0,0 +1,53 @@ +From 24ff3dc18b99c4b912ab1746e803ddb3be5ced4c Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Jos=C3=A9=20Roberto=20de=20Souza?= +Date: Wed, 16 Jun 2021 12:44:15 -0700 +Subject: drm/dp_mst: Add missing drm parameters to recently added call to drm_dbg_kms() +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +From: José Roberto de Souza + +commit 24ff3dc18b99c4b912ab1746e803ddb3be5ced4c upstream. + +Commit 3769e4c0af5b ("drm/dp_mst: Avoid to mess up payload table by +ports in stale topology") added to calls to drm_dbg_kms() but it +missed the first parameter, the drm device breaking the build. + +Fixes: 3769e4c0af5b ("drm/dp_mst: Avoid to mess up payload table by ports in stale topology") +Cc: Wayne Lin +Cc: Lyude Paul +Cc: dri-devel@lists.freedesktop.org +Cc: stable@vger.kernel.org +Signed-off-by: José Roberto de Souza +Reviewed-by: Lyude Paul +Signed-off-by: Lyude Paul +Link: https://patchwork.freedesktop.org/patch/msgid/20210616194415.36926-1-jose.souza@intel.com +Signed-off-by: Greg Kroah-Hartman +--- + drivers/gpu/drm/drm_dp_mst_topology.c | 7 +++++-- + 1 file changed, 5 insertions(+), 2 deletions(-) + +--- a/drivers/gpu/drm/drm_dp_mst_topology.c ++++ b/drivers/gpu/drm/drm_dp_mst_topology.c +@@ -3383,7 +3383,9 @@ int drm_dp_update_payload_part1(struct d + mutex_unlock(&mgr->lock); + + if (skip) { +- drm_dbg_kms("Virtual channel %d is not in current topology\n", i); ++ drm_dbg_kms(mgr->dev, ++ "Virtual channel %d is not in current topology\n", ++ i); + continue; + } + /* Validated ports don't matter if we're releasing +@@ -3398,7 +3400,8 @@ int drm_dp_update_payload_part1(struct d + payload->start_slot = req_payload.start_slot; + continue; + } else { +- drm_dbg_kms("Fail:set payload to invalid sink"); ++ drm_dbg_kms(mgr->dev, ++ "Fail:set payload to invalid sink"); + mutex_unlock(&mgr->payload_lock); + return -EINVAL; + } diff --git a/queue-5.13/drm-dp_mst-avoid-to-mess-up-payload-table-by-ports-in-stale-topology.patch b/queue-5.13/drm-dp_mst-avoid-to-mess-up-payload-table-by-ports-in-stale-topology.patch new file mode 100644 index 00000000000..0e44692c619 --- /dev/null +++ b/queue-5.13/drm-dp_mst-avoid-to-mess-up-payload-table-by-ports-in-stale-topology.patch @@ -0,0 +1,121 @@ +From 3769e4c0af5b82c8ea21d037013cb9564dfaa51f Mon Sep 17 00:00:00 2001 +From: Wayne Lin +Date: Wed, 16 Jun 2021 11:55:01 +0800 +Subject: drm/dp_mst: Avoid to mess up payload table by ports in stale topology + +From: Wayne Lin + +commit 3769e4c0af5b82c8ea21d037013cb9564dfaa51f upstream. + +[Why] +After unplug/hotplug hub from the system, userspace might start to +clear stale payloads gradually. If we call drm_dp_mst_deallocate_vcpi() +to release stale VCPI of those ports which are not relating to current +topology, we have chane to wrongly clear active payload table entry for +current topology. + +E.g. +We have allocated VCPI 1 in current payload table and we call +drm_dp_mst_deallocate_vcpi() to clean VCPI 1 in stale topology. In +drm_dp_mst_deallocate_vcpi(), it will call drm_dp_mst_put_payload_id() +tp put VCPI 1 and which means ID 1 is available again. Thereafter, if we +want to allocate a new payload stream, it will find ID 1 is available by +drm_dp_mst_assign_payload_id(). However, ID 1 is being used + +[How] +Check target sink is relating to current topology or not before doing +any payload table update. +Searching upward to find the target sink's relevant root branch device. +If the found root branch device is not the same root of current +topology, don't update payload table. + +Changes since v1: +* Change debug macro to use drm_dbg_kms() instead +* Amend the commit message to add Cc tag. + +Signed-off-by: Wayne Lin +Cc: stable@vger.kernel.org +Signed-off-by: Lyude Paul +Link: https://patchwork.freedesktop.org/patch/msgid/20210616035501.3776-3-Wayne.Lin@amd.com +Reviewed-by: Lyude Paul +Signed-off-by: Greg Kroah-Hartman +--- + drivers/gpu/drm/drm_dp_mst_topology.c | 29 +++++++++++++++++++++++++++++ + 1 file changed, 29 insertions(+) + +--- a/drivers/gpu/drm/drm_dp_mst_topology.c ++++ b/drivers/gpu/drm/drm_dp_mst_topology.c +@@ -94,6 +94,9 @@ static int drm_dp_mst_register_i2c_bus(s + static void drm_dp_mst_unregister_i2c_bus(struct drm_dp_mst_port *port); + static void drm_dp_mst_kick_tx(struct drm_dp_mst_topology_mgr *mgr); + ++static bool drm_dp_mst_port_downstream_of_branch(struct drm_dp_mst_port *port, ++ struct drm_dp_mst_branch *branch); ++ + #define DBG_PREFIX "[dp_mst]" + + #define DP_STR(x) [DP_ ## x] = #x +@@ -3360,6 +3363,7 @@ int drm_dp_update_payload_part1(struct d + struct drm_dp_mst_port *port; + int i, j; + int cur_slots = 1; ++ bool skip; + + mutex_lock(&mgr->payload_lock); + for (i = 0; i < mgr->max_payloads; i++) { +@@ -3374,6 +3378,14 @@ int drm_dp_update_payload_part1(struct d + port = container_of(vcpi, struct drm_dp_mst_port, + vcpi); + ++ mutex_lock(&mgr->lock); ++ skip = !drm_dp_mst_port_downstream_of_branch(port, mgr->mst_primary); ++ mutex_unlock(&mgr->lock); ++ ++ if (skip) { ++ drm_dbg_kms("Virtual channel %d is not in current topology\n", i); ++ continue; ++ } + /* Validated ports don't matter if we're releasing + * VCPI + */ +@@ -3473,6 +3485,7 @@ int drm_dp_update_payload_part2(struct d + struct drm_dp_mst_port *port; + int i; + int ret = 0; ++ bool skip; + + mutex_lock(&mgr->payload_lock); + for (i = 0; i < mgr->max_payloads; i++) { +@@ -3482,6 +3495,13 @@ int drm_dp_update_payload_part2(struct d + + port = container_of(mgr->proposed_vcpis[i], struct drm_dp_mst_port, vcpi); + ++ mutex_lock(&mgr->lock); ++ skip = !drm_dp_mst_port_downstream_of_branch(port, mgr->mst_primary); ++ mutex_unlock(&mgr->lock); ++ ++ if (skip) ++ continue; ++ + DRM_DEBUG_KMS("payload %d %d\n", i, mgr->payloads[i].payload_state); + if (mgr->payloads[i].payload_state == DP_PAYLOAD_LOCAL) { + ret = drm_dp_create_payload_step2(mgr, port, mgr->proposed_vcpis[i]->vcpi, &mgr->payloads[i]); +@@ -4561,9 +4581,18 @@ EXPORT_SYMBOL(drm_dp_mst_reset_vcpi_slot + void drm_dp_mst_deallocate_vcpi(struct drm_dp_mst_topology_mgr *mgr, + struct drm_dp_mst_port *port) + { ++ bool skip; ++ + if (!port->vcpi.vcpi) + return; + ++ mutex_lock(&mgr->lock); ++ skip = !drm_dp_mst_port_downstream_of_branch(port, mgr->mst_primary); ++ mutex_unlock(&mgr->lock); ++ ++ if (skip) ++ return; ++ + drm_dp_mst_put_payload_id(mgr, port->vcpi.vcpi); + port->vcpi.num_slots = 0; + port->vcpi.pbn = 0; diff --git a/queue-5.13/drm-dp_mst-do-not-set-proposed-vcpi-directly.patch b/queue-5.13/drm-dp_mst-do-not-set-proposed-vcpi-directly.patch new file mode 100644 index 00000000000..1714743ba67 --- /dev/null +++ b/queue-5.13/drm-dp_mst-do-not-set-proposed-vcpi-directly.patch @@ -0,0 +1,126 @@ +From 35d3e8cb35e75450f87f87e3d314e2d418b6954b Mon Sep 17 00:00:00 2001 +From: Wayne Lin +Date: Wed, 16 Jun 2021 11:55:00 +0800 +Subject: drm/dp_mst: Do not set proposed vcpi directly + +From: Wayne Lin + +commit 35d3e8cb35e75450f87f87e3d314e2d418b6954b upstream. + +[Why] +When we receive CSN message to notify one port is disconnected, we will +implicitly set its corresponding num_slots to 0. Later on, we will +eventually call drm_dp_update_payload_part1() to arrange down streams. + +In drm_dp_update_payload_part1(), we iterate over all proposed_vcpis[] +to do the update. Not specific to a target sink only. For example, if we +light up 2 monitors, Monitor_A and Monitor_B, and then we unplug +Monitor_B. Later on, when we call drm_dp_update_payload_part1() to try +to update payload for Monitor_A, we'll also implicitly clean payload for +Monitor_B at the same time. And finally, when we try to call +drm_dp_update_payload_part1() to clean payload for Monitor_B, we will do +nothing at this time since payload for Monitor_B has been cleaned up +previously. + +For StarTech 1to3 DP hub, it seems like if we didn't update DPCD payload +ID table then polling for "ACT Handled"(BIT_1 of DPCD 002C0h) will fail +and this polling will last for 3 seconds. + +Therefore, guess the best way is we don't set the proposed_vcpi[] +diretly. Let user of these herlper functions to set the proposed_vcpi +directly. + +[How] +1. Revert commit 7617e9621bf2 ("drm/dp_mst: clear time slots for ports +invalid") +2. Tackle the issue in previous commit by skipping those trasient +proposed VCPIs. These stale VCPIs shoulde be explicitly cleared by +user later on. + +Changes since v1: +* Change debug macro to use drm_dbg_kms() instead +* Amend the commit message to add Fixed & Cc tags + +Signed-off-by: Wayne Lin +Fixes: 7617e9621bf2 ("drm/dp_mst: clear time slots for ports invalid") +Cc: Lyude Paul +Cc: Wayne Lin +Cc: Maarten Lankhorst +Cc: Maxime Ripard +Cc: Thomas Zimmermann +Cc: dri-devel@lists.freedesktop.org +Cc: # v5.5+ +Signed-off-by: Lyude Paul +Link: https://patchwork.freedesktop.org/patch/msgid/20210616035501.3776-2-Wayne.Lin@amd.com +Reviewed-by: Lyude Paul +Signed-off-by: Greg Kroah-Hartman +--- + drivers/gpu/drm/drm_dp_mst_topology.c | 36 +++++++++------------------------- + 1 file changed, 10 insertions(+), 26 deletions(-) + +--- a/drivers/gpu/drm/drm_dp_mst_topology.c ++++ b/drivers/gpu/drm/drm_dp_mst_topology.c +@@ -2497,7 +2497,7 @@ drm_dp_mst_handle_conn_stat(struct drm_d + { + struct drm_dp_mst_topology_mgr *mgr = mstb->mgr; + struct drm_dp_mst_port *port; +- int old_ddps, old_input, ret, i; ++ int old_ddps, ret; + u8 new_pdt; + bool new_mcs; + bool dowork = false, create_connector = false; +@@ -2529,7 +2529,6 @@ drm_dp_mst_handle_conn_stat(struct drm_d + } + + old_ddps = port->ddps; +- old_input = port->input; + port->input = conn_stat->input_port; + port->ldps = conn_stat->legacy_device_plug_status; + port->ddps = conn_stat->displayport_device_plug_status; +@@ -2552,28 +2551,6 @@ drm_dp_mst_handle_conn_stat(struct drm_d + dowork = false; + } + +- if (!old_input && old_ddps != port->ddps && !port->ddps) { +- for (i = 0; i < mgr->max_payloads; i++) { +- struct drm_dp_vcpi *vcpi = mgr->proposed_vcpis[i]; +- struct drm_dp_mst_port *port_validated; +- +- if (!vcpi) +- continue; +- +- port_validated = +- container_of(vcpi, struct drm_dp_mst_port, vcpi); +- port_validated = +- drm_dp_mst_topology_get_port_validated(mgr, port_validated); +- if (!port_validated) { +- mutex_lock(&mgr->payload_lock); +- vcpi->num_slots = 0; +- mutex_unlock(&mgr->payload_lock); +- } else { +- drm_dp_mst_topology_put_port(port_validated); +- } +- } +- } +- + if (port->connector) + drm_modeset_unlock(&mgr->base.lock); + else if (create_connector) +@@ -3404,8 +3381,15 @@ int drm_dp_update_payload_part1(struct d + port = drm_dp_mst_topology_get_port_validated( + mgr, port); + if (!port) { +- mutex_unlock(&mgr->payload_lock); +- return -EINVAL; ++ if (vcpi->num_slots == payload->num_slots) { ++ cur_slots += vcpi->num_slots; ++ payload->start_slot = req_payload.start_slot; ++ continue; ++ } else { ++ drm_dbg_kms("Fail:set payload to invalid sink"); ++ mutex_unlock(&mgr->payload_lock); ++ return -EINVAL; ++ } + } + put_port = true; + } diff --git a/queue-5.13/net-bridge-multicast-fix-mrd-advertisement-router-port-marking-race.patch b/queue-5.13/net-bridge-multicast-fix-mrd-advertisement-router-port-marking-race.patch new file mode 100644 index 00000000000..2ee37d83fcc --- /dev/null +++ b/queue-5.13/net-bridge-multicast-fix-mrd-advertisement-router-port-marking-race.patch @@ -0,0 +1,47 @@ +From 000b7287b67555fee39d39fff75229dedde0dcbf Mon Sep 17 00:00:00 2001 +From: Nikolay Aleksandrov +Date: Sun, 11 Jul 2021 12:56:29 +0300 +Subject: net: bridge: multicast: fix MRD advertisement router port marking race + +From: Nikolay Aleksandrov + +commit 000b7287b67555fee39d39fff75229dedde0dcbf upstream. + +When an MRD advertisement is received on a bridge port with multicast +snooping enabled, we mark it as a router port automatically, that +includes adding that port to the router port list. The multicast lock +protects that list, but it is not acquired in the MRD advertisement case +leading to a race condition, we need to take it to fix the race. + +Cc: stable@vger.kernel.org +Cc: linus.luessing@c0d3.blue +Fixes: 4b3087c7e37f ("bridge: Snoop Multicast Router Advertisements") +Signed-off-by: Nikolay Aleksandrov +Signed-off-by: David S. Miller +Signed-off-by: Greg Kroah-Hartman +--- + net/bridge/br_multicast.c | 4 ++++ + 1 file changed, 4 insertions(+) + +--- a/net/bridge/br_multicast.c ++++ b/net/bridge/br_multicast.c +@@ -3100,7 +3100,9 @@ static int br_ip4_multicast_mrd_rcv(stru + igmp_hdr(skb)->type != IGMP_MRDISC_ADV) + return -ENOMSG; + ++ spin_lock(&br->multicast_lock); + br_multicast_mark_router(br, port); ++ spin_unlock(&br->multicast_lock); + + return 0; + } +@@ -3168,7 +3170,9 @@ static void br_ip6_multicast_mrd_rcv(str + if (icmp6_hdr(skb)->icmp6_type != ICMPV6_MRDISC_ADV) + return; + ++ spin_lock(&br->multicast_lock); + br_multicast_mark_router(br, port); ++ spin_unlock(&br->multicast_lock); + } + + static int br_multicast_ipv6_rcv(struct net_bridge *br, diff --git a/queue-5.13/net-bridge-multicast-fix-pim-hello-router-port-marking-race.patch b/queue-5.13/net-bridge-multicast-fix-pim-hello-router-port-marking-race.patch new file mode 100644 index 00000000000..04b8eb4eb56 --- /dev/null +++ b/queue-5.13/net-bridge-multicast-fix-pim-hello-router-port-marking-race.patch @@ -0,0 +1,36 @@ +From 04bef83a3358946bfc98a5ecebd1b0003d83d882 Mon Sep 17 00:00:00 2001 +From: Nikolay Aleksandrov +Date: Sun, 11 Jul 2021 12:56:28 +0300 +Subject: net: bridge: multicast: fix PIM hello router port marking race + +From: Nikolay Aleksandrov + +commit 04bef83a3358946bfc98a5ecebd1b0003d83d882 upstream. + +When a PIM hello packet is received on a bridge port with multicast +snooping enabled, we mark it as a router port automatically, that +includes adding that port the router port list. The multicast lock +protects that list, but it is not acquired in the PIM message case +leading to a race condition, we need to take it to fix the race. + +Cc: stable@vger.kernel.org +Fixes: 91b02d3d133b ("bridge: mcast: add router port on PIM hello message") +Signed-off-by: Nikolay Aleksandrov +Signed-off-by: David S. Miller +Signed-off-by: Greg Kroah-Hartman +--- + net/bridge/br_multicast.c | 2 ++ + 1 file changed, 2 insertions(+) + +--- a/net/bridge/br_multicast.c ++++ b/net/bridge/br_multicast.c +@@ -3087,7 +3087,9 @@ static void br_multicast_pim(struct net_ + pim_hdr_type(pimhdr) != PIM_TYPE_HELLO) + return; + ++ spin_lock(&br->multicast_lock); + br_multicast_mark_router(br, port); ++ spin_unlock(&br->multicast_lock); + } + + static int br_ip4_multicast_mrd_rcv(struct net_bridge *br, diff --git a/queue-5.13/series b/queue-5.13/series index 532b10d0c0b..10f8c8427a9 100644 --- a/queue-5.13/series +++ b/queue-5.13/series @@ -31,3 +31,8 @@ btrfs-fix-deadlock-with-concurrent-chunk-allocations-involving-system-chunks.pat btrfs-rework-chunk-allocation-to-avoid-exhaustion-of-the-system-chunk-array.patch btrfs-don-t-block-if-we-can-t-acquire-the-reclaim-lock.patch btrfs-zoned-fix-wrong-mutex-unlock-on-failure-to-allocate-log-root-tree.patch +drm-dp_mst-do-not-set-proposed-vcpi-directly.patch +drm-dp_mst-avoid-to-mess-up-payload-table-by-ports-in-stale-topology.patch +drm-dp_mst-add-missing-drm-parameters-to-recently-added-call-to-drm_dbg_kms.patch +net-bridge-multicast-fix-pim-hello-router-port-marking-race.patch +net-bridge-multicast-fix-mrd-advertisement-router-port-marking-race.patch