From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from metis.whiteo.stw.pengutronix.de (metis.whiteo.stw.pengutronix.de [185.203.201.7]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 7CE3A3C2BA3 for ; Fri, 10 Jul 2026 12:45:34 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=185.203.201.7 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783687537; cv=none; b=aQAaps7uIce5PdInxkBa/dhZCH9Zv2TkoITUQKEa3WLO03XKahfFmZhgJ/hJ8AyDeSqqbWcGYFDMgXsIFSPsoSEDQrwJUDJyBzODiQ4RedwZEmvQ1EHxiB3ID4OVgt2MN981YfaCauJNBBY0pE5Ei3L80nijg7KPnIbJsbQMFpk= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783687537; c=relaxed/simple; bh=x/cPHZObHRAjbrKiBVSRy4qDZGhcYBRLZFjDzXvmdO4=; h=Message-ID:Subject:From:To:Cc:Date:In-Reply-To:References: Content-Type:MIME-Version; b=mvrita7dFBrtsC2lsxIlS2cYVUdVv803qOjELhR5S6uB3dCKMpCGyPE3DFSgHEGChZ5Hoq7oxw+p+uZy7lotvLCQA7hUiGqPk7P2VQTGMmsoEDIbdqIhahca02/UHpF+SPS7GlB7fS2izt89t5BA9GwMNCbTlsHss04qzC6/u+E= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=pengutronix.de; spf=pass smtp.mailfrom=pengutronix.de; arc=none smtp.client-ip=185.203.201.7 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=pengutronix.de Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=pengutronix.de Received: from ptz.office.stw.pengutronix.de ([2a0a:edc0:0:900:1d::77] helo=[IPv6:::1]) by metis.whiteo.stw.pengutronix.de with esmtp (Exim 4.92) (envelope-from ) id 1wiAbc-0001hB-IA; Fri, 10 Jul 2026 14:45:24 +0200 Message-ID: Subject: Re: [PATCH v3 1/2] drm/etnaviv: Reference count struct etnaviv_file_private From: Lucas Stach To: Christian Gmeiner , Russell King , David Airlie , Simona Vetter , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann Cc: etnaviv@lists.freedesktop.org, dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, kernel-dev@igalia.com, Christian Gmeiner Date: Fri, 10 Jul 2026 14:45:23 +0200 In-Reply-To: <20260710-etnaviv-reset-notification-v3-1-7a145c8a1d01@igalia.com> References: <20260710-etnaviv-reset-notification-v3-0-7a145c8a1d01@igalia.com> <20260710-etnaviv-reset-notification-v3-1-7a145c8a1d01@igalia.com> Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable User-Agent: Evolution 3.60.1 (3.60.1-1.fc44) Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-SA-Exim-Connect-IP: 2a0a:edc0:0:900:1d::77 X-SA-Exim-Mail-From: l.stach@pengutronix.de X-SA-Exim-Scanned: No (on metis.whiteo.stw.pengutronix.de); SAEximRunCond expanded to false X-PTX-Original-Recipient: linux-kernel@vger.kernel.org Am Freitag, dem 10.07.2026 um 14:03 +0200 schrieb Christian Gmeiner: > From: Christian Gmeiner >=20 > The next commit updates per-context data from the GPU reset path, which > runs in the scheduler timeout worker. This can race with closing the DRM > file: drm_sched_entity_flush() only waits until the entity queue is > empty, it does not wait for jobs still running on the hardware. So the > context can already be freed while the reset path still needs it. >=20 > Reference count the context and let every submit hold a reference, the > same way a submit already keeps its mmu context and pid alive. No > functional change. >=20 > Signed-off-by: Christian Gmeiner Reviewed-by: Lucas Stach > --- > drivers/gpu/drm/etnaviv/etnaviv_drv.c | 17 ++++++++++++++++- > drivers/gpu/drm/etnaviv/etnaviv_drv.h | 11 +++++++++++ > drivers/gpu/drm/etnaviv/etnaviv_gem_submit.c | 5 ++++- > 3 files changed, 31 insertions(+), 2 deletions(-) >=20 > diff --git a/drivers/gpu/drm/etnaviv/etnaviv_drv.c b/drivers/gpu/drm/etna= viv/etnaviv_drv.c > index 08aca9035fc1..a27ed014fb4e 100644 > --- a/drivers/gpu/drm/etnaviv/etnaviv_drv.c > +++ b/drivers/gpu/drm/etnaviv/etnaviv_drv.c > @@ -60,6 +60,19 @@ static void load_gpu(struct drm_device *dev) > } > } > =20 > +static void etnaviv_file_private_release(struct kref *kref) > +{ > + struct etnaviv_file_private *ctx =3D > + container_of(kref, struct etnaviv_file_private, refcount); > + > + kfree(ctx); > +} > + > +void etnaviv_file_private_put(struct etnaviv_file_private *ctx) > +{ > + kref_put(&ctx->refcount, etnaviv_file_private_release); > +} > + > static int etnaviv_open(struct drm_device *dev, struct drm_file *file) > { > struct etnaviv_drm_private *priv =3D dev->dev_private; > @@ -70,6 +83,8 @@ static int etnaviv_open(struct drm_device *dev, struct = drm_file *file) > if (!ctx) > return -ENOMEM; > =20 > + kref_init(&ctx->refcount); > + > ret =3D xa_alloc_cyclic(&priv->active_contexts, &ctx->id, ctx, > xa_limit_32b, &priv->next_context_id, GFP_KERNEL); > if (ret < 0) > @@ -120,7 +135,7 @@ static void etnaviv_postclose(struct drm_device *dev,= struct drm_file *file) > =20 > xa_erase(&priv->active_contexts, ctx->id); > =20 > - kfree(ctx); > + etnaviv_file_private_put(ctx); > } > =20 > /* > diff --git a/drivers/gpu/drm/etnaviv/etnaviv_drv.h b/drivers/gpu/drm/etna= viv/etnaviv_drv.h > index 55a9e745604d..cba4323ae589 100644 > --- a/drivers/gpu/drm/etnaviv/etnaviv_drv.h > +++ b/drivers/gpu/drm/etnaviv/etnaviv_drv.h > @@ -7,6 +7,7 @@ > #define __ETNAVIV_DRV_H__ > =20 > #include > +#include > #include > #include > #include > @@ -29,6 +30,7 @@ struct etnaviv_iommu_global; > #define ETNAVIV_SOFTPIN_START_ADDRESS SZ_4M /* must be >=3D SUBALLOC_SIZ= E */ > =20 > struct etnaviv_file_private { > + struct kref refcount; > int id; > struct etnaviv_iommu_context *mmu; > struct drm_sched_entity sched_entity[ETNA_MAX_PIPES]; > @@ -53,6 +55,15 @@ struct etnaviv_drm_private { > struct etnaviv_cmdbuf *flop_reset_data_ppu; > }; > =20 > +void etnaviv_file_private_put(struct etnaviv_file_private *ctx); > + > +static inline struct etnaviv_file_private * > +etnaviv_file_private_get(struct etnaviv_file_private *ctx) > +{ > + kref_get(&ctx->refcount); > + return ctx; > +} > + > int etnaviv_ioctl_gem_submit(struct drm_device *dev, void *data, > struct drm_file *file); > =20 > diff --git a/drivers/gpu/drm/etnaviv/etnaviv_gem_submit.c b/drivers/gpu/d= rm/etnaviv/etnaviv_gem_submit.c > index 1a77a09b3377..98f1f59a8b05 100644 > --- a/drivers/gpu/drm/etnaviv/etnaviv_gem_submit.c > +++ b/drivers/gpu/drm/etnaviv/etnaviv_gem_submit.c > @@ -398,6 +398,9 @@ static void submit_cleanup(struct kref *kref) > =20 > put_pid(submit->pid); > =20 > + if (submit->ctx) > + etnaviv_file_private_put(submit->ctx); > + > kfree(submit->pmrs); > kfree(submit); > } > @@ -526,7 +529,7 @@ int etnaviv_ioctl_gem_submit(struct drm_device *dev, = void *data, > if (ret) > goto err_submit_put; > =20 > - submit->ctx =3D file->driver_priv; > + submit->ctx =3D etnaviv_file_private_get(file->driver_priv); > submit->mmu_context =3D etnaviv_iommu_context_get(submit->ctx->mmu); > submit->exec_state =3D args->exec_state; > submit->flags =3D args->flags;