Received: by 2002:a25:1985:0:0:0:0:0 with SMTP id 127csp539580ybz; Wed, 22 Apr 2020 03:16:13 -0700 (PDT) X-Google-Smtp-Source: APiQypLpUG8Knv4WwFDvxJ5Zj0z9voIP6r+vivMy9EnMQnSYtqAf2ZEHlxcbeoutkwjsD6jAo2fe X-Received: by 2002:a17:906:48c:: with SMTP id f12mr25889610eja.93.1587550572866; Wed, 22 Apr 2020 03:16:12 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1587550572; cv=none; d=google.com; s=arc-20160816; b=AHKGSYF5vBcAfodmv7uUJXvmHXZHShVNJcvO+0fXsdjmsbM8pZnsA4P9FE54lkUroQ 9u55LM9SHRD3QpAtVUt5Q5mhVh+BxlWC77w3lfVb1t2niH93zd1QiKnsyYyxkL1tG6J8 yiKZbLrbwLx+bT7fYtwUSAuypwscPonRfqzbfHXSWvbRFok8tsDUdj+I6ap7o6FgK63k V1LCgxeQhnE/+UKXdMOr3teGidwHqLS2YrImP+ZGdj/pZKMxlQRjHXSRoe67AdnVMJ2V Jr+6uJEM3Ufo+tHPK5mwYMq4bhAqfCt87SbOi2TlRwm5EIJypYQw1ak7CL9kMk7X2c+c 2CZA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :user-agent:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=ku1Y6zqVVpV6wgbUksAJ/ucnzoSyWq55e7/WYNFQtKs=; b=LC/ZbxMkn7jVVMMBpcvcVVxlzGx3CQswQxcNqKPqEQsNdNKQa+Ded389k0//rPe3rX URQ+AoZDCPpnM2+mTz1GARTNnAihlFNdKms0/XiOEX5LrmmuJ/D9myyjfmQp6fTCf5I0 Z8pKYFBpY9/tUOaqPmXsn3pA3AQP55xrCKrxsNudAJECycfcW23+TtwYoQWK7fxua2xn 6fSSURprHLAjD7HpcUgNyHepR6RwTnktHI+7vUPJr9raiHiGXBRJGFWaREfVAtK0UEJa 1WkDKnXVKbNaIyaPaMUToHPGMAO+oQPY0IioDGc4mW2aJMy3UjCmpsAxZyjOajc3X+4L HYOw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b="OmAUQN/Q"; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id l64si3102118ede.431.2020.04.22.03.15.49; Wed, 22 Apr 2020 03:16:12 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b="OmAUQN/Q"; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728714AbgDVKNo (ORCPT + 99 others); Wed, 22 Apr 2020 06:13:44 -0400 Received: from mail.kernel.org ([198.145.29.99]:47580 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726240AbgDVKNg (ORCPT ); Wed, 22 Apr 2020 06:13:36 -0400 Received: from localhost (83-86-89-107.cable.dynamic.v4.ziggo.nl [83.86.89.107]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id 60D9E20781; Wed, 22 Apr 2020 10:13:35 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1587550415; bh=Oif0qUeXDeEDFaVTAP0jQaj1zg1uJCGeVivjc+F1Zp4=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=OmAUQN/QGv5BMSxrLER4/M0/v1VoEEEXIKRH3arrf6B9BHg6zbMmp41X/mnZ4tKAp hxY1tJY0DWFiqB/le3QfL2rmGhA9Tvxi6sO0vvuQqSPBAgInzx/3bXfNsp81KRKKX9 bOfhPetcL8nV9Ndb1Te7XrLfdR4QNZB21qvWKnYE= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Sean Paul , Wayne Lin , =?UTF-8?q?Ville=20Syrj=C3=A4l=C3=A4?= , Lyude Paul , Sasha Levin Subject: [PATCH 4.14 099/199] drm/dp_mst: Fix clearing payload state on topology disable Date: Wed, 22 Apr 2020 11:57:05 +0200 Message-Id: <20200422095107.842999382@linuxfoundation.org> X-Mailer: git-send-email 2.26.2 In-Reply-To: <20200422095057.806111593@linuxfoundation.org> References: <20200422095057.806111593@linuxfoundation.org> User-Agent: quilt/0.66 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Lyude Paul [ Upstream commit 8732fe46b20c951493bfc4dba0ad08efdf41de81 ] The issues caused by: commit 64e62bdf04ab ("drm/dp_mst: Remove VCPI while disabling topology mgr") Prompted me to take a closer look at how we clear the payload state in general when disabling the topology, and it turns out there's actually two subtle issues here. The first is that we're not grabbing &mgr.payload_lock when clearing the payloads in drm_dp_mst_topology_mgr_set_mst(). Seeing as the canonical lock order is &mgr.payload_lock -> &mgr.lock (because we always want &mgr.lock to be the inner-most lock so topology validation always works), this makes perfect sense. It also means that -technically- there could be racing between someone calling drm_dp_mst_topology_mgr_set_mst() to disable the topology, along with a modeset occurring that's modifying the payload state at the same time. The second is the more obvious issue that Wayne Lin discovered, that we're not clearing proposed_payloads when disabling the topology. I actually can't see any obvious places where the racing caused by the first issue would break something, and it could be that some of our higher-level locks already prevent this by happenstance, but better safe then sorry. So, let's make it so that drm_dp_mst_topology_mgr_set_mst() first grabs &mgr.payload_lock followed by &mgr.lock so that we never race when modifying the payload state. Then, we also clear proposed_payloads to fix the original issue of enabling a new topology with a dirty payload state. This doesn't clear any of the drm_dp_vcpi structures, but those are getting destroyed along with the ports anyway. Changes since v1: * Use sizeof(mgr->payloads[0])/sizeof(mgr->proposed_vcpis[0]) instead - vsyrjala Cc: Sean Paul Cc: Wayne Lin Cc: Ville Syrjälä Cc: stable@vger.kernel.org # v4.4+ Signed-off-by: Lyude Paul Reviewed-by: Ville Syrjälä Link: https://patchwork.freedesktop.org/patch/msgid/20200122194321.14953-1-lyude@redhat.com Signed-off-by: Sasha Levin --- drivers/gpu/drm/drm_dp_mst_topology.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/drivers/gpu/drm/drm_dp_mst_topology.c b/drivers/gpu/drm/drm_dp_mst_topology.c index f0d819fc16cd7..db0e9ce57e29a 100644 --- a/drivers/gpu/drm/drm_dp_mst_topology.c +++ b/drivers/gpu/drm/drm_dp_mst_topology.c @@ -2038,6 +2038,7 @@ int drm_dp_mst_topology_mgr_set_mst(struct drm_dp_mst_topology_mgr *mgr, bool ms int ret = 0; struct drm_dp_mst_branch *mstb = NULL; + mutex_lock(&mgr->payload_lock); mutex_lock(&mgr->lock); if (mst_state == mgr->mst_state) goto out_unlock; @@ -2096,7 +2097,10 @@ int drm_dp_mst_topology_mgr_set_mst(struct drm_dp_mst_topology_mgr *mgr, bool ms /* this can fail if the device is gone */ drm_dp_dpcd_writeb(mgr->aux, DP_MSTM_CTRL, 0); ret = 0; - memset(mgr->payloads, 0, mgr->max_payloads * sizeof(struct drm_dp_payload)); + memset(mgr->payloads, 0, + mgr->max_payloads * sizeof(mgr->payloads[0])); + memset(mgr->proposed_vcpis, 0, + mgr->max_payloads * sizeof(mgr->proposed_vcpis[0])); mgr->payload_mask = 0; set_bit(0, &mgr->payload_mask); mgr->vcpi_mask = 0; @@ -2104,6 +2108,7 @@ int drm_dp_mst_topology_mgr_set_mst(struct drm_dp_mst_topology_mgr *mgr, bool ms out_unlock: mutex_unlock(&mgr->lock); + mutex_unlock(&mgr->payload_lock); if (mstb) drm_dp_put_mst_branch_device(mstb); return ret; -- 2.20.1