Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 218087
b: refs/heads/master
c: dfaae39
h: refs/heads/master
i:
  218085: 4274094
  218083: 072a0c2
  218079: 4e45ffe
v: v3
  • Loading branch information
Chris Wilson committed Sep 22, 2010
1 parent 1ba5260 commit 24cc83d
Show file tree
Hide file tree
Showing 4 changed files with 43 additions and 29 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: 9e0ae53404700f1e4ae1f33b0ff92948ae0e509d
refs/heads/master: dfaae392f4461785eb1c92aeaf2a1040b184edba
16 changes: 1 addition & 15 deletions trunk/drivers/gpu/drm/i915/i915_drv.c
Original file line number Diff line number Diff line change
Expand Up @@ -395,21 +395,7 @@ int i915_reset(struct drm_device *dev, u8 flags)

mutex_lock(&dev->struct_mutex);

/*
* Clear request list
*/
i915_gem_retire_requests(dev);

/* Remove anything from the flushing lists. The GPU cache is likely
* to be lost on reset along with the data, so simply move the
* lost bo to the inactive list.
*/
i915_gem_reset_flushing_list(dev);

/* Move everything out of the GPU domains to ensure we do any
* necessary invalidation upon reuse.
*/
i915_gem_reset_inactive_gpu_domains(dev);
i915_gem_reset_lists(dev);

/*
* Set the domains we want to reset (GRDOM/bits 2 and 3) as
Expand Down
3 changes: 1 addition & 2 deletions trunk/drivers/gpu/drm/i915/i915_drv.h
Original file line number Diff line number Diff line change
Expand Up @@ -1005,8 +1005,7 @@ int i915_gem_object_get_fence_reg(struct drm_gem_object *obj,
int i915_gem_object_put_fence_reg(struct drm_gem_object *obj,
bool interruptible);
void i915_gem_retire_requests(struct drm_device *dev);
void i915_gem_reset_flushing_list(struct drm_device *dev);
void i915_gem_reset_inactive_gpu_domains(struct drm_device *dev);
void i915_gem_reset_lists(struct drm_device *dev);
void i915_gem_clflush_object(struct drm_gem_object *obj);
void i915_gem_flush_ring(struct drm_device *dev,
struct drm_file *file_priv,
Expand Down
51 changes: 40 additions & 11 deletions trunk/drivers/gpu/drm/i915/i915_gem.c
Original file line number Diff line number Diff line change
Expand Up @@ -1682,27 +1682,60 @@ i915_get_gem_seqno(struct drm_device *dev,
return ring->get_gem_seqno(dev, ring);
}

void i915_gem_reset_flushing_list(struct drm_device *dev)
static void i915_gem_reset_ring_lists(struct drm_i915_private *dev_priv,
struct intel_ring_buffer *ring)
{
struct drm_i915_private *dev_priv = dev->dev_private;
while (!list_empty(&ring->request_list)) {
struct drm_i915_gem_request *request;

while (!list_empty(&dev_priv->mm.flushing_list)) {
request = list_first_entry(&ring->request_list,
struct drm_i915_gem_request,
list);

list_del(&request->list);
list_del(&request->client_list);
kfree(request);
}

while (!list_empty(&ring->active_list)) {
struct drm_i915_gem_object *obj_priv;

obj_priv = list_first_entry(&dev_priv->mm.flushing_list,
obj_priv = list_first_entry(&ring->active_list,
struct drm_i915_gem_object,
list);

obj_priv->base.write_domain = 0;
list_del_init(&obj_priv->gpu_write_list);
i915_gem_object_move_to_inactive(&obj_priv->base);
}
}

void i915_gem_reset_inactive_gpu_domains(struct drm_device *dev)
void i915_gem_reset_lists(struct drm_device *dev)
{
struct drm_i915_private *dev_priv = dev->dev_private;
struct drm_i915_gem_object *obj_priv;

i915_gem_reset_ring_lists(dev_priv, &dev_priv->render_ring);
if (HAS_BSD(dev))
i915_gem_reset_ring_lists(dev_priv, &dev_priv->bsd_ring);

/* Remove anything from the flushing lists. The GPU cache is likely
* to be lost on reset along with the data, so simply move the
* lost bo to the inactive list.
*/
while (!list_empty(&dev_priv->mm.flushing_list)) {
obj_priv = list_first_entry(&dev_priv->mm.flushing_list,
struct drm_i915_gem_object,
list);

obj_priv->base.write_domain = 0;
list_del_init(&obj_priv->gpu_write_list);
i915_gem_object_move_to_inactive(&obj_priv->base);
}

/* Move everything out of the GPU domains to ensure we do any
* necessary invalidation upon reuse.
*/
list_for_each_entry(obj_priv,
&dev_priv->mm.inactive_list,
list)
Expand All @@ -1720,23 +1753,20 @@ i915_gem_retire_requests_ring(struct drm_device *dev,
{
drm_i915_private_t *dev_priv = dev->dev_private;
uint32_t seqno;
bool wedged;

if (!ring->status_page.page_addr ||
list_empty(&ring->request_list))
return;

seqno = i915_get_gem_seqno(dev, ring);
wedged = atomic_read(&dev_priv->mm.wedged);

while (!list_empty(&ring->request_list)) {
struct drm_i915_gem_request *request;

request = list_first_entry(&ring->request_list,
struct drm_i915_gem_request,
list);

if (!wedged && !i915_seqno_passed(seqno, request->seqno))
if (!i915_seqno_passed(seqno, request->seqno))
break;

trace_i915_gem_request_retire(dev, request->seqno);
Expand All @@ -1757,8 +1787,7 @@ i915_gem_retire_requests_ring(struct drm_device *dev,
struct drm_i915_gem_object,
list);

if (!wedged &&
!i915_seqno_passed(seqno, obj_priv->last_rendering_seqno))
if (!i915_seqno_passed(seqno, obj_priv->last_rendering_seqno))
break;

obj = &obj_priv->base;
Expand Down

0 comments on commit 24cc83d

Please sign in to comment.