* [PATCH v3 0/2] Pass down hot plug CONNECTOR ID to user-space
@ 2025-09-23 8:36 Marius Vlad
2025-09-23 8:36 ` [PATCH 1/2] drm: Introduce a new connector status Marius Vlad
2025-09-23 8:36 ` [PATCH 2/2] drm: Propagate connector status change Marius Vlad
0 siblings, 2 replies; 8+ messages in thread
From: Marius Vlad @ 2025-09-23 8:36 UTC (permalink / raw)
To: dri-devel
Cc: daniel.stone, dmitry.baryshkov, jani.nikula, tzimmermann,
simona.vetter, derek.foreman
Patch series addresses a shortcoming where we're sending a hot plug event
without passing the actual CONNECTOR that caused it. This takes into
consideration both the polling path and the HPD (Hot Plug Detect) path.
v3: Address comments from Dmitry
- guard connector status write with mode_config.mutex
- avoid setting up the connector status and immediately unset it. Do the
unset in drm_kms_helper_hotplug_event/drm_kms_helper_connector_hotplug_event
v2: Address comments from Daniel
- split patch into 2, one that introduces a bool to track connector
connection status change and a patch that uses that to be able to send
hot plug events with the proper CONNECTOR ID to udev and further pass
that down to user-space
- nuke out mutex when iterating connector list
- fix typo
v2 is at https://lore.kernel.org/dri-devel/20250729165708.9947-1-marius.vlad@collabora.com/
Marius Vlad (2):
drm: Introduce a new connector status
drm: Propagate connector status change
drivers/gpu/drm/drm_connector.c | 1 +
drivers/gpu/drm/drm_probe_helper.c | 40 ++++++++++++++++++++++++++----
drivers/gpu/drm/drm_sysfs.c | 1 +
include/drm/drm_connector.h | 3 +++
4 files changed, 40 insertions(+), 5 deletions(-)
--
2.47.2
^ permalink raw reply [flat|nested] 8+ messages in thread
* [PATCH 1/2] drm: Introduce a new connector status
2025-09-23 8:36 [PATCH v3 0/2] Pass down hot plug CONNECTOR ID to user-space Marius Vlad
@ 2025-09-23 8:36 ` Marius Vlad
2025-09-23 15:53 ` Dmitry Baryshkov
` (2 more replies)
2025-09-23 8:36 ` [PATCH 2/2] drm: Propagate connector status change Marius Vlad
1 sibling, 3 replies; 8+ messages in thread
From: Marius Vlad @ 2025-09-23 8:36 UTC (permalink / raw)
To: dri-devel
Cc: daniel.stone, dmitry.baryshkov, jani.nikula, tzimmermann,
simona.vetter, derek.foreman
This patch introduces a new boolean variable used to track connector's
connect/disconnect status and it is being used on both polling and
the HPD (Hot Plug Detect) paths.
A subsequent patch would make use of this connector status to propagate
per-connector udev hot plug events. This allows user-space to receive
the connector's ID, rather than having a generic hot-plug event for all
connectors, or in the HPD path, just the first one found with a
connection status change.
Signed-off-by: Marius Vlad <marius.vlad@collabora.com>
---
drivers/gpu/drm/drm_connector.c | 1 +
drivers/gpu/drm/drm_probe_helper.c | 18 ++++++++++++++++++
drivers/gpu/drm/drm_sysfs.c | 1 +
include/drm/drm_connector.h | 3 +++
4 files changed, 23 insertions(+)
diff --git a/drivers/gpu/drm/drm_connector.c b/drivers/gpu/drm/drm_connector.c
index 272d6254ea47..3c6628ee3096 100644
--- a/drivers/gpu/drm/drm_connector.c
+++ b/drivers/gpu/drm/drm_connector.c
@@ -274,6 +274,7 @@ static int drm_connector_init_only(struct drm_device *dev,
/* provide ddc symlink in sysfs */
connector->ddc = ddc;
+ connector->status_changed = false;
INIT_LIST_HEAD(&connector->head);
INIT_LIST_HEAD(&connector->global_connector_list_entry);
diff --git a/drivers/gpu/drm/drm_probe_helper.c b/drivers/gpu/drm/drm_probe_helper.c
index 09b12c30df69..a865d5aa6f73 100644
--- a/drivers/gpu/drm/drm_probe_helper.c
+++ b/drivers/gpu/drm/drm_probe_helper.c
@@ -629,6 +629,9 @@ int drm_helper_probe_single_connector_modes(struct drm_connector *connector,
mod_delayed_work(system_wq,
&dev->mode_config.output_poll_work,
0);
+ mutex_lock(&dev->mode_config.mutex);
+ connector->status_changed = true;
+ mutex_unlock(&dev->mode_config.mutex);
}
/*
@@ -732,6 +735,17 @@ EXPORT_SYMBOL(drm_helper_probe_single_connector_modes);
*/
void drm_kms_helper_hotplug_event(struct drm_device *dev)
{
+ struct drm_connector *connector;
+ struct drm_connector_list_iter conn_iter;
+
+ drm_connector_list_iter_begin(dev, &conn_iter);
+ drm_for_each_connector_iter(connector, &conn_iter) {
+ mutex_lock(&dev->mode_config.mutex);
+ connector->status_changed = false;
+ mutex_unlock(&dev->mode_config.mutex);
+ }
+ drm_connector_list_iter_end(&conn_iter);
+
drm_sysfs_hotplug_event(dev);
drm_client_dev_hotplug(dev);
}
@@ -748,6 +762,10 @@ void drm_kms_helper_connector_hotplug_event(struct drm_connector *connector)
{
struct drm_device *dev = connector->dev;
+ mutex_lock(&dev->mode_config.mutex);
+ connector->status_changed = false;
+ mutex_unlock(&dev->mode_config.mutex);
+
drm_sysfs_connector_hotplug_event(connector);
drm_client_dev_hotplug(dev);
}
diff --git a/drivers/gpu/drm/drm_sysfs.c b/drivers/gpu/drm/drm_sysfs.c
index b01ffa4d6509..bd9161490116 100644
--- a/drivers/gpu/drm/drm_sysfs.c
+++ b/drivers/gpu/drm/drm_sysfs.c
@@ -199,6 +199,7 @@ static ssize_t status_store(struct device *device,
return ret;
old_force = connector->force;
+ connector->status_changed = true;
if (sysfs_streq(buf, "detect"))
connector->force = 0;
diff --git a/include/drm/drm_connector.h b/include/drm/drm_connector.h
index 8f34f4b8183d..e4310df3d55c 100644
--- a/include/drm/drm_connector.h
+++ b/include/drm/drm_connector.h
@@ -2146,6 +2146,9 @@ struct drm_connector {
/** @force: a DRM_FORCE_<foo> state for forced mode sets */
enum drm_connector_force force;
+ /** @status_changed: if the old status doesn't match current connection status */
+ bool status_changed;
+
/**
* @edid_override: Override EDID set via debugfs.
*
--
2.47.2
^ permalink raw reply related [flat|nested] 8+ messages in thread
* [PATCH 2/2] drm: Propagate connector status change
2025-09-23 8:36 [PATCH v3 0/2] Pass down hot plug CONNECTOR ID to user-space Marius Vlad
2025-09-23 8:36 ` [PATCH 1/2] drm: Introduce a new connector status Marius Vlad
@ 2025-09-23 8:36 ` Marius Vlad
1 sibling, 0 replies; 8+ messages in thread
From: Marius Vlad @ 2025-09-23 8:36 UTC (permalink / raw)
To: dri-devel
Cc: daniel.stone, dmitry.baryshkov, jani.nikula, tzimmermann,
simona.vetter, derek.foreman
On the HPD (Hot Plug Detect) path this change makes use of the connector
status to notify all connectors, rather than just first one found that
suffered a status change.
Similarly on the polling side, this also takes into consideration
sending per-connector udev hot plug events.
Signed-off-by: Marius Vlad <marius.vlad@collabora.com>
---
drivers/gpu/drm/drm_probe_helper.c | 22 +++++++++++++++++-----
1 file changed, 17 insertions(+), 5 deletions(-)
diff --git a/drivers/gpu/drm/drm_probe_helper.c b/drivers/gpu/drm/drm_probe_helper.c
index a865d5aa6f73..98afab9f15e9 100644
--- a/drivers/gpu/drm/drm_probe_helper.c
+++ b/drivers/gpu/drm/drm_probe_helper.c
@@ -862,8 +862,14 @@ static void output_poll_execute(struct work_struct *work)
mutex_unlock(&dev->mode_config.mutex);
out:
- if (changed)
- drm_kms_helper_hotplug_event(dev);
+ if (changed) {
+ drm_connector_list_iter_begin(dev, &conn_iter);
+ drm_for_each_connector_iter(connector, &conn_iter) {
+ if (connector->status_changed)
+ drm_kms_helper_connector_hotplug_event(connector);
+ }
+ drm_connector_list_iter_end(&conn_iter);
+ }
if (repoll)
schedule_delayed_work(delayed_work, DRM_OUTPUT_POLL_PERIOD);
@@ -1125,10 +1131,16 @@ bool drm_helper_hpd_irq_event(struct drm_device *dev)
drm_connector_list_iter_end(&conn_iter);
mutex_unlock(&dev->mode_config.mutex);
- if (changed == 1)
+ if (changed == 1) {
drm_kms_helper_connector_hotplug_event(first_changed_connector);
- else if (changed > 0)
- drm_kms_helper_hotplug_event(dev);
+ } else if (changed > 0) {
+ drm_connector_list_iter_begin(dev, &conn_iter);
+ drm_for_each_connector_iter(connector, &conn_iter) {
+ if (connector->status_changed)
+ drm_kms_helper_connector_hotplug_event(connector);
+ }
+ drm_connector_list_iter_end(&conn_iter);
+ }
if (first_changed_connector)
drm_connector_put(first_changed_connector);
--
2.47.2
^ permalink raw reply related [flat|nested] 8+ messages in thread
* Re: [PATCH 1/2] drm: Introduce a new connector status
2025-09-23 8:36 ` [PATCH 1/2] drm: Introduce a new connector status Marius Vlad
@ 2025-09-23 15:53 ` Dmitry Baryshkov
2025-11-03 18:07 ` Marius Vlad
2025-09-23 17:34 ` Ian Forbes
2025-09-25 6:51 ` kernel test robot
2 siblings, 1 reply; 8+ messages in thread
From: Dmitry Baryshkov @ 2025-09-23 15:53 UTC (permalink / raw)
To: Marius Vlad
Cc: dri-devel, daniel.stone, jani.nikula, tzimmermann, simona.vetter,
derek.foreman
On Tue, Sep 23, 2025 at 11:36:35AM +0300, Marius Vlad wrote:
> This patch introduces a new boolean variable used to track connector's
> connect/disconnect status and it is being used on both polling and
> the HPD (Hot Plug Detect) paths.
Please see Documentation/process/submitting-patches.rst, it has special
paragraph about "This patch".
>
> A subsequent patch would make use of this connector status to propagate
> per-connector udev hot plug events. This allows user-space to receive
> the connector's ID, rather than having a generic hot-plug event for all
> connectors, or in the HPD path, just the first one found with a
> connection status change.
It's not clear from the commit message, what is the expected behaviour.
The flag has to be set when we've detected the status change - e.g.
monitor being plugged or unplugged. When is it expected to be cleared?
>
> Signed-off-by: Marius Vlad <marius.vlad@collabora.com>
> ---
> drivers/gpu/drm/drm_connector.c | 1 +
> drivers/gpu/drm/drm_probe_helper.c | 18 ++++++++++++++++++
> drivers/gpu/drm/drm_sysfs.c | 1 +
> include/drm/drm_connector.h | 3 +++
> 4 files changed, 23 insertions(+)
>
> diff --git a/drivers/gpu/drm/drm_connector.c b/drivers/gpu/drm/drm_connector.c
> index 272d6254ea47..3c6628ee3096 100644
> --- a/drivers/gpu/drm/drm_connector.c
> +++ b/drivers/gpu/drm/drm_connector.c
> @@ -274,6 +274,7 @@ static int drm_connector_init_only(struct drm_device *dev,
>
> /* provide ddc symlink in sysfs */
> connector->ddc = ddc;
> + connector->status_changed = false;
>
> INIT_LIST_HEAD(&connector->head);
> INIT_LIST_HEAD(&connector->global_connector_list_entry);
> diff --git a/drivers/gpu/drm/drm_probe_helper.c b/drivers/gpu/drm/drm_probe_helper.c
> index 09b12c30df69..a865d5aa6f73 100644
> --- a/drivers/gpu/drm/drm_probe_helper.c
> +++ b/drivers/gpu/drm/drm_probe_helper.c
> @@ -629,6 +629,9 @@ int drm_helper_probe_single_connector_modes(struct drm_connector *connector,
> mod_delayed_work(system_wq,
> &dev->mode_config.output_poll_work,
> 0);
> + mutex_lock(&dev->mode_config.mutex);
> + connector->status_changed = true;
> + mutex_unlock(&dev->mode_config.mutex);
> }
>
> /*
> @@ -732,6 +735,17 @@ EXPORT_SYMBOL(drm_helper_probe_single_connector_modes);
> */
> void drm_kms_helper_hotplug_event(struct drm_device *dev)
> {
> + struct drm_connector *connector;
> + struct drm_connector_list_iter conn_iter;
> +
> + drm_connector_list_iter_begin(dev, &conn_iter);
> + drm_for_each_connector_iter(connector, &conn_iter) {
> + mutex_lock(&dev->mode_config.mutex);
> + connector->status_changed = false;
> + mutex_unlock(&dev->mode_config.mutex);
> + }
> + drm_connector_list_iter_end(&conn_iter);
> +
> drm_sysfs_hotplug_event(dev);
> drm_client_dev_hotplug(dev);
> }
> @@ -748,6 +762,10 @@ void drm_kms_helper_connector_hotplug_event(struct drm_connector *connector)
> {
> struct drm_device *dev = connector->dev;
>
> + mutex_lock(&dev->mode_config.mutex);
> + connector->status_changed = false;
> + mutex_unlock(&dev->mode_config.mutex);
> +
> drm_sysfs_connector_hotplug_event(connector);
> drm_client_dev_hotplug(dev);
> }
> diff --git a/drivers/gpu/drm/drm_sysfs.c b/drivers/gpu/drm/drm_sysfs.c
> index b01ffa4d6509..bd9161490116 100644
> --- a/drivers/gpu/drm/drm_sysfs.c
> +++ b/drivers/gpu/drm/drm_sysfs.c
> @@ -199,6 +199,7 @@ static ssize_t status_store(struct device *device,
> return ret;
>
> old_force = connector->force;
> + connector->status_changed = true;
>
> if (sysfs_streq(buf, "detect"))
> connector->force = 0;
> diff --git a/include/drm/drm_connector.h b/include/drm/drm_connector.h
> index 8f34f4b8183d..e4310df3d55c 100644
> --- a/include/drm/drm_connector.h
> +++ b/include/drm/drm_connector.h
> @@ -2146,6 +2146,9 @@ struct drm_connector {
> /** @force: a DRM_FORCE_<foo> state for forced mode sets */
> enum drm_connector_force force;
>
> + /** @status_changed: if the old status doesn't match current connection status */
> + bool status_changed;
> +
> /**
> * @edid_override: Override EDID set via debugfs.
> *
> --
> 2.47.2
>
--
With best wishes
Dmitry
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH 1/2] drm: Introduce a new connector status
2025-09-23 8:36 ` [PATCH 1/2] drm: Introduce a new connector status Marius Vlad
2025-09-23 15:53 ` Dmitry Baryshkov
@ 2025-09-23 17:34 ` Ian Forbes
2025-11-03 18:01 ` Marius Vlad
2025-09-25 6:51 ` kernel test robot
2 siblings, 1 reply; 8+ messages in thread
From: Ian Forbes @ 2025-09-23 17:34 UTC (permalink / raw)
To: Marius Vlad
Cc: dri-devel, daniel.stone, dmitry.baryshkov, jani.nikula,
tzimmermann, simona.vetter, derek.foreman
[-- Attachment #1: Type: text/plain, Size: 785 bytes --]
On Tue, Sep 23, 2025 at 3:36 AM Marius Vlad <marius.vlad@collabora.com> wrote:
>
> This patch introduces a new boolean variable used to track connector's
> connect/disconnect status and it is being used on both polling and
> the HPD (Hot Plug Detect) paths.
>
> A subsequent patch would make use of this connector status to propagate
> per-connector udev hot plug events. This allows user-space to receive
> the connector's ID, rather than having a generic hot-plug event for all
> connectors, or in the HPD path, just the first one found with a
> connection status change.
>
> Signed-off-by: Marius Vlad <marius.vlad@collabora.com>
> ---
How do you see this working with virtual connectors which can hotplug
without a connected -> disconnected -> connected cycle?
[-- Attachment #2: S/MIME Cryptographic Signature --]
[-- Type: application/pkcs7-signature, Size: 5414 bytes --]
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH 1/2] drm: Introduce a new connector status
2025-09-23 8:36 ` [PATCH 1/2] drm: Introduce a new connector status Marius Vlad
2025-09-23 15:53 ` Dmitry Baryshkov
2025-09-23 17:34 ` Ian Forbes
@ 2025-09-25 6:51 ` kernel test robot
2 siblings, 0 replies; 8+ messages in thread
From: kernel test robot @ 2025-09-25 6:51 UTC (permalink / raw)
To: Marius Vlad
Cc: oe-lkp, lkp, dri-devel, daniel.stone, dmitry.baryshkov,
jani.nikula, tzimmermann, simona.vetter, derek.foreman,
oliver.sang
Hello,
kernel test robot noticed "WARNING:possible_recursive_locking_detected" on:
commit: 432c7653afa4afe08e59d608db7cbbc321c52149 ("[PATCH 1/2] drm: Introduce a new connector status")
url: https://github.com/intel-lab-lkp/linux/commits/Marius-Vlad/drm-Introduce-a-new-connector-status/20250923-163922
base: git://anongit.freedesktop.org/drm/drm-misc drm-misc-next
patch link: https://lore.kernel.org/all/20250923083636.4749-2-marius.vlad@collabora.com/
patch subject: [PATCH 1/2] drm: Introduce a new connector status
in testcase: boot
config: x86_64-randconfig-074-20250924
compiler: gcc-14
test machine: qemu-system-x86_64 -enable-kvm -cpu SandyBridge -smp 2 -m 16G
(please refer to attached dmesg/kmsg for entire log/backtrace)
If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <oliver.sang@intel.com>
| Closes: https://lore.kernel.org/oe-lkp/202509251410.fdfbcac3-lkp@intel.com
[ 19.416092][ T1] WARNING: possible recursive locking detected
[ 19.416406][ T1] 6.17.0-rc2-00290-g432c7653afa4 #1 Not tainted
[ 19.416406][ T1] --------------------------------------------
[ 19.416406][ T1] swapper/0/1 is trying to acquire lock:
[ 19.416406][ T1] ffff88813b9c84d0 (&dev->mode_config.mutex){+.+.}-{4:4}, at: drm_helper_probe_single_connector_modes (drivers/gpu/drm/drm_probe_helper.c:633)
[ 19.416406][ T1]
[ 19.416406][ T1] but task is already holding lock:
[ 19.416406][ T1] ffff88813b9c84d0 (&dev->mode_config.mutex){+.+.}-{4:4}, at: drm_client_modeset_probe (drivers/gpu/drm/drm_client_modeset.c:869)
[ 19.416406][ T1]
[ 19.416406][ T1] other info that might help us debug this:
[ 19.416406][ T1] Possible unsafe locking scenario:
[ 19.416406][ T1]
[ 19.416406][ T1] CPU0
[ 19.416406][ T1] ----
[ 19.416406][ T1] lock(&dev->mode_config.mutex);
[ 19.416406][ T1]
[ 19.416406][ T1] *** DEADLOCK ***
[ 19.416406][ T1]
[ 19.416406][ T1] May be due to missing lock nesting notation
[ 19.416406][ T1]
[ 19.416406][ T1] 6 locks held by swapper/0/1:
[ 19.416406][ T1] #0: ffff88813b9c8320 (&dev->clientlist_mutex){+.+.}-{4:4}, at: drm_client_register (include/linux/list.h:169 drivers/gpu/drm/drm_client.c:128)
[ 19.416406][ T1] #1: ffff888108a882a0 (&helper->lock){+.+.}-{4:4}, at: drm_fb_helper_initial_config (drivers/gpu/drm/drm_fb_helper.c:1917)
[ 19.416406][ T1] #2: ffff888108a88098 (&client->modeset_mutex){+.+.}-{4:4}, at: drm_client_modeset_probe (drivers/gpu/drm/drm_client_modeset.c:867)
[ 19.416406][ T1] #3: ffff88813b9c84d0 (&dev->mode_config.mutex){+.+.}-{4:4}, at: drm_client_modeset_probe (drivers/gpu/drm/drm_client_modeset.c:869)
[ 19.416406][ T1] #4: ffffc9000001fa78 (crtc_ww_class_acquire){+.+.}-{0:0}, at: drm_helper_probe_single_connector_modes (drivers/gpu/drm/drm_probe_helper.c:572)
[ 19.416406][ T1] #5: ffffc9000001faa8 (crtc_ww_class_mutex){+.+.}-{4:4}, at: drm_helper_probe_single_connector_modes (drivers/gpu/drm/drm_probe_helper.c:572)
[ 19.416406][ T1]
[ 19.416406][ T1] stack backtrace:
[ 19.416406][ T1] CPU: 0 UID: 0 PID: 1 Comm: swapper/0 Not tainted 6.17.0-rc2-00290-g432c7653afa4 #1 PREEMPT(none)
[ 19.416406][ T1] Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 1.16.3-debian-1.16.3-2 04/01/2014
[ 19.416406][ T1] Call Trace:
[ 19.416406][ T1] <TASK>
[ 19.416406][ T1] dump_stack_lvl (lib/dump_stack.c:122)
[ 19.416406][ T1] print_deadlock_bug.cold (kernel/locking/lockdep.c:3044)
[ 19.416406][ T1] validate_chain (kernel/locking/lockdep.c:3898)
[ 19.416406][ T1] __lock_acquire (kernel/locking/lockdep.c:5237 (discriminator 1))
[ 19.416406][ T1] lock_acquire (kernel/locking/lockdep.c:470 kernel/locking/lockdep.c:5870)
[ 19.416406][ T1] ? drm_helper_probe_single_connector_modes (drivers/gpu/drm/drm_probe_helper.c:633)
[ 19.416406][ T1] ? sched_show_task (kernel/sched/core.c:8912)
[ 19.416406][ T1] ? look_up_lock_class (kernel/locking/lockdep.c:933 (discriminator 28))
[ 19.416406][ T1] __mutex_lock (arch/x86/include/asm/atomic.h:23 include/linux/atomic/atomic-arch-fallback.h:457 include/linux/jump_label.h:262 include/trace/events/lock.h:95 kernel/locking/mutex.c:600 kernel/locking/mutex.c:760)
[ 19.416406][ T1] ? drm_helper_probe_single_connector_modes (drivers/gpu/drm/drm_probe_helper.c:633)
[ 19.416406][ T1] ? look_up_lock_class (kernel/locking/lockdep.c:933 (discriminator 28))
[ 19.416406][ T1] ? mutex_lock_io_nested (kernel/locking/mutex.c:759)
[ 19.416406][ T1] ? drm_print_bits (drivers/gpu/drm/drm_print.c:334)
[ 19.416406][ T1] ? ww_mutex_lock (kernel/locking/mutex.c:887)
[ 19.416406][ T1] ? drm_helper_probe_single_connector_modes (drivers/gpu/drm/drm_probe_helper.c:633)
[ 19.416406][ T1] drm_helper_probe_single_connector_modes (drivers/gpu/drm/drm_probe_helper.c:633)
[ 19.416406][ T1] ? __drm_helper_update_and_validate (drivers/gpu/drm/drm_probe_helper.c:561)
[ 19.416406][ T1] ? __kmalloc_noprof (include/trace/events/kmem.h:54 (discriminator 2) mm/slub.c:4366 (discriminator 2) mm/slub.c:4377 (discriminator 2))
[ 19.416406][ T1] drm_client_modeset_probe (drivers/gpu/drm/drm_client_modeset.c:869 (discriminator 1))
[ 19.416406][ T1] ? drm_client_firmware_config (drivers/gpu/drm/drm_client_modeset.c:818)
[ 19.416406][ T1] __drm_fb_helper_initial_config_and_unlock (drivers/gpu/drm/drm_fb_helper.c:1830)
[ 19.416406][ T1] drm_fbdev_client_hotplug (drivers/gpu/drm/clients/drm_fbdev_client.c:53)
[ 19.416406][ T1] drm_client_register (drivers/gpu/drm/drm_client.c:141)
[ 19.416406][ T1] drm_fbdev_client_setup (drivers/gpu/drm/clients/drm_fbdev_client.c:167)
[ 19.416406][ T1] drm_client_setup (drivers/gpu/drm/clients/drm_client_setup.c:47)
[ 19.416406][ T1] vkms_create (drivers/gpu/drm/vkms/vkms_drv.c:203)
[ 19.416406][ T1] ? drm_display_helper_module_init (drivers/gpu/drm/vkms/vkms_drv.c:213)
[ 19.416406][ T1] vkms_init (drivers/gpu/drm/vkms/vkms_drv.c:221)
[ 19.416406][ T1] do_one_initcall (init/main.c:1269)
[ 19.416406][ T1] ? trace_event_raw_event_initcall_level (init/main.c:1260)
[ 19.416406][ T1] do_initcalls (init/main.c:1330 (discriminator 3) init/main.c:1347 (discriminator 3))
[ 19.416406][ T1] kernel_init_freeable (init/main.c:1583)
[ 19.416406][ T1] ? rest_init (init/main.c:1461)
[ 19.416406][ T1] kernel_init (init/main.c:1471)
[ 19.416406][ T1] ? rest_init (init/main.c:1461)
[ 19.416406][ T1] ret_from_fork (arch/x86/kernel/process.c:154)
[ 19.416406][ T1] ? rest_init (init/main.c:1461)
[ 19.416406][ T1] ret_from_fork_asm (arch/x86/entry/entry_64.S:255)
[ 19.416406][ T1] </TASK>
[ 984.236393][ T23] INFO: task swapper/0:1 blocked for more than 491 seconds.
[ 984.237354][ T23] Not tainted 6.17.0-rc2-00290-g432c7653afa4 #1
[ 984.238322][ T23] "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message.
[ 984.239375][ T23] task:swapper/0 state:D stack:0 pid:1 tgid:1 ppid:0 task_flags:0x0140 flags:0x00004000
[ 984.240834][ T23] Call Trace:
[ 984.241228][ T23] <TASK>
[ 984.241634][ T23] __schedule (kernel/sched/core.c:5357 kernel/sched/core.c:6961)
[ 984.242202][ T23] ? io_schedule_timeout (kernel/sched/core.c:6817)
[ 984.242846][ T23] ? lock_acquire (include/trace/events/lock.h:24 (discriminator 2) kernel/locking/lockdep.c:5831 (discriminator 2))
[ 984.243441][ T23] schedule (kernel/sched/core.c:7044 kernel/sched/core.c:7058)
[ 984.243975][ T23] schedule_preempt_disabled (kernel/sched/core.c:7116)
[ 984.244639][ T23] __mutex_lock (kernel/locking/mutex.c:183 kernel/locking/mutex.c:678 kernel/locking/mutex.c:760)
[ 984.245258][ T23] ? drm_helper_probe_single_connector_modes (drivers/gpu/drm/drm_probe_helper.c:633)
[ 984.246160][ T23] ? mutex_lock_io_nested (kernel/locking/mutex.c:759)
[ 984.246876][ T23] ? drm_print_bits (drivers/gpu/drm/drm_print.c:334)
[ 984.247486][ T23] ? ww_mutex_lock (kernel/locking/mutex.c:887)
[ 984.248132][ T23] ? ww_mutex_lock (kernel/locking/mutex.c:887)
[ 984.248681][ T23] ? drm_helper_probe_single_connector_modes (drivers/gpu/drm/drm_probe_helper.c:633)
[ 984.249557][ T23] drm_helper_probe_single_connector_modes (drivers/gpu/drm/drm_probe_helper.c:633)
[ 984.250457][ T23] ? __drm_helper_update_and_validate (drivers/gpu/drm/drm_probe_helper.c:561)
[ 984.251275][ T23] ? __kmalloc_noprof (include/trace/events/kmem.h:54 (discriminator 2) mm/slub.c:4366 (discriminator 2) mm/slub.c:4377 (discriminator 2))
[ 984.251990][ T23] drm_client_modeset_probe (drivers/gpu/drm/drm_client_modeset.c:869 (discriminator 1))
[ 984.252659][ T23] ? drm_client_firmware_config (drivers/gpu/drm/drm_client_modeset.c:818)
[ 984.253433][ T23] __drm_fb_helper_initial_config_and_unlock (drivers/gpu/drm/drm_fb_helper.c:1830)
[ 984.254309][ T23] drm_fbdev_client_hotplug (drivers/gpu/drm/clients/drm_fbdev_client.c:53)
[ 984.255079][ T23] drm_client_register (drivers/gpu/drm/drm_client.c:141)
[ 984.255737][ T23] drm_fbdev_client_setup (drivers/gpu/drm/clients/drm_fbdev_client.c:167)
[ 984.256474][ T23] drm_client_setup (drivers/gpu/drm/clients/drm_client_setup.c:47)
[ 984.257080][ T23] vkms_create (drivers/gpu/drm/vkms/vkms_drv.c:203)
[ 984.257646][ T23] ? drm_display_helper_module_init (drivers/gpu/drm/vkms/vkms_drv.c:213)
[ 984.258477][ T23] vkms_init (drivers/gpu/drm/vkms/vkms_drv.c:221)
[ 984.258979][ T23] do_one_initcall (init/main.c:1269)
[ 984.259580][ T23] ? trace_event_raw_event_initcall_level (init/main.c:1260)
[ 984.260457][ T23] do_initcalls (init/main.c:1330 (discriminator 3) init/main.c:1347 (discriminator 3))
[ 984.261031][ T23] kernel_init_freeable (init/main.c:1583)
[ 984.261730][ T23] ? rest_init (init/main.c:1461)
[ 984.262250][ T23] kernel_init (init/main.c:1471)
[ 984.262775][ T23] ? rest_init (init/main.c:1461)
[ 984.263366][ T23] ret_from_fork (arch/x86/kernel/process.c:154)
[ 984.263966][ T23] ? rest_init (init/main.c:1461)
[ 984.264445][ T23] ret_from_fork_asm (arch/x86/entry/entry_64.S:255)
[ 984.265087][ T23] </TASK>
[ 984.265460][ T23] INFO: task swapper/0:1 is blocked on a mutex likely owned by task swapper/0:1.
[ 984.266569][ T23] task:swapper/0 state:D stack:0 pid:1 tgid:1 ppid:0 task_flags:0x0140 flags:0x00004000
[ 984.267995][ T23] Call Trace:
[ 984.268440][ T23] <TASK>
[ 984.268818][ T23] __schedule (kernel/sched/core.c:5357 kernel/sched/core.c:6961)
[ 984.269392][ T23] ? io_schedule_timeout (kernel/sched/core.c:6817)
[ 984.270076][ T23] ? lock_acquire (include/trace/events/lock.h:24 (discriminator 2) kernel/locking/lockdep.c:5831 (discriminator 2))
[ 984.270650][ T23] schedule (kernel/sched/core.c:7044 kernel/sched/core.c:7058)
[ 984.271187][ T23] schedule_preempt_disabled (kernel/sched/core.c:7116)
[ 984.271938][ T23] __mutex_lock (kernel/locking/mutex.c:183 kernel/locking/mutex.c:678 kernel/locking/mutex.c:760)
[ 984.272512][ T23] ? drm_helper_probe_single_connector_modes (drivers/gpu/drm/drm_probe_helper.c:633)
[ 984.273417][ T23] ? mutex_lock_io_nested (kernel/locking/mutex.c:759)
[ 984.274100][ T23] ? drm_print_bits (drivers/gpu/drm/drm_print.c:334)
[ 984.274700][ T23] ? ww_mutex_lock (kernel/locking/mutex.c:887)
[ 984.275321][ T23] ? ww_mutex_lock (kernel/locking/mutex.c:887)
[ 984.275900][ T23] ? drm_helper_probe_single_connector_modes (drivers/gpu/drm/drm_probe_helper.c:633)
[ 984.276788][ T23] drm_helper_probe_single_connector_modes (drivers/gpu/drm/drm_probe_helper.c:633)
[ 984.277636][ T23] ? __drm_helper_update_and_validate (drivers/gpu/drm/drm_probe_helper.c:561)
[ 984.278471][ T23] ? __kmalloc_noprof (include/trace/events/kmem.h:54 (discriminator 2) mm/slub.c:4366 (discriminator 2) mm/slub.c:4377 (discriminator 2))
[ 984.279094][ T23] drm_client_modeset_probe (drivers/gpu/drm/drm_client_modeset.c:869 (discriminator 1))
[ 984.279852][ T23] ? drm_client_firmware_config (drivers/gpu/drm/drm_client_modeset.c:818)
[ 984.280602][ T23] __drm_fb_helper_initial_config_and_unlock (drivers/gpu/drm/drm_fb_helper.c:1830)
[ 984.281537][ T23] drm_fbdev_client_hotplug (drivers/gpu/drm/clients/drm_fbdev_client.c:53)
[ 984.282238][ T23] drm_client_register (drivers/gpu/drm/drm_client.c:141)
[ 984.282887][ T23] drm_fbdev_client_setup (drivers/gpu/drm/clients/drm_fbdev_client.c:167)
[ 984.283611][ T23] drm_client_setup (drivers/gpu/drm/clients/drm_client_setup.c:47)
[ 984.284232][ T23] vkms_create (drivers/gpu/drm/vkms/vkms_drv.c:203)
[ 984.284846][ T23] ? drm_display_helper_module_init (drivers/gpu/drm/vkms/vkms_drv.c:213)
[ 984.285609][ T23] vkms_init (drivers/gpu/drm/vkms/vkms_drv.c:221)
[ 984.286136][ T23] do_one_initcall (init/main.c:1269)
[ 984.286773][ T23] ? trace_event_raw_event_initcall_level (init/main.c:1260)
[ 984.287581][ T23] do_initcalls (init/main.c:1330 (discriminator 3) init/main.c:1347 (discriminator 3))
[ 984.288212][ T23] kernel_init_freeable (init/main.c:1583)
[ 984.288856][ T23] ? rest_init (init/main.c:1461)
[ 984.289412][ T23] kernel_init (init/main.c:1471)
[ 984.289983][ T23] ? rest_init (init/main.c:1461)
[ 984.290537][ T23] ret_from_fork (arch/x86/kernel/process.c:154)
[ 984.291124][ T23] ? rest_init (init/main.c:1461)
[ 984.291735][ T23] ret_from_fork_asm (arch/x86/entry/entry_64.S:255)
[ 984.292371][ T23] </TASK>
[ 984.292826][ T23] INFO: lockdep is turned off.
[ 1045.677903][ C0] BUG: workqueue lockup - pool cpus=0 node=0 flags=0x0 nice=0 stuck for 59s!
[ 1045.680667][ C0] Showing busy workqueues and worker pools:
[ 1045.684192][ C0] workqueue events_power_efficient: flags=0x80
[ 1045.684971][ C0] pwq 2: cpus=0 node=0 flags=0x0 nice=0 active=3 refcnt=4
[ 1045.684987][ C0] pending: neigh_managed_work, neigh_periodic_work, do_cache_clean
[ 1045.685083][ C0] Showing backtraces of running workers in stalled CPU-bound worker pools:
[ 1076.396346][ C0] BUG: workqueue lockup - pool cpus=0 node=0 flags=0x0 nice=0 stuck for 89s!
[ 1076.400410][ C0] Showing busy workqueues and worker pools:
[ 1076.401145][ C0] workqueue events: flags=0x0
[ 1076.401765][ C0] pwq 2: cpus=0 node=0 flags=0x0 nice=0 active=1 refcnt=2
[ 1076.401781][ C0] pending: stop_one_cpu_nowait_workfn
[ 1076.401795][ C0] workqueue events_power_efficient: flags=0x80
[ 1076.404125][ C0] pwq 2: cpus=0 node=0 flags=0x0 nice=0 active=3 refcnt=4
[ 1076.404141][ C0] pending: neigh_managed_work, neigh_periodic_work, do_cache_clean
[ 1076.411517][ C0] Showing backtraces of running workers in stalled CPU-bound worker pools:
The kernel config and materials to reproduce are available at:
https://download.01.org/0day-ci/archive/20250925/202509251410.fdfbcac3-lkp@intel.com
--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH 1/2] drm: Introduce a new connector status
2025-09-23 17:34 ` Ian Forbes
@ 2025-11-03 18:01 ` Marius Vlad
0 siblings, 0 replies; 8+ messages in thread
From: Marius Vlad @ 2025-11-03 18:01 UTC (permalink / raw)
To: Ian Forbes
Cc: dri-devel, daniel.stone, dmitry.baryshkov, jani.nikula,
tzimmermann, simona.vetter, derek.foreman
Hi Ian,
On Tue, Sep 23, 2025 at 12:34:58PM -0500, Ian Forbes wrote:
> On Tue, Sep 23, 2025 at 3:36 AM Marius Vlad <marius.vlad@collabora.com> wrote:
> >
> > This patch introduces a new boolean variable used to track connector's
> > connect/disconnect status and it is being used on both polling and
> > the HPD (Hot Plug Detect) paths.
> >
> > A subsequent patch would make use of this connector status to propagate
> > per-connector udev hot plug events. This allows user-space to receive
> > the connector's ID, rather than having a generic hot-plug event for all
> > connectors, or in the HPD path, just the first one found with a
> > connection status change.
> >
> > Signed-off-by: Marius Vlad <marius.vlad@collabora.com>
> > ---
>
> How do you see this working with virtual connectors which can hotplug
> without a connected -> disconnected -> connected cycle?
tbh I don't see how those hot plug events are generated on virtual
connectors. Do you have a particular driver in mind, or how do you
"simulate" that hotplug cycle?
Pushed today a v4 of this patches series which adds polling in the vkms
driver and with that in I'm able to use sysfs and simulate a hot plug
event, like you'd have regular connectors. I've CC'ed on that v4 if
you'd like to have another go.
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH 1/2] drm: Introduce a new connector status
2025-09-23 15:53 ` Dmitry Baryshkov
@ 2025-11-03 18:07 ` Marius Vlad
0 siblings, 0 replies; 8+ messages in thread
From: Marius Vlad @ 2025-11-03 18:07 UTC (permalink / raw)
To: Dmitry Baryshkov
Cc: dri-devel, daniel.stone, jani.nikula, tzimmermann, simona.vetter,
derek.foreman
[-- Attachment #1: Type: text/plain, Size: 4772 bytes --]
Hi Dmitry,
On Tue, Sep 23, 2025 at 06:53:01PM +0300, Dmitry Baryshkov wrote:
> On Tue, Sep 23, 2025 at 11:36:35AM +0300, Marius Vlad wrote:
> > This patch introduces a new boolean variable used to track connector's
> > connect/disconnect status and it is being used on both polling and
> > the HPD (Hot Plug Detect) paths.
>
> Please see Documentation/process/submitting-patches.rst, it has special
> paragraph about "This patch".
Yes, removed that.
>
> >
> > A subsequent patch would make use of this connector status to propagate
> > per-connector udev hot plug events. This allows user-space to receive
> > the connector's ID, rather than having a generic hot-plug event for all
> > connectors, or in the HPD path, just the first one found with a
> > connection status change.
>
> It's not clear from the commit message, what is the expected behaviour.
> The flag has to be set when we've detected the status change - e.g.
> monitor being plugged or unplugged. When is it expected to be cleared?
Flag should be cleared when firing up KMS uevents and set when detecting
connected/disconnected events. Added a note in the commit desc for v4.
>
> >
> > Signed-off-by: Marius Vlad <marius.vlad@collabora.com>
> > ---
> > drivers/gpu/drm/drm_connector.c | 1 +
> > drivers/gpu/drm/drm_probe_helper.c | 18 ++++++++++++++++++
> > drivers/gpu/drm/drm_sysfs.c | 1 +
> > include/drm/drm_connector.h | 3 +++
> > 4 files changed, 23 insertions(+)
> >
> > diff --git a/drivers/gpu/drm/drm_connector.c b/drivers/gpu/drm/drm_connector.c
> > index 272d6254ea47..3c6628ee3096 100644
> > --- a/drivers/gpu/drm/drm_connector.c
> > +++ b/drivers/gpu/drm/drm_connector.c
> > @@ -274,6 +274,7 @@ static int drm_connector_init_only(struct drm_device *dev,
> >
> > /* provide ddc symlink in sysfs */
> > connector->ddc = ddc;
> > + connector->status_changed = false;
> >
> > INIT_LIST_HEAD(&connector->head);
> > INIT_LIST_HEAD(&connector->global_connector_list_entry);
> > diff --git a/drivers/gpu/drm/drm_probe_helper.c b/drivers/gpu/drm/drm_probe_helper.c
> > index 09b12c30df69..a865d5aa6f73 100644
> > --- a/drivers/gpu/drm/drm_probe_helper.c
> > +++ b/drivers/gpu/drm/drm_probe_helper.c
> > @@ -629,6 +629,9 @@ int drm_helper_probe_single_connector_modes(struct drm_connector *connector,
> > mod_delayed_work(system_wq,
> > &dev->mode_config.output_poll_work,
> > 0);
> > + mutex_lock(&dev->mode_config.mutex);
> > + connector->status_changed = true;
> > + mutex_unlock(&dev->mode_config.mutex);
> > }
> >
> > /*
> > @@ -732,6 +735,17 @@ EXPORT_SYMBOL(drm_helper_probe_single_connector_modes);
> > */
> > void drm_kms_helper_hotplug_event(struct drm_device *dev)
> > {
> > + struct drm_connector *connector;
> > + struct drm_connector_list_iter conn_iter;
> > +
> > + drm_connector_list_iter_begin(dev, &conn_iter);
> > + drm_for_each_connector_iter(connector, &conn_iter) {
> > + mutex_lock(&dev->mode_config.mutex);
> > + connector->status_changed = false;
> > + mutex_unlock(&dev->mode_config.mutex);
> > + }
> > + drm_connector_list_iter_end(&conn_iter);
> > +
> > drm_sysfs_hotplug_event(dev);
> > drm_client_dev_hotplug(dev);
> > }
> > @@ -748,6 +762,10 @@ void drm_kms_helper_connector_hotplug_event(struct drm_connector *connector)
> > {
> > struct drm_device *dev = connector->dev;
> >
> > + mutex_lock(&dev->mode_config.mutex);
> > + connector->status_changed = false;
> > + mutex_unlock(&dev->mode_config.mutex);
> > +
> > drm_sysfs_connector_hotplug_event(connector);
> > drm_client_dev_hotplug(dev);
> > }
> > diff --git a/drivers/gpu/drm/drm_sysfs.c b/drivers/gpu/drm/drm_sysfs.c
> > index b01ffa4d6509..bd9161490116 100644
> > --- a/drivers/gpu/drm/drm_sysfs.c
> > +++ b/drivers/gpu/drm/drm_sysfs.c
> > @@ -199,6 +199,7 @@ static ssize_t status_store(struct device *device,
> > return ret;
> >
> > old_force = connector->force;
> > + connector->status_changed = true;
> >
> > if (sysfs_streq(buf, "detect"))
> > connector->force = 0;
> > diff --git a/include/drm/drm_connector.h b/include/drm/drm_connector.h
> > index 8f34f4b8183d..e4310df3d55c 100644
> > --- a/include/drm/drm_connector.h
> > +++ b/include/drm/drm_connector.h
> > @@ -2146,6 +2146,9 @@ struct drm_connector {
> > /** @force: a DRM_FORCE_<foo> state for forced mode sets */
> > enum drm_connector_force force;
> >
> > + /** @status_changed: if the old status doesn't match current connection status */
> > + bool status_changed;
> > +
> > /**
> > * @edid_override: Override EDID set via debugfs.
> > *
> > --
> > 2.47.2
> >
>
> --
> With best wishes
> Dmitry
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]
^ permalink raw reply [flat|nested] 8+ messages in thread
end of thread, other threads:[~2025-11-03 18:07 UTC | newest]
Thread overview: 8+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-09-23 8:36 [PATCH v3 0/2] Pass down hot plug CONNECTOR ID to user-space Marius Vlad
2025-09-23 8:36 ` [PATCH 1/2] drm: Introduce a new connector status Marius Vlad
2025-09-23 15:53 ` Dmitry Baryshkov
2025-11-03 18:07 ` Marius Vlad
2025-09-23 17:34 ` Ian Forbes
2025-11-03 18:01 ` Marius Vlad
2025-09-25 6:51 ` kernel test robot
2025-09-23 8:36 ` [PATCH 2/2] drm: Propagate connector status change Marius Vlad
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.