From nobody Wed Jun 17 04:05:39 2026 Received: from sender4-pp-f112.zoho.com (sender4-pp-f112.zoho.com [136.143.188.112]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id CBC843DBD5F for ; Wed, 22 Apr 2026 12:36:26 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=pass smtp.client-ip=136.143.188.112 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1776861391; cv=pass; b=sCqVOtS/c6KpmqFpjLajYQaBomvWunV0zivt0hQE+8BHyROZwxL3+6IrWQzyLAvoEx1x2Rc76/4/ak0SToeRxob99j2+U6OwG2ufgOJGVCrOfNb8LMXdDfnQ7QA3GPyr2h0JTLis8QOTo8xUMMFOc7sLqCr9cYGeEq3DGioArCk= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1776861391; c=relaxed/simple; bh=6bE8QHLGFOCbWP27Dt9G0RnWYdsOmyuBVSj6S4BKRGM=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=BNPX9v8+Awfe1tmGh0ZrbtfWyzY4NdBW+JWw4td42nv5It2F7Xjl1GUCCF1q0DMIZ4HwO8xCnCLCP4/D8MWz8X9UNGnqDYTTbuROrLgy9avgZ7OCZnjDV0Jk3FYqmKJctvtyWZi1uEjnmQzYkFqUWBx16WSfpEvhrBsvaWM6lKE= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=collabora.com; spf=pass smtp.mailfrom=collabora.com; dkim=pass (1024-bit key) header.d=collabora.com header.i=nicolas.frattaroli@collabora.com header.b=Q4pCkfPU; arc=pass smtp.client-ip=136.143.188.112 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=collabora.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=collabora.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=collabora.com header.i=nicolas.frattaroli@collabora.com header.b="Q4pCkfPU" ARC-Seal: i=1; a=rsa-sha256; t=1776861359; cv=none; d=zohomail.com; s=zohoarc; b=jbajX/vy5W+wbLab0aolJ8UjGZcOqzSC/I5BRI9iDjgZ+0nmWWaIrV2Rb/Rz7SRgL/XdrSJB6MxGX+rzXms8btD1KbYtuEgml+xLk6J71jWnIlrAOhVZMvt5QvZjSefiyt2qq8kl2n1gZ4mPahzrfP9Ki4GXCsCdekhXNIm1eqI= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1776861359; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:MIME-Version:Message-ID:References:Subject:Subject:To:To:Message-Id:Reply-To; bh=D1AqcgSA0t2cNb738fE4oVFHqUU80ZER1l31sqHNos8=; b=P7BsjDQfqgdzVG7VfJ2EaZPBSaa45+8iRB8hfWolDOq/td3zwF4wflzeJVR1gw1U5bbrulqROJv51ClNvuQULuY8Jio1gI0ePwnwssxIwLiOPR95SkrhfkmJwiMDEc4FcCRej4feLuGGFhCMZKZPw586l6RoTC/h1AiABuqUhFs= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass header.i=collabora.com; spf=pass smtp.mailfrom=nicolas.frattaroli@collabora.com; dmarc=pass header.from= DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; t=1776861359; s=zohomail; d=collabora.com; i=nicolas.frattaroli@collabora.com; h=From:From:Date:Date:Subject:Subject:MIME-Version:Content-Type:Content-Transfer-Encoding:Message-Id:Message-Id:References:In-Reply-To:To:To:Cc:Cc:Reply-To; bh=D1AqcgSA0t2cNb738fE4oVFHqUU80ZER1l31sqHNos8=; b=Q4pCkfPUl3KcMacJC59qXrzvZ03rG06FCdXhk01m7OK0Siagzpf1BNFRBFoc54T5 SS1jqLPtkd53uQKF/qI7MEu/LaK1C9bFpp83e45DXeETy3waPY34W/Bf1DST1LWhKpe GJtJpdHdy6A8jsfkAHeSL/QRYWrc92XswIaFVWaY= Received: by mx.zohomail.com with SMTPS id 1776861358716268.8573147783461; Wed, 22 Apr 2026 05:35:58 -0700 (PDT) From: Nicolas Frattaroli Date: Wed, 22 Apr 2026 14:35:31 +0200 Subject: [PATCH v8 1/2] drm/connector: Fix epoch_counter docs to reflect reality Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260422-hot-plug-passup-v8-1-5cfae6ba4119@collabora.com> References: <20260422-hot-plug-passup-v8-0-5cfae6ba4119@collabora.com> In-Reply-To: <20260422-hot-plug-passup-v8-0-5cfae6ba4119@collabora.com> To: Stanislav Lisovskiy , =?utf-8?q?Ville_Syrj=C3=A4l=C3=A4?= , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter , Louis Chauvet , Haneen Mohammed , Melissa Wen , Daniel Stone , Ian Forbes , Dmitry Baryshkov Cc: dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, kernel@collabora.com, wayland-devel@lists.freedesktop.org, Nicolas Frattaroli X-Mailer: b4 0.15.2 Since the very day epoch_counter in drm_connector was introduced, its documentation was not accurate. It claims it's used to detect "any other changes [...] besides status", when in reality, it's used to detect changes including status, as a status change also increases the epoch counter. Adjust the documentation to rectify this discrepancy. Fixes: 5186421cbfe2 ("drm: Introduce epoch counter to drm_connector") Signed-off-by: Nicolas Frattaroli --- include/drm/drm_connector.h | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/include/drm/drm_connector.h b/include/drm/drm_connector.h index 3e422a4f2e72..446385a12f4b 100644 --- a/include/drm/drm_connector.h +++ b/include/drm/drm_connector.h @@ -2264,7 +2264,10 @@ struct drm_connector { */ struct mutex edid_override_mutex; =20 - /** @epoch_counter: used to detect any other changes in connector, beside= s status */ + /** + * @epoch_counter: Used to detect changes in connector. Increased when + * the connector, including its status, is changed. + */ u64 epoch_counter; =20 /** --=20 2.53.0 From nobody Wed Jun 17 04:05:39 2026 Received: from sender4-pp-f112.zoho.com (sender4-pp-f112.zoho.com [136.143.188.112]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 20B783DCDA6 for ; Wed, 22 Apr 2026 12:36:25 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=pass smtp.client-ip=136.143.188.112 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1776861389; cv=pass; b=QvFtFH1ZoNzEwr/TsajI9XLd/ja0cBJK4Mpu4edWEphsnGPa+EW6G6PBdWf3Ta8ZtWCBPfbrk7rNSZNemwv5a8Md6ajjetoa4L/m3TKRJ8gc49OZz8KB95FpDX5sZ4ZXTcQCXGXIRfpYAXFRvYFRacCjDhUqT8rn9GgXVPwkfUs= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1776861389; c=relaxed/simple; bh=5H3ZtzHYAPG19LvMsoRrt+Tb7Cz0Zr3k+/83hIvwpkU=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=BU5Pbahuvr6BZsmy4N6Wykt8lz7moy8hnp/ZwxAffeqLY5Eztl0iuzYsYga0H/96sa3ImGFUBFII4n92TxmiOhMFdro991ApacrygrcjWMZAYru/2pBEwbvzBzvu5KrOfLGz9Y+czbQXzp37jPLzmE7hcNnx5/ZoKTLduUgQvXU= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=collabora.com; spf=pass smtp.mailfrom=collabora.com; dkim=pass (1024-bit key) header.d=collabora.com header.i=nicolas.frattaroli@collabora.com header.b=CP40XUx7; arc=pass smtp.client-ip=136.143.188.112 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=collabora.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=collabora.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=collabora.com header.i=nicolas.frattaroli@collabora.com header.b="CP40XUx7" ARC-Seal: i=1; a=rsa-sha256; t=1776861363; cv=none; d=zohomail.com; s=zohoarc; b=ErCs+MbgrTZZb+tXO8mBt5/vLSDq+7Ty0aoV94LXOb2jAoVMTEpp1hIuftB52CFqd5dSdHW2BPxNHdPlx/Guppunl0bP7RGB7CQdpo9QaxmILj5fxuiEAxkm/XRg2/1KejFd0Aj5z8I9UD6mdrC+Bmu2hUVMqBDakeldaf5u5Sw= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1776861363; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:MIME-Version:Message-ID:References:Subject:Subject:To:To:Message-Id:Reply-To; bh=Oom1DKVQqo8VlxUkPHegZ7GCL71D6HX629O2qxbqAwo=; b=LUXCtUX+Wbt1ZUUAWES7UE9CBxk8I/xuAJZja4gwWxvUfDmfgvPVP6uiOkiK7Q4nfBuimKP5a4ZHq2FZSq32l9OYhJGmsL77NEuELFB0uabkAa+W8HqwXDhan5+hg9FzD177I4rTirIdeaQ6ebj2pjRWDzDaBIgdDY2Ok9ecUTo= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass header.i=collabora.com; spf=pass smtp.mailfrom=nicolas.frattaroli@collabora.com; dmarc=pass header.from= DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; t=1776861363; s=zohomail; d=collabora.com; i=nicolas.frattaroli@collabora.com; h=From:From:Date:Date:Subject:Subject:MIME-Version:Content-Type:Content-Transfer-Encoding:Message-Id:Message-Id:References:In-Reply-To:To:To:Cc:Cc:Reply-To; bh=Oom1DKVQqo8VlxUkPHegZ7GCL71D6HX629O2qxbqAwo=; b=CP40XUx7TkT+vP2/Jo2A2P2qsmhC8D0/NWF7kfvuB1Ut8G8iJ+kQRUykFW4ZsAGi eZYn/cSeidz8C4trtSYo5dughh2dYC9vgPq+pJVYzzWu97UFqUzj8qPyjuadX0H8Udc oKbl3zhw1T6QLOt8wK4SL+c495CrRljPxFHpEKNU= Received: by mx.zohomail.com with SMTPS id 1776861362560154.676040955713; Wed, 22 Apr 2026 05:36:02 -0700 (PDT) From: Nicolas Frattaroli Date: Wed, 22 Apr 2026 14:35:32 +0200 Subject: [PATCH v8 2/2] drm: Send per-connector hotplug events Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260422-hot-plug-passup-v8-2-5cfae6ba4119@collabora.com> References: <20260422-hot-plug-passup-v8-0-5cfae6ba4119@collabora.com> In-Reply-To: <20260422-hot-plug-passup-v8-0-5cfae6ba4119@collabora.com> To: Stanislav Lisovskiy , =?utf-8?q?Ville_Syrj=C3=A4l=C3=A4?= , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter , Louis Chauvet , Haneen Mohammed , Melissa Wen , Daniel Stone , Ian Forbes , Dmitry Baryshkov Cc: dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, kernel@collabora.com, wayland-devel@lists.freedesktop.org, Nicolas Frattaroli , Marius Vlad X-Mailer: b4 0.15.2 Try to send per-connector hotplug events as often as possible, rather than connector-less global hotplug events. This does result in more hotplug events if multiple connectors changed at the same time, but give userspace more actionable information. Since the hotplug event needs to be sent outside of the mode_config mutex to avoid a deadlock, pointers to all the changed connectors are stored in a newly allocated array. The "changed" boolean in output_poll_execute now only serves to signal that a non-connector-specific hotplug event needs to be sent from a prior event that was delayed. So, rename it from "changed" to "delayed_hp" to avoid any confusion. Co-developed-by: Marius Vlad Signed-off-by: Marius Vlad Signed-off-by: Nicolas Frattaroli --- drivers/gpu/drm/drm_probe_helper.c | 68 ++++++++++++++++++++++++----------= ---- 1 file changed, 43 insertions(+), 25 deletions(-) diff --git a/drivers/gpu/drm/drm_probe_helper.c b/drivers/gpu/drm/drm_probe= _helper.c index d4dc8cb45bce..3beed8aa32fe 100644 --- a/drivers/gpu/drm/drm_probe_helper.c +++ b/drivers/gpu/drm/drm_probe_helper.c @@ -757,17 +757,19 @@ static void output_poll_execute(struct work_struct *w= ork) { struct delayed_work *delayed_work =3D to_delayed_work(work); struct drm_device *dev =3D container_of(delayed_work, struct drm_device, = mode_config.output_poll_work); + struct drm_connector **changed_conns; struct drm_connector *connector; struct drm_connector_list_iter conn_iter; enum drm_connector_status old_status; - bool repoll =3D false, changed; + unsigned int num_changed =3D 0, i; + bool repoll =3D false, delayed_hp; u64 old_epoch_counter; =20 if (!dev->mode_config.poll_enabled) return; =20 /* Pick up any changes detected by the probe functions. */ - changed =3D dev->mode_config.delayed_event; + delayed_hp =3D dev->mode_config.delayed_event; dev->mode_config.delayed_event =3D false; =20 if (!drm_kms_helper_poll) { @@ -783,6 +785,13 @@ static void output_poll_execute(struct work_struct *wo= rk) goto out; } =20 + changed_conns =3D kmalloc_array(dev->mode_config.num_connector, + sizeof(*changed_conns), GFP_KERNEL); + if (!changed_conns) { + repoll =3D true; + goto out; + } + drm_connector_list_iter_begin(dev, &conn_iter); drm_for_each_connector_iter(connector, &conn_iter) { /* Ignore forced connectors. */ @@ -836,15 +845,23 @@ static void output_poll_execute(struct work_struct *w= ork) connector->base.id, connector->name, old_epoch_counter, connector->epoch_counter); =20 - changed =3D true; + drm_connector_get(connector); + changed_conns[num_changed++] =3D connector; } } drm_connector_list_iter_end(&conn_iter); =20 mutex_unlock(&dev->mode_config.mutex); =20 + for (i =3D 0; i < num_changed; i++) { + drm_kms_helper_connector_hotplug_event(changed_conns[i]); + drm_connector_put(changed_conns[i]); + } + + kfree(changed_conns); + out: - if (changed) + if (delayed_hp) drm_kms_helper_hotplug_event(dev); =20 if (repoll) @@ -1081,39 +1098,40 @@ EXPORT_SYMBOL(drm_connector_helper_hpd_irq_event); */ bool drm_helper_hpd_irq_event(struct drm_device *dev) { - struct drm_connector *connector, *first_changed_connector =3D NULL; struct drm_connector_list_iter conn_iter; - int changed =3D 0; + struct drm_connector **changed_conns; + struct drm_connector *connector; + unsigned int changed =3D 0, i; =20 if (!dev->mode_config.poll_enabled) return false; =20 - mutex_lock(&dev->mode_config.mutex); - drm_connector_list_iter_begin(dev, &conn_iter); - drm_for_each_connector_iter(connector, &conn_iter) { - /* Only handle HPD capable connectors. */ - if (!(connector->polled & DRM_CONNECTOR_POLL_HPD)) - continue; + scoped_guard(mutex, &dev->mode_config.mutex) { + changed_conns =3D kmalloc_array(dev->mode_config.num_connector, + sizeof(*changed_conns), GFP_KERNEL); + if (!changed_conns) + return false; =20 - if (check_connector_changed(connector)) { - if (!first_changed_connector) { + drm_connector_list_iter_begin(dev, &conn_iter); + drm_for_each_connector_iter(connector, &conn_iter) { + /* Only handle HPD capable connectors. */ + if (!(connector->polled & DRM_CONNECTOR_POLL_HPD)) + continue; + + if (check_connector_changed(connector)) { drm_connector_get(connector); - first_changed_connector =3D connector; + changed_conns[changed++] =3D connector; } - - changed++; } + drm_connector_list_iter_end(&conn_iter); } - drm_connector_list_iter_end(&conn_iter); - mutex_unlock(&dev->mode_config.mutex); =20 - if (changed =3D=3D 1) - drm_kms_helper_connector_hotplug_event(first_changed_connector); - else if (changed > 0) - drm_kms_helper_hotplug_event(dev); + for (i =3D 0; i < changed; i++) { + drm_kms_helper_connector_hotplug_event(changed_conns[i]); + drm_connector_put(changed_conns[i]); + } =20 - if (first_changed_connector) - drm_connector_put(first_changed_connector); + kfree(changed_conns); =20 return changed; } --=20 2.53.0