diff options
Diffstat (limited to 'drivers/gpu/drm/i915/i915_gem_debug.c')
| -rw-r--r-- | drivers/gpu/drm/i915/i915_gem_debug.c | 148 | 
1 files changed, 98 insertions, 50 deletions
diff --git a/drivers/gpu/drm/i915/i915_gem_debug.c b/drivers/gpu/drm/i915/i915_gem_debug.c index 80f380b1d95..48644b840a8 100644 --- a/drivers/gpu/drm/i915/i915_gem_debug.c +++ b/drivers/gpu/drm/i915/i915_gem_debug.c @@ -30,29 +30,112 @@  #include "i915_drm.h"  #include "i915_drv.h" -#if WATCH_INACTIVE -void -i915_verify_inactive(struct drm_device *dev, char *file, int line) +#if WATCH_LISTS +int +i915_verify_lists(struct drm_device *dev)  { +	static int warned;  	drm_i915_private_t *dev_priv = dev->dev_private; -	struct drm_gem_object *obj; -	struct drm_i915_gem_object *obj_priv; - -	list_for_each_entry(obj_priv, &dev_priv->mm.inactive_list, list) { -		obj = &obj_priv->base; -		if (obj_priv->pin_count || obj_priv->active || -		    (obj->write_domain & ~(I915_GEM_DOMAIN_CPU | -					   I915_GEM_DOMAIN_GTT))) -			DRM_ERROR("inactive %p (p %d a %d w %x)  %s:%d\n", +	struct drm_i915_gem_object *obj; +	int err = 0; + +	if (warned) +		return 0; + +	list_for_each_entry(obj, &dev_priv->render_ring.active_list, list) { +		if (obj->base.dev != dev || +		    !atomic_read(&obj->base.refcount.refcount)) { +			DRM_ERROR("freed render active %p\n", obj); +			err++; +			break; +		} else if (!obj->active || +			   (obj->base.read_domains & I915_GEM_GPU_DOMAINS) == 0) { +			DRM_ERROR("invalid render active %p (a %d r %x)\n", +				  obj, +				  obj->active, +				  obj->base.read_domains); +			err++; +		} else if (obj->base.write_domain && list_empty(&obj->gpu_write_list)) { +			DRM_ERROR("invalid render active %p (w %x, gwl %d)\n", +				  obj, +				  obj->base.write_domain, +				  !list_empty(&obj->gpu_write_list)); +			err++; +		} +	} + +	list_for_each_entry(obj, &dev_priv->mm.flushing_list, list) { +		if (obj->base.dev != dev || +		    !atomic_read(&obj->base.refcount.refcount)) { +			DRM_ERROR("freed flushing %p\n", obj); +			err++; +			break; +		} else if (!obj->active || +			   (obj->base.write_domain & I915_GEM_GPU_DOMAINS) == 0 || +			   list_empty(&obj->gpu_write_list)){ +			DRM_ERROR("invalid flushing %p (a %d w %x gwl %d)\n",  				  obj, -				  obj_priv->pin_count, obj_priv->active, -				  obj->write_domain, file, line); +				  obj->active, +				  obj->base.write_domain, +				  !list_empty(&obj->gpu_write_list)); +			err++; +		} +	} + +	list_for_each_entry(obj, &dev_priv->mm.gpu_write_list, gpu_write_list) { +		if (obj->base.dev != dev || +		    !atomic_read(&obj->base.refcount.refcount)) { +			DRM_ERROR("freed gpu write %p\n", obj); +			err++; +			break; +		} else if (!obj->active || +			   (obj->base.write_domain & I915_GEM_GPU_DOMAINS) == 0) { +			DRM_ERROR("invalid gpu write %p (a %d w %x)\n", +				  obj, +				  obj->active, +				  obj->base.write_domain); +			err++; +		} +	} + +	list_for_each_entry(obj, &dev_priv->mm.inactive_list, list) { +		if (obj->base.dev != dev || +		    !atomic_read(&obj->base.refcount.refcount)) { +			DRM_ERROR("freed inactive %p\n", obj); +			err++; +			break; +		} else if (obj->pin_count || obj->active || +			   (obj->base.write_domain & I915_GEM_GPU_DOMAINS)) { +			DRM_ERROR("invalid inactive %p (p %d a %d w %x)\n", +				  obj, +				  obj->pin_count, obj->active, +				  obj->base.write_domain); +			err++; +		}  	} + +	list_for_each_entry(obj, &dev_priv->mm.pinned_list, list) { +		if (obj->base.dev != dev || +		    !atomic_read(&obj->base.refcount.refcount)) { +			DRM_ERROR("freed pinned %p\n", obj); +			err++; +			break; +		} else if (!obj->pin_count || obj->active || +			   (obj->base.write_domain & I915_GEM_GPU_DOMAINS)) { +			DRM_ERROR("invalid pinned %p (p %d a %d w %x)\n", +				  obj, +				  obj->pin_count, obj->active, +				  obj->base.write_domain); +			err++; +		} +	} + +	return warned = err;  }  #endif /* WATCH_INACTIVE */ -#if WATCH_BUF | WATCH_EXEC | WATCH_PWRITE +#if WATCH_EXEC | WATCH_PWRITE  static void  i915_gem_dump_page(struct page *page, uint32_t start, uint32_t end,  		   uint32_t bias, uint32_t mark) @@ -97,41 +180,6 @@ i915_gem_dump_object(struct drm_gem_object *obj, int len,  }  #endif -#if WATCH_LRU -void -i915_dump_lru(struct drm_device *dev, const char *where) -{ -	drm_i915_private_t		*dev_priv = dev->dev_private; -	struct drm_i915_gem_object	*obj_priv; - -	DRM_INFO("active list %s {\n", where); -	spin_lock(&dev_priv->mm.active_list_lock); -	list_for_each_entry(obj_priv, &dev_priv->mm.active_list, -			    list) -	{ -		DRM_INFO("    %p: %08x\n", obj_priv, -			 obj_priv->last_rendering_seqno); -	} -	spin_unlock(&dev_priv->mm.active_list_lock); -	DRM_INFO("}\n"); -	DRM_INFO("flushing list %s {\n", where); -	list_for_each_entry(obj_priv, &dev_priv->mm.flushing_list, -			    list) -	{ -		DRM_INFO("    %p: %08x\n", obj_priv, -			 obj_priv->last_rendering_seqno); -	} -	DRM_INFO("}\n"); -	DRM_INFO("inactive %s {\n", where); -	list_for_each_entry(obj_priv, &dev_priv->mm.inactive_list, list) { -		DRM_INFO("    %p: %08x\n", obj_priv, -			 obj_priv->last_rendering_seqno); -	} -	DRM_INFO("}\n"); -} -#endif - -  #if WATCH_COHERENCY  void  i915_gem_object_check_coherency(struct drm_gem_object *obj, int handle)  | 
