[Intel-gfx] [RFC v2] drm/i915: Engine discovery query
Lionel Landwerlin
lionel.g.landwerlin at intel.com
Mon Apr 16 14:50:54 UTC 2018
On 16/04/18 03:11, Tvrtko Ursulin wrote:
>
> On 11/04/2018 17:32, Lionel Landwerlin wrote:
>> Looks good to me, a few nits below.
>> I'll try to find some time to display this information in gputop.
>>
>> Reviewed-by: Lionel Landwerlin <lionel.g.landwerlin at intel.com>
>
> Thanks!
>
>> On 11/04/18 02:46, Tvrtko Ursulin wrote:
>>> From: Tvrtko Ursulin <tvrtko.ursulin at intel.com>
>>>
>>> Engine discovery query allows userspace to enumerate engines, probe
>>> their
>>> configuration features, all without needing to maintain the internal
>>> PCI
>>> ID based database.
>>>
>>> A new query for the generic i915 query ioctl is added named
>>> DRM_I915_QUERY_ENGINE_INFO, together with accompanying structure
>>> drm_i915_query_engine_info. The address of latter should be passed
>>> to the
>>> kernel in the query.data_ptr field, and should be large enough for the
>>> kernel to fill out all known engines as struct drm_i915_engine_info
>>> elements trailing the query.
>>>
>>> As with other queries, setting the item query length to zero allows
>>> userspace to query minimum required buffer size.
>>>
>>> Enumerated engines have common type mask which can be used to query all
>>> hardware engines, versus engines userspace can submit to using the
>>> execbuf
>>> uAPI.
>>>
>>> Engines also have capabilities which are per engine class namespace of
>>> bits describing features not present on all engine instances.
>>>
>>> v2:
>>> * Fixed HEVC assignment.
>>> * Reorder some fields, rename type to flags, increase width. (Lionel)
>>> * No need to allocate temporary storage if we do it engine by engine.
>>> (Lionel)
>>>
>>> Signed-off-by: Tvrtko Ursulin <tvrtko.ursulin at intel.com>
>>> Cc: Chris Wilson <chris at chris-wilson.co.uk>
>>> Cc: Jon Bloomfield <jon.bloomfield at intel.com>
>>> Cc: Dmitry Rogozhkin <dmitry.v.rogozhkin at intel.com>
>>> Cc: Lionel Landwerlin <lionel.g.landwerlin at intel.com>
>>> Cc: Joonas Lahtinen <joonas.lahtinen at linux.intel.com>
>>> ---
>>> This is RFC for now since it is not very usable before the new
>>> execbuf API
>>> or virtual engine queue submission gets closer.
>>>
>>> In this version I have added capability of distinguishing between
>>> hardware
>>> engines and ABI engines. This is to account for probable future use
>>> cases
>>> like virtualization, where guest might only see one engine instance,
>>> but
>>> will want to know overall hardware capabilities in order to tune its
>>> behaviour.
>>>
>>> In general I think we will have to wait a bit before defining the final
>>> look of the uAPI, but in the meantime I thought it useful to share
>>> as RFC.
>>> ---
>>> drivers/gpu/drm/i915/i915_query.c | 63
>>> +++++++++++++++++++++++++++++++++
>>> drivers/gpu/drm/i915/intel_engine_cs.c | 2 ++
>>> drivers/gpu/drm/i915/intel_ringbuffer.h | 3 ++
>>> include/uapi/drm/i915_drm.h | 46 ++++++++++++++++++++++++
>>> 4 files changed, 114 insertions(+)
>>>
>>> diff --git a/drivers/gpu/drm/i915/i915_query.c
>>> b/drivers/gpu/drm/i915/i915_query.c
>>> index 3ace929dd90f..a1c0e3acc882 100644
>>> --- a/drivers/gpu/drm/i915/i915_query.c
>>> +++ b/drivers/gpu/drm/i915/i915_query.c
>>> @@ -82,9 +82,72 @@ static int query_topology_info(struct
>>> drm_i915_private *dev_priv,
>>> return total_length;
>>> }
>>> +static int
>>> +query_engine_info(struct drm_i915_private *i915,
>>> + struct drm_i915_query_item *query_item)
>>> +{
>>> + struct drm_i915_query_engine_info __user *query_ptr =
>>> + u64_to_user_ptr(query_item->data_ptr);
>>> + struct drm_i915_engine_info __user *info_ptr =
>>> &query_ptr->engines[0];
>>> + struct drm_i915_query_engine_info query;
>>> + struct intel_engine_cs *engine;
>>> + enum intel_engine_id id;
>>> + int len;
>>> +
>>> + if (query_item->flags)
>>> + return -EINVAL;
>>> +
>>> + len = sizeof(struct drm_i915_query_engine_info) +
>>> + I915_NUM_ENGINES * sizeof(struct drm_i915_engine_info);
>>> +
>>> + if (!query_item->length)
>>> + return len;
>>> + else if (query_item->length < len)
>>> + return -EINVAL;
>>> +
>>> + if (copy_from_user(&query, query_ptr, sizeof(query)))
>>> + return -EFAULT;
>>> +
>>> + if (query.num_engines || query.rsvd[0] || query.rsvd[1] ||
>>> + query.rsvd[2])
>>> + return -EINVAL;
>>> +
>>> + if (!access_ok(VERIFY_WRITE, query_ptr, query_item->length))
>>
>> You could limit this to len ?
>
> I could, I am just wondering if you are leading somewhere with this
> suggestion like something I missed?
>
> Check against query_item->length has the semantics of "you told me you
> are giving me this big of a buffer, and I'll check if you were lying
> even if I won't use it all", versus check against len would be "I'll
> check only the part I'll write into, even if you told me buffer is
> bigger".
>
> The current check is a protecting userspace against more mistakes, but
> perhaps you are thinking about some tricks which would be possible by
> just checking len?
Cool, looks like you thought about everything :)
More information about the Intel-gfx
mailing list