drm/i915: Append the object onto the inactive list on binding.
In order to properly track bound objects, they need to exist on one of the inactive/active lists or be pinned. As this is a requirement, do the work inside i915_gem_bind_to_gtt() rather than dotted around the callsites. Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> Signed-off-by: Eric Anholt <eric@anholt.net>
This commit is contained in:
committed by
Eric Anholt
parent
6ef3d42780
commit
bf1a109239
@@ -1137,7 +1137,6 @@ int i915_gem_fault(struct vm_area_struct *vma, struct vm_fault *vmf)
|
|||||||
{
|
{
|
||||||
struct drm_gem_object *obj = vma->vm_private_data;
|
struct drm_gem_object *obj = vma->vm_private_data;
|
||||||
struct drm_device *dev = obj->dev;
|
struct drm_device *dev = obj->dev;
|
||||||
struct drm_i915_private *dev_priv = dev->dev_private;
|
|
||||||
struct drm_i915_gem_object *obj_priv = to_intel_bo(obj);
|
struct drm_i915_gem_object *obj_priv = to_intel_bo(obj);
|
||||||
pgoff_t page_offset;
|
pgoff_t page_offset;
|
||||||
unsigned long pfn;
|
unsigned long pfn;
|
||||||
@@ -1155,8 +1154,6 @@ int i915_gem_fault(struct vm_area_struct *vma, struct vm_fault *vmf)
|
|||||||
if (ret)
|
if (ret)
|
||||||
goto unlock;
|
goto unlock;
|
||||||
|
|
||||||
list_add_tail(&obj_priv->list, &dev_priv->mm.inactive_list);
|
|
||||||
|
|
||||||
ret = i915_gem_object_set_to_gtt_domain(obj, write);
|
ret = i915_gem_object_set_to_gtt_domain(obj, write);
|
||||||
if (ret)
|
if (ret)
|
||||||
goto unlock;
|
goto unlock;
|
||||||
@@ -1363,7 +1360,6 @@ i915_gem_mmap_gtt_ioctl(struct drm_device *dev, void *data,
|
|||||||
struct drm_file *file_priv)
|
struct drm_file *file_priv)
|
||||||
{
|
{
|
||||||
struct drm_i915_gem_mmap_gtt *args = data;
|
struct drm_i915_gem_mmap_gtt *args = data;
|
||||||
struct drm_i915_private *dev_priv = dev->dev_private;
|
|
||||||
struct drm_gem_object *obj;
|
struct drm_gem_object *obj;
|
||||||
struct drm_i915_gem_object *obj_priv;
|
struct drm_i915_gem_object *obj_priv;
|
||||||
int ret;
|
int ret;
|
||||||
@@ -1409,7 +1405,6 @@ i915_gem_mmap_gtt_ioctl(struct drm_device *dev, void *data,
|
|||||||
mutex_unlock(&dev->struct_mutex);
|
mutex_unlock(&dev->struct_mutex);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
list_add_tail(&obj_priv->list, &dev_priv->mm.inactive_list);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
drm_gem_object_unreference(obj);
|
drm_gem_object_unreference(obj);
|
||||||
@@ -2723,6 +2718,9 @@ i915_gem_object_bind_to_gtt(struct drm_gem_object *obj, unsigned alignment)
|
|||||||
atomic_inc(&dev->gtt_count);
|
atomic_inc(&dev->gtt_count);
|
||||||
atomic_add(obj->size, &dev->gtt_memory);
|
atomic_add(obj->size, &dev->gtt_memory);
|
||||||
|
|
||||||
|
/* keep track of bounds object by adding it to the inactive list */
|
||||||
|
list_add_tail(&obj_priv->list, &dev_priv->mm.inactive_list);
|
||||||
|
|
||||||
/* Assert that the object is not currently in any GPU domain. As it
|
/* Assert that the object is not currently in any GPU domain. As it
|
||||||
* wasn't in the GTT, there shouldn't be any way it could have been in
|
* wasn't in the GTT, there shouldn't be any way it could have been in
|
||||||
* a GPU cache
|
* a GPU cache
|
||||||
@@ -4223,8 +4221,7 @@ i915_gem_object_pin(struct drm_gem_object *obj, uint32_t alignment)
|
|||||||
atomic_inc(&dev->pin_count);
|
atomic_inc(&dev->pin_count);
|
||||||
atomic_add(obj->size, &dev->pin_memory);
|
atomic_add(obj->size, &dev->pin_memory);
|
||||||
if (!obj_priv->active &&
|
if (!obj_priv->active &&
|
||||||
(obj->write_domain & I915_GEM_GPU_DOMAINS) == 0 &&
|
(obj->write_domain & I915_GEM_GPU_DOMAINS) == 0)
|
||||||
!list_empty(&obj_priv->list))
|
|
||||||
list_del_init(&obj_priv->list);
|
list_del_init(&obj_priv->list);
|
||||||
}
|
}
|
||||||
i915_verify_inactive(dev, __FILE__, __LINE__);
|
i915_verify_inactive(dev, __FILE__, __LINE__);
|
||||||
|
Reference in New Issue
Block a user