diff mbox

[v2,1/2] drm/i915: Introduce GEM proxy

Message ID 1509528141-4189-2-git-send-email-tina.zhang@intel.com (mailing list archive)
State New, archived
Headers show

Commit Message

Zhang, Tina Nov. 1, 2017, 9:22 a.m. UTC
GEM proxy is a kind of GEM, whose backing physical memory is pinned
and produced by guest VM and is used by host as read only. With GEM
proxy, host is able to access guest physical memory through GEM object
interface. As GEM proxy is such a special kind of GEM, a new flag
I915_GEM_OBJECT_IS_PROXY is introduced to ban host from changing the
backing storage of GEM proxy.

v2:
- return -ENXIO when pin and map pages of GEM proxy to kernel space.
  (Chris)

Here are the histories of this patch in "Dma-buf support for Gvt-g"
patch-set:

v14:
- return -ENXIO when gem proxy object is banned by ioctl.
  (Chris) (Daniel)

v13:
- add comments to GEM proxy. (Chris)
- don't ban GEM proxy in i915_gem_sw_finish_ioctl. (Chris)
- check GEM proxy bar after finishing i915_gem_object_wait. (Chris)
- remove GEM proxy bar in i915_gem_madvise_ioctl.

v6:
- add gem proxy barrier in the following ioctls. (Chris)
  i915_gem_set_caching_ioctl
  i915_gem_set_domain_ioctl
  i915_gem_sw_finish_ioctl
  i915_gem_set_tiling_ioctl
  i915_gem_madvise_ioctl

Signed-off-by: Tina Zhang <tina.zhang@intel.com>
Reviewed-by: Joonas Lahtinen <joonas.lahtinen@linux.intel.com>
Reviewed-by: Chris Wilson <chris@chris-wilson.co.uk>
Cc: Daniel Vetter <daniel.vetter@ffwll.ch>
---
 drivers/gpu/drm/i915/i915_gem.c        | 25 ++++++++++++++++++++++++-
 drivers/gpu/drm/i915/i915_gem_object.h | 11 +++++++++--
 drivers/gpu/drm/i915/i915_gem_tiling.c |  8 ++++++++
 3 files changed, 41 insertions(+), 3 deletions(-)

Comments

Joonas Lahtinen Nov. 6, 2017, 11:24 a.m. UTC | #1
On Wed, 2017-11-01 at 17:22 +0800, Tina Zhang wrote:
> GEM proxy is a kind of GEM, whose backing physical memory is pinned
> and produced by guest VM and is used by host as read only. With GEM
> proxy, host is able to access guest physical memory through GEM object
> interface. As GEM proxy is such a special kind of GEM, a new flag
> I915_GEM_OBJECT_IS_PROXY is introduced to ban host from changing the
> backing storage of GEM proxy.
> 
> v2:
> - return -ENXIO when pin and map pages of GEM proxy to kernel space.
>   (Chris)
> 
> Here are the histories of this patch in "Dma-buf support for Gvt-g"
> patch-set:
> 
> v14:
> - return -ENXIO when gem proxy object is banned by ioctl.
>   (Chris) (Daniel)
> 
> v13:
> - add comments to GEM proxy. (Chris)
> - don't ban GEM proxy in i915_gem_sw_finish_ioctl. (Chris)
> - check GEM proxy bar after finishing i915_gem_object_wait. (Chris)
> - remove GEM proxy bar in i915_gem_madvise_ioctl.
> 
> v6:
> - add gem proxy barrier in the following ioctls. (Chris)
>   i915_gem_set_caching_ioctl
>   i915_gem_set_domain_ioctl
>   i915_gem_sw_finish_ioctl
>   i915_gem_set_tiling_ioctl
>   i915_gem_madvise_ioctl
> 
> Signed-off-by: Tina Zhang <tina.zhang@intel.com>
> Reviewed-by: Joonas Lahtinen <joonas.lahtinen@linux.intel.com>
> Reviewed-by: Chris Wilson <chris@chris-wilson.co.uk>
> Cc: Daniel Vetter <daniel.vetter@ffwll.ch>

<SNIP>

