From: Thomas H. <th...@sh...> - 2010-04-05 12:12:34
|
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 <jg...@re...> > Acked-by: Thomas Hellstrom <the...@vm...> > --- > 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 > |