Message ID | 20250325114306.3740022-3-maciej.falkowski@linux.intel.com (mailing list archive) |
---|---|
State | New |
Headers | show |
Series | PM fixes in Metric Steamer code | expand |
On 3/25/25 04:43, Maciej Falkowski wrote: > From: Jacek Lawrynowicz <jacek.lawrynowicz@linux.intel.com> > > Prevent runtime resume/suspend while MS IOCTLs are in progress. > Failed suspend will call ivpu_ms_cleanup() that would try to acquire > file_priv->ms_lock, which is already held by the IOCTLs. > > Fixes: cdfad4db7756 ("accel/ivpu: Add NPU profiling support") > Cc: <stable@vger.kernel.org> # v6.11+ > Signed-off-by: Jacek Lawrynowicz <jacek.lawrynowicz@linux.intel.com> > Signed-off-by: Maciej Falkowski <maciej.falkowski@linux.intel.com> > --- > drivers/accel/ivpu/ivpu_debugfs.c | 4 ++-- > drivers/accel/ivpu/ivpu_ms.c | 18 ++++++++++++++++++ > 2 files changed, 20 insertions(+), 2 deletions(-) > > diff --git a/drivers/accel/ivpu/ivpu_debugfs.c b/drivers/accel/ivpu/ivpu_debugfs.c > index 0825851656a2..f0dad0c9ce33 100644 > --- a/drivers/accel/ivpu/ivpu_debugfs.c > +++ b/drivers/accel/ivpu/ivpu_debugfs.c > @@ -332,7 +332,7 @@ ivpu_force_recovery_fn(struct file *file, const char __user *user_buf, size_t si > return -EINVAL; > > ret = ivpu_rpm_get(vdev); > - if (ret) > + if (ret < 0) > return ret; > > ivpu_pm_trigger_recovery(vdev, "debugfs"); > @@ -383,7 +383,7 @@ static int dct_active_set(void *data, u64 active_percent) > return -EINVAL; > > ret = ivpu_rpm_get(vdev); > - if (ret) > + if (ret < 0) > return ret; > > if (active_percent) > diff --git a/drivers/accel/ivpu/ivpu_ms.c b/drivers/accel/ivpu/ivpu_ms.c > index eb485cf15ad6..2a043baf10ca 100644 > --- a/drivers/accel/ivpu/ivpu_ms.c > +++ b/drivers/accel/ivpu/ivpu_ms.c > @@ -45,6 +45,10 @@ int ivpu_ms_start_ioctl(struct drm_device *dev, void *data, struct drm_file *fil > args->sampling_period_ns < MS_MIN_SAMPLE_PERIOD_NS) > return -EINVAL; > > + ret = ivpu_rpm_get(vdev); > + if (ret < 0) > + return ret; > + > mutex_lock(&file_priv->ms_lock); > > if (get_instance_by_mask(file_priv, args->metric_group_mask)) { > @@ -97,6 +101,8 @@ int ivpu_ms_start_ioctl(struct drm_device *dev, void *data, struct drm_file *fil > kfree(ms); > unlock: > mutex_unlock(&file_priv->ms_lock); > + > + ivpu_rpm_put(vdev); > return ret; > } > > @@ -161,6 +167,10 @@ int ivpu_ms_get_data_ioctl(struct drm_device *dev, void *data, struct drm_file * > if (!args->metric_group_mask) > return -EINVAL; > > + ret = ivpu_rpm_get(vdev); > + if (ret < 0) > + return ret; > + > mutex_lock(&file_priv->ms_lock); > > ms = get_instance_by_mask(file_priv, args->metric_group_mask); > @@ -188,6 +198,7 @@ int ivpu_ms_get_data_ioctl(struct drm_device *dev, void *data, struct drm_file * > unlock: > mutex_unlock(&file_priv->ms_lock); > > + ivpu_rpm_put(vdev); > return ret; > } > > @@ -205,11 +216,17 @@ int ivpu_ms_stop_ioctl(struct drm_device *dev, void *data, struct drm_file *file > { > struct ivpu_file_priv *file_priv = file->driver_priv; > struct drm_ivpu_metric_streamer_stop *args = data; > + struct ivpu_device *vdev = file_priv->vdev; > struct ivpu_ms_instance *ms; > + int ret; > > if (!args->metric_group_mask) > return -EINVAL; > > + ret = ivpu_rpm_get(vdev); > + if (ret < 0) > + return ret; > + > mutex_lock(&file_priv->ms_lock); > > ms = get_instance_by_mask(file_priv, args->metric_group_mask); > @@ -218,6 +235,7 @@ int ivpu_ms_stop_ioctl(struct drm_device *dev, void *data, struct drm_file *file > > mutex_unlock(&file_priv->ms_lock); > > + ivpu_rpm_put(vdev); Reviewed-by: Lizhi Hou <lizhi.hou@amd.com> > return ms ? 0 : -EINVAL; > } >
diff --git a/drivers/accel/ivpu/ivpu_debugfs.c b/drivers/accel/ivpu/ivpu_debugfs.c index 0825851656a2..f0dad0c9ce33 100644 --- a/drivers/accel/ivpu/ivpu_debugfs.c +++ b/drivers/accel/ivpu/ivpu_debugfs.c @@ -332,7 +332,7 @@ ivpu_force_recovery_fn(struct file *file, const char __user *user_buf, size_t si return -EINVAL; ret = ivpu_rpm_get(vdev); - if (ret) + if (ret < 0) return ret; ivpu_pm_trigger_recovery(vdev, "debugfs"); @@ -383,7 +383,7 @@ static int dct_active_set(void *data, u64 active_percent) return -EINVAL; ret = ivpu_rpm_get(vdev); - if (ret) + if (ret < 0) return ret; if (active_percent) diff --git a/drivers/accel/ivpu/ivpu_ms.c b/drivers/accel/ivpu/ivpu_ms.c index eb485cf15ad6..2a043baf10ca 100644 --- a/drivers/accel/ivpu/ivpu_ms.c +++ b/drivers/accel/ivpu/ivpu_ms.c @@ -45,6 +45,10 @@ int ivpu_ms_start_ioctl(struct drm_device *dev, void *data, struct drm_file *fil args->sampling_period_ns < MS_MIN_SAMPLE_PERIOD_NS) return -EINVAL; + ret = ivpu_rpm_get(vdev); + if (ret < 0) + return ret; + mutex_lock(&file_priv->ms_lock); if (get_instance_by_mask(file_priv, args->metric_group_mask)) { @@ -97,6 +101,8 @@ int ivpu_ms_start_ioctl(struct drm_device *dev, void *data, struct drm_file *fil kfree(ms); unlock: mutex_unlock(&file_priv->ms_lock); + + ivpu_rpm_put(vdev); return ret; } @@ -161,6 +167,10 @@ int ivpu_ms_get_data_ioctl(struct drm_device *dev, void *data, struct drm_file * if (!args->metric_group_mask) return -EINVAL; + ret = ivpu_rpm_get(vdev); + if (ret < 0) + return ret; + mutex_lock(&file_priv->ms_lock); ms = get_instance_by_mask(file_priv, args->metric_group_mask); @@ -188,6 +198,7 @@ int ivpu_ms_get_data_ioctl(struct drm_device *dev, void *data, struct drm_file * unlock: mutex_unlock(&file_priv->ms_lock); + ivpu_rpm_put(vdev); return ret; } @@ -205,11 +216,17 @@ int ivpu_ms_stop_ioctl(struct drm_device *dev, void *data, struct drm_file *file { struct ivpu_file_priv *file_priv = file->driver_priv; struct drm_ivpu_metric_streamer_stop *args = data; + struct ivpu_device *vdev = file_priv->vdev; struct ivpu_ms_instance *ms; + int ret; if (!args->metric_group_mask) return -EINVAL; + ret = ivpu_rpm_get(vdev); + if (ret < 0) + return ret; + mutex_lock(&file_priv->ms_lock); ms = get_instance_by_mask(file_priv, args->metric_group_mask); @@ -218,6 +235,7 @@ int ivpu_ms_stop_ioctl(struct drm_device *dev, void *data, struct drm_file *file mutex_unlock(&file_priv->ms_lock); + ivpu_rpm_put(vdev); return ms ? 0 : -EINVAL; }