[PATCH AUTOSEL 6.18-6.6] thunderbolt: Improve multi-display DisplayPort tunnel allocation
From: Sasha Levin
Date: Mon Aug 31 2026 - 12:16:31 EST
From: Alan Borzeszkowski <alan.borzeszkowski@xxxxxxxxxxxxxxx>
[ Upstream commit afe9021d63b46233f5c87d52b820fa26e7f562cd ]
When 3 monitors are connected through Thunderbolt dock to the system at
once, one of the monitors might fail to establish DisplayPort tunnel.
This happens during DP bandwidth negotiation - each monitor takes
maximum bandwidth that is supported and there might not be enough for
3rd display. In this case Thunderbolt driver drops DP tunnel and
'forgets' about it but with DP bandwidth allocation mode, that comes in
later, some bandwidth might be freed.
Make Thunderbolt driver check again if DP tunnel can be established
after DP bandwidth consumption changed.
Signed-off-by: Alan Borzeszkowski <alan.borzeszkowski@xxxxxxxxxxxxxxx>
Signed-off-by: Mika Westerberg <mika.westerberg@xxxxxxxxxxxxxxx>
Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>
---
LLM Generated explanations, may be completely bogus:
The analysis is complete. A background `git log --all` search timed out
(as expected with that flag), but the review was finished using targeted
history lookups instead.
**Verdict for v6.18.44: YES**
This is a small, low-risk fix for a real multi-monitor Thunderbolt dock
bug: when three displays negotiate bandwidth, a failed third DP tunnel
is never retried after allocation mode frees bandwidth. The patch adds
`tb_tunnel_dp()` on the success path of
`tb_handle_dp_bandwidth_request()`, matching an existing pattern
elsewhere in `tb.c`, and applies cleanly to this tree.
drivers/thunderbolt/tb.c | 3 +++
1 file changed, 3 insertions(+)
diff --git a/drivers/thunderbolt/tb.c b/drivers/thunderbolt/tb.c
index b516b1ad83a19..c8dcb3ca45152 100644
--- a/drivers/thunderbolt/tb.c
+++ b/drivers/thunderbolt/tb.c
@@ -2847,6 +2847,9 @@ static void tb_handle_dp_bandwidth_request(struct work_struct *work)
/* Update other clients about the allocation change */
tb_recalc_estimated_bandwidth(tb);
+
+ tb_dbg(tb, "checking if more DP tunnels can be established now\n");
+ tb_tunnel_dp(tb);
}
put_sw:
--
2.53.0