@@ -2094,6 +2094,22 @@ void i915_init_vm(struct drm_i915_private *dev_priv,
void i915_gem_free_object(struct drm_gem_object *obj);
void i915_gem_vma_destroy(struct i915_vma *vma);
+#define MAX_VMA_FIND_RETRY 100
+int i915_gem_find_vm_space_generic(struct i915_address_space *vm,
+ struct drm_mm_node *node,
+ unsigned long size,
+ unsigned long align,
+ unsigned long color,
+ unsigned long start,
+ unsigned long end,
+ uint32_t flags,
+ enum drm_mm_search_flags sflags,
+ enum drm_mm_allocator_flags aflags,
+ uint8_t retry);
+#define i915_gem_find_vm_space(vm, node, size, align, color, start, end, flags, retry) \
+ i915_gem_find_vm_space_generic(vm, node, size, align, color, \
+ start, end, flags, DRM_MM_BOTTOMUP, retry)
+
#define PIN_MAPPABLE 0x1
#define PIN_NONBLOCK 0x2
#define PIN_GLOBAL 0x4
@@ -3216,24 +3216,23 @@ static void i915_gem_verify_gtt(struct drm_device *dev)
#endif
}
-#define MAX_VMA_FIND_RETRY 100
-static int
-i915_gem_find_vm_space(struct i915_address_space *vm,
- struct drm_mm_node *node,
- unsigned long size,
- unsigned long align,
- unsigned long color,
- unsigned long start,
- unsigned long end,
- uint32_t flags,
- uint8_t retry)
+int i915_gem_find_vm_space_generic(struct i915_address_space *vm,
+ struct drm_mm_node *node,
+ unsigned long size,
+ unsigned long align,
+ unsigned long color,
+ unsigned long start,
+ unsigned long end,
+ uint32_t flags,
+ enum drm_mm_search_flags sflags,
+ enum drm_mm_allocator_flags aflags,
+ uint8_t retry)
{
int ret;
ret = drm_mm_insert_node_in_range_generic(&vm->mm, node,
size, align, color,
start, end,
- DRM_MM_SEARCH_DEFAULT,
- DRM_MM_CREATE_DEFAULT);
+ sflags, aflags);
if (ret && (retry < MAX_VMA_FIND_RETRY)) {
if (WARN_ON(ret != -ENOSPC))
return ret;
@@ -3241,10 +3240,11 @@ i915_gem_find_vm_space(struct i915_address_space *vm,
ret = i915_gem_evict_something(vm->dev, vm, size, align, color,
flags);
if (ret == 0)
- return i915_gem_find_vm_space(vm, node,
- size, align, color,
- start, end, flags,
- retry++);
+ return i915_gem_find_vm_space_generic(vm, node,
+ size, align, color,
+ start, end,
+ sflags, aflags, flags,
+ retry++);
}
return ret;
@@ -1831,7 +1831,6 @@ static int gen6_ppgtt_allocate_page_directories(struct i915_hw_ppgtt *ppgtt)
{
struct drm_device *dev = ppgtt->base.dev;
struct drm_i915_private *dev_priv = dev->dev_private;
- bool retried = false;
int ret;
/* PPGTT PDEs reside in the GGTT and consists of 512 entries. The
@@ -1844,23 +1843,11 @@ static int gen6_ppgtt_allocate_page_directories(struct i915_hw_ppgtt *ppgtt)
if (IS_ERR(ppgtt->scratch_pt))
return PTR_ERR(ppgtt->scratch_pt);
-alloc:
- ret = drm_mm_insert_node_in_range_generic(&dev_priv->gtt.base.mm,
- &ppgtt->node, GEN6_PD_SIZE,
- GEN6_PD_ALIGN, 0,
- 0, dev_priv->gtt.base.total,
- DRM_MM_TOPDOWN);
- if (ret == -ENOSPC && !retried) {
- ret = i915_gem_evict_something(dev, &dev_priv->gtt.base,
- GEN6_PD_SIZE, GEN6_PD_ALIGN,
- I915_CACHE_NONE, 0);
- if (ret)
- goto err_out;
-
- retried = true;
- goto alloc;
- }
-
+ ret = i915_gem_find_vm_space_generic(&dev_priv->gtt.base, &ppgtt->node,
+ GEN6_PD_SIZE, GEN6_PD_ALIGN, 0,
+ 0, dev_priv->gtt.base.total,
+ DRM_MM_TOPDOWN, 0,
+ MAX_VMA_FIND_RETRY-1);
if (ret)
goto err_out;
The two users were already really similar. By adding the flags (I hope you like a lot of arguments in your functions), we can satisfy both callers quite well. Signed-off-by: Ben Widawsky <ben@bwidawsk.net> --- drivers/gpu/drm/i915/i915_drv.h | 16 ++++++++++++++++ drivers/gpu/drm/i915/i915_gem.c | 34 +++++++++++++++++----------------- drivers/gpu/drm/i915/i915_gem_gtt.c | 23 +++++------------------ 3 files changed, 38 insertions(+), 35 deletions(-)