[Intel-gfx] [PATCH 28/38] drm/i915: Create/destroy VM (ppGTT) for use with contexts

Tvrtko Ursulin tvrtko.ursulin at linux.intel.com
Wed Jan 23 12:03:58 UTC 2019


On 23/01/2019 11:51, Chris Wilson wrote:
> Quoting Tvrtko Ursulin (2019-01-23 11:30:39)
>>> +int i915_gem_vm_create_ioctl(struct drm_device *dev, void *data,
>>> +                          struct drm_file *file)
>>> +{
>>> +     struct drm_i915_private *i915 = to_i915(dev);
>>> +     struct drm_i915_gem_vm_create *args = data;
>>> +     struct drm_i915_file_private *file_priv = file->driver_priv;
>>> +     struct i915_hw_ppgtt *ppgtt;
>>> +     int err;
>>> +
>>> +     if (!HAS_FULL_PPGTT(i915))
>>> +             return -ENODEV;
>>> +
>>> +     if (args->flags)
>>> +             return -EINVAL;
>>> +
>>> +     if (args->extensions)
>>> +             return -EINVAL;
>>> +
>>> +     ppgtt = i915_ppgtt_create(i915, file_priv);
>>> +     if (IS_ERR(ppgtt))
>>> +             return PTR_ERR(ppgtt);
>>> +
>>> +     err = mutex_lock_interruptible(&file_priv->vm_lock);
>>> +     if (err)
>>> +             goto err_put;
>>> +
>>> +     err = idr_alloc(&file_priv->vm_idr, ppgtt, 0, 0, GFP_KERNEL);
>>> +     mutex_unlock(&file_priv->vm_lock);
>>> +     if (err < 0)
>>> +             goto err_put;
>>
>>          else if (GEM_WARN_ON(err == 0) {
>>                  err = -EINVAL;
>>                  goto err_put;
>>          }
>>
>> ?
>>
>> Or a GEM_BUG_ON(err == 0) if you must. :)
> 
> Not our bug :) We told it never to return 0.
> 
>>> +
>>> +     ppgtt->user_handle = err;
>>> +     args->id = err;
>>> +     return 0;
>>> +
>>> +err_put:
>>> +     i915_ppgtt_put(ppgtt);
>>> +     return err;
>>> +}
>>> +
>>> +int i915_gem_vm_destroy_ioctl(struct drm_device *dev, void *data,
>>
>> Can we cheat and declare data as u32 * here and so avoid need for the
>> local, since there are only two dereferences?
> 
> Tempting, we need to cook up the macros to hide the function pointer
> differences for the ioctl tables.

Probably not then, I was hoping that we could get away with function 
declaration and definition not being exactly the same and that would be 
all that's needed. If not never mind.

Regards,

Tvrtko

>>> +                           struct drm_file *file)
>>> +{
>>> +     struct drm_i915_file_private *file_priv = file->driver_priv;
>>> +     struct i915_hw_ppgtt *ppgtt;
>>> +     int err;
>>> +     u32 id;
>>> +
>>> +     id = *(u32 *)data;
> 
> Oh crikey, did I write this?
> 
> Remember, do it right the first time as I won't remember when I was
> cutting corners.
> 
>>> +     if (!id)
>>> +             return -ENOENT;
>>> +
>>> +     err = mutex_lock_interruptible(&file_priv->vm_lock);
>>> +     if (err)
>>> +             return err;
>>> +
>>> +     ppgtt = idr_remove(&file_priv->vm_idr, id);
>>> +     if (ppgtt)
>>
>> GEM_WARN_ON(id != ppgtt->user_handle) too much paranoia?
> 
> BUG_ON then!
> 
>>> +             ppgtt->user_handle = 0;
>>> +
>>> +     mutex_unlock(&file_priv->vm_lock);
>>> +     if (!ppgtt)
>>> +             return -ENOENT;
>>> +
>>> +     i915_ppgtt_put(ppgtt);
>>> +     return 0;
>>
>> Or end with simply:
>>
>> i915_ppgtt_put(ppgtt);
>>
>> return ppgtt ? 0 : -ENOENT;
>>
>> ?
> 
> I feel a slight disappointment at the anticlimatic nature of this
> function, leaving a gap, nay, a yearning, for more.
> -Chris
> 


More information about the Intel-gfx mailing list