thunderbolt: Call tb_switch_put() once DisplayPort bandwidth request is finished
authorGil Fine <gil.fine@linux.intel.com>
Thu, 10 Aug 2023 20:18:25 +0000 (23:18 +0300)
committerMika Westerberg <mika.westerberg@linux.intel.com>
Thu, 5 Oct 2023 09:06:50 +0000 (12:06 +0300)
When handling DisplayPort bandwidth request tb_switch_find_by_route() is
called and it returns a router structure with reference count increased.
In order to avoid resource leak call tb_switch_put() when finished.

Fixes: 6ce3563520be ("thunderbolt: Add support for DisplayPort bandwidth allocation mode")
Cc: stable@vger.kernel.org
Signed-off-by: Gil Fine <gil.fine@linux.intel.com>
Signed-off-by: Mika Westerberg <mika.westerberg@linux.intel.com>
drivers/thunderbolt/tb.c

index dd0a1ef..27bd6ca 100644 (file)
@@ -1907,14 +1907,14 @@ static void tb_handle_dp_bandwidth_request(struct work_struct *work)
        in = &sw->ports[ev->port];
        if (!tb_port_is_dpin(in)) {
                tb_port_warn(in, "bandwidth request to non-DP IN adapter\n");
-               goto unlock;
+               goto put_sw;
        }
 
        tb_port_dbg(in, "handling bandwidth allocation request\n");
 
        if (!usb4_dp_port_bandwidth_mode_enabled(in)) {
                tb_port_warn(in, "bandwidth allocation mode not enabled\n");
-               goto unlock;
+               goto put_sw;
        }
 
        ret = usb4_dp_port_requested_bandwidth(in);
@@ -1923,7 +1923,7 @@ static void tb_handle_dp_bandwidth_request(struct work_struct *work)
                        tb_port_dbg(in, "no bandwidth request active\n");
                else
                        tb_port_warn(in, "failed to read requested bandwidth\n");
-               goto unlock;
+               goto put_sw;
        }
        requested_bw = ret;
 
@@ -1932,7 +1932,7 @@ static void tb_handle_dp_bandwidth_request(struct work_struct *work)
        tunnel = tb_find_tunnel(tb, TB_TUNNEL_DP, in, NULL);
        if (!tunnel) {
                tb_port_warn(in, "failed to find tunnel\n");
-               goto unlock;
+               goto put_sw;
        }
 
        out = tunnel->dst_port;
@@ -1959,6 +1959,8 @@ static void tb_handle_dp_bandwidth_request(struct work_struct *work)
                tb_recalc_estimated_bandwidth(tb);
        }
 
+put_sw:
+       tb_switch_put(sw);
 unlock:
        mutex_unlock(&tb->lock);