Commit 85fd4f58 authored by Chris Wilson's avatar Chris Wilson

drm/i915: Mark all non-vma being inserted into the address spaces

We need to distinguish between full i915_vma structs and simple
drm_mm_nodes when considering eviction (i.e. we must be careful not to
treat a mere drm_mm_node as a much larger i915_vma causing memory
corruption, if we are lucky). To do this, color these not-a-vma with -1
(I915_COLOR_UNEVICTABLE).

v2...v200: New name for -1.
Signed-off-by: default avatarChris Wilson <chris@chris-wilson.co.uk>
Reviewed-by: default avatarJoonas Lahtinen <joonas.lahtinen@linux.intel.com>
Link: http://patchwork.freedesktop.org/patch/msgid/20161205142941.21965-1-chris@chris-wilson.co.uk
parent 721d4845
...@@ -73,12 +73,15 @@ static int alloc_gm(struct intel_vgpu *vgpu, bool high_gm) ...@@ -73,12 +73,15 @@ static int alloc_gm(struct intel_vgpu *vgpu, bool high_gm)
mutex_lock(&dev_priv->drm.struct_mutex); mutex_lock(&dev_priv->drm.struct_mutex);
search_again: search_again:
ret = drm_mm_insert_node_in_range_generic(&dev_priv->ggtt.base.mm, ret = drm_mm_insert_node_in_range_generic(&dev_priv->ggtt.base.mm,
node, size, 4096, 0, node, size, 4096,
I915_COLOR_UNEVICTABLE,
start, end, search_flag, start, end, search_flag,
alloc_flag); alloc_flag);
if (ret) { if (ret) {
ret = i915_gem_evict_something(&dev_priv->ggtt.base, ret = i915_gem_evict_something(&dev_priv->ggtt.base,
size, 4096, 0, start, end, 0); size, 4096,
I915_COLOR_UNEVICTABLE,
start, end, 0);
if (ret == 0 && ++retried < 3) if (ret == 0 && ++retried < 3)
goto search_again; goto search_again;
......
...@@ -934,6 +934,8 @@ enum i915_cache_level { ...@@ -934,6 +934,8 @@ enum i915_cache_level {
I915_CACHE_WT, /* hsw:gt3e WriteThrough for scanouts */ I915_CACHE_WT, /* hsw:gt3e WriteThrough for scanouts */
}; };
#define I915_COLOR_UNEVICTABLE (-1) /* a non-vma sharing the address space */
#define DEFAULT_CONTEXT_HANDLE 0 #define DEFAULT_CONTEXT_HANDLE 0
/** /**
......
...@@ -70,7 +70,8 @@ insert_mappable_node(struct i915_ggtt *ggtt, ...@@ -70,7 +70,8 @@ insert_mappable_node(struct i915_ggtt *ggtt,
{ {
memset(node, 0, sizeof(*node)); memset(node, 0, sizeof(*node));
return drm_mm_insert_node_in_range_generic(&ggtt->base.mm, node, return drm_mm_insert_node_in_range_generic(&ggtt->base.mm, node,
size, 0, -1, size, 0,
I915_COLOR_UNEVICTABLE,
0, ggtt->mappable_end, 0, ggtt->mappable_end,
DRM_MM_SEARCH_DEFAULT, DRM_MM_SEARCH_DEFAULT,
DRM_MM_CREATE_DEFAULT); DRM_MM_CREATE_DEFAULT);
......
...@@ -437,7 +437,7 @@ static void *reloc_iomap(struct drm_i915_gem_object *obj, ...@@ -437,7 +437,7 @@ static void *reloc_iomap(struct drm_i915_gem_object *obj,
memset(&cache->node, 0, sizeof(cache->node)); memset(&cache->node, 0, sizeof(cache->node));
ret = drm_mm_insert_node_in_range_generic ret = drm_mm_insert_node_in_range_generic
(&ggtt->base.mm, &cache->node, (&ggtt->base.mm, &cache->node,
4096, 0, 0, 4096, 0, I915_COLOR_UNEVICTABLE,
0, ggtt->mappable_end, 0, ggtt->mappable_end,
DRM_MM_SEARCH_DEFAULT, DRM_MM_SEARCH_DEFAULT,
DRM_MM_CREATE_DEFAULT); DRM_MM_CREATE_DEFAULT);
......
...@@ -2071,15 +2071,15 @@ static int gen6_ppgtt_allocate_page_directories(struct i915_hw_ppgtt *ppgtt) ...@@ -2071,15 +2071,15 @@ static int gen6_ppgtt_allocate_page_directories(struct i915_hw_ppgtt *ppgtt)
return ret; return ret;
alloc: alloc:
ret = drm_mm_insert_node_in_range_generic(&ggtt->base.mm, ret = drm_mm_insert_node_in_range_generic(&ggtt->base.mm, &ppgtt->node,
&ppgtt->node, GEN6_PD_SIZE, GEN6_PD_SIZE, GEN6_PD_ALIGN,
GEN6_PD_ALIGN, 0, I915_COLOR_UNEVICTABLE,
0, ggtt->base.total, 0, ggtt->base.total,
DRM_MM_TOPDOWN); DRM_MM_TOPDOWN);
if (ret == -ENOSPC && !retried) { if (ret == -ENOSPC && !retried) {
ret = i915_gem_evict_something(&ggtt->base, ret = i915_gem_evict_something(&ggtt->base,
GEN6_PD_SIZE, GEN6_PD_ALIGN, GEN6_PD_SIZE, GEN6_PD_ALIGN,
I915_CACHE_NONE, I915_COLOR_UNEVICTABLE,
0, ggtt->base.total, 0, ggtt->base.total,
0); 0);
if (ret) if (ret)
...@@ -2755,7 +2755,8 @@ int i915_gem_init_ggtt(struct drm_i915_private *dev_priv) ...@@ -2755,7 +2755,8 @@ int i915_gem_init_ggtt(struct drm_i915_private *dev_priv)
/* Reserve a mappable slot for our lockless error capture */ /* Reserve a mappable slot for our lockless error capture */
ret = drm_mm_insert_node_in_range_generic(&ggtt->base.mm, ret = drm_mm_insert_node_in_range_generic(&ggtt->base.mm,
&ggtt->error_capture, &ggtt->error_capture,
4096, 0, -1, 4096, 0,
I915_COLOR_UNEVICTABLE,
0, ggtt->mappable_end, 0, ggtt->mappable_end,
0, 0); 0, 0);
if (ret) if (ret)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment