[Intel-gfx] [PATCH 1/1] drm/i915: Start disabling pread/pwrite ioctl's for future platforms

Jason Ekstrand jason at jlekstrand.net
Wed Mar 10 21:37:50 UTC 2021


On Fri, Jan 22, 2021 at 4:40 PM Ashutosh Dixit <ashutosh.dixit at intel.com> wrote:
>
> The guidance for i915 at this time is to start phasing out pread/pwrite
> ioctl's, the rationale being (a) the functionality can be done entirely in
> userspace with a combination of mmap + memcpy, and (b) no existing user
> mode clients actually use the pread/pwrite interface.
>
> In this patch we disable these ioctls for dGfx platforms with the
> expectation that this will be done for all future platforms (both discrete
> and integrated). IGT changes which handle this kernel change have also been
> submitted [1].
>
> [1] https://patchwork.freedesktop.org/series/81384/
>
> Signed-off-by: Ashutosh Dixit <ashutosh.dixit at intel.com>
> ---
>  drivers/gpu/drm/i915/i915_drv.h          | 1 +
>  drivers/gpu/drm/i915/i915_gem.c          | 6 ++++++
>  drivers/gpu/drm/i915/i915_pci.c          | 3 ++-
>  drivers/gpu/drm/i915/intel_device_info.h | 1 +
>  4 files changed, 10 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
> index 7efb501e22d2..66edffadf4a0 100644
> --- a/drivers/gpu/drm/i915/i915_drv.h
> +++ b/drivers/gpu/drm/i915/i915_drv.h
> @@ -1674,6 +1674,7 @@ tgl_stepping_get(struct drm_i915_private *dev_priv)
>  #define HAS_SECURE_BATCHES(dev_priv) (INTEL_GEN(dev_priv) < 6)
>  #define HAS_WT(dev_priv)       HAS_EDRAM(dev_priv)
>
> +#define HAS_PREAD_PWRITE(dev_priv)     (!INTEL_INFO(dev_priv)->no_pread_pwrite)
>  #define HWS_NEEDS_PHYSICAL(dev_priv)   (INTEL_INFO(dev_priv)->hws_needs_physical)
>
>  #define HAS_LOGICAL_RING_CONTEXTS(dev_priv) \
> diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c
> index 9b04dff5eb32..9f3ef68fadf3 100644
> --- a/drivers/gpu/drm/i915/i915_gem.c
> +++ b/drivers/gpu/drm/i915/i915_gem.c
> @@ -382,6 +382,9 @@ i915_gem_pread_ioctl(struct drm_device *dev, void *data,
>         struct drm_i915_gem_object *obj;
>         int ret;
>
> +       if (!HAS_PREAD_PWRITE(to_i915(dev)))
> +               return -EOPNOTSUPP;
> +
>         if (args->size == 0)
>                 return 0;
>
> @@ -687,6 +690,9 @@ i915_gem_pwrite_ioctl(struct drm_device *dev, void *data,
>         struct drm_i915_gem_object *obj;
>         int ret;
>
> +       if (!HAS_PREAD_PWRITE(to_i915(dev)))
> +               return -EOPNOTSUPP;
> +
>         if (args->size == 0)
>                 return 0;
>
> diff --git a/drivers/gpu/drm/i915/i915_pci.c b/drivers/gpu/drm/i915/i915_pci.c
> index 6cff7cf0f17b..3231d989275c 100644
> --- a/drivers/gpu/drm/i915/i915_pci.c
> +++ b/drivers/gpu/drm/i915/i915_pci.c
> @@ -910,7 +910,8 @@ static const struct intel_device_info rkl_info = {
>         .has_master_unit_irq = 1, \
>         .has_llc = 0, \
>         .has_snoop = 1, \
> -       .is_dgfx = 1
> +       .is_dgfx = 1, \
> +       .no_pread_pwrite = 1
>
>  static const struct intel_device_info dg1_info __maybe_unused = {
>         GEN12_DGFX_FEATURES,
> diff --git a/drivers/gpu/drm/i915/intel_device_info.h b/drivers/gpu/drm/i915/intel_device_info.h
> index e6ca1023ffcf..8edd2cfb0bab 100644
> --- a/drivers/gpu/drm/i915/intel_device_info.h
> +++ b/drivers/gpu/drm/i915/intel_device_info.h
> @@ -114,6 +114,7 @@ enum intel_ppgtt_type {
>         func(is_lp); \
>         func(require_force_probe); \
>         func(is_dgfx); \
> +       func(no_pread_pwrite); \

Is it really better to add a device_info flag here or would we be
better off making it dependent on HW generation?  This is what I did
for relocs:

       /* Relocations are disallowed for all platforms after TGL-LP */
       if (INTEL_GEN(eb->i915) >= 12 && !IS_TIGERLAKE(eb->i915))
               return -EINVAL;

       /* All discrete memory platforms are Gen12 or above */
       BUG_ON(HAS_LMEM(eb->i915));

At least to me, that makes the code more obvious.

--Jason


More information about the Intel-gfx mailing list