drm/radeon/kms: record object that have been list reserved
list reservation was too optimistic about ttm object reservation and could think that an object reserved by some other process as reserved by the list reservation which was false. Thus when unreserving the list it might unreserve object that it didn't reserved in the list. Sorry if it's hard to follow but this kind of things are just causing headheck. Signed-off-by: Jerome Glisse <jglisse@redhat.com> Signed-off-by: Dave Airlie <airlied@redhat.com>
This commit is contained in:

committed by
Dave Airlie

parent
365048ff7f
commit
e865275335
@@ -301,6 +301,7 @@ int radeon_bo_list_reserve(struct list_head *head)
|
||||
r = radeon_bo_reserve(lobj->bo, false);
|
||||
if (unlikely(r != 0))
|
||||
return r;
|
||||
lobj->reserved = true;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
@@ -311,7 +312,7 @@ void radeon_bo_list_unreserve(struct list_head *head)
|
||||
|
||||
list_for_each_entry(lobj, head, list) {
|
||||
/* only unreserve object we successfully reserved */
|
||||
if (radeon_bo_is_reserved(lobj->bo))
|
||||
if (lobj->reserved && radeon_bo_is_reserved(lobj->bo))
|
||||
radeon_bo_unreserve(lobj->bo);
|
||||
}
|
||||
}
|
||||
@@ -322,6 +323,9 @@ int radeon_bo_list_validate(struct list_head *head)
|
||||
struct radeon_bo *bo;
|
||||
int r;
|
||||
|
||||
list_for_each_entry(lobj, head, list) {
|
||||
lobj->reserved = false;
|
||||
}
|
||||
r = radeon_bo_list_reserve(head);
|
||||
if (unlikely(r != 0)) {
|
||||
return r;
|
||||
|
Reference in New Issue
Block a user