Skip to content

Commit 85fd4f5

Browse files
committed
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: Chris Wilson <[email protected]> Reviewed-by: Joonas Lahtinen <[email protected]> Link: http://patchwork.freedesktop.org/patch/msgid/[email protected]
1 parent 721d484 commit 85fd4f5

File tree

5 files changed

+16
-9
lines changed

5 files changed

+16
-9
lines changed

drivers/gpu/drm/i915/gvt/aperture_gm.c

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -73,12 +73,15 @@ static int alloc_gm(struct intel_vgpu *vgpu, bool high_gm)
7373
mutex_lock(&dev_priv->drm.struct_mutex);
7474
search_again:
7575
ret = drm_mm_insert_node_in_range_generic(&dev_priv->ggtt.base.mm,
76-
node, size, 4096, 0,
76+
node, size, 4096,
77+
I915_COLOR_UNEVICTABLE,
7778
start, end, search_flag,
7879
alloc_flag);
7980
if (ret) {
8081
ret = i915_gem_evict_something(&dev_priv->ggtt.base,
81-
size, 4096, 0, start, end, 0);
82+
size, 4096,
83+
I915_COLOR_UNEVICTABLE,
84+
start, end, 0);
8285
if (ret == 0 && ++retried < 3)
8386
goto search_again;
8487

drivers/gpu/drm/i915/i915_drv.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -934,6 +934,8 @@ enum i915_cache_level {
934934
I915_CACHE_WT, /* hsw:gt3e WriteThrough for scanouts */
935935
};
936936

937+
#define I915_COLOR_UNEVICTABLE (-1) /* a non-vma sharing the address space */
938+
937939
#define DEFAULT_CONTEXT_HANDLE 0
938940

939941
/**

drivers/gpu/drm/i915/i915_gem.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,8 @@ insert_mappable_node(struct i915_ggtt *ggtt,
7070
{
7171
memset(node, 0, sizeof(*node));
7272
return drm_mm_insert_node_in_range_generic(&ggtt->base.mm, node,
73-
size, 0, -1,
73+
size, 0,
74+
I915_COLOR_UNEVICTABLE,
7475
0, ggtt->mappable_end,
7576
DRM_MM_SEARCH_DEFAULT,
7677
DRM_MM_CREATE_DEFAULT);

drivers/gpu/drm/i915/i915_gem_execbuffer.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -437,7 +437,7 @@ static void *reloc_iomap(struct drm_i915_gem_object *obj,
437437
memset(&cache->node, 0, sizeof(cache->node));
438438
ret = drm_mm_insert_node_in_range_generic
439439
(&ggtt->base.mm, &cache->node,
440-
4096, 0, 0,
440+
4096, 0, I915_COLOR_UNEVICTABLE,
441441
0, ggtt->mappable_end,
442442
DRM_MM_SEARCH_DEFAULT,
443443
DRM_MM_CREATE_DEFAULT);

drivers/gpu/drm/i915/i915_gem_gtt.c

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2071,15 +2071,15 @@ static int gen6_ppgtt_allocate_page_directories(struct i915_hw_ppgtt *ppgtt)
20712071
return ret;
20722072

20732073
alloc:
2074-
ret = drm_mm_insert_node_in_range_generic(&ggtt->base.mm,
2075-
&ppgtt->node, GEN6_PD_SIZE,
2076-
GEN6_PD_ALIGN, 0,
2074+
ret = drm_mm_insert_node_in_range_generic(&ggtt->base.mm, &ppgtt->node,
2075+
GEN6_PD_SIZE, GEN6_PD_ALIGN,
2076+
I915_COLOR_UNEVICTABLE,
20772077
0, ggtt->base.total,
20782078
DRM_MM_TOPDOWN);
20792079
if (ret == -ENOSPC && !retried) {
20802080
ret = i915_gem_evict_something(&ggtt->base,
20812081
GEN6_PD_SIZE, GEN6_PD_ALIGN,
2082-
I915_CACHE_NONE,
2082+
I915_COLOR_UNEVICTABLE,
20832083
0, ggtt->base.total,
20842084
0);
20852085
if (ret)
@@ -2755,7 +2755,8 @@ int i915_gem_init_ggtt(struct drm_i915_private *dev_priv)
27552755
/* Reserve a mappable slot for our lockless error capture */
27562756
ret = drm_mm_insert_node_in_range_generic(&ggtt->base.mm,
27572757
&ggtt->error_capture,
2758-
4096, 0, -1,
2758+
4096, 0,
2759+
I915_COLOR_UNEVICTABLE,
27592760
0, ggtt->mappable_end,
27602761
0, 0);
27612762
if (ret)

0 commit comments

Comments
 (0)