Jerome Glisse wrote:
> There is case where we want to be able to wait only for the
> GPU while not waiting for other buffer to be unreserved. This
> patch split the no_wait argument all the way down in the whole
> ttm path so that upper level can decide on what to wait on or
> not.
>
> This patch break the API to other modules, update to others
> driver are following in separate patches.
>
> Signed-off-by: Jerome Glisse <[email protected]>
>
Acked-by: Thomas Hellstrom <[email protected]>
> ---
> drivers/gpu/drm/ttm/ttm_bo.c | 57 ++++++++++++++++++++----------------
> drivers/gpu/drm/ttm/ttm_bo_util.c | 9 ++++--
> include/drm/ttm/ttm_bo_api.h | 6 ++-
> include/drm/ttm/ttm_bo_driver.h | 29 +++++++++++-------
> 4 files changed, 60 insertions(+), 41 deletions(-)
>
> diff --git a/drivers/gpu/drm/ttm/ttm_bo.c b/drivers/gpu/drm/ttm/ttm_bo.c
> index c7320ce..d2b2482 100644
> --- a/drivers/gpu/drm/ttm/ttm_bo.c
> +++ b/drivers/gpu/drm/ttm/ttm_bo.c
> @@ -357,7 +357,8 @@ static int ttm_bo_add_ttm(struct ttm_buffer_object *bo,
> bool zero_alloc)
>
> static int ttm_bo_handle_move_mem(struct ttm_buffer_object *bo,
> struct ttm_mem_reg *mem,
> - bool evict, bool interruptible, bool no_wait)
> + bool evict, bool interruptible,
> + bool no_wait_reserve, bool no_wait_gpu)
> {
> struct ttm_bo_device *bdev = bo->bdev;
> bool old_is_pci = ttm_mem_reg_is_pci(bdev, &bo->mem);
> @@ -402,12 +403,12 @@ static int ttm_bo_handle_move_mem(struct
> ttm_buffer_object *bo,
>
> if (!(old_man->flags & TTM_MEMTYPE_FLAG_FIXED) &&
> !(new_man->flags & TTM_MEMTYPE_FLAG_FIXED))
> - ret = ttm_bo_move_ttm(bo, evict, no_wait, mem);
> + ret = ttm_bo_move_ttm(bo, evict, no_wait_reserve, no_wait_gpu,
> mem);
> else if (bdev->driver->move)
> ret = bdev->driver->move(bo, evict, interruptible,
> - no_wait, mem);
> + no_wait_reserve, no_wait_gpu, mem);
> else
> - ret = ttm_bo_move_memcpy(bo, evict, no_wait, mem);
> + ret = ttm_bo_move_memcpy(bo, evict, no_wait_reserve,
> no_wait_gpu, mem);
>
> if (ret)
> goto out_err;
> @@ -606,7 +607,7 @@ void ttm_bo_unref(struct ttm_buffer_object **p_bo)
> EXPORT_SYMBOL(ttm_bo_unref);
>
> static int ttm_bo_evict(struct ttm_buffer_object *bo, bool interruptible,
> - bool no_wait)
> + bool no_wait_reserve, bool no_wait_gpu)
> {
> struct ttm_bo_device *bdev = bo->bdev;
> struct ttm_bo_global *glob = bo->glob;
> @@ -615,7 +616,7 @@ static int ttm_bo_evict(struct ttm_buffer_object *bo,
> bool interruptible,
> int ret = 0;
>
> spin_lock(&bo->lock);
> - ret = ttm_bo_wait(bo, false, interruptible, no_wait);
> + ret = ttm_bo_wait(bo, false, interruptible, no_wait_gpu);
> spin_unlock(&bo->lock);
>
> if (unlikely(ret != 0)) {
> @@ -638,7 +639,7 @@ static int ttm_bo_evict(struct ttm_buffer_object *bo,
> bool interruptible,
> placement.num_busy_placement = 0;
> bdev->driver->evict_flags(bo, &placement);
> ret = ttm_bo_mem_space(bo, &placement, &evict_mem, interruptible,
> - no_wait);
> + no_wait_reserve, no_wait_gpu);
> if (ret) {
> if (ret != -ERESTARTSYS) {
> printk(KERN_ERR TTM_PFX
> @@ -650,7 +651,7 @@ static int ttm_bo_evict(struct ttm_buffer_object *bo,
> bool interruptible,
> }
>
> ret = ttm_bo_handle_move_mem(bo, &evict_mem, true, interruptible,
> - no_wait);
> + no_wait_reserve, no_wait_gpu);
> if (ret) {
> if (ret != -ERESTARTSYS)
> printk(KERN_ERR TTM_PFX "Buffer eviction failed\n");
> @@ -670,7 +671,8 @@ out:
>
> static int ttm_mem_evict_first(struct ttm_bo_device *bdev,
> uint32_t mem_type,
> - bool interruptible, bool no_wait)
> + bool interruptible, bool no_wait_reserve,
> + bool no_wait_gpu)
> {
> struct ttm_bo_global *glob = bdev->glob;
> struct ttm_mem_type_manager *man = &bdev->man[mem_type];
> @@ -687,11 +689,11 @@ retry:
> bo = list_first_entry(&man->lru, struct ttm_buffer_object, lru);
> kref_get(&bo->list_kref);
>
> - ret = ttm_bo_reserve_locked(bo, false, true, false, 0);
> + ret = ttm_bo_reserve_locked(bo, false, no_wait_reserve, false, 0);
>
> if (unlikely(ret == -EBUSY)) {
> spin_unlock(&glob->lru_lock);
> - if (likely(!no_wait))
> + if (likely(!no_wait_gpu))
> ret = ttm_bo_wait_unreserved(bo, interruptible);
>
> kref_put(&bo->list_kref, ttm_bo_release_list);
> @@ -713,7 +715,7 @@ retry:
> while (put_count--)
> kref_put(&bo->list_kref, ttm_bo_ref_bug);
>
> - ret = ttm_bo_evict(bo, interruptible, no_wait);
> + ret = ttm_bo_evict(bo, interruptible, no_wait_reserve, no_wait_gpu);
> ttm_bo_unreserve(bo);
>
> kref_put(&bo->list_kref, ttm_bo_release_list);
> @@ -764,7 +766,9 @@ static int ttm_bo_mem_force_space(struct
> ttm_buffer_object *bo,
> uint32_t mem_type,
> struct ttm_placement *placement,
> struct ttm_mem_reg *mem,
> - bool interruptible, bool no_wait)
> + bool interruptible,
> + bool no_wait_reserve,
> + bool no_wait_gpu)
> {
> struct ttm_bo_device *bdev = bo->bdev;
> struct ttm_bo_global *glob = bdev->glob;
> @@ -785,7 +789,7 @@ static int ttm_bo_mem_force_space(struct
> ttm_buffer_object *bo,
> }
> spin_unlock(&glob->lru_lock);
> ret = ttm_mem_evict_first(bdev, mem_type, interruptible,
> - no_wait);
> + no_wait_reserve, no_wait_gpu);
> if (unlikely(ret != 0))
> return ret;
> } while (1);
> @@ -855,7 +859,8 @@ static bool ttm_bo_mt_compatible(struct
> ttm_mem_type_manager *man,
> int ttm_bo_mem_space(struct ttm_buffer_object *bo,
> struct ttm_placement *placement,
> struct ttm_mem_reg *mem,
> - bool interruptible, bool no_wait)
> + bool interruptible, bool no_wait_reserve,
> + bool no_wait_gpu)
> {
> struct ttm_bo_device *bdev = bo->bdev;
> struct ttm_mem_type_manager *man;
> @@ -952,7 +957,7 @@ int ttm_bo_mem_space(struct ttm_buffer_object *bo,
> }
>
> ret = ttm_bo_mem_force_space(bo, mem_type, placement, mem,
> - interruptible, no_wait);
> + interruptible, no_wait_reserve,
> no_wait_gpu);
> if (ret == 0 && mem->mm_node) {
> mem->placement = cur_flags;
> mem->mm_node->private = bo;
> @@ -978,7 +983,8 @@ EXPORT_SYMBOL(ttm_bo_wait_cpu);
>
> int ttm_bo_move_buffer(struct ttm_buffer_object *bo,
> struct ttm_placement *placement,
> - bool interruptible, bool no_wait)
> + bool interruptible, bool no_wait_reserve,
> + bool no_wait_gpu)
> {
> struct ttm_bo_global *glob = bo->glob;
> int ret = 0;
> @@ -992,7 +998,7 @@ int ttm_bo_move_buffer(struct ttm_buffer_object *bo,
> * instead of doing it here.
> */
> spin_lock(&bo->lock);
> - ret = ttm_bo_wait(bo, false, interruptible, no_wait);
> + ret = ttm_bo_wait(bo, false, interruptible, no_wait_gpu);
> spin_unlock(&bo->lock);
> if (ret)
> return ret;
> @@ -1002,10 +1008,10 @@ int ttm_bo_move_buffer(struct ttm_buffer_object *bo,
> /*
> * Determine where to move the buffer.
> */
> - ret = ttm_bo_mem_space(bo, placement, &mem, interruptible, no_wait);
> + ret = ttm_bo_mem_space(bo, placement, &mem, interruptible,
> no_wait_reserve, no_wait_gpu);
> if (ret)
> goto out_unlock;
> - ret = ttm_bo_handle_move_mem(bo, &mem, false, interruptible, no_wait);
> + ret = ttm_bo_handle_move_mem(bo, &mem, false, interruptible,
> no_wait_reserve, no_wait_gpu);
> out_unlock:
> if (ret && mem.mm_node) {
> spin_lock(&glob->lru_lock);
> @@ -1039,7 +1045,8 @@ static int ttm_bo_mem_compat(struct ttm_placement
> *placement,
>
> int ttm_bo_validate(struct ttm_buffer_object *bo,
> struct ttm_placement *placement,
> - bool interruptible, bool no_wait)
> + bool interruptible, bool no_wait_reserve,
> + bool no_wait_gpu)
> {
> int ret;
>
> @@ -1054,7 +1061,7 @@ int ttm_bo_validate(struct ttm_buffer_object *bo,
> */
> ret = ttm_bo_mem_compat(placement, &bo->mem);
> if (ret < 0) {
> - ret = ttm_bo_move_buffer(bo, placement, interruptible, no_wait);
> + ret = ttm_bo_move_buffer(bo, placement, interruptible,
> no_wait_reserve, no_wait_gpu);
> if (ret)
> return ret;
> } else {
> @@ -1175,7 +1182,7 @@ int ttm_bo_init(struct ttm_bo_device *bdev,
> goto out_err;
> }
>
> - ret = ttm_bo_validate(bo, placement, interruptible, false);
> + ret = ttm_bo_validate(bo, placement, interruptible, false, false);
> if (ret)
> goto out_err;
>
> @@ -1249,7 +1256,7 @@ static int ttm_bo_force_list_clean(struct ttm_bo_device
> *bdev,
> spin_lock(&glob->lru_lock);
> while (!list_empty(&man->lru)) {
> spin_unlock(&glob->lru_lock);
> - ret = ttm_mem_evict_first(bdev, mem_type, false, false);
> + ret = ttm_mem_evict_first(bdev, mem_type, false, false, false);
> if (ret) {
> if (allow_errors) {
> return ret;
> @@ -1839,7 +1846,7 @@ static int ttm_bo_swapout(struct ttm_mem_shrink *shrink)
> evict_mem.mem_type = TTM_PL_SYSTEM;
>
> ret = ttm_bo_handle_move_mem(bo, &evict_mem, true,
> - false, false);
> + false, false, false);
> if (unlikely(ret != 0))
> goto out;
> }
> diff --git a/drivers/gpu/drm/ttm/ttm_bo_util.c
> b/drivers/gpu/drm/ttm/ttm_bo_util.c
> index 3f72fe1..db43b30 100644
> --- a/drivers/gpu/drm/ttm/ttm_bo_util.c
> +++ b/drivers/gpu/drm/ttm/ttm_bo_util.c
> @@ -49,7 +49,8 @@ void ttm_bo_free_old_node(struct ttm_buffer_object *bo)
> }
>
> int ttm_bo_move_ttm(struct ttm_buffer_object *bo,
> - bool evict, bool no_wait, struct ttm_mem_reg *new_mem)
> + bool evict, bool no_wait_reserve,
> + bool no_wait_gpu, struct ttm_mem_reg *new_mem)
> {
> struct ttm_tt *ttm = bo->ttm;
> struct ttm_mem_reg *old_mem = &bo->mem;
> @@ -207,7 +208,8 @@ static int ttm_copy_ttm_io_page(struct ttm_tt *ttm, void
> *dst,
> }
>
> int ttm_bo_move_memcpy(struct ttm_buffer_object *bo,
> - bool evict, bool no_wait, struct ttm_mem_reg *new_mem)
> + bool evict, bool no_wait_reserve, bool no_wait_gpu,
> + struct ttm_mem_reg *new_mem)
> {
> struct ttm_bo_device *bdev = bo->bdev;
> struct ttm_mem_type_manager *man = &bdev->man[new_mem->mem_type];
> @@ -525,7 +527,8 @@ int ttm_bo_pfn_prot(struct ttm_buffer_object *bo,
> int ttm_bo_move_accel_cleanup(struct ttm_buffer_object *bo,
> void *sync_obj,
> void *sync_obj_arg,
> - bool evict, bool no_wait,
> + bool evict, bool no_wait_reserve,
> + bool no_wait_gpu,
> struct ttm_mem_reg *new_mem)
> {
> struct ttm_bo_device *bdev = bo->bdev;
> diff --git a/include/drm/ttm/ttm_bo_api.h b/include/drm/ttm/ttm_bo_api.h
> index 81eb9f4..8c8005e 100644
> --- a/include/drm/ttm/ttm_bo_api.h
> +++ b/include/drm/ttm/ttm_bo_api.h
> @@ -313,7 +313,8 @@ extern int ttm_bo_wait(struct ttm_buffer_object *bo, bool
> lazy,
> * @bo: The buffer object.
> * @placement: Proposed placement for the buffer object.
> * @interruptible: Sleep interruptible if sleeping.
> - * @no_wait: Return immediately if the buffer is busy.
> + * @no_wait_reserve: Return immediately if other buffers are busy.
> + * @no_wait_gpu: Return immediately if the GPU is busy.
> *
> * Changes placement and caching policy of the buffer object
> * according proposed placement.
> @@ -325,7 +326,8 @@ extern int ttm_bo_wait(struct ttm_buffer_object *bo, bool
> lazy,
> */
> extern int ttm_bo_validate(struct ttm_buffer_object *bo,
> struct ttm_placement *placement,
> - bool interruptible, bool no_wait);
> + bool interruptible, bool no_wait_reserve,
> + bool no_wait_gpu);
>
> /**
> * ttm_bo_unref
> diff --git a/include/drm/ttm/ttm_bo_driver.h b/include/drm/ttm/ttm_bo_driver.h
> index 4c4e0f8..999fbcb 100644
> --- a/include/drm/ttm/ttm_bo_driver.h
> +++ b/include/drm/ttm/ttm_bo_driver.h
> @@ -312,7 +312,8 @@ struct ttm_bo_driver {
> */
> int (*move) (struct ttm_buffer_object *bo,
> bool evict, bool interruptible,
> - bool no_wait, struct ttm_mem_reg *new_mem);
> + bool no_wait_reserve, bool no_wait_gpu,
> + struct ttm_mem_reg *new_mem);
>
> /**
> * struct ttm_bo_driver_member verify_access
> @@ -634,7 +635,8 @@ extern bool ttm_mem_reg_is_pci(struct ttm_bo_device *bdev,
> * @proposed_placement: Proposed new placement for the buffer object.
> * @mem: A struct ttm_mem_reg.
> * @interruptible: Sleep interruptible when sliping.
> - * @no_wait: Don't sleep waiting for space to become available.
> + * @no_wait_reserve: Return immediately if other buffers are busy.
> + * @no_wait_gpu: Return immediately if the GPU is busy.
> *
> * Allocate memory space for the buffer object pointed to by @bo, using
> * the placement flags in @mem, potentially evicting other idle buffer
> objects.
> @@ -648,7 +650,8 @@ extern bool ttm_mem_reg_is_pci(struct ttm_bo_device *bdev,
> extern int ttm_bo_mem_space(struct ttm_buffer_object *bo,
> struct ttm_placement *placement,
> struct ttm_mem_reg *mem,
> - bool interruptible, bool no_wait);
> + bool interruptible,
> + bool no_wait_reserve, bool no_wait_gpu);
> /**
> * ttm_bo_wait_for_cpu
> *
> @@ -827,7 +830,8 @@ extern void ttm_bo_unblock_reservation(struct
> ttm_buffer_object *bo);
> *
> * @bo: A pointer to a struct ttm_buffer_object.
> * @evict: 1: This is an eviction. Don't try to pipeline.
> - * @no_wait: Never sleep, but rather return with -EBUSY.
> + * @no_wait_reserve: Return immediately if other buffers are busy.
> + * @no_wait_gpu: Return immediately if the GPU is busy.
> * @new_mem: struct ttm_mem_reg indicating where to move.
> *
> * Optimized move function for a buffer object with both old and
> @@ -841,15 +845,16 @@ extern void ttm_bo_unblock_reservation(struct
> ttm_buffer_object *bo);
> */
>
> extern int ttm_bo_move_ttm(struct ttm_buffer_object *bo,
> - bool evict, bool no_wait,
> - struct ttm_mem_reg *new_mem);
> + bool evict, bool no_wait_reserve,
> + bool no_wait_gpu, struct ttm_mem_reg *new_mem);
>
> /**
> * ttm_bo_move_memcpy
> *
> * @bo: A pointer to a struct ttm_buffer_object.
> * @evict: 1: This is an eviction. Don't try to pipeline.
> - * @no_wait: Never sleep, but rather return with -EBUSY.
> + * @no_wait_reserve: Return immediately if other buffers are busy.
> + * @no_wait_gpu: Return immediately if the GPU is busy.
> * @new_mem: struct ttm_mem_reg indicating where to move.
> *
> * Fallback move function for a mappable buffer object in mappable memory.
> @@ -863,8 +868,8 @@ extern int ttm_bo_move_ttm(struct ttm_buffer_object *bo,
> */
>
> extern int ttm_bo_move_memcpy(struct ttm_buffer_object *bo,
> - bool evict,
> - bool no_wait, struct ttm_mem_reg *new_mem);
> + bool evict, bool no_wait_reserve,
> + bool no_wait_gpu, struct ttm_mem_reg *new_mem);
>
> /**
> * ttm_bo_free_old_node
> @@ -883,7 +888,8 @@ extern void ttm_bo_free_old_node(struct ttm_buffer_object
> *bo);
> * @sync_obj_arg: An argument to pass to the sync object idle / wait
> * functions.
> * @evict: This is an evict move. Don't return until the buffer is idle.
> - * @no_wait: Never sleep, but rather return with -EBUSY.
> + * @no_wait_reserve: Return immediately if other buffers are busy.
> + * @no_wait_gpu: Return immediately if the GPU is busy.
> * @new_mem: struct ttm_mem_reg indicating where to move.
> *
> * Accelerated move function to be called when an accelerated move
> @@ -897,7 +903,8 @@ extern void ttm_bo_free_old_node(struct ttm_buffer_object
> *bo);
> extern int ttm_bo_move_accel_cleanup(struct ttm_buffer_object *bo,
> void *sync_obj,
> void *sync_obj_arg,
> - bool evict, bool no_wait,
> + bool evict, bool no_wait_reserve,
> + bool no_wait_gpu,
> struct ttm_mem_reg *new_mem);
> /**
> * ttm_io_prot
>
------------------------------------------------------------------------------
Download Intel® Parallel Studio Eval
Try the new software tools for yourself. Speed compiling, find bugs
proactively, and fine-tune applications for parallel performance.
See why Intel Parallel Studio got high marks during beta.
http://p.sf.net/sfu/intel-sw-dev
--
_______________________________________________
Dri-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/dri-devel