From mboxrd@z Thu Jan 1 00:00:00 1970 From: Lyude Paul Subject: Re: [PATCH 2/5] drm: Allow determining if current task is output poll worker Date: Mon, 12 Feb 2018 12:46:11 -0500 Message-ID: <1518457571.5319.7.camel@redhat.com> References: <7831d4f21dde8cd0b1659e393854598995dfb249.1518338788.git.lukas@wunner.de> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: In-Reply-To: <7831d4f21dde8cd0b1659e393854598995dfb249.1518338788.git.lukas@wunner.de> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: intel-gfx-bounces@lists.freedesktop.org Sender: "Intel-gfx" To: Lukas Wunner , Tejun Heo , Lai Jiangshan , Alex Deucher , Dave Airlie , Ben Skeggs Cc: Pierre Moreau , Archit Taneja , Ismo Toijala , nouveau@lists.freedesktop.org, intel-gfx@lists.freedesktop.org, linux-kernel@vger.kernel.org, dri-devel@lists.freedesktop.org, Hans de Goede , Peter Wu List-Id: nouveau.vger.kernel.org T24gU3VuLCAyMDE4LTAyLTExIGF0IDEwOjM4ICswMTAwLCBMdWthcyBXdW5uZXIgd3JvdGU6Cj4g SW50cm9kdWNlIGEgaGVscGVyIHRvIGRldGVybWluZSBpZiB0aGUgY3VycmVudCB0YXNrIGlzIGFu IG91dHB1dCBwb2xsCj4gd29ya2VyLgo+IAo+IFRoaXMgYWxsb3dzIHVzIHRvIGZpeCBhIGxvbmct c3RhbmRpbmcgZGVhZGxvY2sgaW4gc2V2ZXJhbCBEUk0gZHJpdmVycwo+IHdoZXJlaW4gdGhlIC0+ cnVudGltZV9zdXNwZW5kIGNhbGxiYWNrIHdhaXRzIGZvciB0aGUgb3V0cHV0IHBvbGwgd29ya2Vy Cj4gdG8gZmluaXNoIGFuZCB0aGUgd29ya2VyIGluIHR1cm4gY2FsbHMgYSAtPmRldGVjdCBjYWxs YmFjayB3aGljaCB3YWl0cwo+IGZvciBydW50aW1lIHN1c3BlbmQgdG8gZmluaXNoLiAgVGhlIC0+ ZGV0ZWN0IGNhbGxiYWNrIGlzIGludm9rZWQgZnJvbQo+IG11bHRpcGxlIGNhbGwgc2l0ZXMgYW5k IHdhaXRpbmcgZm9yIHJ1bnRpbWUgc3VzcGVuZCB0byBmaW5pc2ggaXMgdGhlCj4gY29ycmVjdCB0 aGluZyB0byBkbyBleGNlcHQgaWYgaXQncyBleGVjdXRpbmcgaW4gdGhlIGNvbnRleHQgb2YgdGhl Cj4gd29ya2VyLgo+IAo+IENjOiBEYXZlIEFpcmxpZSA8YWlybGllZEByZWRoYXQuY29tPgo+IENj OiBCZW4gU2tlZ2dzIDxic2tlZ2dzQHJlZGhhdC5jb20+Cj4gQ2M6IEFsZXggRGV1Y2hlciA8YWxl eGFuZGVyLmRldWNoZXJAYW1kLmNvbT4KPiBTaWduZWQtb2ZmLWJ5OiBMdWthcyBXdW5uZXIgPGx1 a2FzQHd1bm5lci5kZT4KPiAtLS0KPiAgZHJpdmVycy9ncHUvZHJtL2RybV9wcm9iZV9oZWxwZXIu YyB8IDE0ICsrKysrKysrKysrKysrCj4gIGluY2x1ZGUvZHJtL2RybV9jcnRjX2hlbHBlci5oICAg ICAgfCAgMSArCj4gIDIgZmlsZXMgY2hhbmdlZCwgMTUgaW5zZXJ0aW9ucygrKQo+IAo+IGRpZmYg LS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vZHJtX3Byb2JlX2hlbHBlci5jCj4gYi9kcml2ZXJzL2dw dS9kcm0vZHJtX3Byb2JlX2hlbHBlci5jCj4gaW5kZXggNTU1ZmJlNTRkNmUyLi4wMTk4ODFkMTVj ZTEgMTAwNjQ0Cj4gLS0tIGEvZHJpdmVycy9ncHUvZHJtL2RybV9wcm9iZV9oZWxwZXIuYwo+ICsr KyBiL2RyaXZlcnMvZ3B1L2RybS9kcm1fcHJvYmVfaGVscGVyLmMKPiBAQCAtNjUzLDYgKzY1Mywy MCBAQCBzdGF0aWMgdm9pZCBvdXRwdXRfcG9sbF9leGVjdXRlKHN0cnVjdCB3b3JrX3N0cnVjdAo+ ICp3b3JrKQo+ICAJCXNjaGVkdWxlX2RlbGF5ZWRfd29yayhkZWxheWVkX3dvcmssCj4gRFJNX09V VFBVVF9QT0xMX1BFUklPRCk7Cj4gIH0KPiAgCj4gKy8qKgo+ICsgKiBkcm1fa21zX2hlbHBlcl9p c19wb2xsX3dvcmtlciAtIGlzICVjdXJyZW50IHRhc2sgYW4gb3V0cHV0IHBvbGwgd29ya2VyPwo+ ICsgKgo+ICsgKiBEZXRlcm1pbmUgaWYgJWN1cnJlbnQgdGFzayBpcyBhbiBvdXRwdXQgcG9sbCB3 b3JrZXIuICBUaGlzIGNhbiBiZSB1c2VkCj4gKyAqIHRvIHNlbGVjdCBkaXN0aW5jdCBjb2RlIHBh dGhzIGZvciBvdXRwdXQgcG9sbGluZyB2ZXJzdXMgb3RoZXIgY29udGV4dHMuCj4gKyAqLwpGb3Ig dGhpcywgaXQgd291bGQgYmUgd29ydGggZXhwbGljaXRseSBub3RpbmcgaW4gdGhlIGNvbW1lbnRz IGhlcmV0aGF0IHRoaXMKc2hvdWxkIGJlIGNhbGxlZCBieSBEUk0gZHJpdmVycyBpbiBvcmRlciB0 byBwcmV2ZW50IHJhY2luZyB3aXRoIGhvdHBsdWcKcG9sbGluZyB3b3JrZXJzLCBzbyB0aGF0IG5l dyBkcml2ZXJzIGluIHRoZSBmdXR1cmUgY2FuIGF2b2lkIGltcGxlbWVudGluZyB0aGlzCnJhY2Ug Y29uZGl0aW9uIGluIHRoZWlyIGRyaXZlci4KCj4gK2Jvb2wgZHJtX2ttc19oZWxwZXJfaXNfcG9s bF93b3JrZXIodm9pZCkKPiArewo+ICsJc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrID0gY3VycmVu dF93b3JrKCk7Cj4gKwo+ICsJcmV0dXJuIHdvcmsgJiYgd29yay0+ZnVuYyA9PSBvdXRwdXRfcG9s bF9leGVjdXRlOwo+ICt9Cj4gK0VYUE9SVF9TWU1CT0woZHJtX2ttc19oZWxwZXJfaXNfcG9sbF93 b3JrZXIpOwo+ICsKPiAgLyoqCj4gICAqIGRybV9rbXNfaGVscGVyX3BvbGxfZGlzYWJsZSAtIGRp c2FibGUgb3V0cHV0IHBvbGxpbmcKPiAgICogQGRldjogZHJtX2RldmljZQo+IGRpZmYgLS1naXQg YS9pbmNsdWRlL2RybS9kcm1fY3J0Y19oZWxwZXIuaCBiL2luY2x1ZGUvZHJtL2RybV9jcnRjX2hl bHBlci5oCj4gaW5kZXggNzZlMjM3YmQ5ODliLi42OTE0NjMzMDM3YTUgMTAwNjQ0Cj4gLS0tIGEv aW5jbHVkZS9kcm0vZHJtX2NydGNfaGVscGVyLmgKPiArKysgYi9pbmNsdWRlL2RybS9kcm1fY3J0 Y19oZWxwZXIuaAo+IEBAIC03Nyw1ICs3Nyw2IEBAIHZvaWQgZHJtX2ttc19oZWxwZXJfaG90cGx1 Z19ldmVudChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKPiAgCj4gIHZvaWQgZHJtX2ttc19oZWxw ZXJfcG9sbF9kaXNhYmxlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOwo+ICB2b2lkIGRybV9rbXNf aGVscGVyX3BvbGxfZW5hYmxlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOwo+ICtib29sIGRybV9r bXNfaGVscGVyX2lzX3BvbGxfd29ya2VyKHZvaWQpOwo+ICAKPiAgI2VuZGlmCi0tIApDaGVlcnMs CglMeXVkZSBQYXVsCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fCkludGVsLWdmeCBtYWlsaW5nIGxpc3QKSW50ZWwtZ2Z4QGxpc3RzLmZyZWVkZXNrdG9wLm9y ZwpodHRwczovL2xpc3RzLmZyZWVkZXNrdG9wLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2ludGVsLWdm eAo= From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S932278AbeBLRqQ (ORCPT ); Mon, 12 Feb 2018 12:46:16 -0500 Received: from mail-qk0-f193.google.com ([209.85.220.193]:34261 "EHLO mail-qk0-f193.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753643AbeBLRqO (ORCPT ); Mon, 12 Feb 2018 12:46:14 -0500 X-Google-Smtp-Source: AH8x226ThaTnQSccIc0Gd1VHe+5XnOvHI3JIt7i5PIwVMjBLsLMdYoMD+xX18TCcmcK9cfUQruNSkA== Message-ID: <1518457571.5319.7.camel@redhat.com> Subject: Re: [PATCH 2/5] drm: Allow determining if current task is output poll worker From: Lyude Paul To: Lukas Wunner , Tejun Heo , Lai Jiangshan , Alex Deucher , Dave Airlie , Ben Skeggs Cc: dri-devel@lists.freedesktop.org, Peter Wu , nouveau@lists.freedesktop.org, Hans de Goede , Pierre Moreau , linux-kernel@vger.kernel.org, Ismo Toijala , intel-gfx@lists.freedesktop.org, Liviu Dudau , Archit Taneja Date: Mon, 12 Feb 2018 12:46:11 -0500 In-Reply-To: <7831d4f21dde8cd0b1659e393854598995dfb249.1518338788.git.lukas@wunner.de> References: <7831d4f21dde8cd0b1659e393854598995dfb249.1518338788.git.lukas@wunner.de> Organization: Red Hat Content-Type: text/plain; charset="UTF-8" X-Mailer: Evolution 3.26.4 (3.26.4-1.fc27) Mime-Version: 1.0 Content-Transfer-Encoding: 7bit Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Sun, 2018-02-11 at 10:38 +0100, Lukas Wunner wrote: > Introduce a helper to determine if the current task is an output poll > worker. > > This allows us to fix a long-standing deadlock in several DRM drivers > wherein the ->runtime_suspend callback waits for the output poll worker > to finish and the worker in turn calls a ->detect callback which waits > for runtime suspend to finish. The ->detect callback is invoked from > multiple call sites and waiting for runtime suspend to finish is the > correct thing to do except if it's executing in the context of the > worker. > > Cc: Dave Airlie > Cc: Ben Skeggs > Cc: Alex Deucher > Signed-off-by: Lukas Wunner > --- > drivers/gpu/drm/drm_probe_helper.c | 14 ++++++++++++++ > include/drm/drm_crtc_helper.h | 1 + > 2 files changed, 15 insertions(+) > > diff --git a/drivers/gpu/drm/drm_probe_helper.c > b/drivers/gpu/drm/drm_probe_helper.c > index 555fbe54d6e2..019881d15ce1 100644 > --- a/drivers/gpu/drm/drm_probe_helper.c > +++ b/drivers/gpu/drm/drm_probe_helper.c > @@ -653,6 +653,20 @@ static void output_poll_execute(struct work_struct > *work) > schedule_delayed_work(delayed_work, > DRM_OUTPUT_POLL_PERIOD); > } > > +/** > + * drm_kms_helper_is_poll_worker - is %current task an output poll worker? > + * > + * Determine if %current task is an output poll worker. This can be used > + * to select distinct code paths for output polling versus other contexts. > + */ For this, it would be worth explicitly noting in the comments herethat this should be called by DRM drivers in order to prevent racing with hotplug polling workers, so that new drivers in the future can avoid implementing this race condition in their driver. > +bool drm_kms_helper_is_poll_worker(void) > +{ > + struct work_struct *work = current_work(); > + > + return work && work->func == output_poll_execute; > +} > +EXPORT_SYMBOL(drm_kms_helper_is_poll_worker); > + > /** > * drm_kms_helper_poll_disable - disable output polling > * @dev: drm_device > diff --git a/include/drm/drm_crtc_helper.h b/include/drm/drm_crtc_helper.h > index 76e237bd989b..6914633037a5 100644 > --- a/include/drm/drm_crtc_helper.h > +++ b/include/drm/drm_crtc_helper.h > @@ -77,5 +77,6 @@ void drm_kms_helper_hotplug_event(struct drm_device *dev); > > void drm_kms_helper_poll_disable(struct drm_device *dev); > void drm_kms_helper_poll_enable(struct drm_device *dev); > +bool drm_kms_helper_is_poll_worker(void); > > #endif -- Cheers, Lyude Paul