* [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
* 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 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
* 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 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 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
* [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
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 a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox