Re: [PATCH] drm/ttm: move cpu_writers handling into vmwgfx v2
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
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(&bo->list_kref)); BUG_ON(kref_read(&bo->kref)); - BUG_ON(atomic_read(&bo->cpu_writers)); BUG_ON(bo->mem.mm_node != NULL); BUG_ON(!list_empty(&bo->lru)); BUG_ON(!list_empty(&bo->ddestroy)); @@ -1311,7 +1310,6 @@ int ttm_bo_init_reserved(struct ttm_bo_device *bdev, kref_init(&bo->kref); kref_init(&bo->list_kref); - atomic_set(&bo->cpu_writers, 0); INIT_LIST_HEAD(&bo->lru); INIT_LIST_HEAD(&bo->ddestroy); INIT_LIST_HEAD(&bo->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(&bo->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(&bo->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(&fbo->base.wu_mutex); fbo->base.moving = NULL; drm_vma_node_reset(&fbo->base.base.vma_node); - atomic_set(&fbo->base.cpu_writers, 0); kref_init(&fbo->base.list_kref); kref_init(&fbo->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(&bo->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(&safe->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(&bo->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_
Re: [PATCH] drm/ttm: move cpu_writers handling into vmwgfx
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(&bo->list_kref)); > > BUG_ON(kref_read(&bo->kref)); > > - BUG_ON(atomic_read(&bo->cpu_writers)); > > BUG_ON(bo->mem.mm_node != NULL); > > BUG_ON(!list_empty(&bo->lru)); > > BUG_ON(!list_empty(&bo->ddestroy)); > > @@ -1308,7 +1307,6 @@ int ttm_bo_init_reserved(struct ttm_bo_device > > *bdev, > > > > kref_init(&bo->kref); > > kref_init(&bo->list_kref); > > - atomic_set(&bo->cpu_writers, 0); > > INIT_LIST_HEAD(&bo->lru); > > INIT_LIST_HEAD(&bo->ddestroy); > > INIT_LIST_HEAD(&bo->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(&bo->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(&bo->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(&fbo->base.wu_mutex); > > fbo->base.moving = NULL; > > drm_vma_node_reset(&fbo->base.vma_node); > > - atomic_set(&fbo->base.cpu_writers, 0); > > > > kref_init(&fbo->base.list_kref); > > kref_init(&fbo->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(&bo->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(&safe->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/gp
Re: [PATCH] drm/ttm: move cpu_writers handling into vmwgfx
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(&bo->list_kref)); BUG_ON(kref_read(&bo->kref)); - BUG_ON(atomic_read(&bo->cpu_writers)); BUG_ON(bo->mem.mm_node != NULL); BUG_ON(!list_empty(&bo->lru)); BUG_ON(!list_empty(&bo->ddestroy)); @@ -1308,7 +1307,6 @@ int ttm_bo_init_reserved(struct ttm_bo_device *bdev, kref_init(&bo->kref); kref_init(&bo->list_kref); - atomic_set(&bo->cpu_writers, 0); INIT_LIST_HEAD(&bo->lru); INIT_LIST_HEAD(&bo->ddestroy); INIT_LIST_HEAD(&bo->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(&bo->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(&bo->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(&fbo->base.wu_mutex); fbo->base.moving = NULL; drm_vma_node_reset(&fbo->base.vma_node); - atomic_set(&fbo->base.cpu_writers, 0); kref_init(&fbo->base.list_kref); kref_init(&fbo->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(&bo->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(&safe->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(&user_bo->vbo.base); + atomic_dec(&user_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 = &user_bo->vbo.base; bool existed; int ret; if (flags & drm_vmw_synccpu_allow_cs)
Re: [PATCH] drm/ttm: move cpu_writers handling into vmwgfx
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(&bo->list_kref)); > BUG_ON(kref_read(&bo->kref)); > - BUG_ON(atomic_read(&bo->cpu_writers)); > BUG_ON(bo->mem.mm_node != NULL); > BUG_ON(!list_empty(&bo->lru)); > BUG_ON(!list_empty(&bo->ddestroy)); > @@ -1308,7 +1307,6 @@ int ttm_bo_init_reserved(struct ttm_bo_device > *bdev, > > kref_init(&bo->kref); > kref_init(&bo->list_kref); > - atomic_set(&bo->cpu_writers, 0); > INIT_LIST_HEAD(&bo->lru); > INIT_LIST_HEAD(&bo->ddestroy); > INIT_LIST_HEAD(&bo->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(&bo->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(&bo->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(&fbo->base.wu_mutex); > fbo->base.moving = NULL; > drm_vma_node_reset(&fbo->base.vma_node); > - atomic_set(&fbo->base.cpu_writers, 0); > > kref_init(&fbo->base.list_kref); > kref_init(&fbo->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(&bo->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(&safe->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(&user_bo->vbo.base); > + atomic_dec(&user_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
[PATCH] drm/ttm: move cpu_writers handling into vmwgfx
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(&bo->list_kref)); BUG_ON(kref_read(&bo->kref)); - BUG_ON(atomic_read(&bo->cpu_writers)); BUG_ON(bo->mem.mm_node != NULL); BUG_ON(!list_empty(&bo->lru)); BUG_ON(!list_empty(&bo->ddestroy)); @@ -1308,7 +1307,6 @@ int ttm_bo_init_reserved(struct ttm_bo_device *bdev, kref_init(&bo->kref); kref_init(&bo->list_kref); - atomic_set(&bo->cpu_writers, 0); INIT_LIST_HEAD(&bo->lru); INIT_LIST_HEAD(&bo->ddestroy); INIT_LIST_HEAD(&bo->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(&bo->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(&bo->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(&fbo->base.wu_mutex); fbo->base.moving = NULL; drm_vma_node_reset(&fbo->base.vma_node); - atomic_set(&fbo->base.cpu_writers, 0); kref_init(&fbo->base.list_kref); kref_init(&fbo->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(&bo->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(&safe->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(&user_bo->vbo.base); + atomic_dec(&user_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 = &user_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 @@