hrtimer_cancel(&stream->poll_check_timer);
}
-static void xe_oa_enable_locked(struct xe_oa_stream *stream)
+static int xe_oa_enable_locked(struct xe_oa_stream *stream)
{
if (stream->enabled)
- return;
-
- stream->enabled = true;
+ return 0;
xe_oa_stream_enable(stream);
+
+ stream->enabled = true;
+ return 0;
}
-static void xe_oa_disable_locked(struct xe_oa_stream *stream)
+static int xe_oa_disable_locked(struct xe_oa_stream *stream)
{
if (!stream->enabled)
- return;
-
- stream->enabled = false;
+ return 0;
xe_oa_stream_disable(stream);
+
+ stream->enabled = false;
+ return 0;
}
static long xe_oa_config_locked(struct xe_oa_stream *stream, u64 arg)
{
switch (cmd) {
case DRM_XE_PERF_IOCTL_ENABLE:
- xe_oa_enable_locked(stream);
- return 0;
+ return xe_oa_enable_locked(stream);
case DRM_XE_PERF_IOCTL_DISABLE:
- xe_oa_disable_locked(stream);
- return 0;
+ return xe_oa_disable_locked(stream);
case DRM_XE_PERF_IOCTL_CONFIG:
return xe_oa_config_locked(stream, arg);
case DRM_XE_PERF_IOCTL_STATUS:
if (ret)
goto err_free;
+ if (!param->disabled) {
+ ret = xe_oa_enable_locked(stream);
+ if (ret)
+ goto err_destroy;
+ }
+
stream_fd = anon_inode_getfd("[xe_oa]", &xe_oa_fops, stream, 0);
if (stream_fd < 0) {
ret = stream_fd;
- goto err_destroy;
+ goto err_disable;
}
- if (!param->disabled)
- xe_oa_enable_locked(stream);
-
/* Hold a reference on the drm device till stream_fd is released */
drm_dev_get(&stream->oa->xe->drm);
return stream_fd;
+err_disable:
+ if (!param->disabled)
+ xe_oa_disable_locked(stream);
err_destroy:
xe_oa_stream_destroy(stream);
err_free: