lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [<thread-prev] [day] [month] [year] [list]
Message-ID: <20190925200656.GN218215@art_vandelay>
Date:   Wed, 25 Sep 2019 16:06:56 -0400
From:   Sean Paul <sean@...rly.run>
To:     Lyude Paul <lyude@...hat.com>
Cc:     dri-devel@...ts.freedesktop.org, nouveau@...ts.freedesktop.org,
        amd-gfx@...ts.freedesktop.org, Juston Li <juston.li@...el.com>,
        Imre Deak <imre.deak@...el.com>,
        Ville Syrjälä 
        <ville.syrjala@...ux.intel.com>, Harry Wentland <hwentlan@....com>,
        Daniel Vetter <daniel.vetter@...ll.ch>,
        Ben Skeggs <bskeggs@...hat.com>,
        David Airlie <airlied@...ux.ie>,
        Daniel Vetter <daniel@...ll.ch>, linux-kernel@...r.kernel.org
Subject: Re: [PATCH v2 22/27] drm/nouveau: Don't grab runtime PM refs for HPD
 IRQs

On Tue, Sep 03, 2019 at 04:46:00PM -0400, Lyude Paul wrote:
> In order for suspend/resume reprobing to work, we need to be able to
> perform sideband communications during suspend/resume, along with
> runtime PM suspend/resume. In order to do so, we also need to make sure
> that nouveau doesn't bother grabbing a runtime PM reference to do so,
> since otherwise we'll start deadlocking runtime PM again.
> 
> Note that we weren't able to do this before, because of the DP MST
> helpers processing UP requests from topologies in the same context as
> drm_dp_mst_hpd_irq() which would have caused us to open ourselves up to
> receiving hotplug events and deadlocking with runtime suspend/resume.
> Now that those requests are handled asynchronously, this change should
> be completely safe.
> 
> Cc: Juston Li <juston.li@...el.com>
> Cc: Imre Deak <imre.deak@...el.com>
> Cc: Ville Syrjälä <ville.syrjala@...ux.intel.com>
> Cc: Harry Wentland <hwentlan@....com>
> Cc: Daniel Vetter <daniel.vetter@...ll.ch>
> Signed-off-by: Lyude Paul <lyude@...hat.com>

Seems reasonable to me, but would feel better if a nouveau person confirmed

Reviewed-by: Sean Paul <sean@...rly.run>


> ---
>  drivers/gpu/drm/nouveau/nouveau_connector.c | 33 +++++++++++----------
>  1 file changed, 17 insertions(+), 16 deletions(-)
> 
> diff --git a/drivers/gpu/drm/nouveau/nouveau_connector.c b/drivers/gpu/drm/nouveau/nouveau_connector.c
> index 56871d34e3fb..f276918d3f3b 100644
> --- a/drivers/gpu/drm/nouveau/nouveau_connector.c
> +++ b/drivers/gpu/drm/nouveau/nouveau_connector.c
> @@ -1131,6 +1131,16 @@ nouveau_connector_hotplug(struct nvif_notify *notify)
>  	const char *name = connector->name;
>  	struct nouveau_encoder *nv_encoder;
>  	int ret;
> +	bool plugged = (rep->mask != NVIF_NOTIFY_CONN_V0_UNPLUG);
> +
> +	if (rep->mask & NVIF_NOTIFY_CONN_V0_IRQ) {
> +		NV_DEBUG(drm, "service %s\n", name);
> +		drm_dp_cec_irq(&nv_connector->aux);
> +		if ((nv_encoder = find_encoder(connector, DCB_OUTPUT_DP)))
> +			nv50_mstm_service(nv_encoder->dp.mstm);
> +
> +		return NVIF_NOTIFY_KEEP;
> +	}
>  
>  	ret = pm_runtime_get(drm->dev->dev);
>  	if (ret == 0) {
> @@ -1151,25 +1161,16 @@ nouveau_connector_hotplug(struct nvif_notify *notify)
>  		return NVIF_NOTIFY_DROP;
>  	}
>  
> -	if (rep->mask & NVIF_NOTIFY_CONN_V0_IRQ) {
> -		NV_DEBUG(drm, "service %s\n", name);
> -		drm_dp_cec_irq(&nv_connector->aux);
> -		if ((nv_encoder = find_encoder(connector, DCB_OUTPUT_DP)))
> -			nv50_mstm_service(nv_encoder->dp.mstm);
> -	} else {
> -		bool plugged = (rep->mask != NVIF_NOTIFY_CONN_V0_UNPLUG);
> -
> +	if (!plugged)
> +		drm_dp_cec_unset_edid(&nv_connector->aux);
> +	NV_DEBUG(drm, "%splugged %s\n", plugged ? "" : "un", name);
> +	if ((nv_encoder = find_encoder(connector, DCB_OUTPUT_DP))) {
>  		if (!plugged)
> -			drm_dp_cec_unset_edid(&nv_connector->aux);
> -		NV_DEBUG(drm, "%splugged %s\n", plugged ? "" : "un", name);
> -		if ((nv_encoder = find_encoder(connector, DCB_OUTPUT_DP))) {
> -			if (!plugged)
> -				nv50_mstm_remove(nv_encoder->dp.mstm);
> -		}
> -
> -		drm_helper_hpd_irq_event(connector->dev);
> +			nv50_mstm_remove(nv_encoder->dp.mstm);
>  	}
>  
> +	drm_helper_hpd_irq_event(connector->dev);
> +
>  	pm_runtime_mark_last_busy(drm->dev->dev);
>  	pm_runtime_put_autosuspend(drm->dev->dev);
>  	return NVIF_NOTIFY_KEEP;
> -- 
> 2.21.0
> 

-- 
Sean Paul, Software Engineer, Google / Chromium OS

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