Re: [PATCH] drm/ttm: move cpu_writers handling into vmwgfx v2

2019-10-01 Thread Thomas Hellstrom
Hi, Christian,

On 9/30/19 6:34 PM, Christian König wrote:
> From: Christian König 
>
> This feature is only used by vmwgfx and superflous for everybody else.
>
> v2: use vmw_buffer_object instead of vmw_user_bo.
>
> Signed-off-by: Christian König 
> ---

I just sent out a patch based on this that is slightly reworked on the
vmwgfx side and that fixes a couple of checkpatch warnings.  TTM changes
should be the same. Added myself as Co-developed-by:

Hope this is ok. If you want to merge it through your tree I'm fine with
that.

/Thomas


___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

[PATCH] drm/ttm: move cpu_writers handling into vmwgfx v2

2019-09-30 Thread Christian König
From: Christian König 

This feature is only used by vmwgfx and superflous for everybody else.

v2: use vmw_buffer_object instead of vmw_user_bo.

Signed-off-by: Christian König 
---
 drivers/gpu/drm/ttm/ttm_bo.c   | 27 --
 drivers/gpu/drm/ttm/ttm_bo_util.c  |  1 -
 drivers/gpu/drm/ttm/ttm_execbuf_util.c |  7 +-
 drivers/gpu/drm/vmwgfx/vmwgfx_bo.c | 36 +-
 drivers/gpu/drm/vmwgfx/vmwgfx_drv.h|  2 ++
 drivers/gpu/drm/vmwgfx/vmwgfx_execbuf.c|  8 +++
 drivers/gpu/drm/vmwgfx/vmwgfx_resource.c   |  4 
 drivers/gpu/drm/vmwgfx/vmwgfx_validation.c |  4 
 include/drm/ttm/ttm_bo_api.h   | 31 -
 9 files changed, 49 insertions(+), 71 deletions(-)

diff --git a/drivers/gpu/drm/ttm/ttm_bo.c b/drivers/gpu/drm/ttm/ttm_bo.c
index 881cf26d698e..a9aaecdd7481 100644
--- a/drivers/gpu/drm/ttm/ttm_bo.c
+++ b/drivers/gpu/drm/ttm/ttm_bo.c
@@ -153,7 +153,6 @@ static void ttm_bo_release_list(struct kref *list_kref)
 
