[PATCH] drm/vgem: Allow root to inject hanging fences onto dmabufs

Kristian Høgsberg krh at bitplanet.net
Wed Jul 20 23:28:40 UTC 2016


Why is this useful if only root can use it?

Kristian

On Wed, Jul 20, 2016 at 12:39 PM, Chris Wilson <chris at chris-wilson.co.uk> wrote:
> When performing driver testing, one factor we want to test is how we
> handle a foreign fence that is never signaled. We can wait on that fence
> indefinitely, in which case the driver appears hung, or we can take some
> remedial action (with risks regarding the state of any shared content).
> Whatever the action choosen by the driver, in order to perform the test
> we want to disable the safety feature of vgem fence (which is then used
> to test implicit dma-buf fencing). This is regarded as a highly
> dangerous feature and so hidden behind an expert config option and only
> available to root when enabled.
>
> Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
> ---
>  drivers/gpu/drm/Kconfig           | 13 +++++++++++++
>  drivers/gpu/drm/vgem/vgem_fence.c | 14 ++++++++++++--
>  include/uapi/drm/vgem_drm.h       |  1 +
>  3 files changed, 26 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/gpu/drm/Kconfig b/drivers/gpu/drm/Kconfig
> index fc357319de35..2b25bc38fad2 100644
> --- a/drivers/gpu/drm/Kconfig
> +++ b/drivers/gpu/drm/Kconfig
> @@ -228,6 +228,19 @@ config DRM_VGEM
>           as used by Mesa's software renderer for enhanced performance.
>           If M is selected the module will be called vgem.
>
> +config DRM_VGEM_FENCE_HANG
> +       bool "Enable fence hang testing (DANGEROUS)"
> +       depends on DRM_VGEM
> +       depends on EXPERT
> +       depends on !COMPILE_TEST
> +       default n
> +       help
> +         Enables support for root to use indefinite fences.
> +         Do not enable this unless you are testing DRM drivers.
> +
> +         Recommended for driver developers only.
> +
> +         If in doubt, say "N".
>
>  source "drivers/gpu/drm/exynos/Kconfig"
>
> diff --git a/drivers/gpu/drm/vgem/vgem_fence.c b/drivers/gpu/drm/vgem/vgem_fence.c
> index 5c57c1ffa1f9..91d3d75fc9c5 100644
> --- a/drivers/gpu/drm/vgem/vgem_fence.c
> +++ b/drivers/gpu/drm/vgem/vgem_fence.c
> @@ -107,7 +107,8 @@ static struct fence *vgem_fence_create(struct vgem_file *vfile,
>         setup_timer(&fence->timer, vgem_fence_timeout, (unsigned long)fence);
>
>         /* We force the fence to expire within 10s to prevent driver hangs */
> -       mod_timer(&fence->timer, jiffies + VGEM_FENCE_TIMEOUT);
> +       if ((flags & VGEM_FENCE_NOTIMEOUT) == 0)
> +               mod_timer(&fence->timer, jiffies + VGEM_FENCE_TIMEOUT);
>
>         return &fence->base;
>  }
> @@ -160,9 +161,18 @@ int vgem_fence_attach_ioctl(struct drm_device *dev,
>         struct fence *fence;
>         int ret;
>
> -       if (arg->flags & ~VGEM_FENCE_WRITE)
> +       if (arg->flags & ~(VGEM_FENCE_WRITE | VGEM_FENCE_NOTIMEOUT))
>                 return -EINVAL;
>
> +       if (arg->flags & VGEM_FENCE_NOTIMEOUT) {
> +               if (config_enabled(CONFIG_DRM_VGEM_FENCE_HANG)) {
> +                       if (!capable(CAP_SYS_ADMIN))
> +                               return -EPERM;
> +               } else {
> +                       return -EINVAL;
> +               }
> +       }
> +
>         if (arg->pad)
>                 return -EINVAL;
>
> diff --git a/include/uapi/drm/vgem_drm.h b/include/uapi/drm/vgem_drm.h
> index bf66f5db6da8..55fd08750773 100644
> --- a/include/uapi/drm/vgem_drm.h
> +++ b/include/uapi/drm/vgem_drm.h
> @@ -46,6 +46,7 @@ struct drm_vgem_fence_attach {
>         __u32 handle;
>         __u32 flags;
>  #define VGEM_FENCE_WRITE       0x1
> +#define VGEM_FENCE_NOTIMEOUT   0x2
>         __u32 out_fence;
>         __u32 pad;
>  };
> --
> 2.8.1
>
> _______________________________________________
> dri-devel mailing list
> dri-devel at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/dri-devel


More information about the dri-devel mailing list