You've already forked linux-apfs
mirror of
https://github.com/linux-apfs/linux-apfs.git
synced 2026-05-01 15:00:59 -07:00
drm: Improve drm_mm search (and fix topdown allocation) with rbtrees
The drm_mm range manager claimed to support top-down insertion, but it was neither searching for the top-most hole that could fit the allocation request nor fitting the request to the hole correctly. In order to search the range efficiently, we create a secondary index for the holes using either their size or their address. This index allows us to find the smallest hole or the hole at the bottom or top of the range efficiently, whilst keeping the hole stack to rapidly service evictions. v2: Search for holes both high and low. Rename flags to mode. v3: Discover rb_entry_safe() and use it! v4: Kerneldoc for enum drm_mm_insert_mode. Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> Reviewed-by: Joonas Lahtinen <joonas.lahtinen@linux.intel.com> Cc: Alex Deucher <alexander.deucher@amd.com> Cc: "Christian König" <christian.koenig@amd.com> Cc: David Airlie <airlied@linux.ie> Cc: Russell King <rmk+kernel@armlinux.org.uk> Cc: Daniel Vetter <daniel.vetter@intel.com> Cc: Jani Nikula <jani.nikula@linux.intel.com> Cc: Sean Paul <seanpaul@chromium.org> Cc: Lucas Stach <l.stach@pengutronix.de> Cc: Christian Gmeiner <christian.gmeiner@gmail.com> Cc: Rob Clark <robdclark@gmail.com> Cc: Thierry Reding <thierry.reding@gmail.com> Cc: Stephen Warren <swarren@wwwdotorg.org> Cc: Alexandre Courbot <gnurou@gmail.com> Cc: Eric Anholt <eric@anholt.net> Cc: Sinclair Yeh <syeh@vmware.com> Cc: Thomas Hellstrom <thellstrom@vmware.com> Reviewed-by: Alex Deucher <alexander.deucher@amd.com> Reviewed-by: Sinclair Yeh <syeh@vmware.com> # vmwgfx Reviewed-by: Lucas Stach <l.stach@pengutronix.de> #etnaviv Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch> Link: http://patchwork.freedesktop.org/patch/msgid/20170202210438.28702-1-chris@chris-wilson.co.uk
This commit is contained in:
committed by
Daniel Vetter
parent
17aad8a340
commit
4e64e5539d
@@ -97,8 +97,7 @@ int amdgpu_gtt_mgr_alloc(struct ttm_mem_type_manager *man,
|
||||
{
|
||||
struct amdgpu_gtt_mgr *mgr = man->priv;
|
||||
struct drm_mm_node *node = mem->mm_node;
|
||||
enum drm_mm_search_flags sflags = DRM_MM_SEARCH_BEST;
|
||||
enum drm_mm_allocator_flags aflags = DRM_MM_CREATE_DEFAULT;
|
||||
enum drm_mm_insert_mode mode;
|
||||
unsigned long fpfn, lpfn;
|
||||
int r;
|
||||
|
||||
@@ -115,15 +114,14 @@ int amdgpu_gtt_mgr_alloc(struct ttm_mem_type_manager *man,
|
||||
else
|
||||
lpfn = man->size;
|
||||
|
||||
if (place && place->flags & TTM_PL_FLAG_TOPDOWN) {
|
||||
sflags = DRM_MM_SEARCH_BELOW;
|
||||
aflags = DRM_MM_CREATE_TOP;
|
||||
}
|
||||
mode = DRM_MM_INSERT_BEST;
|
||||
if (place && place->flags & TTM_PL_FLAG_TOPDOWN)
|
||||
mode = DRM_MM_INSERT_HIGH;
|
||||
|
||||
spin_lock(&mgr->lock);
|
||||
r = drm_mm_insert_node_in_range_generic(&mgr->mm, node, mem->num_pages,
|
||||
mem->page_alignment, 0,
|
||||
fpfn, lpfn, sflags, aflags);
|
||||
r = drm_mm_insert_node_in_range(&mgr->mm, node,
|
||||
mem->num_pages, mem->page_alignment, 0,
|
||||
fpfn, lpfn, mode);
|
||||
spin_unlock(&mgr->lock);
|
||||
|
||||
if (!r) {
|
||||
|
||||
@@ -97,8 +97,7 @@ static int amdgpu_vram_mgr_new(struct ttm_mem_type_manager *man,
|
||||
struct amdgpu_vram_mgr *mgr = man->priv;
|
||||
struct drm_mm *mm = &mgr->mm;
|
||||
struct drm_mm_node *nodes;
|
||||
enum drm_mm_search_flags sflags = DRM_MM_SEARCH_DEFAULT;
|
||||
enum drm_mm_allocator_flags aflags = DRM_MM_CREATE_DEFAULT;
|
||||
enum drm_mm_insert_mode mode;
|
||||
unsigned long lpfn, num_nodes, pages_per_node, pages_left;
|
||||
unsigned i;
|
||||
int r;
|
||||
@@ -121,10 +120,9 @@ static int amdgpu_vram_mgr_new(struct ttm_mem_type_manager *man,
|
||||
if (!nodes)
|
||||
return -ENOMEM;
|
||||
|
||||
if (place->flags & TTM_PL_FLAG_TOPDOWN) {
|
||||
sflags = DRM_MM_SEARCH_BELOW;
|
||||
aflags = DRM_MM_CREATE_TOP;
|
||||
}
|
||||
mode = DRM_MM_INSERT_BEST;
|
||||
if (place->flags & TTM_PL_FLAG_TOPDOWN)
|
||||
mode = DRM_MM_INSERT_HIGH;
|
||||
|
||||
pages_left = mem->num_pages;
|
||||
|
||||
@@ -135,13 +133,11 @@ static int amdgpu_vram_mgr_new(struct ttm_mem_type_manager *man,
|
||||
|
||||
if (pages == pages_per_node)
|
||||
alignment = pages_per_node;
|
||||
else
|
||||
sflags |= DRM_MM_SEARCH_BEST;
|
||||
|
||||
r = drm_mm_insert_node_in_range_generic(mm, &nodes[i], pages,
|
||||
alignment, 0,
|
||||
place->fpfn, lpfn,
|
||||
sflags, aflags);
|
||||
r = drm_mm_insert_node_in_range(mm, &nodes[i],
|
||||
pages, alignment, 0,
|
||||
place->fpfn, lpfn,
|
||||
mode);
|
||||
if (unlikely(r))
|
||||
goto error;
|
||||
|
||||
|
||||
@@ -148,8 +148,8 @@ armada_gem_linear_back(struct drm_device *dev, struct armada_gem_object *obj)
|
||||
return -ENOSPC;
|
||||
|
||||
mutex_lock(&priv->linear_lock);
|
||||
ret = drm_mm_insert_node(&priv->linear, node, size, align,
|
||||
DRM_MM_SEARCH_DEFAULT);
|
||||
ret = drm_mm_insert_node_generic(&priv->linear, node,
|
||||
size, align, 0, 0);
|
||||
mutex_unlock(&priv->linear_lock);
|
||||
if (ret) {
|
||||
kfree(node);
|
||||
|
||||
+272
-216
File diff suppressed because it is too large
Load Diff
@@ -212,8 +212,7 @@ int drm_vma_offset_add(struct drm_vma_offset_manager *mgr,
|
||||
goto out_unlock;
|
||||
}
|
||||
|
||||
ret = drm_mm_insert_node(&mgr->vm_addr_space_mm, &node->vm_node,
|
||||
pages, 0, DRM_MM_SEARCH_DEFAULT);
|
||||
ret = drm_mm_insert_node(&mgr->vm_addr_space_mm, &node->vm_node, pages);
|
||||
if (ret)
|
||||
goto out_unlock;
|
||||
|
||||
|
||||
@@ -108,6 +108,7 @@ static int etnaviv_iommu_find_iova(struct etnaviv_iommu *mmu,
|
||||
struct drm_mm_node *node, size_t size)
|
||||
{
|
||||
struct etnaviv_vram_mapping *free = NULL;
|
||||
enum drm_mm_insert_mode mode = DRM_MM_INSERT_LOW;
|
||||
int ret;
|
||||
|
||||
lockdep_assert_held(&mmu->lock);
|
||||
@@ -119,9 +120,9 @@ static int etnaviv_iommu_find_iova(struct etnaviv_iommu *mmu,
|
||||
bool found;
|
||||
|
||||
ret = drm_mm_insert_node_in_range(&mmu->mm, node,
|
||||
size, 0, mmu->last_iova, ~0UL,
|
||||
DRM_MM_SEARCH_DEFAULT);
|
||||
|
||||
size, 0, 0,
|
||||
mmu->last_iova, U64_MAX,
|
||||
mode);
|
||||
if (ret != -ENOSPC)
|
||||
break;
|
||||
|
||||
@@ -136,7 +137,7 @@ static int etnaviv_iommu_find_iova(struct etnaviv_iommu *mmu,
|
||||
}
|
||||
|
||||
/* Try to retire some entries */
|
||||
drm_mm_scan_init(&scan, &mmu->mm, size, 0, 0, 0);
|
||||
drm_mm_scan_init(&scan, &mmu->mm, size, 0, 0, mode);
|
||||
|
||||
found = 0;
|
||||
INIT_LIST_HEAD(&list);
|
||||
@@ -188,6 +189,8 @@ static int etnaviv_iommu_find_iova(struct etnaviv_iommu *mmu,
|
||||
list_del_init(&m->scan_node);
|
||||
}
|
||||
|
||||
mode = DRM_MM_INSERT_EVICT;
|
||||
|
||||
/*
|
||||
* We removed enough mappings so that the new allocation will
|
||||
* succeed, retry the allocation one more time.
|
||||
|
||||
@@ -69,12 +69,10 @@ insert_mappable_node(struct i915_ggtt *ggtt,
|
||||
struct drm_mm_node *node, u32 size)
|
||||
{
|
||||
memset(node, 0, sizeof(*node));
|
||||
return drm_mm_insert_node_in_range_generic(&ggtt->base.mm, node,
|
||||
size, 0,
|
||||
I915_COLOR_UNEVICTABLE,
|
||||
0, ggtt->mappable_end,
|
||||
DRM_MM_SEARCH_DEFAULT,
|
||||
DRM_MM_CREATE_DEFAULT);
|
||||
return drm_mm_insert_node_in_range(&ggtt->base.mm, node,
|
||||
size, 0, I915_COLOR_UNEVICTABLE,
|
||||
0, ggtt->mappable_end,
|
||||
DRM_MM_INSERT_LOW);
|
||||
}
|
||||
|
||||
static void
|
||||
|
||||
@@ -109,6 +109,7 @@ i915_gem_evict_something(struct i915_address_space *vm,
|
||||
}, **phase;
|
||||
struct i915_vma *vma, *next;
|
||||
struct drm_mm_node *node;
|
||||
enum drm_mm_insert_mode mode;
|
||||
int ret;
|
||||
|
||||
lockdep_assert_held(&vm->i915->drm.struct_mutex);
|
||||
@@ -127,10 +128,14 @@ i915_gem_evict_something(struct i915_address_space *vm,
|
||||
* On each list, the oldest objects lie at the HEAD with the freshest
|
||||
* object on the TAIL.
|
||||
*/
|
||||
mode = DRM_MM_INSERT_BEST;
|
||||
if (flags & PIN_HIGH)
|
||||
mode = DRM_MM_INSERT_HIGH;
|
||||
if (flags & PIN_MAPPABLE)
|
||||
mode = DRM_MM_INSERT_LOW;
|
||||
drm_mm_scan_init_with_range(&scan, &vm->mm,
|
||||
min_size, alignment, cache_level,
|
||||
start, end,
|
||||
flags & PIN_HIGH ? DRM_MM_CREATE_TOP : 0);
|
||||
start, end, mode);
|
||||
|
||||
/* Retire before we search the active list. Although we have
|
||||
* reasonable accuracy in our retirement lists, we may have
|
||||
|
||||
@@ -436,12 +436,11 @@ static void *reloc_iomap(struct drm_i915_gem_object *obj,
|
||||
PIN_MAPPABLE | PIN_NONBLOCK);
|
||||
if (IS_ERR(vma)) {
|
||||
memset(&cache->node, 0, sizeof(cache->node));
|
||||
ret = drm_mm_insert_node_in_range_generic
|
||||
ret = drm_mm_insert_node_in_range
|
||||
(&ggtt->base.mm, &cache->node,
|
||||
PAGE_SIZE, 0, I915_COLOR_UNEVICTABLE,
|
||||
0, ggtt->mappable_end,
|
||||
DRM_MM_SEARCH_DEFAULT,
|
||||
DRM_MM_CREATE_DEFAULT);
|
||||
DRM_MM_INSERT_LOW);
|
||||
if (ret) /* no inactive aperture space, use cpu reloc */
|
||||
return NULL;
|
||||
} else {
|
||||
|
||||
@@ -2748,12 +2748,10 @@ int i915_gem_init_ggtt(struct drm_i915_private *dev_priv)
|
||||
return ret;
|
||||
|
||||
/* Reserve a mappable slot for our lockless error capture */
|
||||
ret = drm_mm_insert_node_in_range_generic(&ggtt->base.mm,
|
||||
&ggtt->error_capture,
|
||||
PAGE_SIZE, 0,
|
||||
I915_COLOR_UNEVICTABLE,
|
||||
0, ggtt->mappable_end,
|
||||
0, 0);
|
||||
ret = drm_mm_insert_node_in_range(&ggtt->base.mm, &ggtt->error_capture,
|
||||
PAGE_SIZE, 0, I915_COLOR_UNEVICTABLE,
|
||||
0, ggtt->mappable_end,
|
||||
DRM_MM_INSERT_LOW);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
@@ -3663,7 +3661,7 @@ int i915_gem_gtt_insert(struct i915_address_space *vm,
|
||||
u64 size, u64 alignment, unsigned long color,
|
||||
u64 start, u64 end, unsigned int flags)
|
||||
{
|
||||
u32 search_flag, alloc_flag;
|
||||
enum drm_mm_insert_mode mode;
|
||||
u64 offset;
|
||||
int err;
|
||||
|
||||
@@ -3684,13 +3682,11 @@ int i915_gem_gtt_insert(struct i915_address_space *vm,
|
||||
if (unlikely(round_up(start, alignment) > round_down(end - size, alignment)))
|
||||
return -ENOSPC;
|
||||
|
||||
if (flags & PIN_HIGH) {
|
||||
search_flag = DRM_MM_SEARCH_BELOW;
|
||||
alloc_flag = DRM_MM_CREATE_TOP;
|
||||
} else {
|
||||
search_flag = DRM_MM_SEARCH_DEFAULT;
|
||||
alloc_flag = DRM_MM_CREATE_DEFAULT;
|
||||
}
|
||||
mode = DRM_MM_INSERT_BEST;
|
||||
if (flags & PIN_HIGH)
|
||||
mode = DRM_MM_INSERT_HIGH;
|
||||
if (flags & PIN_MAPPABLE)
|
||||
mode = DRM_MM_INSERT_LOW;
|
||||
|
||||
/* We only allocate in PAGE_SIZE/GTT_PAGE_SIZE (4096) chunks,
|
||||
* so we know that we always have a minimum alignment of 4096.
|
||||
@@ -3702,10 +3698,9 @@ int i915_gem_gtt_insert(struct i915_address_space *vm,
|
||||
if (alignment <= I915_GTT_MIN_ALIGNMENT)
|
||||
alignment = 0;
|
||||
|
||||
err = drm_mm_insert_node_in_range_generic(&vm->mm, node,
|
||||
size, alignment, color,
|
||||
start, end,
|
||||
search_flag, alloc_flag);
|
||||
err = drm_mm_insert_node_in_range(&vm->mm, node,
|
||||
size, alignment, color,
|
||||
start, end, mode);
|
||||
if (err != -ENOSPC)
|
||||
return err;
|
||||
|
||||
@@ -3743,9 +3738,7 @@ int i915_gem_gtt_insert(struct i915_address_space *vm,
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
search_flag = DRM_MM_SEARCH_DEFAULT;
|
||||
return drm_mm_insert_node_in_range_generic(&vm->mm, node,
|
||||
size, alignment, color,
|
||||
start, end,
|
||||
search_flag, alloc_flag);
|
||||
return drm_mm_insert_node_in_range(&vm->mm, node,
|
||||
size, alignment, color,
|
||||
start, end, DRM_MM_INSERT_EVICT);
|
||||
}
|
||||
|
||||
@@ -55,9 +55,9 @@ int i915_gem_stolen_insert_node_in_range(struct drm_i915_private *dev_priv,
|
||||
return -ENODEV;
|
||||
|
||||
mutex_lock(&dev_priv->mm.stolen_lock);
|
||||
ret = drm_mm_insert_node_in_range(&dev_priv->mm.stolen, node, size,
|
||||
alignment, start, end,
|
||||
DRM_MM_SEARCH_DEFAULT);
|
||||
ret = drm_mm_insert_node_in_range(&dev_priv->mm.stolen, node,
|
||||
size, alignment, 0,
|
||||
start, end, DRM_MM_INSERT_BEST);
|
||||
mutex_unlock(&dev_priv->mm.stolen_lock);
|
||||
|
||||
return ret;
|
||||
|
||||
@@ -54,8 +54,7 @@ static struct page **get_pages_vram(struct drm_gem_object *obj,
|
||||
if (!p)
|
||||
return ERR_PTR(-ENOMEM);
|
||||
|
||||
ret = drm_mm_insert_node(&priv->vram.mm, msm_obj->vram_node,
|
||||
npages, 0, DRM_MM_SEARCH_DEFAULT);
|
||||
ret = drm_mm_insert_node(&priv->vram.mm, msm_obj->vram_node, npages);
|
||||
if (ret) {
|
||||
drm_free_large(p);
|
||||
return ERR_PTR(ret);
|
||||
|
||||
@@ -45,8 +45,7 @@ msm_gem_map_vma(struct msm_gem_address_space *aspace,
|
||||
if (WARN_ON(drm_mm_node_allocated(&vma->node)))
|
||||
return 0;
|
||||
|
||||
ret = drm_mm_insert_node(&aspace->mm, &vma->node, npages,
|
||||
0, DRM_MM_SEARCH_DEFAULT);
|
||||
ret = drm_mm_insert_node(&aspace->mm, &vma->node, npages);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
|
||||
@@ -22,23 +22,24 @@ static unsigned int max_iterations = 8192;
|
||||
static unsigned int max_prime = 128;
|
||||
|
||||
enum {
|
||||
DEFAULT,
|
||||
TOPDOWN,
|
||||
BEST,
|
||||
BOTTOMUP,
|
||||
TOPDOWN,
|
||||
EVICT,
|
||||
};
|
||||
|
||||
static const struct insert_mode {
|
||||
const char *name;
|
||||
unsigned int search_flags;
|
||||
unsigned int create_flags;
|
||||
enum drm_mm_insert_mode mode;
|
||||
} insert_modes[] = {
|
||||
[DEFAULT] = { "default", DRM_MM_SEARCH_DEFAULT, DRM_MM_CREATE_DEFAULT },
|
||||
[TOPDOWN] = { "top-down", DRM_MM_SEARCH_BELOW, DRM_MM_CREATE_TOP },
|
||||
[BEST] = { "best", DRM_MM_SEARCH_BEST, DRM_MM_CREATE_DEFAULT },
|
||||
[BEST] = { "best", DRM_MM_INSERT_BEST },
|
||||
[BOTTOMUP] = { "bottom-up", DRM_MM_INSERT_LOW },
|
||||
[TOPDOWN] = { "top-down", DRM_MM_INSERT_HIGH },
|
||||
[EVICT] = { "evict", DRM_MM_INSERT_EVICT },
|
||||
{}
|
||||
}, evict_modes[] = {
|
||||
{ "default", DRM_MM_SEARCH_DEFAULT, DRM_MM_CREATE_DEFAULT },
|
||||
{ "top-down", DRM_MM_SEARCH_BELOW, DRM_MM_CREATE_TOP },
|
||||
{ "bottom-up", DRM_MM_INSERT_LOW },
|
||||
{ "top-down", DRM_MM_INSERT_HIGH },
|
||||
{}
|
||||
};
|
||||
|
||||
@@ -526,8 +527,7 @@ static bool expect_insert(struct drm_mm *mm, struct drm_mm_node *node,
|
||||
|
||||
err = drm_mm_insert_node_generic(mm, node,
|
||||
size, alignment, color,
|
||||
mode->search_flags,
|
||||
mode->create_flags);
|
||||
mode->mode);
|
||||
if (err) {
|
||||
pr_err("insert (size=%llu, alignment=%llu, color=%lu, mode=%s) failed with err=%d\n",
|
||||
size, alignment, color, mode->name, err);
|
||||
@@ -547,7 +547,7 @@ static bool expect_insert_fail(struct drm_mm *mm, u64 size)
|
||||
struct drm_mm_node tmp = {};
|
||||
int err;
|
||||
|
||||
err = drm_mm_insert_node(mm, &tmp, size, 0, DRM_MM_SEARCH_DEFAULT);
|
||||
err = drm_mm_insert_node(mm, &tmp, size);
|
||||
if (likely(err == -ENOSPC))
|
||||
return true;
|
||||
|
||||
@@ -753,11 +753,10 @@ static bool expect_insert_in_range(struct drm_mm *mm, struct drm_mm_node *node,
|
||||
{
|
||||
int err;
|
||||
|
||||
err = drm_mm_insert_node_in_range_generic(mm, node,
|
||||
size, alignment, color,
|
||||
range_start, range_end,
|
||||
mode->search_flags,
|
||||
mode->create_flags);
|
||||
err = drm_mm_insert_node_in_range(mm, node,
|
||||
size, alignment, color,
|
||||
range_start, range_end,
|
||||
mode->mode);
|
||||
if (err) {
|
||||
pr_err("insert (size=%llu, alignment=%llu, color=%lu, mode=%s) nto range [%llx, %llx] failed with err=%d\n",
|
||||
size, alignment, color, mode->name,
|
||||
@@ -781,11 +780,10 @@ static bool expect_insert_in_range_fail(struct drm_mm *mm,
|
||||
struct drm_mm_node tmp = {};
|
||||
int err;
|
||||
|
||||
err = drm_mm_insert_node_in_range_generic(mm, &tmp,
|
||||
size, 0, 0,
|
||||
range_start, range_end,
|
||||
DRM_MM_SEARCH_DEFAULT,
|
||||
DRM_MM_CREATE_DEFAULT);
|
||||
err = drm_mm_insert_node_in_range(mm, &tmp,
|
||||
size, 0, 0,
|
||||
range_start, range_end,
|
||||
0);
|
||||
if (likely(err == -ENOSPC))
|
||||
return true;
|
||||
|
||||
@@ -1324,7 +1322,7 @@ static int evict_something(struct drm_mm *mm,
|
||||
drm_mm_scan_init_with_range(&scan, mm,
|
||||
size, alignment, 0,
|
||||
range_start, range_end,
|
||||
mode->create_flags);
|
||||
mode->mode);
|
||||
if (!evict_nodes(&scan,
|
||||
nodes, order, count, false,
|
||||
&evict_list))
|
||||
@@ -1332,8 +1330,7 @@ static int evict_something(struct drm_mm *mm,
|
||||
|
||||
memset(&tmp, 0, sizeof(tmp));
|
||||
err = drm_mm_insert_node_generic(mm, &tmp, size, alignment, 0,
|
||||
mode->search_flags,
|
||||
mode->create_flags);
|
||||
DRM_MM_INSERT_EVICT);
|
||||
if (err) {
|
||||
pr_err("Failed to insert into eviction hole: size=%d, align=%d\n",
|
||||
size, alignment);
|
||||
@@ -1408,8 +1405,7 @@ static int igt_evict(void *ignored)
|
||||
ret = -EINVAL;
|
||||
drm_mm_init(&mm, 0, size);
|
||||
for (n = 0; n < size; n++) {
|
||||
err = drm_mm_insert_node(&mm, &nodes[n].node, 1, 0,
|
||||
DRM_MM_SEARCH_DEFAULT);
|
||||
err = drm_mm_insert_node(&mm, &nodes[n].node, 1);
|
||||
if (err) {
|
||||
pr_err("insert failed, step %d\n", n);
|
||||
ret = err;
|
||||
@@ -1517,8 +1513,7 @@ static int igt_evict_range(void *ignored)
|
||||
ret = -EINVAL;
|
||||
drm_mm_init(&mm, 0, size);
|
||||
for (n = 0; n < size; n++) {
|
||||
err = drm_mm_insert_node(&mm, &nodes[n].node, 1, 0,
|
||||
DRM_MM_SEARCH_DEFAULT);
|
||||
err = drm_mm_insert_node(&mm, &nodes[n].node, 1);
|
||||
if (err) {
|
||||
pr_err("insert failed, step %d\n", n);
|
||||
ret = err;
|
||||
@@ -1904,7 +1899,7 @@ static int evict_color(struct drm_mm *mm,
|
||||
drm_mm_scan_init_with_range(&scan, mm,
|
||||
size, alignment, color,
|
||||
range_start, range_end,
|
||||
mode->create_flags);
|
||||
mode->mode);
|
||||
if (!evict_nodes(&scan,
|
||||
nodes, order, count, true,
|
||||
&evict_list))
|
||||
@@ -1912,8 +1907,7 @@ static int evict_color(struct drm_mm *mm,
|
||||
|
||||
memset(&tmp, 0, sizeof(tmp));
|
||||
err = drm_mm_insert_node_generic(mm, &tmp, size, alignment, color,
|
||||
mode->search_flags,
|
||||
mode->create_flags);
|
||||
DRM_MM_INSERT_EVICT);
|
||||
if (err) {
|
||||
pr_err("Failed to insert into eviction hole: size=%d, align=%d, color=%lu, err=%d\n",
|
||||
size, alignment, color, err);
|
||||
|
||||
@@ -109,8 +109,7 @@ static int sis_drm_alloc(struct drm_device *dev, struct drm_file *file,
|
||||
if (pool == AGP_TYPE) {
|
||||
retval = drm_mm_insert_node(&dev_priv->agp_mm,
|
||||
&item->mm_node,
|
||||
mem->size, 0,
|
||||
DRM_MM_SEARCH_DEFAULT);
|
||||
mem->size);
|
||||
offset = item->mm_node.start;
|
||||
} else {
|
||||
#if defined(CONFIG_FB_SIS) || defined(CONFIG_FB_SIS_MODULE)
|
||||
@@ -122,8 +121,7 @@ static int sis_drm_alloc(struct drm_device *dev, struct drm_file *file,
|
||||
#else
|
||||
retval = drm_mm_insert_node(&dev_priv->vram_mm,
|
||||
&item->mm_node,
|
||||
mem->size, 0,
|
||||
DRM_MM_SEARCH_DEFAULT);
|
||||
mem->size);
|
||||
offset = item->mm_node.start;
|
||||
#endif
|
||||
}
|
||||
|
||||
@@ -128,8 +128,8 @@ static int tegra_bo_iommu_map(struct tegra_drm *tegra, struct tegra_bo *bo)
|
||||
if (!bo->mm)
|
||||
return -ENOMEM;
|
||||
|
||||
err = drm_mm_insert_node_generic(&tegra->mm, bo->mm, bo->gem.size,
|
||||
PAGE_SIZE, 0, 0, 0);
|
||||
err = drm_mm_insert_node_generic(&tegra->mm,
|
||||
bo->mm, bo->gem.size, PAGE_SIZE, 0, 0);
|
||||
if (err < 0) {
|
||||
dev_err(tegra->drm->dev, "out of I/O virtual memory: %zd\n",
|
||||
err);
|
||||
|
||||
@@ -54,9 +54,8 @@ static int ttm_bo_man_get_node(struct ttm_mem_type_manager *man,
|
||||
{
|
||||
struct ttm_range_manager *rman = (struct ttm_range_manager *) man->priv;
|
||||
struct drm_mm *mm = &rman->mm;
|
||||
struct drm_mm_node *node = NULL;
|
||||
enum drm_mm_search_flags sflags = DRM_MM_SEARCH_BEST;
|
||||
enum drm_mm_allocator_flags aflags = DRM_MM_CREATE_DEFAULT;
|
||||
struct drm_mm_node *node;
|
||||
enum drm_mm_insert_mode mode;
|
||||
unsigned long lpfn;
|
||||
int ret;
|
||||
|
||||
@@ -68,16 +67,15 @@ static int ttm_bo_man_get_node(struct ttm_mem_type_manager *man,
|
||||
if (!node)
|
||||
return -ENOMEM;
|
||||
|
||||
if (place->flags & TTM_PL_FLAG_TOPDOWN) {
|
||||
sflags = DRM_MM_SEARCH_BELOW;
|
||||
aflags = DRM_MM_CREATE_TOP;
|
||||
}
|
||||
mode = DRM_MM_INSERT_BEST;
|
||||
if (place->flags & TTM_PL_FLAG_TOPDOWN)
|
||||
mode = DRM_MM_INSERT_HIGH;
|
||||
|
||||
spin_lock(&rman->lock);
|
||||
ret = drm_mm_insert_node_in_range_generic(mm, node, mem->num_pages,
|
||||
ret = drm_mm_insert_node_in_range(mm, node,
|
||||
mem->num_pages,
|
||||
mem->page_alignment, 0,
|
||||
place->fpfn, lpfn,
|
||||
sflags, aflags);
|
||||
place->fpfn, lpfn, mode);
|
||||
spin_unlock(&rman->lock);
|
||||
|
||||
if (unlikely(ret)) {
|
||||
|
||||
@@ -593,7 +593,7 @@ static int vc4_crtc_atomic_check(struct drm_crtc *crtc,
|
||||
|
||||
spin_lock_irqsave(&vc4->hvs->mm_lock, flags);
|
||||
ret = drm_mm_insert_node(&vc4->hvs->dlist_mm, &vc4_state->mm,
|
||||
dlist_count, 1, 0);
|
||||
dlist_count);
|
||||
spin_unlock_irqrestore(&vc4->hvs->mm_lock, flags);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
@@ -141,8 +141,7 @@ static int vc4_hvs_upload_linear_kernel(struct vc4_hvs *hvs,
|
||||
int ret, i;
|
||||
u32 __iomem *dst_kernel;
|
||||
|
||||
ret = drm_mm_insert_node(&hvs->dlist_mm, space, VC4_KERNEL_DWORDS, 1,
|
||||
0);
|
||||
ret = drm_mm_insert_node(&hvs->dlist_mm, space, VC4_KERNEL_DWORDS);
|
||||
if (ret) {
|
||||
DRM_ERROR("Failed to allocate space for filter kernel: %d\n",
|
||||
ret);
|
||||
|
||||
@@ -514,9 +514,9 @@ static int vc4_plane_mode_set(struct drm_plane *plane,
|
||||
if (lbm_size) {
|
||||
if (!vc4_state->lbm.allocated) {
|
||||
spin_lock_irqsave(&vc4->hvs->mm_lock, irqflags);
|
||||
ret = drm_mm_insert_node(&vc4->hvs->lbm_mm,
|
||||
&vc4_state->lbm,
|
||||
lbm_size, 32, 0);
|
||||
ret = drm_mm_insert_node_generic(&vc4->hvs->lbm_mm,
|
||||
&vc4_state->lbm,
|
||||
lbm_size, 32, 0, 0);
|
||||
spin_unlock_irqrestore(&vc4->hvs->mm_lock, irqflags);
|
||||
} else {
|
||||
WARN_ON_ONCE(lbm_size != vc4_state->lbm.size);
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user