]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/commitdiff
5.13-stable patches
authorGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Mon, 19 Jul 2021 13:06:55 +0000 (15:06 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Mon, 19 Jul 2021 13:06:55 +0000 (15:06 +0200)
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

queue-5.13/drm-dp_mst-add-missing-drm-parameters-to-recently-added-call-to-drm_dbg_kms.patch [new file with mode: 0644]
queue-5.13/drm-dp_mst-avoid-to-mess-up-payload-table-by-ports-in-stale-topology.patch [new file with mode: 0644]
queue-5.13/drm-dp_mst-do-not-set-proposed-vcpi-directly.patch [new file with mode: 0644]
queue-5.13/net-bridge-multicast-fix-mrd-advertisement-router-port-marking-race.patch [new file with mode: 0644]
queue-5.13/net-bridge-multicast-fix-pim-hello-router-port-marking-race.patch [new file with mode: 0644]
queue-5.13/series

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 (file)
index 0000000..468362e
--- /dev/null
@@ -0,0 +1,53 @@
+From 24ff3dc18b99c4b912ab1746e803ddb3be5ced4c Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Jos=C3=A9=20Roberto=20de=20Souza?= <jose.souza@intel.com>
+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 <jose.souza@intel.com>
+
+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 <Wayne.Lin@amd.com>
+Cc: Lyude Paul <lyude@redhat.com>
+Cc: dri-devel@lists.freedesktop.org
+Cc: stable@vger.kernel.org
+Signed-off-by: José Roberto de Souza <jose.souza@intel.com>
+Reviewed-by: Lyude Paul <lyude@redhat.com>
+Signed-off-by: Lyude Paul <lyude@redhat.com>
+Link: https://patchwork.freedesktop.org/patch/msgid/20210616194415.36926-1-jose.souza@intel.com
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ 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 (file)
index 0000000..0e44692
--- /dev/null
@@ -0,0 +1,121 @@
+From 3769e4c0af5b82c8ea21d037013cb9564dfaa51f Mon Sep 17 00:00:00 2001
+From: Wayne Lin <Wayne.Lin@amd.com>
+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 <Wayne.Lin@amd.com>
+
+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 <Wayne.Lin@amd.com>
+Cc: stable@vger.kernel.org
+Signed-off-by: Lyude Paul <lyude@redhat.com>
+Link: https://patchwork.freedesktop.org/patch/msgid/20210616035501.3776-3-Wayne.Lin@amd.com
+Reviewed-by: Lyude Paul <lyude@redhat.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ 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 (file)
index 0000000..1714743
--- /dev/null
@@ -0,0 +1,126 @@
+From 35d3e8cb35e75450f87f87e3d314e2d418b6954b Mon Sep 17 00:00:00 2001
+From: Wayne Lin <Wayne.Lin@amd.com>
+Date: Wed, 16 Jun 2021 11:55:00 +0800
+Subject: drm/dp_mst: Do not set proposed vcpi directly
+
+From: Wayne Lin <Wayne.Lin@amd.com>
+
+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 <Wayne.Lin@amd.com>
+Fixes: 7617e9621bf2 ("drm/dp_mst: clear time slots for ports invalid")
+Cc: Lyude Paul <lyude@redhat.com>
+Cc: Wayne Lin <Wayne.Lin@amd.com>
+Cc: Maarten Lankhorst <maarten.lankhorst@linux.intel.com>
+Cc: Maxime Ripard <mripard@kernel.org>
+Cc: Thomas Zimmermann <tzimmermann@suse.de>
+Cc: dri-devel@lists.freedesktop.org
+Cc: <stable@vger.kernel.org> # v5.5+
+Signed-off-by: Lyude Paul <lyude@redhat.com>
+Link: https://patchwork.freedesktop.org/patch/msgid/20210616035501.3776-2-Wayne.Lin@amd.com
+Reviewed-by: Lyude Paul <lyude@redhat.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ 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 (file)
index 0000000..2ee37d8
--- /dev/null
@@ -0,0 +1,47 @@
+From 000b7287b67555fee39d39fff75229dedde0dcbf Mon Sep 17 00:00:00 2001
+From: Nikolay Aleksandrov <nikolay@nvidia.com>
+Date: Sun, 11 Jul 2021 12:56:29 +0300
+Subject: net: bridge: multicast: fix MRD advertisement router port marking race
+
+From: Nikolay Aleksandrov <nikolay@nvidia.com>
+
+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 <nikolay@nvidia.com>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ 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 (file)
index 0000000..04b8eb4
--- /dev/null
@@ -0,0 +1,36 @@
+From 04bef83a3358946bfc98a5ecebd1b0003d83d882 Mon Sep 17 00:00:00 2001
+From: Nikolay Aleksandrov <nikolay@nvidia.com>
+Date: Sun, 11 Jul 2021 12:56:28 +0300
+Subject: net: bridge: multicast: fix PIM hello router port marking race
+
+From: Nikolay Aleksandrov <nikolay@nvidia.com>
+
+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 <nikolay@nvidia.com>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ 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,
index 532b10d0c0bff3c1ff2f5c096598d0db1368ec50..10f8c8427a995bf7964134a563528c9ff4c93d7c 100644 (file)
@@ -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