Patch "drm/msm/dp: Drop aux devices together with DP controller" has been added to the 6.4-stable tree

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This is a note to let you know that I've just added the patch titled

    drm/msm/dp: Drop aux devices together with DP controller

to the 6.4-stable tree which can be found at:
    http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
     drm-msm-dp-drop-aux-devices-together-with-dp-control.patch
and it can be found in the queue-6.4 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree,
please let <stable@xxxxxxxxxxxxxxx> know about it.



commit aea0b17971a5cb8038b662d8761b341128e951a2
Author: Bjorn Andersson <quic_bjorande@xxxxxxxxxxx>
Date:   Mon Jun 12 15:01:06 2023 -0700

    drm/msm/dp: Drop aux devices together with DP controller
    
    [ Upstream commit a7bfb2ad2184a1fba78be35209b6019aa8cc8d4d ]
    
    Using devres to depopulate the aux bus made sure that upon a probe
    deferral the EDP panel device would be destroyed and recreated upon next
    attempt.
    
    But the struct device which the devres is tied to is the DPUs
    (drm_dev->dev), which may be happen after the DP controller is torn
    down.
    
    Indications of this can be seen in the commonly seen EDID-hexdump full
    of zeros in the log, or the occasional/rare KASAN fault where the
    panel's attempt to read the EDID information causes a use after free on
    DP resources.
    
    It's tempting to move the devres to the DP controller's struct device,
    but the resources used by the device(s) on the aux bus are explicitly
    torn down in the error path. The KASAN-reported use-after-free also
    remains, as the DP aux "module" explicitly frees its devres-allocated
    memory in this code path.
    
    As such, explicitly depopulate the aux bus in the error path, and in the
    component unbind path, to avoid these issues.
    
    Fixes: 2b57f726611e ("drm/msm/dp: fix aux-bus EP lifetime")
    Signed-off-by: Bjorn Andersson <quic_bjorande@xxxxxxxxxxx>
    Reviewed-by: Dmitry Baryshkov <dmitry.baryshkov@xxxxxxxxxx>
    Reviewed-by: Douglas Anderson <dianders@xxxxxxxxxxxx>
    Patchwork: https://patchwork.freedesktop.org/patch/542163/
    Link: https://lore.kernel.org/r/20230612220106.1884039-1-quic_bjorande@xxxxxxxxxxx
    Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@xxxxxxxxxx>
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/drivers/gpu/drm/msm/dp/dp_display.c b/drivers/gpu/drm/msm/dp/dp_display.c
index 03b0eda6df54a..294ab2bd856de 100644
--- a/drivers/gpu/drm/msm/dp/dp_display.c
+++ b/drivers/gpu/drm/msm/dp/dp_display.c
@@ -329,6 +329,8 @@ static void dp_display_unbind(struct device *dev, struct device *master,
 
 	kthread_stop(dp->ev_tsk);
 
+	of_dp_aux_depopulate_bus(dp->aux);
+
 	dp_power_client_deinit(dp->power);
 	dp_unregister_audio_driver(dev, dp->audio);
 	dp_aux_unregister(dp->aux);
@@ -1509,11 +1511,6 @@ void msm_dp_debugfs_init(struct msm_dp *dp_display, struct drm_minor *minor)
 	}
 }
 
-static void of_dp_aux_depopulate_bus_void(void *data)
-{
-	of_dp_aux_depopulate_bus(data);
-}
-
 static int dp_display_get_next_bridge(struct msm_dp *dp)
 {
 	int rc;
@@ -1541,12 +1538,6 @@ static int dp_display_get_next_bridge(struct msm_dp *dp)
 		of_node_put(aux_bus);
 		if (rc)
 			goto error;
-
-		rc = devm_add_action_or_reset(dp->drm_dev->dev,
-						of_dp_aux_depopulate_bus_void,
-						dp_priv->aux);
-		if (rc)
-			goto error;
 	} else if (dp->is_edp) {
 		DRM_ERROR("eDP aux_bus not found\n");
 		return -ENODEV;
@@ -1570,6 +1561,7 @@ static int dp_display_get_next_bridge(struct msm_dp *dp)
 
 error:
 	if (dp->is_edp) {
+		of_dp_aux_depopulate_bus(dp_priv->aux);
 		dp_display_host_phy_exit(dp_priv);
 		dp_display_host_deinit(dp_priv);
 	}



[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux