提交 4144f9b5 编写于 作者: C Chris Wilson 提交者: Daniel Vetter

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: NChris Wilson <chris@chris-wilson.co.uk>
[danvet: Also adjust the comment per irc discussion with Chris.]
Signed-off-by: NDaniel Vetter <daniel.vetter@ffwll.ch>
上级 77072258
...@@ -3351,17 +3351,20 @@ i915_gem_object_get_fence(struct drm_i915_gem_object *obj) ...@@ -3351,17 +3351,20 @@ i915_gem_object_get_fence(struct drm_i915_gem_object *obj)
return 0; return 0;
} }
static bool i915_gem_valid_gtt_space(struct drm_device *dev, static bool i915_gem_valid_gtt_space(struct i915_vma *vma,
struct drm_mm_node *gtt_space,
unsigned long cache_level) unsigned long cache_level)
{ {
struct drm_mm_node *gtt_space = &vma->node;
struct drm_mm_node *other; struct drm_mm_node *other;
/* On non-LLC machines we have to be careful when putting differing /*
* types of snoopable memory together to avoid the prefetcher * On some machines we have to be careful when putting differing types
* crossing memory domains and dying. * of snoopable memory together to avoid the prefetcher crossing memory
* domains and dying. During vm initialisation, we decide whether or not
* these constraints apply and set the drm_mm.color_adjust
* appropriately.
*/ */
if (HAS_LLC(dev)) if (vma->vm->mm.color_adjust == NULL)
return true; return true;
if (!drm_mm_node_allocated(gtt_space)) if (!drm_mm_node_allocated(gtt_space))
...@@ -3499,8 +3502,7 @@ i915_gem_object_bind_to_vm(struct drm_i915_gem_object *obj, ...@@ -3499,8 +3502,7 @@ i915_gem_object_bind_to_vm(struct drm_i915_gem_object *obj,
goto err_free_vma; goto err_free_vma;
} }
if (WARN_ON(!i915_gem_valid_gtt_space(dev, &vma->node, if (WARN_ON(!i915_gem_valid_gtt_space(vma, obj->cache_level))) {
obj->cache_level))) {
ret = -EINVAL; ret = -EINVAL;
goto err_remove_node; goto err_remove_node;
} }
...@@ -3710,7 +3712,7 @@ int i915_gem_object_set_cache_level(struct drm_i915_gem_object *obj, ...@@ -3710,7 +3712,7 @@ int i915_gem_object_set_cache_level(struct drm_i915_gem_object *obj,
} }
list_for_each_entry_safe(vma, next, &obj->vma_list, vma_link) { list_for_each_entry_safe(vma, next, &obj->vma_list, vma_link) {
if (!i915_gem_valid_gtt_space(dev, &vma->node, cache_level)) { if (!i915_gem_valid_gtt_space(vma, cache_level)) {
ret = i915_vma_unbind(vma); ret = i915_vma_unbind(vma);
if (ret) if (ret)
return ret; return ret;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册