Patch "drm/vc4: drop all currently held locks if deadlock happens" has been added to the 6.1-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/vc4: drop all currently held locks if deadlock happens

to the 6.1-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-vc4-drop-all-currently-held-locks-if-deadlock-ha.patch
and it can be found in the queue-6.1 subdirectory.

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



commit 7c6c43336afe10bc3a90f023733a1d5d320adc25
Author: Maíra Canal <mcanal@xxxxxxxxxx>
Date:   Thu Dec 29 16:46:38 2022 -0300

    drm/vc4: drop all currently held locks if deadlock happens
    
    [ Upstream commit 479d4f0be4237ba33bc9432787aeb62c90e30f95 ]
    
    If vc4_hdmi_reset_link() returns -EDEADLK, it means that a deadlock
    happened in the locking context. This situation should be addressed by
    dropping all currently held locks and block until the contended lock
    becomes available. Currently, vc4 is not dealing with the deadlock
    properly, producing the following output when PROVE_LOCKING is enabled:
    
    [  825.612809] ------------[ cut here ]------------
    [  825.612852] WARNING: CPU: 1 PID: 116 at drivers/gpu/drm/drm_modeset_lock.c:276 drm_modeset_drop_locks+0x60/0x68 [drm]
    [  825.613458] Modules linked in: 8021q mrp garp stp llc
    raspberrypi_cpufreq brcmfmac brcmutil crct10dif_ce hci_uart cfg80211
    btqca btbcm bluetooth vc4 raspberrypi_hwmon snd_soc_hdmi_codec cec
    clk_raspberrypi ecdh_generic drm_display_helper ecc rfkill
    drm_dma_helper drm_kms_helper pwm_bcm2835 bcm2835_thermal bcm2835_rng
    rng_core i2c_bcm2835 drm fuse ip_tables x_tables ipv6
    [  825.613735] CPU: 1 PID: 116 Comm: kworker/1:2 Tainted: G        W 6.1.0-rc6-01399-g941aae326315 #3
    [  825.613759] Hardware name: Raspberry Pi 3 Model B Rev 1.2 (DT)
    [  825.613777] Workqueue: events output_poll_execute [drm_kms_helper]
    [  825.614038] pstate: 60000005 (nZCv daif -PAN -UAO -TCO -DIT -SSBS BTYPE=--)
    [  825.614063] pc : drm_modeset_drop_locks+0x60/0x68 [drm]
    [  825.614603] lr : drm_helper_probe_detect+0x120/0x1b4 [drm_kms_helper]
    [  825.614829] sp : ffff800008313bf0
    [  825.614844] x29: ffff800008313bf0 x28: ffffcd7778b8b000 x27: 0000000000000000
    [  825.614883] x26: 0000000000000001 x25: 0000000000000001 x24: ffff677cc35c2758
    [  825.614920] x23: ffffcd7707d01430 x22: ffffcd7707c3edc7 x21: 0000000000000001
    [  825.614958] x20: 0000000000000000 x19: ffff800008313c10 x18: 000000000000b6d3
    [  825.614995] x17: ffffcd777835e214 x16: ffffcd7777cef870 x15: fffff81000000000
    [  825.615033] x14: 0000000000000000 x13: 0000000000000099 x12: 0000000000000002
    [  825.615070] x11: 72917988020af800 x10: 72917988020af800 x9 : 72917988020af800
    [  825.615108] x8 : ffff677cc665e0a8 x7 : d00a8c180000110c x6 : ffffcd77774c0054
    [  825.615145] x5 : 0000000000000000 x4 : 0000000000000001 x3 : 0000000000000000
    [  825.615181] x2 : ffff677cc55e1880 x1 : ffffcd7777cef8ec x0 : ffff800008313c10
    [  825.615219] Call trace:
    [  825.615232]  drm_modeset_drop_locks+0x60/0x68 [drm]
    [  825.615773]  drm_helper_probe_detect+0x120/0x1b4 [drm_kms_helper]
    [  825.616003]  output_poll_execute+0xe4/0x224 [drm_kms_helper]
    [  825.616233]  process_one_work+0x2b4/0x618
    [  825.616264]  worker_thread+0x24c/0x464
    [  825.616288]  kthread+0xec/0x110
    [  825.616310]  ret_from_fork+0x10/0x20
    [  825.616335] irq event stamp: 7634
    [  825.616349] hardirqs last  enabled at (7633): [<ffffcd777831ee90>] _raw_spin_unlock_irq+0x3c/0x78
    [  825.616384] hardirqs last disabled at (7634): [<ffffcd7778315a78>] __schedule+0x134/0x9f0
    [  825.616411] softirqs last  enabled at (7630): [<ffffcd7707aacea0>] local_bh_enable+0x4/0x30 [ipv6]
    [  825.617019] softirqs last disabled at (7618): [<ffffcd7707aace70>] local_bh_disable+0x4/0x30 [ipv6]
    [  825.617586] ---[ end trace 0000000000000000 ]---
    
    Therefore, deal with the deadlock as suggested by [1], using the
    function drm_modeset_backoff().
    
    [1] https://docs.kernel.org/gpu/drm-kms.html?highlight=kms#kms-locking
    
    Fixes: 6bed2ea3cb38 ("drm/vc4: hdmi: Reset link on hotplug")
    Reported-by: Stefan Wahren <stefan.wahren@xxxxxxxx>
    Signed-off-by: Maíra Canal <mcanal@xxxxxxxxxx>
    Tested-by: Stefan Wahren <stefan.wahren@xxxxxxxx>
    Signed-off-by: Maxime Ripard <maxime@xxxxxxxxxx>
    Link: https://patchwork.freedesktop.org/patch/msgid/20221229194638.178712-1-mcanal@xxxxxxxxxx
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/drivers/gpu/drm/vc4/vc4_hdmi.c b/drivers/gpu/drm/vc4/vc4_hdmi.c
index c4b73d9dd0409..0d0b6df4df153 100644
--- a/drivers/gpu/drm/vc4/vc4_hdmi.c
+++ b/drivers/gpu/drm/vc4/vc4_hdmi.c
@@ -402,6 +402,7 @@ static void vc4_hdmi_handle_hotplug(struct vc4_hdmi *vc4_hdmi,
 {
 	struct drm_connector *connector = &vc4_hdmi->connector;
 	struct edid *edid;
+	int ret;
 
 	/*
 	 * NOTE: This function should really be called with
@@ -430,7 +431,15 @@ static void vc4_hdmi_handle_hotplug(struct vc4_hdmi *vc4_hdmi,
 	cec_s_phys_addr_from_edid(vc4_hdmi->cec_adap, edid);
 	kfree(edid);
 
-	vc4_hdmi_reset_link(connector, ctx);
+	for (;;) {
+		ret = vc4_hdmi_reset_link(connector, ctx);
+		if (ret == -EDEADLK) {
+			drm_modeset_backoff(ctx);
+			continue;
+		}
+
+		break;
+	}
 }
 
 static int vc4_hdmi_connector_detect_ctx(struct drm_connector *connector,



[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