> @@ -1649,6 +1659,10 @@ i915_gem_sw_finish_ioctl(struct drm_device *dev, void *data,
>  	if (!obj)
>  		return -ENOENT;
>  
> +	/* Proxy objects are barred from CPU access, so there is no
> +	 * need to ban sw_finish as it is a nop.
> +	 */
> +
>  	/* Pinned buffers may be scanout, so flush the cache */
>  	i915_gem_object_flush_if_display(obj);
>  	i915_gem_object_put(obj);
> @@ -2614,7 +2628,8 @@ void *i915_gem_object_pin_map(struct drm_i915_gem_object *obj,
>  	void *ptr;
>  	int ret;
>  
> -	GEM_BUG_ON(!i915_gem_object_has_struct_page(obj));
> +	if (unlikely(!i915_gem_object_has_struct_page(obj)))
> +		return ERR_PTR(-ENODEV);

You should have marked this change in the changelog and then marked the
Reviewed-by tags to be valid only to the previous version of this
patch.

It's not a fair game to claim a patch to be "Reviewed-by" at the
current version, when you've made changes that were not agreed upon.

So that's some meta-review. Back to the actual review;

Which codepath was hitting the GEM_BUG_ON? Wondering if it would be
cleaner to avoid the call to this function on that single codepath.

Regards, Joonas
Zhang, Tina Nov. 7, 2017, 4:53 a.m. UTC | #2
> -----Original Message-----

> From: intel-gvt-dev [mailto:intel-gvt-dev-bounces@lists.freedesktop.org] On

> Behalf Of Joonas Lahtinen

> Sent: Monday, November 6, 2017 7:24 PM

> To: Zhang, Tina <tina.zhang@intel.com>; zhenyuw@linux.intel.com; Wang, Zhi

> A <zhi.a.wang@intel.com>; daniel@ffwll.ch; chris@chris-wilson.co.uk

> Cc: Daniel Vetter <daniel.vetter@ffwll.ch>; intel-gfx@lists.freedesktop.org;

> intel-gvt-dev@lists.freedesktop.org

> Subject: Re: [PATCH v2 1/2] drm/i915: Introduce GEM proxy

> 

> On Wed, 2017-11-01 at 17:22 +0800, Tina Zhang wrote:

> > GEM proxy is a kind of GEM, whose backing physical memory is pinned

> > and produced by guest VM and is used by host as read only. With GEM

> > proxy, host is able to access guest physical memory through GEM object

> > interface. As GEM proxy is such a special kind of GEM, a new flag

> > I915_GEM_OBJECT_IS_PROXY is introduced to ban host from changing the

> > backing storage of GEM proxy.

> >

> > v2:

> > - return -ENXIO when pin and map pages of GEM proxy to kernel space.

> >   (Chris)

> >

> > Here are the histories of this patch in "Dma-buf support for Gvt-g"

> > patch-set:

> >

> > v14:

> > - return -ENXIO when gem proxy object is banned by ioctl.

> >   (Chris) (Daniel)

> >

> > v13:

> > - add comments to GEM proxy. (Chris)

> > - don't ban GEM proxy in i915_gem_sw_finish_ioctl. (Chris)

> > - check GEM proxy bar after finishing i915_gem_object_wait. (Chris)

> > - remove GEM proxy bar in i915_gem_madvise_ioctl.

> >

> > v6:

> > - add gem proxy barrier in the following ioctls. (Chris)

> >   i915_gem_set_caching_ioctl

> >   i915_gem_set_domain_ioctl

> >   i915_gem_sw_finish_ioctl

> >   i915_gem_set_tiling_ioctl

> >   i915_gem_madvise_ioctl

> >

> > Signed-off-by: Tina Zhang <tina.zhang@intel.com>

> > Reviewed-by: Joonas Lahtinen <joonas.lahtinen@linux.intel.com>

> > Reviewed-by: Chris Wilson <chris@chris-wilson.co.uk>

> > Cc: Daniel Vetter <daniel.vetter@ffwll.ch>

> 

> <SNIP>

> 

> > @@ -1649,6 +1659,10 @@ i915_gem_sw_finish_ioctl(struct drm_device

> *dev, void *data,

> >  	if (!obj)

> >  		return -ENOENT;

> >

> > +	/* Proxy objects are barred from CPU access, so there is no

> > +	 * need to ban sw_finish as it is a nop.

> > +	 */

> > +

> >  	/* Pinned buffers may be scanout, so flush the cache */

> >  	i915_gem_object_flush_if_display(obj);

> >  	i915_gem_object_put(obj);

> > @@ -2614,7 +2628,8 @@ void *i915_gem_object_pin_map(struct

> drm_i915_gem_object *obj,

> >  	void *ptr;

> >  	int ret;

> >

> > -	GEM_BUG_ON(!i915_gem_object_has_struct_page(obj));

> > +	if (unlikely(!i915_gem_object_has_struct_page(obj)))

> > +		return ERR_PTR(-ENODEV);

> 

> You should have marked this change in the changelog and then marked the

> Reviewed-by tags to be valid only to the previous version of this patch.

> 

> It's not a fair game to claim a patch to be "Reviewed-by" at the current version,

> when you've made changes that were not agreed upon.

I thought we were agreed on this :)

> 

> So that's some meta-review. Back to the actual review;

> 

> Which codepath was hitting the GEM_BUG_ON? Wondering if it would be

> cleaner to avoid the call to this function on that single codepath.

Here is the previously comments:
https://lists.freedesktop.org/archives/intel-gvt-dev/2017-October/002278.html
Thanks.

BR,
Tina
> 

> Regards, Joonas

> --

> Joonas Lahtinen

> Open Source Technology Center

> Intel Corporation

> _______________________________________________

> intel-gvt-dev mailing list

> intel-gvt-dev@lists.freedesktop.org

> https://lists.freedesktop.org/mailman/listinfo/intel-gvt-dev
Joonas Lahtinen Nov. 7, 2017, 1:06 p.m. UTC | #3
On Tue, 2017-11-07 at 04:53 +0000, Zhang, Tina wrote:
> > -----Original Message-----
> > From: intel-gvt-dev [mailto:intel-gvt-dev-bounces@lists.freedesktop.org] On
> > Behalf Of Joonas Lahtinen
> > Sent: Monday, November 6, 2017 7:24 PM
> > To: Zhang, Tina <tina.zhang@intel.com>; zhenyuw@linux.intel.com; Wang, Zhi
> > A <zhi.a.wang@intel.com>; daniel@ffwll.ch; chris@chris-wilson.co.uk
> > Cc: Daniel Vetter <daniel.vetter@ffwll.ch>; intel-gfx@lists.freedesktop.org;
> > intel-gvt-dev@lists.freedesktop.org
> > Subject: Re: [PATCH v2 1/2] drm/i915: Introduce GEM proxy
> > 
> > On Wed, 2017-11-01 at 17:22 +0800, Tina Zhang wrote:
> > > GEM proxy is a kind of GEM, whose backing physical memory is pinned
> > > and produced by guest VM and is used by host as read only. With GEM
> > > proxy, host is able to access guest physical memory through GEM object
> > > interface. As GEM proxy is such a special kind of GEM, a new flag
> > > I915_GEM_OBJECT_IS_PROXY is introduced to ban host from changing the
> > > backing storage of GEM proxy.
> > > 
> > > v2:
> > > - return -ENXIO when pin and map pages of GEM proxy to kernel space.
> > >   (Chris)
> > > 
> > > Here are the histories of this patch in "Dma-buf support for Gvt-g"
> > > patch-set:
> > > 
> > > v14:
> > > - return -ENXIO when gem proxy object is banned by ioctl.
> > >   (Chris) (Daniel)
> > > 
> > > v13:
> > > - add comments to GEM proxy. (Chris)
> > > - don't ban GEM proxy in i915_gem_sw_finish_ioctl. (Chris)
> > > - check GEM proxy bar after finishing i915_gem_object_wait. (Chris)
> > > - remove GEM proxy bar in i915_gem_madvise_ioctl.
> > > 
> > > v6:
> > > - add gem proxy barrier in the following ioctls. (Chris)
> > >   i915_gem_set_caching_ioctl
> > >   i915_gem_set_domain_ioctl
> > >   i915_gem_sw_finish_ioctl
> > >   i915_gem_set_tiling_ioctl
> > >   i915_gem_madvise_ioctl
> > > 
> > > Signed-off-by: Tina Zhang <tina.zhang@intel.com>
> > > Reviewed-by: Joonas Lahtinen <joonas.lahtinen@linux.intel.com>
> > > Reviewed-by: Chris Wilson <chris@chris-wilson.co.uk>
> > > Cc: Daniel Vetter <daniel.vetter@ffwll.ch>
> > 
> > <SNIP>
> > 
> > > @@ -1649,6 +1659,10 @@ i915_gem_sw_finish_ioctl(struct drm_device
> > 
> > *dev, void *data,
> > >  	if (!obj)
> > >  		return -ENOENT;
> > > 
> > > +	/* Proxy objects are barred from CPU access, so there is no
> > > +	 * need to ban sw_finish as it is a nop.
> > > +	 */
> > > +
> > >  	/* Pinned buffers may be scanout, so flush the cache */
> > >  	i915_gem_object_flush_if_display(obj);
> > >  	i915_gem_object_put(obj);
> > > @@ -2614,7 +2628,8 @@ void *i915_gem_object_pin_map(struct
> > 
> > drm_i915_gem_object *obj,
> > >  	void *ptr;
> > >  	int ret;
> > > 
> > > -	GEM_BUG_ON(!i915_gem_object_has_struct_page(obj));
> > > +	if (unlikely(!i915_gem_object_has_struct_page(obj)))
> > > +		return ERR_PTR(-ENODEV);
> > 
> > You should have marked this change in the changelog and then marked the
> > Reviewed-by tags to be valid only to the previous version of this patch.
> > 
> > It's not a fair game to claim a patch to be "Reviewed-by" at the current version,
> > when you've made changes that were not agreed upon.
> 
> I thought we were agreed on this :)
> 
> > 
> > So that's some meta-review. Back to the actual review;
> > 
> > Which codepath was hitting the GEM_BUG_ON? Wondering if it would be
> > cleaner to avoid the call to this function on that single codepath.
> 
> Here is the previously comments:
> https://lists.freedesktop.org/archives/intel-gvt-dev/2017-October/002278.html
> Thanks.

I never even noticed such an e-mail, so the correct response would've
been;

Reviewed-by: Joonas #vX
Reviewed-by: Chris

Where #vX is the version I actually agreed to.

Reviewed-by tags are are ones you need to be especially careful about
in addition to the Signed-off-bys because they carry special meaning:

https://www.kernel.org/doc/html/v4.13/process/submitting-patches.html#r
eviewer-s-statement-of-oversight

Regards, Joonas
Zhang, Tina Nov. 11, 2017, 2:32 a.m. UTC | #4
> -----Original Message-----

> From: intel-gvt-dev [mailto:intel-gvt-dev-bounces@lists.freedesktop.org] On

> Behalf Of Joonas Lahtinen

> Sent: Tuesday, November 7, 2017 9:06 PM

> To: Zhang, Tina <tina.zhang@intel.com>; zhenyuw@linux.intel.com; Wang, Zhi

> A <zhi.a.wang@intel.com>; daniel@ffwll.ch; chris@chris-wilson.co.uk

> Cc: Daniel Vetter <daniel.vetter@ffwll.ch>; intel-gfx@lists.freedesktop.org;

> intel-gvt-dev@lists.freedesktop.org

> Subject: Re: [PATCH v2 1/2] drm/i915: Introduce GEM proxy

> 

> On Tue, 2017-11-07 at 04:53 +0000, Zhang, Tina wrote:

> > > -----Original Message-----

> > > From: intel-gvt-dev

> > > [mailto:intel-gvt-dev-bounces@lists.freedesktop.org] On Behalf Of

> > > Joonas Lahtinen

> > > Sent: Monday, November 6, 2017 7:24 PM

> > > To: Zhang, Tina <tina.zhang@intel.com>; zhenyuw@linux.intel.com;

> > > Wang, Zhi A <zhi.a.wang@intel.com>; daniel@ffwll.ch;

> > > chris@chris-wilson.co.uk

> > > Cc: Daniel Vetter <daniel.vetter@ffwll.ch>;

> > > intel-gfx@lists.freedesktop.org; intel-gvt-dev@lists.freedesktop.org

> > > Subject: Re: [PATCH v2 1/2] drm/i915: Introduce GEM proxy

> > >

> > > On Wed, 2017-11-01 at 17:22 +0800, Tina Zhang wrote:

> > > > GEM proxy is a kind of GEM, whose backing physical memory is

> > > > pinned and produced by guest VM and is used by host as read only.

> > > > With GEM proxy, host is able to access guest physical memory

> > > > through GEM object interface. As GEM proxy is such a special kind

> > > > of GEM, a new flag I915_GEM_OBJECT_IS_PROXY is introduced to ban

> > > > host from changing the backing storage of GEM proxy.

> > > >

> > > > v2:

> > > > - return -ENXIO when pin and map pages of GEM proxy to kernel space.

> > > >   (Chris)

> > > >

> > > > Here are the histories of this patch in "Dma-buf support for Gvt-g"

> > > > patch-set:

> > > >

> > > > v14:

> > > > - return -ENXIO when gem proxy object is banned by ioctl.

> > > >   (Chris) (Daniel)

> > > >

> > > > v13:

> > > > - add comments to GEM proxy. (Chris)

> > > > - don't ban GEM proxy in i915_gem_sw_finish_ioctl. (Chris)

> > > > - check GEM proxy bar after finishing i915_gem_object_wait.

> > > > (Chris)

> > > > - remove GEM proxy bar in i915_gem_madvise_ioctl.

> > > >

> > > > v6:

> > > > - add gem proxy barrier in the following ioctls. (Chris)

> > > >   i915_gem_set_caching_ioctl

> > > >   i915_gem_set_domain_ioctl

> > > >   i915_gem_sw_finish_ioctl

> > > >   i915_gem_set_tiling_ioctl

> > > >   i915_gem_madvise_ioctl

> > > >

> > > > Signed-off-by: Tina Zhang <tina.zhang@intel.com>

> > > > Reviewed-by: Joonas Lahtinen <joonas.lahtinen@linux.intel.com>

> > > > Reviewed-by: Chris Wilson <chris@chris-wilson.co.uk>

> > > > Cc: Daniel Vetter <daniel.vetter@ffwll.ch>

> > >

> > > <SNIP>

> > >

> > > > @@ -1649,6 +1659,10 @@ i915_gem_sw_finish_ioctl(struct drm_device

> > >

> > > *dev, void *data,

> > > >  	if (!obj)

> > > >  		return -ENOENT;

> > > >

> > > > +	/* Proxy objects are barred from CPU access, so there is no

> > > > +	 * need to ban sw_finish as it is a nop.

> > > > +	 */

> > > > +

> > > >  	/* Pinned buffers may be scanout, so flush the cache */

> > > >  	i915_gem_object_flush_if_display(obj);

> > > >  	i915_gem_object_put(obj);

> > > > @@ -2614,7 +2628,8 @@ void *i915_gem_object_pin_map(struct

> > >

> > > drm_i915_gem_object *obj,

> > > >  	void *ptr;

> > > >  	int ret;

> > > >

> > > > -	GEM_BUG_ON(!i915_gem_object_has_struct_page(obj));

> > > > +	if (unlikely(!i915_gem_object_has_struct_page(obj)))

> > > > +		return ERR_PTR(-ENODEV);

> > >

> > > You should have marked this change in the changelog and then marked

> > > the Reviewed-by tags to be valid only to the previous version of this patch.

> > >

> > > It's not a fair game to claim a patch to be "Reviewed-by" at the

> > > current version, when you've made changes that were not agreed upon.

> >

> > I thought we were agreed on this :)

> >

> > >

> > > So that's some meta-review. Back to the actual review;

> > >

> > > Which codepath was hitting the GEM_BUG_ON? Wondering if it would be

> > > cleaner to avoid the call to this function on that single codepath.

> >

> > Here is the previously comments:

> > https://lists.freedesktop.org/archives/intel-gvt-dev/2017-October/0022

> > 78.html

> > Thanks.

> 

> I never even noticed such an e-mail, so the correct response would've been;

> 

> Reviewed-by: Joonas #vX

> Reviewed-by: Chris

> 

> Where #vX is the version I actually agreed to.

> 

> Reviewed-by tags are are ones you need to be especially careful about in

> addition to the Signed-off-bys because they carry special meaning:

> 

> https://www.kernel.org/doc/html/v4.13/process/submitting-patches.html#r

> eviewer-s-statement-of-oversight

Indeed, thank you :)

BR,
Tina
> 

> Regards, Joonas

> --

> Joonas Lahtinen

> Open Source Technology Center

> Intel Corporation

> _______________________________________________

> intel-gvt-dev mailing list

> intel-gvt-dev@lists.freedesktop.org

> https://lists.freedesktop.org/mailman/listinfo/intel-gvt-dev
Zhang, Tina Nov. 11, 2017, 2:44 a.m. UTC | #5
Hi,

As the "Dma-buf support for GVT-g" patch-set relys on this patch, can I collect the comments for this version? Do we all agree on it?
Thanks.

Comments of the previous version:
https://lists.freedesktop.org/archives/intel-gvt-dev/2017-October/002278.html

BR,
Tina

> -----Original Message-----
> From: Zhang, Tina
> Sent: Wednesday, November 1, 2017 5:22 PM
> To: zhenyuw@linux.intel.com; Wang, Zhi A <zhi.a.wang@intel.com>;
> daniel@ffwll.ch; joonas.lahtinen@linux.intel.com; chris@chris-wilson.co.uk
> Cc: Zhang, Tina <tina.zhang@intel.com>; intel-gfx@lists.freedesktop.org; intel-
> gvt-dev@lists.freedesktop.org; Daniel Vetter <daniel.vetter@ffwll.ch>
> Subject: [PATCH v2 1/2] drm/i915: Introduce GEM proxy
> 
> GEM proxy is a kind of GEM, whose backing physical memory is pinned and
> produced by guest VM and is used by host as read only. With GEM proxy, host is
> able to access guest physical memory through GEM object interface. As GEM
> proxy is such a special kind of GEM, a new flag I915_GEM_OBJECT_IS_PROXY is
> introduced to ban host from changing the backing storage of GEM proxy.
> 
> v2:
> - return -ENXIO when pin and map pages of GEM proxy to kernel space.
>   (Chris)
> 
> Here are the histories of this patch in "Dma-buf support for Gvt-g"
> patch-set:
> 
> v14:
> - return -ENXIO when gem proxy object is banned by ioctl.
>   (Chris) (Daniel)
> 
> v13:
> - add comments to GEM proxy. (Chris)
> - don't ban GEM proxy in i915_gem_sw_finish_ioctl. (Chris)
> - check GEM proxy bar after finishing i915_gem_object_wait. (Chris)
> - remove GEM proxy bar in i915_gem_madvise_ioctl.
> 
> v6:
> - add gem proxy barrier in the following ioctls. (Chris)
>   i915_gem_set_caching_ioctl
>   i915_gem_set_domain_ioctl
>   i915_gem_sw_finish_ioctl
>   i915_gem_set_tiling_ioctl
>   i915_gem_madvise_ioctl
> 
> Signed-off-by: Tina Zhang <tina.zhang@intel.com>
> Reviewed-by: Joonas Lahtinen <joonas.lahtinen@linux.intel.com>
> Reviewed-by: Chris Wilson <chris@chris-wilson.co.uk>
> Cc: Daniel Vetter <daniel.vetter@ffwll.ch>
> ---
>  drivers/gpu/drm/i915/i915_gem.c        | 25 ++++++++++++++++++++++++-
>  drivers/gpu/drm/i915/i915_gem_object.h | 11 +++++++++--
> drivers/gpu/drm/i915/i915_gem_tiling.c |  8 ++++++++
>  3 files changed, 41 insertions(+), 3 deletions(-)
> 
> diff --git a/drivers/gpu/drm/i915/i915_gem.c
> b/drivers/gpu/drm/i915/i915_gem.c index 82a1003..13bc18d 100644
> --- a/drivers/gpu/drm/i915/i915_gem.c
> +++ b/drivers/gpu/drm/i915/i915_gem.c
> @@ -1593,6 +1593,16 @@ i915_gem_set_domain_ioctl(struct drm_device
> *dev, void *data,
>  	if (err)
>  		goto out;
> 
> +	/* Proxy objects do not control access to the backing storage, ergo
> +	 * they cannot be used as a means to manipulate the cache domain
> +	 * tracking for that backing storage. The proxy object is always
> +	 * considered to be outside of any cache domain.
> +	 */
> +	if (i915_gem_object_is_proxy(obj)) {
> +		err = -ENXIO;
> +		goto out;
> +	}
> +
>  	/* Flush and acquire obj->pages so that we are coherent through
>  	 * direct access in memory with previous cached writes through
>  	 * shmemfs and that our cache domain tracking remains valid.
> @@ -1649,6 +1659,10 @@ i915_gem_sw_finish_ioctl(struct drm_device *dev,
> void *data,
>  	if (!obj)
>  		return -ENOENT;
> 
> +	/* Proxy objects are barred from CPU access, so there is no
> +	 * need to ban sw_finish as it is a nop.
> +	 */
> +
>  	/* Pinned buffers may be scanout, so flush the cache */
>  	i915_gem_object_flush_if_display(obj);
>  	i915_gem_object_put(obj);
> @@ -2614,7 +2628,8 @@ void *i915_gem_object_pin_map(struct
> drm_i915_gem_object *obj,
>  	void *ptr;
>  	int ret;
> 
> -	GEM_BUG_ON(!i915_gem_object_has_struct_page(obj));
> +	if (unlikely(!i915_gem_object_has_struct_page(obj)))
> +		return ERR_PTR(-ENODEV);
> 
>  	ret = mutex_lock_interruptible(&obj->mm.lock);
>  	if (ret)
> @@ -3766,6 +3781,14 @@ int i915_gem_set_caching_ioctl(struct drm_device
> *dev, void *data,
>  	if (!obj)
>  		return -ENOENT;
> 
> +	/* The caching mode of proxy object is handled by its generator, and
> not
> +	 * expected to be changed by user mode.
> +	 */
> +	if (i915_gem_object_is_proxy(obj)) {
> +		ret = -ENXIO;
> +		goto out;
> +	}
> +
>  	if (obj->cache_level == level)
>  		goto out;
> 
> diff --git a/drivers/gpu/drm/i915/i915_gem_object.h
> b/drivers/gpu/drm/i915/i915_gem_object.h
> index 956c911..78d65db 100644
> --- a/drivers/gpu/drm/i915/i915_gem_object.h
> +++ b/drivers/gpu/drm/i915/i915_gem_object.h
> @@ -53,8 +53,9 @@ struct i915_lut_handle {
> 
>  struct drm_i915_gem_object_ops {
>  	unsigned int flags;
> -#define I915_GEM_OBJECT_HAS_STRUCT_PAGE BIT(0)
> -#define I915_GEM_OBJECT_IS_SHRINKABLE   BIT(1)
> +#define I915_GEM_OBJECT_HAS_STRUCT_PAGE	BIT(0)
> +#define I915_GEM_OBJECT_IS_SHRINKABLE	BIT(1)
> +#define I915_GEM_OBJECT_IS_PROXY	BIT(2)
> 
>  	/* Interface between the GEM object and its backing storage.
>  	 * get_pages() is called once prior to the use of the associated set @@ -
> 355,6 +356,12 @@ i915_gem_object_is_shrinkable(const struct
> drm_i915_gem_object *obj)  }
> 
>  static inline bool
> +i915_gem_object_is_proxy(const struct drm_i915_gem_object *obj) {
> +	return obj->ops->flags & I915_GEM_OBJECT_IS_PROXY; }
> +
> +static inline bool
>  i915_gem_object_is_active(const struct drm_i915_gem_object *obj)  {
>  	return obj->active_count;
> diff --git a/drivers/gpu/drm/i915/i915_gem_tiling.c
> b/drivers/gpu/drm/i915/i915_gem_tiling.c
> index fb5231f..f617012 100644
> --- a/drivers/gpu/drm/i915/i915_gem_tiling.c
> +++ b/drivers/gpu/drm/i915/i915_gem_tiling.c
> @@ -345,6 +345,14 @@ i915_gem_set_tiling_ioctl(struct drm_device *dev,
> void *data,
>  	if (!obj)
>  		return -ENOENT;
> 
> +	/* The tiling mode of proxy objects is handled by its generator, and not
> +	 * expected to be changed by user mode.
> +	 */
> +	if (i915_gem_object_is_proxy(obj)) {
> +		err = -ENXIO;
> +		goto err;
> +	}
> +
>  	if (!i915_tiling_ok(obj, args->tiling_mode, args->stride)) {
>  		err = -EINVAL;
>  		goto err;
> --
> 2.7.4
diff mbox

Patch

diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c
index 82a1003..13bc18d 100644
--- a/drivers/gpu/drm/i915/i915_gem.c
+++ b/drivers/gpu/drm/i915/i915_gem.c
@@ -1593,6 +1593,16 @@  i915_gem_set_domain_ioctl(struct drm_device *dev, void *data,
 	if (err)
 		goto out;
 
+	/* Proxy objects do not control access to the backing storage, ergo
+	 * they cannot be used as a means to manipulate the cache domain
+	 * tracking for that backing storage. The proxy object is always
+	 * considered to be outside of any cache domain.
+	 */
+	if (i915_gem_object_is_proxy(obj)) {
+		err = -ENXIO;
+		goto out;
+	}
+
 	/* Flush and acquire obj->pages so that we are coherent through
 	 * direct access in memory with previous cached writes through
 	 * shmemfs and that our cache domain tracking remains valid.
@@ -1649,6 +1659,10 @@  i915_gem_sw_finish_ioctl(struct drm_device *dev, void *data,
 	if (!obj)
 		return -ENOENT;
 
+	/* Proxy objects are barred from CPU access, so there is no
+	 * need to ban sw_finish as it is a nop.
+	 */
+
 	/* Pinned buffers may be scanout, so flush the cache */
 	i915_gem_object_flush_if_display(obj);
 	i915_gem_object_put(obj);
@@ -2614,7 +2628,8 @@  void *i915_gem_object_pin_map(struct drm_i915_gem_object *obj,
 	void *ptr;
 	int ret;
 
-	GEM_BUG_ON(!i915_gem_object_has_struct_page(obj));
+	if (unlikely(!i915_gem_object_has_struct_page(obj)))
+		return ERR_PTR(-ENODEV);
 
 	ret = mutex_lock_interruptible(&obj->mm.lock);
 	if (ret)
@@ -3766,6 +3781,14 @@  int i915_gem_set_caching_ioctl(struct drm_device *dev, void *data,
 	if (!obj)
 		return -ENOENT;
 
+	/* The caching mode of proxy object is handled by its generator, and not
+	 * expected to be changed by user mode.
+	 */
+	if (i915_gem_object_is_proxy(obj)) {
+		ret = -ENXIO;
+		goto out;
+	}
+
 	if (obj->cache_level == level)
 		goto out;
 
diff --git a/drivers/gpu/drm/i915/i915_gem_object.h b/drivers/gpu/drm/i915/i915_gem_object.h
index 956c911..78d65db 100644
--- a/drivers/gpu/drm/i915/i915_gem_object.h
+++ b/drivers/gpu/drm/i915/i915_gem_object.h
@@ -53,8 +53,9 @@  struct i915_lut_handle {
 
 struct drm_i915_gem_object_ops {
 	unsigned int flags;
-#define I915_GEM_OBJECT_HAS_STRUCT_PAGE BIT(0)
-#define I915_GEM_OBJECT_IS_SHRINKABLE   BIT(1)
+#define I915_GEM_OBJECT_HAS_STRUCT_PAGE	BIT(0)
+#define I915_GEM_OBJECT_IS_SHRINKABLE	BIT(1)
+#define I915_GEM_OBJECT_IS_PROXY	BIT(2)
 
 	/* Interface between the GEM object and its backing storage.
 	 * get_pages() is called once prior to the use of the associated set
@@ -355,6 +356,12 @@  i915_gem_object_is_shrinkable(const struct drm_i915_gem_object *obj)
 }
 
 static inline bool
+i915_gem_object_is_proxy(const struct drm_i915_gem_object *obj)
+{
+	return obj->ops->flags & I915_GEM_OBJECT_IS_PROXY;
+}
+
+static inline bool
 i915_gem_object_is_active(const struct drm_i915_gem_object *obj)
 {
 	return obj->active_count;
diff --git a/drivers/gpu/drm/i915/i915_gem_tiling.c b/drivers/gpu/drm/i915/i915_gem_tiling.c
index fb5231f..f617012 100644
--- a/drivers/gpu/drm/i915/i915_gem_tiling.c
+++ b/drivers/gpu/drm/i915/i915_gem_tiling.c
@@ -345,6 +345,14 @@  i915_gem_set_tiling_ioctl(struct drm_device *dev, void *data,
 	if (!obj)
 		return -ENOENT;
 
+	/* The tiling mode of proxy objects is handled by its generator, and not
+	 * expected to be changed by user mode.
+	 */
+	if (i915_gem_object_is_proxy(obj)) {
+		err = -ENXIO;
+		goto err;
+	}
+
 	if (!i915_tiling_ok(obj, args->tiling_mode, args->stride)) {
 		err = -EINVAL;
 		goto err;