[Intel-gfx] [PATCH v7 4/4] drm/i915/perf: enable filtering on multiple contexts
Joonas Lahtinen
joonas.lahtinen at linux.intel.com
Thu Apr 30 13:04:53 UTC 2020
Quoting Lionel Landwerlin (2020-04-28 13:08:16)
> Add 2 new properties to the i915-perf open ioctl to specify an array
> of GEM context handles as well as the length of the array.
>
> This can be used by drivers using multiple GEM contexts to implement a
> single GL context.
>
> Signed-off-by: Lionel Landwerlin <lionel.g.landwerlin at intel.com>
Do add link to the userspace changes in the actual patch so that it
is preserved at merge time, not only the cover letter.
Regards, Joonas
> ---
> drivers/gpu/drm/i915/i915_perf.c | 58 ++++++++++++++++++++++++++++++--
> include/uapi/drm/i915_drm.h | 21 ++++++++++++
> 2 files changed, 76 insertions(+), 3 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/i915_perf.c b/drivers/gpu/drm/i915/i915_perf.c
> index 79f68efd7d5b..e236d2a8720b 100644
> --- a/drivers/gpu/drm/i915/i915_perf.c
> +++ b/drivers/gpu/drm/i915/i915_perf.c
> @@ -3686,7 +3686,8 @@ static int read_properties_unlocked(struct i915_perf *perf,
> struct perf_open_properties *props)
> {
> u64 __user *uprop = uprops;
> - u32 i;
> + u32 __user *uctx_handles = NULL;
> + u32 i, n_uctx_handles = 0;
> int err;
>
> memset(props, 0, sizeof(struct perf_open_properties));
> @@ -3737,7 +3738,7 @@ static int read_properties_unlocked(struct i915_perf *perf,
>
> switch ((enum drm_i915_perf_property_id)id) {
> case DRM_I915_PERF_PROP_CTX_HANDLE:
> - if (props->n_ctx_handles > 0) {
> + if (props->n_ctx_handles > 0 || n_uctx_handles > 0) {
> DRM_DEBUG("Context handle specified multiple times\n");
> err = -EINVAL;
> goto error;
> @@ -3851,6 +3852,38 @@ static int read_properties_unlocked(struct i915_perf *perf,
> }
> props->poll_oa_period = value;
> break;
> + case DRM_I915_PERF_PROP_CTX_HANDLE_ARRAY:
> + /* HSW can only filter in HW and only on a single
> + * context.
> + */
> + if (IS_HASWELL(perf->i915)) {
> + DRM_DEBUG("Multi context filter not supported on HSW\n");
> + err = -ENODEV;
> + goto error;
> + }
> + uctx_handles = u64_to_user_ptr(value);
> + break;
> + case DRM_I915_PERF_PROP_CTX_HANDLE_ARRAY_LENGTH:
> + if (IS_HASWELL(perf->i915)) {
> + DRM_DEBUG("Multi context filter not supported on HSW\n");
> + err = -ENODEV;
> + goto error;
> + }
> + if (props->n_ctx_handles > 0 || n_uctx_handles > 0) {
> + DRM_DEBUG("Context handle specified multiple times\n");
> + err = -EINVAL;
> + goto error;
> + }
> + props->ctx_handles =
> + kmalloc_array(value,
> + sizeof(*props->ctx_handles),
> + GFP_KERNEL);
> + if (!props->ctx_handles) {
> + err = -ENOMEM;
> + goto error;
> + }
> + n_uctx_handles = value;
> + break;
> case DRM_I915_PERF_PROP_MAX:
> MISSING_CASE(id);
> err = -EINVAL;
> @@ -3860,6 +3893,21 @@ static int read_properties_unlocked(struct i915_perf *perf,
> uprop += 2;
> }
>
> + if (n_uctx_handles > 0 && props->n_ctx_handles > 0) {
> + DRM_DEBUG("Context handle specified multiple times\n");
> + err = -EINVAL;
> + goto error;
> + }
> +
> + for (i = 0; i < n_uctx_handles; i++) {
> + err = get_user(props->ctx_handles[i], uctx_handles);
> + if (err)
> + goto error;
> +
> + uctx_handles++;
> + props->n_ctx_handles++;
> + }
> +
> return 0;
>
> error:
> @@ -4643,8 +4691,12 @@ int i915_perf_ioctl_version(void)
> *
> * 5: Add DRM_I915_PERF_PROP_POLL_OA_PERIOD parameter that controls the
> * interval for the hrtimer used to check for OA data.
> + *
> + * 6: Add DRM_I915_PERF_PROP_CTX_HANDLE_ARRAY &
> + * DRM_I915_PERF_PROP_CTX_HANDLE_ARRAY_LENGTH to allow an
> + * application monitor/pin multiple contexts.
> */
> - return 5;
> + return 6;
> }
>
> #if IS_ENABLED(CONFIG_DRM_I915_SELFTEST)
> diff --git a/include/uapi/drm/i915_drm.h b/include/uapi/drm/i915_drm.h
> index 14b67cd6b54b..f80e7932d728 100644
> --- a/include/uapi/drm/i915_drm.h
> +++ b/include/uapi/drm/i915_drm.h
> @@ -1993,6 +1993,27 @@ enum drm_i915_perf_property_id {
> */
> DRM_I915_PERF_PROP_POLL_OA_PERIOD,
>
> + /**
> + * Specifies an array of u32 GEM context handles to filter reports
> + * with.
> + *
> + * Using this parameter is incompatible with using
> + * DRM_I915_PERF_PROP_CTX_HANDLE.
> + *
> + * This property is available in perf revision 6.
> + */
> + DRM_I915_PERF_PROP_CTX_HANDLE_ARRAY,
> +
> + /**
> + * Specifies the length of the array specified with
> + * DRM_I915_PERF_PROP_CTX_HANDLE_ARRAY.
> + *
> + * The length must be in the range [1, 4].
> + *
> + * This property is available in perf revision 6.
> + */
> + DRM_I915_PERF_PROP_CTX_HANDLE_ARRAY_LENGTH,
> +
> DRM_I915_PERF_PROP_MAX /* non-ABI */
> };
>
> --
> 2.26.2
>
More information about the Intel-gfx
mailing list