Skip to content

Commit

Permalink
drm/i915: Fix list corruption in vma_unbind
Browse files Browse the repository at this point in the history
The saga around the breadcrumb vmas used by execbuf continues ...

This time around we've managed to unconditionally move the object to
the unbound list on the last vma unbind even though it might never
have been on either the bound or unbound list. Hilarity ensued.

Chris Wilson tracked this one down but compared to his patches I've
simply opted to completely separate the unbound case for not-yet bound
vmas. Otherwise we imo end up with semantically hard to parse checks
around the list_move_tail(global_list, ...).

Cc: Chris Wilson <chris@chris-wilson.co.uk>
Cc: Ben Widawsky <ben@bwidawsk.net>
Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=68462
Reviewed-by: Chris Wilson <chris@chris-wilson.co.uk>
Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
  • Loading branch information
Daniel Vetter committed Sep 4, 2013
1 parent b833d68 commit 0ff501c
Showing 1 changed file with 5 additions and 3 deletions.
8 changes: 5 additions & 3 deletions drivers/gpu/drm/i915/i915_gem.c
Original file line number Diff line number Diff line change
Expand Up @@ -2610,8 +2610,11 @@ int i915_vma_unbind(struct i915_vma *vma)
if (list_empty(&vma->vma_link))
return 0;

if (!drm_mm_node_allocated(&vma->node))
goto destroy;
if (!drm_mm_node_allocated(&vma->node)) {
i915_gem_vma_destroy(vma);

return 0;
}

if (obj->pin_count)
return -EBUSY;
Expand Down Expand Up @@ -2651,7 +2654,6 @@ int i915_vma_unbind(struct i915_vma *vma)

drm_mm_remove_node(&vma->node);

destroy:
i915_gem_vma_destroy(vma);

/* Since the unbound list is global, only move to that list if
Expand Down

0 comments on commit 0ff501c

Please sign in to comment.