On Thu, Aug 26, 2021 at 10:01:18AM +0800, Desmond Cheong Zhi Xi wrote:
> In a future patch, a read lock on drm_device.master_rwsem is
> held in the ioctl handler before the check for ioctl
> permissions. However, this inverts the lock hierarchy of
> drm_global_mutex --> master_rwsem.
> 
> To avoid this, we do some prep work to grab the drm_global_mutex
> before checking for ioctl permissions.
> 
> Signed-off-by: Desmond Cheong Zhi Xi <desmondcheon...@gmail.com>
> ---
>  drivers/gpu/drm/drm_ioctl.c | 18 +++++++++---------
>  1 file changed, 9 insertions(+), 9 deletions(-)
> 
> diff --git a/drivers/gpu/drm/drm_ioctl.c b/drivers/gpu/drm/drm_ioctl.c
> index d25713b09b80..158629d88319 100644
> --- a/drivers/gpu/drm/drm_ioctl.c
> +++ b/drivers/gpu/drm/drm_ioctl.c
> @@ -772,19 +772,19 @@ long drm_ioctl_kernel(struct file *file, drm_ioctl_t 
> *func, void *kdata,
>       if (drm_dev_is_unplugged(dev))
>               return -ENODEV;
>  
> +     /* Enforce sane locking for modern driver ioctls. */
> +     if (unlikely(drm_core_check_feature(dev, DRIVER_LEGACY)) && !(flags & 
> DRM_UNLOCKED))

Maybe have a local bool locked_ioctl for this so it's extremely clear it's
the same condition in both?

Either way: Reviewed-by: Daniel Vetter <daniel.vet...@ffwll.ch>

> +             mutex_lock(&drm_global_mutex);
> +
>       retcode = drm_ioctl_permit(flags, file_priv);
>       if (unlikely(retcode))
> -             return retcode;
> +             goto out;
>  
> -     /* Enforce sane locking for modern driver ioctls. */
> -     if (likely(!drm_core_check_feature(dev, DRIVER_LEGACY)) ||
> -         (flags & DRM_UNLOCKED))
> -             retcode = func(dev, kdata, file_priv);
> -     else {
> -             mutex_lock(&drm_global_mutex);
> -             retcode = func(dev, kdata, file_priv);
> +     retcode = func(dev, kdata, file_priv);
> +
> +out:
> +     if (unlikely(drm_core_check_feature(dev, DRIVER_LEGACY)) && !(flags & 
> DRM_UNLOCKED))
>               mutex_unlock(&drm_global_mutex);
> -     }
>       return retcode;
>  }
>  EXPORT_SYMBOL(drm_ioctl_kernel);
> -- 
> 2.25.1
> 

-- 
Daniel Vetter
Software Engineer, Intel Corporation
http://blog.ffwll.ch

Reply via email to