Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 205171
b: refs/heads/master
c: be72615
h: refs/heads/master
i:
  205169: b12cc41
  205167: a75fa6d
v: v3
  • Loading branch information
Chris Wilson authored and Eric Anholt committed Aug 2, 2010
1 parent 1e631b4 commit 38275c5
Show file tree
Hide file tree
Showing 3 changed files with 50 additions and 11 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: b09a1feca65764311f8a3e14befb52b98d705f0a
refs/heads/master: be72615bcf4d5b7b314d836c5e1b4baa4b65dad1
8 changes: 8 additions & 0 deletions trunk/drivers/gpu/drm/i915/i915_drv.h
Original file line number Diff line number Diff line change
Expand Up @@ -551,6 +551,14 @@ typedef struct drm_i915_private {
/** LRU list of objects with fence regs on them. */
struct list_head fence_list;

/**
* List of objects currently pending being freed.
*
* These objects are no longer in use, but due to a signal
* we were prevented from freeing them at the appointed time.
*/
struct list_head deferred_free_list;

/**
* We leave the user IRQ off as much as possible,
* but this means that requests will finish and never
Expand Down
51 changes: 41 additions & 10 deletions trunk/drivers/gpu/drm/i915/i915_gem.c
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,7 @@ static int i915_gem_evict_from_inactive_list(struct drm_device *dev);
static int i915_gem_phys_pwrite(struct drm_device *dev, struct drm_gem_object *obj,
struct drm_i915_gem_pwrite *args,
struct drm_file *file_priv);
static void i915_gem_free_object_tail(struct drm_gem_object *obj);

static LIST_HEAD(shrink_list);
static DEFINE_SPINLOCK(shrink_list_lock);
Expand Down Expand Up @@ -1755,6 +1756,20 @@ i915_gem_retire_requests(struct drm_device *dev)
{
drm_i915_private_t *dev_priv = dev->dev_private;

if (!list_empty(&dev_priv->mm.deferred_free_list)) {
struct drm_i915_gem_object *obj_priv, *tmp;

/* We must be careful that during unbind() we do not
* accidentally infinitely recurse into retire requests.
* Currently:
* retire -> free -> unbind -> wait -> retire_ring
*/
list_for_each_entry_safe(obj_priv, tmp,
&dev_priv->mm.deferred_free_list,
list)
i915_gem_free_object_tail(&obj_priv->base);
}

i915_gem_retire_requests_ring(dev, &dev_priv->render_ring);
if (HAS_BSD(dev))
i915_gem_retire_requests_ring(dev, &dev_priv->bsd_ring);
Expand Down Expand Up @@ -4458,20 +4473,19 @@ int i915_gem_init_object(struct drm_gem_object *obj)
return 0;
}

void i915_gem_free_object(struct drm_gem_object *obj)
static void i915_gem_free_object_tail(struct drm_gem_object *obj)
{
struct drm_device *dev = obj->dev;
drm_i915_private_t *dev_priv = dev->dev_private;
struct drm_i915_gem_object *obj_priv = to_intel_bo(obj);
int ret;

trace_i915_gem_object_destroy(obj);

while (obj_priv->pin_count > 0)
i915_gem_object_unpin(obj);

if (obj_priv->phys_obj)
i915_gem_detach_phys_object(dev, obj);

i915_gem_object_unbind(obj);
ret = i915_gem_object_unbind(obj);
if (ret == -ERESTARTSYS) {
list_move(&obj_priv->list,
&dev_priv->mm.deferred_free_list);
return;
}

if (obj_priv->mmap_offset)
i915_gem_free_mmap_offset(obj);
Expand All @@ -4483,6 +4497,22 @@ void i915_gem_free_object(struct drm_gem_object *obj)
kfree(obj_priv);
}

void i915_gem_free_object(struct drm_gem_object *obj)
{
struct drm_device *dev = obj->dev;
struct drm_i915_gem_object *obj_priv = to_intel_bo(obj);

trace_i915_gem_object_destroy(obj);

while (obj_priv->pin_count > 0)
i915_gem_object_unpin(obj);

if (obj_priv->phys_obj)
i915_gem_detach_phys_object(dev, obj);

i915_gem_free_object_tail(obj);
}

/** Unbinds all inactive objects. */
static int
i915_gem_evict_from_inactive_list(struct drm_device *dev)
Expand Down Expand Up @@ -4756,6 +4786,7 @@ i915_gem_load(struct drm_device *dev)
INIT_LIST_HEAD(&dev_priv->mm.gpu_write_list);
INIT_LIST_HEAD(&dev_priv->mm.inactive_list);
INIT_LIST_HEAD(&dev_priv->mm.fence_list);
INIT_LIST_HEAD(&dev_priv->mm.deferred_free_list);
INIT_LIST_HEAD(&dev_priv->render_ring.active_list);
INIT_LIST_HEAD(&dev_priv->render_ring.request_list);
if (HAS_BSD(dev)) {
Expand Down

0 comments on commit 38275c5

Please sign in to comment.