public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
From: Lyude Paul <lyude@redhat.com>
To: nouveau@lists.freedesktop.org
Cc: stable@vger.kernel.org, Lukas Wunner <lukas@wunner.de>,
	Karol Herbst <karolherbst@gmail.com>,
	Ben Skeggs <bskeggs@redhat.com>, David Airlie <airlied@linux.ie>,
	dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org
Subject: [PATCH v5 11/13] drm/nouveau: Respond to HPDs by probing one conn at a time
Date: Tue,  7 Aug 2018 16:39:08 -0400	[thread overview]
Message-ID: <20180807203914.2192-12-lyude@redhat.com> (raw)
In-Reply-To: <20180807203914.2192-1-lyude@redhat.com>

There isn't actually any reason we need to call drm_hpd_irq_event() from
our hotplug handler, as we already know which connector the hotplug
event was fired for. We're also going to need to avoid probing all
connectors needlessly from hotplug handlers anyway so that we can track
when nouveau_connector_detect() is being called from the context of it's
connector's hotplug handler in order to fix the next deadlocking issue.

This is (slightly) faster anyway!

Signed-off-by: Lyude Paul <lyude@redhat.com>
Cc: stable@vger.kernel.org
Cc: Lukas Wunner <lukas@wunner.de>
Cc: Karol Herbst <karolherbst@gmail.com>
---
 drivers/gpu/drm/nouveau/nouveau_connector.c | 28 ++++++++++++++++++++-
 1 file changed, 27 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/nouveau/nouveau_connector.c b/drivers/gpu/drm/nouveau/nouveau_connector.c
index 010d6db14cba..9714e09f17db 100644
--- a/drivers/gpu/drm/nouveau/nouveau_connector.c
+++ b/drivers/gpu/drm/nouveau/nouveau_connector.c
@@ -1114,6 +1114,32 @@ nouveau_connector_funcs_lvds = {
 	.atomic_get_property = nouveau_conn_atomic_get_property,
 };
 
+static void
+nouveau_connector_hotplug_probe(struct nouveau_connector *nv_conn)
+{
+	struct drm_modeset_acquire_ctx ctx;
+	struct drm_connector *conn = &nv_conn->base;
+	enum drm_connector_status old_status;
+	struct drm_device *dev = conn->dev;
+	bool changed;
+
+	mutex_lock(&dev->mode_config.mutex);
+
+	drm_modeset_acquire_init(&ctx, 0);
+	drm_modeset_lock(&dev->mode_config.connection_mutex, &ctx);
+
+	old_status = conn->status;
+	conn->status = drm_helper_probe_detect(conn, &ctx, true);
+	changed = old_status != conn->status;
+
+	drm_modeset_drop_locks(&ctx);
+	drm_modeset_acquire_fini(&ctx);
+	mutex_unlock(&dev->mode_config.mutex);
+
+	if (changed)
+		drm_kms_helper_hotplug_event(dev);
+}
+
 static int
 nouveau_connector_hotplug(struct nvif_notify *notify)
 {
@@ -1138,7 +1164,7 @@ nouveau_connector_hotplug(struct nvif_notify *notify)
 				nv50_mstm_remove(nv_encoder->dp.mstm);
 		}
 
-		drm_helper_hpd_irq_event(connector->dev);
+		nouveau_connector_hotplug_probe(nv_connector);
 	}
 
 	return NVIF_NOTIFY_KEEP;
-- 
2.17.1


  parent reply	other threads:[~2018-08-07 20:39 UTC|newest]

Thread overview: 20+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-08-07 20:38 [PATCH v5 00/13] Fix connector probing deadlocks from RPM bugs Lyude Paul
2018-08-07 20:38 ` [PATCH v5 01/13] drm/nouveau: Fix bogus drm_kms_helper_poll_enable() placement Lyude Paul
2018-08-07 20:38 ` [PATCH v5 02/13] drm/nouveau: Remove duplicate poll_enable() in pmops_runtime_suspend() Lyude Paul
2018-08-07 20:39 ` [PATCH v5 03/13] drm/nouveau: Remove useless poll_enable() call in switcheroo_set_state() Lyude Paul
2018-08-07 20:39 ` [PATCH v5 04/13] drm/nouveau: Remove useless poll_disable() " Lyude Paul
2018-08-07 20:39 ` [PATCH v5 05/13] drm/nouveau: Remove useless poll_enable() call in drm_load() Lyude Paul
2018-08-11  9:45   ` [Nouveau] " Karol Herbst
2018-08-07 20:39 ` [PATCH v5 06/13] drm/nouveau: Call optimus_dsm functions after nouveau_do_suspend() Lyude Paul
2018-08-10 21:35   ` [Nouveau] " Karol Herbst
2018-08-07 20:39 ` [PATCH v5 07/13] drm/nouveau: Add missing unroll functions in nouveau_do_suspend() Lyude Paul
2018-08-10 21:36   ` [Nouveau] " Karol Herbst
2018-08-07 20:39 ` [PATCH v5 08/13] drm/nouveau: Don't ignore nouveau_do_suspend() ret value Lyude Paul
2018-08-10 21:37   ` [Nouveau] " Karol Herbst
2018-08-07 20:39 ` [PATCH v5 09/13] drm/nouveau: Fix deadlock with fb_helper by inhibiting it's HPD Lyude Paul
2018-08-07 20:39 ` [PATCH v5 10/13] drm/nouveau: Use pm_runtime_get_noresume() in connector_detect() Lyude Paul
2018-08-10 21:39   ` [Nouveau] " Karol Herbst
2018-08-07 20:39 ` Lyude Paul [this message]
2018-08-07 20:39 ` [PATCH v5 12/13] drm/nouveau: Fix deadlocks in nouveau_connector_detect() Lyude Paul
2018-08-07 20:39 ` [PATCH v5 13/13] drm/nouveau: Call pm_runtime_get_noresume() from hpd handlers Lyude Paul
2018-08-11  9:35   ` [Nouveau] " Karol Herbst

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20180807203914.2192-12-lyude@redhat.com \
    --to=lyude@redhat.com \
    --cc=airlied@linux.ie \
    --cc=bskeggs@redhat.com \
    --cc=dri-devel@lists.freedesktop.org \
    --cc=karolherbst@gmail.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=lukas@wunner.de \
    --cc=nouveau@lists.freedesktop.org \
    --cc=stable@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox