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 <jgli...@redhat.com>
>   

Acked-by: Thomas Hellstrom <thellst...@vmware.com>


> ---
>  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 9db02bb..6f51b30 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 5ca37a5..865b2a8 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 e929c27..69f70e4 100644
> --- a/include/drm/ttm/ttm_bo_driver.h
> +++ b/include/drm/ttm/ttm_bo_driver.h
> @@ -311,7 +311,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
> @@ -633,7 +634,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.
> @@ -647,7 +649,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
>   *
> @@ -826,7 +829,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
> @@ -840,15 +844,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.
> @@ -862,8 +867,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
> @@ -882,7 +887,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
> @@ -896,7 +902,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&#174; 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
Dri-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/dri-devel

Reply via email to