diff options
author | Chris Wilson <chris@chris-wilson.co.uk> | 2014-09-11 03:43:48 -0400 |
---|---|---|
committer | Daniel Vetter <daniel.vetter@ffwll.ch> | 2014-09-19 08:41:18 -0400 |
commit | 4144f9b5e003e65b7e4be6abfff133bc83e73fec (patch) | |
tree | e4c1b58dcb5f34f280962f5b41f729f704aede3a /drivers/gpu | |
parent | 770722585639bc2da683e72f610d5f614298e415 (diff) |
drm/i915: Match GTT space sanity checker with implementation
If we believe that the device can cross cache domains in its prefetcher
(i.e. we allow neighbouring pages in different domains), we don't supply
a color_adjust callback. Use the presence of this callback to better
determine when we should be verifying that the GTT space we just
used is valid.
v2: Remove the superfluous struct drm_device function param as well.
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
[danvet: Also adjust the comment per irc discussion with Chris.]
Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
Diffstat (limited to 'drivers/gpu')
-rw-r--r-- | drivers/gpu/drm/i915/i915_gem.c | 20 |
1 files changed, 11 insertions, 9 deletions
diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c index 2a5351df46da..28f91df2604d 100644 --- a/drivers/gpu/drm/i915/i915_gem.c +++ b/drivers/gpu/drm/i915/i915_gem.c | |||
@@ -3351,17 +3351,20 @@ i915_gem_object_get_fence(struct drm_i915_gem_object *obj) | |||
3351 | return 0; | 3351 | return 0; |
3352 | } | 3352 | } |
3353 | 3353 | ||
3354 | static bool i915_gem_valid_gtt_space(struct drm_device *dev, | 3354 | static bool i915_gem_valid_gtt_space(struct i915_vma *vma, |
3355 | struct drm_mm_node *gtt_space, | ||
3356 | unsigned long cache_level) | 3355 | unsigned long cache_level) |
3357 | { | 3356 | { |
3357 | struct drm_mm_node *gtt_space = &vma->node; | ||
3358 | struct drm_mm_node *other; | 3358 | struct drm_mm_node *other; |
3359 | 3359 | ||
3360 | /* On non-LLC machines we have to be careful when putting differing | 3360 | /* |
3361 | * types of snoopable memory together to avoid the prefetcher | 3361 | * On some machines we have to be careful when putting differing types |
3362 | * crossing memory domains and dying. | 3362 | * of snoopable memory together to avoid the prefetcher crossing memory |
3363 | * domains and dying. During vm initialisation, we decide whether or not | ||
3364 | * these constraints apply and set the drm_mm.color_adjust | ||
3365 | * appropriately. | ||
3363 | */ | 3366 | */ |
3364 | if (HAS_LLC(dev)) | 3367 | if (vma->vm->mm.color_adjust == NULL) |
3365 | return true; | 3368 | return true; |
3366 | 3369 | ||
3367 | if (!drm_mm_node_allocated(gtt_space)) | 3370 | if (!drm_mm_node_allocated(gtt_space)) |
@@ -3499,8 +3502,7 @@ search_free: | |||
3499 | 3502 | ||
3500 | goto err_free_vma; | 3503 | goto err_free_vma; |
3501 | } | 3504 | } |
3502 | if (WARN_ON(!i915_gem_valid_gtt_space(dev, &vma->node, | 3505 | if (WARN_ON(!i915_gem_valid_gtt_space(vma, obj->cache_level))) { |
3503 | obj->cache_level))) { | ||
3504 | ret = -EINVAL; | 3506 | ret = -EINVAL; |
3505 | goto err_remove_node; | 3507 | goto err_remove_node; |
3506 | } | 3508 | } |
@@ -3710,7 +3712,7 @@ int i915_gem_object_set_cache_level(struct drm_i915_gem_object *obj, | |||
3710 | } | 3712 | } |
3711 | 3713 | ||
3712 | list_for_each_entry_safe(vma, next, &obj->vma_list, vma_link) { | 3714 | list_for_each_entry_safe(vma, next, &obj->vma_list, vma_link) { |
3713 | if (!i915_gem_valid_gtt_space(dev, &vma->node, cache_level)) { | 3715 | if (!i915_gem_valid_gtt_space(vma, cache_level)) { |
3714 | ret = i915_vma_unbind(vma); | 3716 | ret = i915_vma_unbind(vma); |
3715 | if (ret) | 3717 | if (ret) |
3716 | return ret; | 3718 | return ret; |