BUG_ON(kref_read(>list_kref));
BUG_ON(kref_read(>kref));
-   BUG_ON(atomic_read(>cpu_writers));
BUG_ON(bo->mem.mm_node != NULL);
BUG_ON(!list_empty(>lru));
BUG_ON(!list_empty(>ddestroy));
@@ -1311,7 +1310,6 @@ int ttm_bo_init_reserved(struct ttm_bo_device *bdev,
 
kref_init(>kref);
kref_init(>list_kref);
-   atomic_set(>cpu_writers, 0);
INIT_LIST_HEAD(>lru);
INIT_LIST_HEAD(>ddestroy);
INIT_LIST_HEAD(>swap);
@@ -1823,31 +1821,6 @@ int ttm_bo_wait(struct ttm_buffer_object *bo,
 }
 EXPORT_SYMBOL(ttm_bo_wait);
 
-int ttm_bo_synccpu_write_grab(struct ttm_buffer_object *bo, bool no_wait)
-{
-   int ret = 0;
-
-   /*
-* Using ttm_bo_reserve makes sure the lru lists are updated.
-*/
-
-   ret = ttm_bo_reserve(bo, true, no_wait, NULL);
-   if (unlikely(ret != 0))
-   return ret;
-   ret = ttm_bo_wait(bo, true, no_wait);
-   if (likely(ret == 0))
-   atomic_inc(>cpu_writers);
-   ttm_bo_unreserve(bo);
-   return ret;
-}
-EXPORT_SYMBOL(ttm_bo_synccpu_write_grab);
-
-void ttm_bo_synccpu_write_release(struct ttm_buffer_object *bo)
-{
-   atomic_dec(>cpu_writers);
-}
-EXPORT_SYMBOL(ttm_bo_synccpu_write_release);
-
 /**
  * A buffer object shrink method that tries to swap out the first
  * buffer object on the bo_global::swap_lru list.
diff --git a/drivers/gpu/drm/ttm/ttm_bo_util.c 
b/drivers/gpu/drm/ttm/ttm_bo_util.c
index fe81c565e7ef..b00039dcb487 100644
--- a/drivers/gpu/drm/ttm/ttm_bo_util.c
+++ b/drivers/gpu/drm/ttm/ttm_bo_util.c
@@ -511,7 +511,6 @@ static int ttm_buffer_object_transfer(struct 
ttm_buffer_object *bo,
mutex_init(>base.wu_mutex);
fbo->base.moving = NULL;
drm_vma_node_reset(>base.base.vma_node);
-   atomic_set(>base.cpu_writers, 0);
 
kref_init(>base.list_kref);
kref_init(>base.kref);
diff --git a/drivers/gpu/drm/ttm/ttm_execbuf_util.c 
b/drivers/gpu/drm/ttm/ttm_execbuf_util.c
index 131dae8f4170..0519e1b5a49c 100644
--- a/drivers/gpu/drm/ttm/ttm_execbuf_util.c
+++ b/drivers/gpu/drm/ttm/ttm_execbuf_util.c
@@ -113,12 +113,7 @@ int ttm_eu_reserve_buffers(struct ww_acquire_ctx *ticket,
struct ttm_buffer_object *bo = entry->bo;
 
ret = __ttm_bo_reserve(bo, intr, (ticket == NULL), ticket);
-   if (!ret && unlikely(atomic_read(>cpu_writers) > 0)) {
-   dma_resv_unlock(bo->base.resv);
-
-   ret = -EBUSY;
-
-   } else if (ret == -EALREADY && dups) {
+   if (ret == -EALREADY && dups) {
struct ttm_validate_buffer *safe = entry;
entry = list_prev_entry(entry, head);
list_del(>head);
diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_bo.c 
b/drivers/gpu/drm/vmwgfx/vmwgfx_bo.c
index a05ef9d0a2e7..5ddd2573b64c 100644
--- a/drivers/gpu/drm/vmwgfx/vmwgfx_bo.c
+++ b/drivers/gpu/drm/vmwgfx/vmwgfx_bo.c
@@ -76,6 +76,26 @@ vmw_user_buffer_object(struct ttm_buffer_object *bo)
return container_of(vmw_bo, struct vmw_user_buffer_object, vbo);
 }
 
+/**
+ * vmw_bo_verify_synccpu - Verify if grab for CPU access exists
+ *
+ * @list: list of ttm_validate_buffer objects
+ *
+ * Return:
+ * -EBUSY if a CPU grab is found, 0 otherwise.
+ */
+int vmw_bo_verify_synccpu(struct list_head *list)
+{
+   struct ttm_validate_buffer *entry;
+
+   list_for_each_entry(entry, list, head) {
+   struct vmw_buffer_object *bo = vmw_buffer_object(entry->bo);
+
+if (unlikely(atomic_read(>cpu_writers) > 0))
+   return -EBUSY;
+   }
+   return 0;
+}
 
 /**
  * vmw_bo_pin_in_placement - Validate a buffer to placement.
@@ -565,7 +585,7 @@ static void vmw_user_bo_ref_obj_release(struct 
ttm_base_object *base,
 
switch (ref_type) {
case TTM_REF_SYNCCPU_WRITE:
-  

Re: [PATCH] drm/ttm: move cpu_writers handling into vmwgfx

2019-06-14 Thread Thomas Hellstrom
Hi, Christian,

On Fri, 2019-06-14 at 14:58 +0200, Christian König wrote:
> Thomas just a gentle ping on this.
> 
> It's not that my live depends on this, but it would still be a nice
> to 
> have cleanup.
> 
> Thanks,
> Christian.
> 

I thought I had answered this, but I can't find it in my outgoing
folder. Sorry about that.

In principle I'm fine with it, but the vmwgfx part needs some changes:
1) We need to operate on struct vmwgfx_buffer_object rather than struct
vmwgfx_user_buffer_object. Not all buffer objects are user buffer
objects...

2) Need to look at the moving the list verifying or at least its calls
into the vmwgfx_validate.c code.

I hopefully can have a quick look at this next week.

/Thomas




> Am 07.06.19 um 16:47 schrieb Christian König:
> > This feature is only used by vmwgfx and superflous for everybody
> > else.
> > 
> > Signed-off-by: Christian König 
> > ---
> >   drivers/gpu/drm/ttm/ttm_bo.c | 27 --
> >   drivers/gpu/drm/ttm/ttm_bo_util.c|  1 -
> >   drivers/gpu/drm/ttm/ttm_execbuf_util.c   |  7 +
> >   drivers/gpu/drm/vmwgfx/vmwgfx_bo.c   | 35
> > 
> >   drivers/gpu/drm/vmwgfx/vmwgfx_drv.h  |  2 ++
> >   drivers/gpu/drm/vmwgfx/vmwgfx_execbuf.c  |  8 ++
> >   drivers/gpu/drm/vmwgfx/vmwgfx_resource.c |  4 +++
> >   include/drm/ttm/ttm_bo_api.h | 31 -
> > 
> >   8 files changed, 45 insertions(+), 70 deletions(-)
> > 
> > diff --git a/drivers/gpu/drm/ttm/ttm_bo.c
> > b/drivers/gpu/drm/ttm/ttm_bo.c
> > index c7de667d482a..4ec055ffd6a7 100644
> > --- a/drivers/gpu/drm/ttm/ttm_bo.c
> > +++ b/drivers/gpu/drm/ttm/ttm_bo.c
> > @@ -153,7 +153,6 @@ static void ttm_bo_release_list(struct kref
> > *list_kref)
> >   
> > BUG_ON(kref_read(>list_kref));
> > BUG_ON(kref_read(>kref));
> > -   BUG_ON(atomic_read(>cpu_writers));
> > BUG_ON(bo->mem.mm_node != NULL);
> > BUG_ON(!list_empty(>lru));
> > BUG_ON(!list_empty(>ddestroy));
> > @@ -1308,7 +1307,6 @@ int ttm_bo_init_reserved(struct ttm_bo_device
> > *bdev,
> >   
> > kref_init(>kref);
> > kref_init(>list_kref);
> > -   atomic_set(>cpu_writers, 0);
> > INIT_LIST_HEAD(>lru);
> > INIT_LIST_HEAD(>ddestroy);
> > INIT_LIST_HEAD(>swap);
> > @@ -1814,31 +1812,6 @@ int ttm_bo_wait(struct ttm_buffer_object
> > *bo,
> >   }
> >   EXPORT_SYMBOL(ttm_bo_wait);
> >   
> > -int ttm_bo_synccpu_write_grab(struct ttm_buffer_object *bo, bool
> > no_wait)
> > -{
> > -   int ret = 0;
> > -
> > -   /*
> > -* Using ttm_bo_reserve makes sure the lru lists are updated.
> > -*/
> > -
> > -   ret = ttm_bo_reserve(bo, true, no_wait, NULL);
> > -   if (unlikely(ret != 0))
> > -   return ret;
> > -   ret = ttm_bo_wait(bo, true, no_wait);
> > -   if (likely(ret == 0))
> > -   atomic_inc(>cpu_writers);
> > -   ttm_bo_unreserve(bo);
> > -   return ret;
> > -}
> > -EXPORT_SYMBOL(ttm_bo_synccpu_write_grab);
> > -
> > -void ttm_bo_synccpu_write_release(struct ttm_buffer_object *bo)
> > -{
> > -   atomic_dec(>cpu_writers);
> > -}
> > -EXPORT_SYMBOL(ttm_bo_synccpu_write_release);
> > -
> >   /**
> >* A buffer object shrink method that tries to swap out the first
> >* buffer object on the bo_global::swap_lru list.
> > diff --git a/drivers/gpu/drm/ttm/ttm_bo_util.c
> > b/drivers/gpu/drm/ttm/ttm_bo_util.c
> > index 895d77d799e4..6f43f1f0de7c 100644
> > --- a/drivers/gpu/drm/ttm/ttm_bo_util.c
> > +++ b/drivers/gpu/drm/ttm/ttm_bo_util.c
> > @@ -511,7 +511,6 @@ static int ttm_buffer_object_transfer(struct
> > ttm_buffer_object *bo,
> > mutex_init(>base.wu_mutex);
> > fbo->base.moving = NULL;
> > drm_vma_node_reset(>base.vma_node);
> > -   atomic_set(>base.cpu_writers, 0);
> >   
> > kref_init(>base.list_kref);
> > kref_init(>base.kref);
> > diff --git a/drivers/gpu/drm/ttm/ttm_execbuf_util.c
> > b/drivers/gpu/drm/ttm/ttm_execbuf_util.c
> > index 957ec375a4ba..80fa52b36d5c 100644
> > --- a/drivers/gpu/drm/ttm/ttm_execbuf_util.c
> > +++ b/drivers/gpu/drm/ttm/ttm_execbuf_util.c
> > @@ -113,12 +113,7 @@ int ttm_eu_reserve_buffers(struct
> > ww_acquire_ctx *ticket,
> > struct ttm_buffer_object *bo = entry->bo;
> >   
> > ret = __ttm_bo_reserve(bo, intr, (ticket == NULL),
> > ticket);
> > -   if (!ret && unlikely(atomic_read(>cpu_writers) >
> > 0)) {
> > -   reservation_object_unlock(bo->resv);
> > -
> > -   ret = -EBUSY;
> > -
> > -   } else if (ret == -EALREADY && dups) {
> > +   if (ret == -EALREADY && dups) {
> > struct ttm_validate_buffer *safe = entry;
> > entry = list_prev_entry(entry, head);
> > list_del(>head);
> > diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_bo.c
> > b/drivers/gpu/drm/vmwgfx/vmwgfx_bo.c
> > index 5d5c2bce01f3..457861c5047f 100644
> > --- a/drivers/gpu/drm/vmwgfx/vmwgfx_bo.c
> > +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_bo.c
> > @@ -565,7 

Re: [PATCH] drm/ttm: move cpu_writers handling into vmwgfx

2019-06-14 Thread Christian König

Thomas just a gentle ping on this.

It's not that my live depends on this, but it would still be a nice to 
have cleanup.


Thanks,
Christian.

Am 07.06.19 um 16:47 schrieb Christian König:

This feature is only used by vmwgfx and superflous for everybody else.

Signed-off-by: Christian König 
---
  drivers/gpu/drm/ttm/ttm_bo.c | 27 --
  drivers/gpu/drm/ttm/ttm_bo_util.c|  1 -
  drivers/gpu/drm/ttm/ttm_execbuf_util.c   |  7 +
  drivers/gpu/drm/vmwgfx/vmwgfx_bo.c   | 35 
  drivers/gpu/drm/vmwgfx/vmwgfx_drv.h  |  2 ++
  drivers/gpu/drm/vmwgfx/vmwgfx_execbuf.c  |  8 ++
  drivers/gpu/drm/vmwgfx/vmwgfx_resource.c |  4 +++
  include/drm/ttm/ttm_bo_api.h | 31 -
  8 files changed, 45 insertions(+), 70 deletions(-)

diff --git a/drivers/gpu/drm/ttm/ttm_bo.c b/drivers/gpu/drm/ttm/ttm_bo.c
index c7de667d482a..4ec055ffd6a7 100644
--- a/drivers/gpu/drm/ttm/ttm_bo.c
+++ b/drivers/gpu/drm/ttm/ttm_bo.c
@@ -153,7 +153,6 @@ static void ttm_bo_release_list(struct kref *list_kref)
  
  	BUG_ON(kref_read(>list_kref));

BUG_ON(kref_read(>kref));
-   BUG_ON(atomic_read(>cpu_writers));
BUG_ON(bo->mem.mm_node != NULL);
BUG_ON(!list_empty(>lru));
BUG_ON(!list_empty(>ddestroy));
@@ -1308,7 +1307,6 @@ int ttm_bo_init_reserved(struct ttm_bo_device *bdev,
  
  	kref_init(>kref);

kref_init(>list_kref);
-   atomic_set(>cpu_writers, 0);
INIT_LIST_HEAD(>lru);
INIT_LIST_HEAD(>ddestroy);
INIT_LIST_HEAD(>swap);
@@ -1814,31 +1812,6 @@ int ttm_bo_wait(struct ttm_buffer_object *bo,
  }
  EXPORT_SYMBOL(ttm_bo_wait);
  
-int ttm_bo_synccpu_write_grab(struct ttm_buffer_object *bo, bool no_wait)

-{
-   int ret = 0;
-
-   /*
-* Using ttm_bo_reserve makes sure the lru lists are updated.
-*/
-
-   ret = ttm_bo_reserve(bo, true, no_wait, NULL);
-   if (unlikely(ret != 0))
-   return ret;
-   ret = ttm_bo_wait(bo, true, no_wait);
-   if (likely(ret == 0))
-   atomic_inc(>cpu_writers);
-   ttm_bo_unreserve(bo);
-   return ret;
-}
-EXPORT_SYMBOL(ttm_bo_synccpu_write_grab);
-
-void ttm_bo_synccpu_write_release(struct ttm_buffer_object *bo)
-{
-   atomic_dec(>cpu_writers);
-}
-EXPORT_SYMBOL(ttm_bo_synccpu_write_release);
-
  /**
   * A buffer object shrink method that tries to swap out the first
   * buffer object on the bo_global::swap_lru list.
diff --git a/drivers/gpu/drm/ttm/ttm_bo_util.c 
b/drivers/gpu/drm/ttm/ttm_bo_util.c
index 895d77d799e4..6f43f1f0de7c 100644
--- a/drivers/gpu/drm/ttm/ttm_bo_util.c
+++ b/drivers/gpu/drm/ttm/ttm_bo_util.c
@@ -511,7 +511,6 @@ static int ttm_buffer_object_transfer(struct 
ttm_buffer_object *bo,
mutex_init(>base.wu_mutex);
fbo->base.moving = NULL;
drm_vma_node_reset(>base.vma_node);
-   atomic_set(>base.cpu_writers, 0);
  
  	kref_init(>base.list_kref);

kref_init(>base.kref);
diff --git a/drivers/gpu/drm/ttm/ttm_execbuf_util.c 
b/drivers/gpu/drm/ttm/ttm_execbuf_util.c
index 957ec375a4ba..80fa52b36d5c 100644
--- a/drivers/gpu/drm/ttm/ttm_execbuf_util.c
+++ b/drivers/gpu/drm/ttm/ttm_execbuf_util.c
@@ -113,12 +113,7 @@ int ttm_eu_reserve_buffers(struct ww_acquire_ctx *ticket,
struct ttm_buffer_object *bo = entry->bo;
  
  		ret = __ttm_bo_reserve(bo, intr, (ticket == NULL), ticket);

-   if (!ret && unlikely(atomic_read(>cpu_writers) > 0)) {
-   reservation_object_unlock(bo->resv);
-
-   ret = -EBUSY;
-
-   } else if (ret == -EALREADY && dups) {
+   if (ret == -EALREADY && dups) {
struct ttm_validate_buffer *safe = entry;
entry = list_prev_entry(entry, head);
list_del(>head);
diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_bo.c 
b/drivers/gpu/drm/vmwgfx/vmwgfx_bo.c
index 5d5c2bce01f3..457861c5047f 100644
--- a/drivers/gpu/drm/vmwgfx/vmwgfx_bo.c
+++ b/drivers/gpu/drm/vmwgfx/vmwgfx_bo.c
@@ -565,7 +565,7 @@ static void vmw_user_bo_ref_obj_release(struct 
ttm_base_object *base,
  
  	switch (ref_type) {

case TTM_REF_SYNCCPU_WRITE:
-   ttm_bo_synccpu_write_release(_bo->vbo.base);
+   atomic_dec(_bo->vbo.cpu_writers);
break;
default:
WARN_ONCE(true, "Undefined buffer object reference release.\n");
@@ -681,12 +681,12 @@ static int vmw_user_bo_synccpu_grab(struct 
vmw_user_buffer_object *user_bo,
struct ttm_object_file *tfile,
uint32_t flags)
  {
+   bool nonblock = !!(flags & drm_vmw_synccpu_dontblock);
struct ttm_buffer_object *bo = _bo->vbo.base;
bool existed;
int ret;
  
  	if (flags & drm_vmw_synccpu_allow_cs) {

-   bool nonblock = !!(flags & drm_vmw_synccpu_dontblock);
long lret;

Re: [PATCH] drm/ttm: move cpu_writers handling into vmwgfx

2019-06-12 Thread Thomas Hellstrom
Hi, Christian,

This looks OK, although there are a couple of minor alterations needed
in the vmwgfx driver:

- We should operate on vmw_buffer_objects rather than on
user_buffer_objects.
- vmw_user_bo_verify_synccpu should move to the validate code.

I can take care of that if it's ok with you.

Thanks,
Thomas


On Fri, 2019-06-07 at 16:47 +0200, Christian König wrote:
> This feature is only used by vmwgfx and superflous for everybody
> else.
> 
> Signed-off-by: Christian König 
> ---
>  drivers/gpu/drm/ttm/ttm_bo.c | 27 --
>  drivers/gpu/drm/ttm/ttm_bo_util.c|  1 -
>  drivers/gpu/drm/ttm/ttm_execbuf_util.c   |  7 +
>  drivers/gpu/drm/vmwgfx/vmwgfx_bo.c   | 35 
> 
>  drivers/gpu/drm/vmwgfx/vmwgfx_drv.h  |  2 ++
>  drivers/gpu/drm/vmwgfx/vmwgfx_execbuf.c  |  8 ++
>  drivers/gpu/drm/vmwgfx/vmwgfx_resource.c |  4 +++
>  include/drm/ttm/ttm_bo_api.h | 31 -
>  8 files changed, 45 insertions(+), 70 deletions(-)
> 
> diff --git a/drivers/gpu/drm/ttm/ttm_bo.c
> b/drivers/gpu/drm/ttm/ttm_bo.c
> index c7de667d482a..4ec055ffd6a7 100644
> --- a/drivers/gpu/drm/ttm/ttm_bo.c
> +++ b/drivers/gpu/drm/ttm/ttm_bo.c
> @@ -153,7 +153,6 @@ static void ttm_bo_release_list(struct kref
> *list_kref)
>  
>   BUG_ON(kref_read(>list_kref));
>   BUG_ON(kref_read(>kref));
> - BUG_ON(atomic_read(>cpu_writers));
>   BUG_ON(bo->mem.mm_node != NULL);
>   BUG_ON(!list_empty(>lru));
>   BUG_ON(!list_empty(>ddestroy));
> @@ -1308,7 +1307,6 @@ int ttm_bo_init_reserved(struct ttm_bo_device
> *bdev,
>  
>   kref_init(>kref);
>   kref_init(>list_kref);
> - atomic_set(>cpu_writers, 0);
>   INIT_LIST_HEAD(>lru);
>   INIT_LIST_HEAD(>ddestroy);
>   INIT_LIST_HEAD(>swap);
> @@ -1814,31 +1812,6 @@ int ttm_bo_wait(struct ttm_buffer_object *bo,
>  }
>  EXPORT_SYMBOL(ttm_bo_wait);
>  
> -int ttm_bo_synccpu_write_grab(struct ttm_buffer_object *bo, bool
> no_wait)
> -{
> - int ret = 0;
> -
> - /*
> -  * Using ttm_bo_reserve makes sure the lru lists are updated.
> -  */
> -
> - ret = ttm_bo_reserve(bo, true, no_wait, NULL);
> - if (unlikely(ret != 0))
> - return ret;
> - ret = ttm_bo_wait(bo, true, no_wait);
> - if (likely(ret == 0))
> - atomic_inc(>cpu_writers);
> - ttm_bo_unreserve(bo);
> - return ret;
> -}
> -EXPORT_SYMBOL(ttm_bo_synccpu_write_grab);
> -
> -void ttm_bo_synccpu_write_release(struct ttm_buffer_object *bo)
> -{
> - atomic_dec(>cpu_writers);
> -}
> -EXPORT_SYMBOL(ttm_bo_synccpu_write_release);
> -
>  /**
>   * A buffer object shrink method that tries to swap out the first
>   * buffer object on the bo_global::swap_lru list.
> diff --git a/drivers/gpu/drm/ttm/ttm_bo_util.c
> b/drivers/gpu/drm/ttm/ttm_bo_util.c
> index 895d77d799e4..6f43f1f0de7c 100644
> --- a/drivers/gpu/drm/ttm/ttm_bo_util.c
> +++ b/drivers/gpu/drm/ttm/ttm_bo_util.c
> @@ -511,7 +511,6 @@ static int ttm_buffer_object_transfer(struct
> ttm_buffer_object *bo,
>   mutex_init(>base.wu_mutex);
>   fbo->base.moving = NULL;
>   drm_vma_node_reset(>base.vma_node);
> - atomic_set(>base.cpu_writers, 0);
>  
>   kref_init(>base.list_kref);
>   kref_init(>base.kref);
> diff --git a/drivers/gpu/drm/ttm/ttm_execbuf_util.c
> b/drivers/gpu/drm/ttm/ttm_execbuf_util.c
> index 957ec375a4ba..80fa52b36d5c 100644
> --- a/drivers/gpu/drm/ttm/ttm_execbuf_util.c
> +++ b/drivers/gpu/drm/ttm/ttm_execbuf_util.c
> @@ -113,12 +113,7 @@ int ttm_eu_reserve_buffers(struct ww_acquire_ctx
> *ticket,
>   struct ttm_buffer_object *bo = entry->bo;
>  
>   ret = __ttm_bo_reserve(bo, intr, (ticket == NULL),
> ticket);
> - if (!ret && unlikely(atomic_read(>cpu_writers) >
> 0)) {
> - reservation_object_unlock(bo->resv);
> -
> - ret = -EBUSY;
> -
> - } else if (ret == -EALREADY && dups) {
> + if (ret == -EALREADY && dups) {
>   struct ttm_validate_buffer *safe = entry;
>   entry = list_prev_entry(entry, head);
>   list_del(>head);
> diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_bo.c
> b/drivers/gpu/drm/vmwgfx/vmwgfx_bo.c
> index 5d5c2bce01f3..457861c5047f 100644
> --- a/drivers/gpu/drm/vmwgfx/vmwgfx_bo.c
> +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_bo.c
> @@ -565,7 +565,7 @@ static void vmw_user_bo_ref_obj_release(struct
> ttm_base_object *base,
>  
>   switch (ref_type) {
>   case TTM_REF_SYNCCPU_WRITE:
> - ttm_bo_synccpu_write_release(_bo->vbo.base);
> + atomic_dec(_bo->vbo.cpu_writers);
>   break;
>   default:
>   WARN_ONCE(true, "Undefined buffer object reference
> release.\n");
> @@ -681,12 +681,12 @@ static int vmw_user_bo_synccpu_grab(struct
> vmw_user_buffer_object *user_bo,
>   struct ttm_object_file *tfile,
>  

[PATCH] drm/ttm: move cpu_writers handling into vmwgfx

2019-06-07 Thread Christian König
This feature is only used by vmwgfx and superflous for everybody else.

Signed-off-by: Christian König 
---
 drivers/gpu/drm/ttm/ttm_bo.c | 27 --
 drivers/gpu/drm/ttm/ttm_bo_util.c|  1 -
 drivers/gpu/drm/ttm/ttm_execbuf_util.c   |  7 +
 drivers/gpu/drm/vmwgfx/vmwgfx_bo.c   | 35 
 drivers/gpu/drm/vmwgfx/vmwgfx_drv.h  |  2 ++
 drivers/gpu/drm/vmwgfx/vmwgfx_execbuf.c  |  8 ++
 drivers/gpu/drm/vmwgfx/vmwgfx_resource.c |  4 +++
 include/drm/ttm/ttm_bo_api.h | 31 -
 8 files changed, 45 insertions(+), 70 deletions(-)

diff --git a/drivers/gpu/drm/ttm/ttm_bo.c b/drivers/gpu/drm/ttm/ttm_bo.c
index c7de667d482a..4ec055ffd6a7 100644
--- a/drivers/gpu/drm/ttm/ttm_bo.c
+++ b/drivers/gpu/drm/ttm/ttm_bo.c
@@ -153,7 +153,6 @@ static void ttm_bo_release_list(struct kref *list_kref)
 
BUG_ON(kref_read(>list_kref));
BUG_ON(kref_read(>kref));
-   BUG_ON(atomic_read(>cpu_writers));
BUG_ON(bo->mem.mm_node != NULL);
BUG_ON(!list_empty(>lru));
BUG_ON(!list_empty(>ddestroy));
@@ -1308,7 +1307,6 @@ int ttm_bo_init_reserved(struct ttm_bo_device *bdev,
 
kref_init(>kref);
kref_init(>list_kref);
-   atomic_set(>cpu_writers, 0);
INIT_LIST_HEAD(>lru);
INIT_LIST_HEAD(>ddestroy);
INIT_LIST_HEAD(>swap);
@@ -1814,31 +1812,6 @@ int ttm_bo_wait(struct ttm_buffer_object *bo,
 }
 EXPORT_SYMBOL(ttm_bo_wait);
 
-int ttm_bo_synccpu_write_grab(struct ttm_buffer_object *bo, bool no_wait)
-{
-   int ret = 0;
-
-   /*
-* Using ttm_bo_reserve makes sure the lru lists are updated.
-*/
-
-   ret = ttm_bo_reserve(bo, true, no_wait, NULL);
-   if (unlikely(ret != 0))
-   return ret;
-   ret = ttm_bo_wait(bo, true, no_wait);
-   if (likely(ret == 0))
-   atomic_inc(>cpu_writers);
-   ttm_bo_unreserve(bo);
-   return ret;
-}
-EXPORT_SYMBOL(ttm_bo_synccpu_write_grab);
-
-void ttm_bo_synccpu_write_release(struct ttm_buffer_object *bo)
-{
-   atomic_dec(>cpu_writers);
-}
-EXPORT_SYMBOL(ttm_bo_synccpu_write_release);
-
 /**
  * A buffer object shrink method that tries to swap out the first
  * buffer object on the bo_global::swap_lru list.
diff --git a/drivers/gpu/drm/ttm/ttm_bo_util.c 
b/drivers/gpu/drm/ttm/ttm_bo_util.c
index 895d77d799e4..6f43f1f0de7c 100644
--- a/drivers/gpu/drm/ttm/ttm_bo_util.c
+++ b/drivers/gpu/drm/ttm/ttm_bo_util.c
@@ -511,7 +511,6 @@ static int ttm_buffer_object_transfer(struct 
ttm_buffer_object *bo,
mutex_init(>base.wu_mutex);
fbo->base.moving = NULL;
drm_vma_node_reset(>base.vma_node);
-   atomic_set(>base.cpu_writers, 0);
 
kref_init(>base.list_kref);
kref_init(>base.kref);
diff --git a/drivers/gpu/drm/ttm/ttm_execbuf_util.c 
b/drivers/gpu/drm/ttm/ttm_execbuf_util.c
index 957ec375a4ba..80fa52b36d5c 100644
--- a/drivers/gpu/drm/ttm/ttm_execbuf_util.c
+++ b/drivers/gpu/drm/ttm/ttm_execbuf_util.c
@@ -113,12 +113,7 @@ int ttm_eu_reserve_buffers(struct ww_acquire_ctx *ticket,
struct ttm_buffer_object *bo = entry->bo;
 
ret = __ttm_bo_reserve(bo, intr, (ticket == NULL), ticket);
-   if (!ret && unlikely(atomic_read(>cpu_writers) > 0)) {
-   reservation_object_unlock(bo->resv);
-
-   ret = -EBUSY;
-
-   } else if (ret == -EALREADY && dups) {
+   if (ret == -EALREADY && dups) {
struct ttm_validate_buffer *safe = entry;
entry = list_prev_entry(entry, head);
list_del(>head);
diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_bo.c 
b/drivers/gpu/drm/vmwgfx/vmwgfx_bo.c
index 5d5c2bce01f3..457861c5047f 100644
--- a/drivers/gpu/drm/vmwgfx/vmwgfx_bo.c
+++ b/drivers/gpu/drm/vmwgfx/vmwgfx_bo.c
@@ -565,7 +565,7 @@ static void vmw_user_bo_ref_obj_release(struct 
ttm_base_object *base,
 
switch (ref_type) {
case TTM_REF_SYNCCPU_WRITE:
-   ttm_bo_synccpu_write_release(_bo->vbo.base);
+   atomic_dec(_bo->vbo.cpu_writers);
break;
default:
WARN_ONCE(true, "Undefined buffer object reference release.\n");
@@ -681,12 +681,12 @@ static int vmw_user_bo_synccpu_grab(struct 
vmw_user_buffer_object *user_bo,
struct ttm_object_file *tfile,
uint32_t flags)
 {
+   bool nonblock = !!(flags & drm_vmw_synccpu_dontblock);
struct ttm_buffer_object *bo = _bo->vbo.base;
bool existed;
int ret;
 
if (flags & drm_vmw_synccpu_allow_cs) {
-   bool nonblock = !!(flags & drm_vmw_synccpu_dontblock);
long lret;
 
lret = reservation_object_wait_timeout_rcu
@@ -699,15 +699,20 @@ static int vmw_user_bo_synccpu_grab(struct 
vmw_user_buffer_object *user_bo,
return