Received: by 2002:ad5:474a:0:0:0:0:0 with SMTP id i10csp1860209imu; Fri, 14 Dec 2018 01:41:01 -0800 (PST) X-Google-Smtp-Source: AFSGD/W4HGG0Z7nK+s47bvMq4fhGVD7CewzxTHtiBI3Luxsp6Gm/NjYh7DStd21I0P0mwoil7LSw X-Received: by 2002:a17:902:6b09:: with SMTP id o9mr2214012plk.208.1544780461727; Fri, 14 Dec 2018 01:41:01 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1544780461; cv=none; d=google.com; s=arc-20160816; b=PTUCCH6LGU1NieFKGkQownZLKd9I0vobA2yO9xWYd4dsx+hC+8PFm+1CJrH6ivPrrW Mi1EtO+nVy+MZ0W3h5xapHcMNpSKlRXXisGQ1zCuQlbFVBvbz+S/+j07BnsMGsZTFxVm CLh7MgQIhBC/RAIAIFxV2i2HvkKV9JHGEDi2Yj4IrpQOUYZtHyXR8Pe/QzSBQg4H/pku UfXz7jdku75ceO5nTQN7T7eG7R77ni2+e98enxo6YbpAxfX38qHw8bwmBsmES8bPNYCU Qpxx64bAeaDx3LR+oXnvZ95qSP/s/abmftR5oR3hYH7C52IY9uOamd1eovEAcJDwOd8v b5mA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:user-agent:in-reply-to :content-disposition:mime-version:references:mail-followup-to :message-id:subject:cc:to:from:date:dkim-signature; bh=CRfi0KWLcGHZVVPGgayqxxr619k61nslHuAZq41+GDQ=; b=f3S+TCpsy8zHpdG1puAm+3LgpiRqqRDEqyCGh7YymZPSyM5y5qCCc3KHMhgHauWeHb rHP9EBt3Kz8WSBqy2X3LEW83URICBi3/U8/kNX8PH7/Nomz23sHEql+Cj6f81U+7sdKc wRAQVI2HfyEMSNiZL6jp2W1cibyl/BF3bw/QFBWDvS5LvI9MEniwyi8tJZ4uoONG4mEO anSN72uHwUoephUHrf+zgC4k8dxLpq6GqFN6mLouvRqKFzy1iP8Lax6y7bvDxSUvBiNw ONZDdIzfAAupG5v4d2bA/h1g4t3yGe9OWncYT7nG221hBa1fzXTKcdPZkJVP6jFsAZVP O5RA== ARC-Authentication-Results: i=1; mx.google.com; dkim=fail header.i=@ffwll.ch header.s=google header.b=gJgAPxLF; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id o12si3743133pgn.145.2018.12.14.01.40.46; Fri, 14 Dec 2018 01:41:01 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=fail header.i=@ffwll.ch header.s=google header.b=gJgAPxLF; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1729094AbeLNJiv (ORCPT + 99 others); Fri, 14 Dec 2018 04:38:51 -0500 Received: from mail-ed1-f65.google.com ([209.85.208.65]:44821 "EHLO mail-ed1-f65.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726344AbeLNJiv (ORCPT ); Fri, 14 Dec 2018 04:38:51 -0500 Received: by mail-ed1-f65.google.com with SMTP id y56so4390250edd.11 for ; Fri, 14 Dec 2018 01:38:49 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ffwll.ch; s=google; h=sender:date:from:to:cc:subject:message-id:mail-followup-to :references:mime-version:content-disposition:in-reply-to:user-agent; bh=CRfi0KWLcGHZVVPGgayqxxr619k61nslHuAZq41+GDQ=; b=gJgAPxLFYKVJZvvuxWEJ+DfINtIKi8Py5za/iUIdKrEUnw+Vp1NHnj7tMAz9MOTwq2 Phw0vJ53OuRhH3lkrufSy7K6oqOvi7iiIfVCQfrER0Om6NDh2Cxdjy3fYvrboQYQZ6CL 1TqigX6cK7O4jtbOAkvryiHO6wvmTRTYx9QcA= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:date:from:to:cc:subject:message-id :mail-followup-to:references:mime-version:content-disposition :in-reply-to:user-agent; bh=CRfi0KWLcGHZVVPGgayqxxr619k61nslHuAZq41+GDQ=; b=qqKRIbctAtbjMOCHTFDUhF7NodhOrlF8de5DpDVk1OdItp+9e3mMi6KVqdOZnIyxQo +AmcBiRVFwrLkViv3ypjgY8dP6jSLA5oS4383Q8NenFOuA6QY+OrA5pIVcBU6LJoV4ov K3YMhbg1PT3uke3y5pMhVRcHYVT0Q5T21CMlvrriXGbkAsgD3RcTbA0wCW+dwzLl7UAk PEeg0GuxQpyLhCpaNdbTUyIYosQqvrmzENP+h4E2b3ZCEadAlXWnElLLSS95cCyKp6El r99r5Comv1hmGzVVRxImVW7AyAltleT+DWh3e+jK+86NNPLXKqX2A74S37Hf1ys4O5dZ 0PAw== X-Gm-Message-State: AA+aEWZXw2nmwS43YDaFZtWi/iYM7WHOJY3MAgatoDV7L/vCs7AZUvHh 631SEDlgk0hfMt9H8Cp7spKRhg== X-Received: by 2002:aa7:c248:: with SMTP id y8mr2341739edo.205.1544780329128; Fri, 14 Dec 2018 01:38:49 -0800 (PST) Received: from phenom.ffwll.local ([2a02:168:569e:0:3106:d637:d723:e855]) by smtp.gmail.com with ESMTPSA id n3-v6sm720259ejd.35.2018.12.14.01.38.47 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Fri, 14 Dec 2018 01:38:48 -0800 (PST) Date: Fri, 14 Dec 2018 10:38:46 +0100 From: Daniel Vetter To: Lyude Paul Cc: dri-devel@lists.freedesktop.org, nouveau@lists.freedesktop.org, intel-gfx@lists.freedesktop.org, amd-gfx@lists.freedesktop.org, Daniel Vetter , Dave Airlie , Harry Wentland , Jerry Zuo , Maarten Lankhorst , Maxime Ripard , Sean Paul , David Airlie , linux-kernel@vger.kernel.org Subject: Re: [WIP PATCH 05/15] drm/dp_mst: Fix payload deallocation on hotplugs using malloc refs Message-ID: <20181214093845.GP21184@phenom.ffwll.local> Mail-Followup-To: Lyude Paul , dri-devel@lists.freedesktop.org, nouveau@lists.freedesktop.org, intel-gfx@lists.freedesktop.org, amd-gfx@lists.freedesktop.org, Dave Airlie , Harry Wentland , Jerry Zuo , Maarten Lankhorst , Maxime Ripard , Sean Paul , David Airlie , linux-kernel@vger.kernel.org References: <20181214012604.13746-1-lyude@redhat.com> <20181214012604.13746-6-lyude@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20181214012604.13746-6-lyude@redhat.com> X-Operating-System: Linux phenom 4.18.0-2-amd64 User-Agent: Mutt/1.10.1 (2018-07-13) Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Thu, Dec 13, 2018 at 08:25:34PM -0500, Lyude Paul wrote: > Up until now, freeing payloads on remote MST hubs that just had ports > removed has almost never worked because we've been relying on port > validation in order to stop us from accessing ports that have already > been freed from memory, but ports which need their payloads released due > to being removed will never be a valid part of the topology after > they've been removed. > > Since we've introduced malloc refs, we can replace all of the validation > logic in payload helpers which are used for deallocation with some > well-placed malloc krefs. This ensures that regardless of whether or not > the ports are still valid and in the topology, any port which has an > allocated payload will remain allocated in memory until it's payloads > have been removed - finally allowing us to actually release said > payloads correctly. > > Signed-off-by: Lyude Paul I think with this we can also remove the int return value (that everyone ignored except for some debug output) from drm_dp_update_payload_part1/2. Follow-up cleanup patch ofc. This looks good. Reviewed-by: Daniel Vetter > --- > drivers/gpu/drm/drm_dp_mst_topology.c | 54 +++++++++++++++------------ > 1 file changed, 30 insertions(+), 24 deletions(-) > > diff --git a/drivers/gpu/drm/drm_dp_mst_topology.c b/drivers/gpu/drm/drm_dp_mst_topology.c > index ae9d019af9f2..93f08bfd2ab3 100644 > --- a/drivers/gpu/drm/drm_dp_mst_topology.c > +++ b/drivers/gpu/drm/drm_dp_mst_topology.c > @@ -1989,10 +1989,6 @@ static int drm_dp_payload_send_msg(struct drm_dp_mst_topology_mgr *mgr, > u8 sinks[DRM_DP_MAX_SDP_STREAMS]; > int i; > > - port = drm_dp_mst_topology_get_port_validated(mgr, port); > - if (!port) > - return -EINVAL; > - > port_num = port->port_num; > mstb = drm_dp_mst_topology_get_mstb_validated(mgr, port->parent); > if (!mstb) { > @@ -2000,10 +1996,8 @@ static int drm_dp_payload_send_msg(struct drm_dp_mst_topology_mgr *mgr, > port->parent, > &port_num); > > - if (!mstb) { > - drm_dp_mst_topology_put_port(port); > + if (!mstb) > return -EINVAL; > - } > } > > txmsg = kzalloc(sizeof(*txmsg), GFP_KERNEL); > @@ -2032,7 +2026,6 @@ static int drm_dp_payload_send_msg(struct drm_dp_mst_topology_mgr *mgr, > kfree(txmsg); > fail_put: > drm_dp_mst_topology_put_mstb(mstb); > - drm_dp_mst_topology_put_port(port); > return ret; > } > > @@ -2137,15 +2130,16 @@ static int drm_dp_destroy_payload_step2(struct drm_dp_mst_topology_mgr *mgr, > */ > int drm_dp_update_payload_part1(struct drm_dp_mst_topology_mgr *mgr) > { > - int i, j; > - int cur_slots = 1; > struct drm_dp_payload req_payload; > struct drm_dp_mst_port *port; > + int i, j; > + int cur_slots = 1; > > mutex_lock(&mgr->payload_lock); > for (i = 0; i < mgr->max_payloads; i++) { > struct drm_dp_vcpi *vcpi = mgr->proposed_vcpis[i]; > struct drm_dp_payload *payload = &mgr->payloads[i]; > + bool put_port = false; > > /* solve the current payloads - compare to the hw ones > - update the hw view */ > @@ -2153,12 +2147,20 @@ int drm_dp_update_payload_part1(struct drm_dp_mst_topology_mgr *mgr) > if (vcpi) { > port = container_of(vcpi, struct drm_dp_mst_port, > vcpi); > - port = drm_dp_mst_topology_get_port_validated(mgr, > - port); > - if (!port) { > - mutex_unlock(&mgr->payload_lock); > - return -EINVAL; > + > + /* Validated ports don't matter if we're releasing > + * VCPI > + */ > + if (vcpi->num_slots) { > + port = drm_dp_mst_topology_get_port_validated( > + mgr, port); > + if (!port) { > + mutex_unlock(&mgr->payload_lock); > + return -EINVAL; > + } > + put_port = true; > } > + > req_payload.num_slots = vcpi->num_slots; > req_payload.vcpi = vcpi->vcpi; > } else { > @@ -2190,7 +2192,7 @@ int drm_dp_update_payload_part1(struct drm_dp_mst_topology_mgr *mgr) > } > cur_slots += req_payload.num_slots; > > - if (port) > + if (put_port) > drm_dp_mst_topology_put_port(port); > } > > @@ -3005,6 +3007,8 @@ bool drm_dp_mst_allocate_vcpi(struct drm_dp_mst_topology_mgr *mgr, > DRM_DEBUG_KMS("initing vcpi for pbn=%d slots=%d\n", > pbn, port->vcpi.num_slots); > > + /* Keep port allocated until it's payload has been removed */ > + drm_dp_mst_get_port_malloc(port); > drm_dp_mst_topology_put_port(port); > return true; > out: > @@ -3034,11 +3038,12 @@ EXPORT_SYMBOL(drm_dp_mst_get_vcpi_slots); > */ > void drm_dp_mst_reset_vcpi_slots(struct drm_dp_mst_topology_mgr *mgr, struct drm_dp_mst_port *port) > { > - port = drm_dp_mst_topology_get_port_validated(mgr, port); > - if (!port) > - return; > + /* > + * A port with VCPI will remain allocated until it's VCPI is > + * released, no verified ref needed > + */ > + > port->vcpi.num_slots = 0; > - drm_dp_mst_topology_put_port(port); > } > EXPORT_SYMBOL(drm_dp_mst_reset_vcpi_slots); > > @@ -3050,16 +3055,17 @@ EXPORT_SYMBOL(drm_dp_mst_reset_vcpi_slots); > void drm_dp_mst_deallocate_vcpi(struct drm_dp_mst_topology_mgr *mgr, > struct drm_dp_mst_port *port) > { > - port = drm_dp_mst_topology_get_port_validated(mgr, port); > - if (!port) > - return; > + /* > + * A port with VCPI will remain allocated until it's VCPI is > + * released, no verified ref needed > + */ > > drm_dp_mst_put_payload_id(mgr, port->vcpi.vcpi); > port->vcpi.num_slots = 0; > port->vcpi.pbn = 0; > port->vcpi.aligned_pbn = 0; > port->vcpi.vcpi = 0; > - drm_dp_mst_topology_put_port(port); > + drm_dp_mst_put_port_malloc(port); > } > EXPORT_SYMBOL(drm_dp_mst_deallocate_vcpi); > > -- > 2.19.2 > -- Daniel Vetter Software Engineer, Intel Corporation http://blog.ffwll.ch