On 2014-10-09 07:02, Michel D?nzer wrote: > From: Michel D?nzer <michel.daenzer at amd.com> > > The radeon driver uses placement range restrictions for several > reasons, > in particular to make sure BOs in VRAM can be accessed by the CPU, e.g. > during a page fault. > > Without this change, TTM could evict other BOs while trying to satisfy > the requested placement, even if the evicted BOs were outside of the > requested placement range. Doing so didn't free up any space in the > requested placement range, so the (potentially high) eviction cost was > incurred for no benefit. > > Nominating for stable because radeon driver changes in 3.17 made this > much more noticeable than before. > > Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=84662 > Cc: stable at vger.kernel.org > Signed-off-by: Michel D?nzer <michel.daenzer at amd.com> > --- > drivers/gpu/drm/ttm/ttm_bo.c | 20 +++++++++++++++++--- > 1 file changed, 17 insertions(+), 3 deletions(-) > > diff --git a/drivers/gpu/drm/ttm/ttm_bo.c > b/drivers/gpu/drm/ttm/ttm_bo.c > index 8f5cec6..407fa2d 100644 > --- a/drivers/gpu/drm/ttm/ttm_bo.c > +++ b/drivers/gpu/drm/ttm/ttm_bo.c > @@ -709,6 +709,7 @@ out: > > static int ttm_mem_evict_first(struct ttm_bo_device *bdev, > uint32_t mem_type, > + const struct ttm_place *place, > bool interruptible, > bool no_wait_gpu) > { > @@ -720,8 +721,21 @@ static int ttm_mem_evict_first(struct > ttm_bo_device *bdev, > spin_lock(&glob->lru_lock); > list_for_each_entry(bo, &man->lru, lru) { > ret = __ttm_bo_reserve(bo, false, true, false, NULL); > - if (!ret) > + if (!ret) { > + if (place && (place->fpfn || place->lpfn)) { > + /* Don't evict this BO if it's outside of the > + * requested placement range > + */ > + if (place->fpfn >= (bo->mem.start + > bo->mem.size) || > + (place->lpfn && place->lpfn <= > bo->mem.start)) { > + __ttm_bo_unreserve(bo); > + ret = -EBUSY; > + continue; > + } > + } > + > break; > + } > } > > if (ret) { > @@ -782,7 +796,7 @@ static int ttm_bo_mem_force_space(struct > ttm_buffer_object *bo, > return ret; > if (mem->mm_node) > break; > - ret = ttm_mem_evict_first(bdev, mem_type, > + ret = ttm_mem_evict_first(bdev, mem_type, place, > interruptible, no_wait_gpu); > if (unlikely(ret != 0)) > return ret; > @@ -1233,7 +1247,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, NULL, false, false); > if (ret) { > if (allow_errors) { > return ret;
I believe you need to "s/place/placement/" over this patch. -- Alan.