[Intel-gfx] [PATCH v7 13/63] drm/i915: Reject more ioctls for userptr

Maarten Lankhorst maarten.lankhorst at linux.intel.com
Fri Jan 29 11:42:41 UTC 2021


Op 28-01-2021 om 17:47 schreef Jason Ekstrand:
> On Thu, Jan 28, 2021 at 10:26 AM Maarten Lankhorst
> <maarten.lankhorst at linux.intel.com> wrote:
>> There are a couple of ioctl's related to tiling and cache placement,
>> that make no sense for userptr, reject those:
>> - i915_gem_set_tiling_ioctl()
>>     Tiling should always be linear for userptr. Changing placement will
>>     fail with -ENXIO.
>> - i915_gem_set_caching_ioctl()
>>     Userptr memory should always be cached. Changing caching mode will
>>     fail with -ENXIO.
>> - i915_gem_set_domain_ioctl()
>>     Changed to be equivalent to gem_wait, which is correct for the
>>     cached linear userptr pointers. This is required because we
>>     cannot grab a reference to the pages in the rework, but waiting
>>     for idle will do the same.
>>
>> This plus the previous changes have been tested against beignet
>> by using its own unit tests, and intel-video-compute by using
>> piglit's opencl tests.
> Did you test against mesa at all?

I tested it and also looked at the code for manual inspection.

Unfortunately rechecking one more time, it seems I missed bo_alloc_internal in mesa. Fortunately it seems not to be capable of allocating userptr.

As far as I can tell, that means the changes to mesa are safe.

I tried to run parts of the vulkan cts as well, but it crashed after a while against my distro's vulkan package for non userptr related reasons.

~Maarten

>> Signed-off-by: Maarten Lankhorst <maarten.lankhorst at linux.intel.com>
>> Reviewed-by: Thomas Hellström <thomas.hellstrom at linux.intel.com>
>> Cc: Jason Ekstrand <jason at jlekstrand.net>
>>
>> -- Still needs an ack from relevant userspace that it won't break, but should be good.
>> ---
>>  drivers/gpu/drm/i915/display/intel_display.c |  2 +-
>>  drivers/gpu/drm/i915/gem/i915_gem_domain.c   | 12 ++++++++++--
>>  drivers/gpu/drm/i915/gem/i915_gem_object.h   |  6 ++++++
>>  drivers/gpu/drm/i915/gem/i915_gem_userptr.c  |  3 ++-
>>  4 files changed, 19 insertions(+), 4 deletions(-)
>>
>> diff --git a/drivers/gpu/drm/i915/display/intel_display.c b/drivers/gpu/drm/i915/display/intel_display.c
>> index d013b0fab128..3e24db8b9ad6 100644
>> --- a/drivers/gpu/drm/i915/display/intel_display.c
>> +++ b/drivers/gpu/drm/i915/display/intel_display.c
>> @@ -14172,7 +14172,7 @@ static int intel_user_framebuffer_create_handle(struct drm_framebuffer *fb,
>>         struct drm_i915_gem_object *obj = intel_fb_obj(fb);
>>         struct drm_i915_private *i915 = to_i915(obj->base.dev);
>>
>> -       if (obj->userptr.mm) {
>> +       if (i915_gem_object_is_userptr(obj)) {
>>                 drm_dbg(&i915->drm,
>>                         "attempting to use a userptr for a framebuffer, denied\n");
>>                 return -EINVAL;
>> diff --git a/drivers/gpu/drm/i915/gem/i915_gem_domain.c b/drivers/gpu/drm/i915/gem/i915_gem_domain.c
>> index 36f54cedaaeb..3078e9a09f70 100644
>> --- a/drivers/gpu/drm/i915/gem/i915_gem_domain.c
>> +++ b/drivers/gpu/drm/i915/gem/i915_gem_domain.c
>> @@ -335,7 +335,13 @@ int i915_gem_set_caching_ioctl(struct drm_device *dev, void *data,
>>          * not allowed to be changed by userspace.
>>          */
>>         if (i915_gem_object_is_proxy(obj)) {
>> -               ret = -ENXIO;
>> +               /*
>> +                * Silently allow cached for userptr; the vulkan driver
>> +                * sets all objects to cached
>> +                */
>> +               if (!i915_gem_object_is_userptr(obj) ||
>> +                   args->caching != I915_CACHING_CACHED)
> Thanks for looking out for this case.  I just double-checked and, yes,
> we set caching on userptr but we always set it to CACHED so this
> should take care of us, assuming it does what it looks like it does.
>
> Acked-by: Jason Ekstrand <jason at jlekstrand.net>
>
>> +                       ret = -ENXIO;
>>                 goto out;
>>         }
>>
>> @@ -533,7 +539,9 @@ i915_gem_set_domain_ioctl(struct drm_device *dev, void *data,
>>          * considered to be outside of any cache domain.
>>          */
>>         if (i915_gem_object_is_proxy(obj)) {
>> -               err = -ENXIO;
>> +               /* silently allow userptr to complete */
>> +               if (!i915_gem_object_is_userptr(obj))
>> +                       err = -ENXIO;
>>                 goto out;
>>         }
>>
>> diff --git a/drivers/gpu/drm/i915/gem/i915_gem_object.h b/drivers/gpu/drm/i915/gem/i915_gem_object.h
>> index e9a8ee96d64c..3f300a1d27ba 100644
>> --- a/drivers/gpu/drm/i915/gem/i915_gem_object.h
>> +++ b/drivers/gpu/drm/i915/gem/i915_gem_object.h
>> @@ -574,6 +574,12 @@ void __i915_gem_object_flush_frontbuffer(struct drm_i915_gem_object *obj,
>>  void __i915_gem_object_invalidate_frontbuffer(struct drm_i915_gem_object *obj,
>>                                               enum fb_op_origin origin);
>>
>> +static inline bool
>> +i915_gem_object_is_userptr(struct drm_i915_gem_object *obj)
>> +{
>> +       return obj->userptr.mm;
>> +}
>> +
>>  static inline void
>>  i915_gem_object_flush_frontbuffer(struct drm_i915_gem_object *obj,
>>                                   enum fb_op_origin origin)
>> diff --git a/drivers/gpu/drm/i915/gem/i915_gem_userptr.c b/drivers/gpu/drm/i915/gem/i915_gem_userptr.c
>> index 0c30ca52dee3..c89cf911fb29 100644
>> --- a/drivers/gpu/drm/i915/gem/i915_gem_userptr.c
>> +++ b/drivers/gpu/drm/i915/gem/i915_gem_userptr.c
>> @@ -721,7 +721,8 @@ static const struct drm_i915_gem_object_ops i915_gem_userptr_ops = {
>>         .name = "i915_gem_object_userptr",
>>         .flags = I915_GEM_OBJECT_IS_SHRINKABLE |
>>                  I915_GEM_OBJECT_NO_MMAP |
>> -                I915_GEM_OBJECT_ASYNC_CANCEL,
>> +                I915_GEM_OBJECT_ASYNC_CANCEL |
>> +                I915_GEM_OBJECT_IS_PROXY,
>>         .get_pages = i915_gem_userptr_get_pages,
>>         .put_pages = i915_gem_userptr_put_pages,
>>         .dmabuf_export = i915_gem_userptr_dmabuf_export,
>> --
>> 2.30.0
>>



More information about the Intel-gfx mailing list