Message ID | 20241118221948.1758130-1-christian.gmeiner@gmail.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | drm/v3d: Stop active perfmon if it is being destroyed | expand |
Hi Christian, On 18/11/24 19:19, Christian Gmeiner wrote: > From: Christian Gmeiner <cgmeiner@igalia.com> > > If the active performance monitor (v3d->active_perfmon) is being > destroyed, stop it first. Currently, the active perfmon is not > stopped during destruction, leaving the v3d->active_perfmon pointer > stale. This can lead to undefined behavior and instability. > > This patch ensures that the active perfmon is stopped before being > destroyed, aligning with the behavior introduced in commit > 7d1fd3638ee3 ("drm/v3d: Stop the active perfmon before being destroyed"). > > Cc: stable@vger.kernel.org # v5.15+ > Fixes: 26a4dc29b74a ("drm/v3d: Expose performance counters to userspace") > Signed-off-by: Christian Gmeiner <cgmeiner@igalia.com> Applied to misc/kernel.git (drm-misc-next). Maxime, Thomas, if possible, could you cherry-pick this commit to be included in 6.13? Thanks! Best Regards, - Maíra > --- > drivers/gpu/drm/v3d/v3d_perfmon.c | 5 +++++ > 1 file changed, 5 insertions(+) > > diff --git a/drivers/gpu/drm/v3d/v3d_perfmon.c b/drivers/gpu/drm/v3d/v3d_perfmon.c > index 00cd081d7873..909288d43f2f 100644 > --- a/drivers/gpu/drm/v3d/v3d_perfmon.c > +++ b/drivers/gpu/drm/v3d/v3d_perfmon.c > @@ -383,6 +383,7 @@ int v3d_perfmon_destroy_ioctl(struct drm_device *dev, void *data, > { > struct v3d_file_priv *v3d_priv = file_priv->driver_priv; > struct drm_v3d_perfmon_destroy *req = data; > + struct v3d_dev *v3d = v3d_priv->v3d; > struct v3d_perfmon *perfmon; > > mutex_lock(&v3d_priv->perfmon.lock); > @@ -392,6 +393,10 @@ int v3d_perfmon_destroy_ioctl(struct drm_device *dev, void *data, > if (!perfmon) > return -EINVAL; > > + /* If the active perfmon is being destroyed, stop it first */ > + if (perfmon == v3d->active_perfmon) > + v3d_perfmon_stop(v3d, perfmon, false); > + > v3d_perfmon_put(perfmon); > > return 0;
diff --git a/drivers/gpu/drm/v3d/v3d_perfmon.c b/drivers/gpu/drm/v3d/v3d_perfmon.c index 00cd081d7873..909288d43f2f 100644 --- a/drivers/gpu/drm/v3d/v3d_perfmon.c +++ b/drivers/gpu/drm/v3d/v3d_perfmon.c @@ -383,6 +383,7 @@ int v3d_perfmon_destroy_ioctl(struct drm_device *dev, void *data, { struct v3d_file_priv *v3d_priv = file_priv->driver_priv; struct drm_v3d_perfmon_destroy *req = data; + struct v3d_dev *v3d = v3d_priv->v3d; struct v3d_perfmon *perfmon; mutex_lock(&v3d_priv->perfmon.lock); @@ -392,6 +393,10 @@ int v3d_perfmon_destroy_ioctl(struct drm_device *dev, void *data, if (!perfmon) return -EINVAL; + /* If the active perfmon is being destroyed, stop it first */ + if (perfmon == v3d->active_perfmon) + v3d_perfmon_stop(v3d, perfmon, false); + v3d_perfmon_put(perfmon); return 0;