aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu
diff options
context:
space:
mode:
authorJerome Glisse <jglisse@redhat.com>2010-05-19 10:05:50 -0400
committerDave Airlie <airlied@redhat.com>2010-05-21 01:07:24 -0400
commite86527533586259875f08fccb173e3347046cc3f (patch)
treeef7443dbce0cd83640b90f28bec2dce24ce74a30 /drivers/gpu
parent365048ff7f977c5983d67b63c47502c5964840e9 (diff)
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>
Diffstat (limited to 'drivers/gpu')
-rw-r--r--drivers/gpu/drm/radeon/radeon.h1
-rw-r--r--drivers/gpu/drm/radeon/radeon_object.c6
2 files changed, 6 insertions, 1 deletions
diff --git a/drivers/gpu/drm/radeon/radeon.h b/drivers/gpu/drm/radeon/radeon.h
index 5c9ce2beaca3..66a37fb75839 100644
--- a/drivers/gpu/drm/radeon/radeon.h
+++ b/drivers/gpu/drm/radeon/radeon.h
@@ -261,6 +261,7 @@ struct radeon_bo_list {
261 unsigned rdomain; 261 unsigned rdomain;
262 unsigned wdomain; 262 unsigned wdomain;
263 u32 tiling_flags; 263 u32 tiling_flags;
264 bool reserved;
264}; 265};
265 266
266/* 267/*
diff --git a/drivers/gpu/drm/radeon/radeon_object.c b/drivers/gpu/drm/radeon/radeon_object.c
index a8d18bcae7db..d5b9373ce06c 100644
--- a/drivers/gpu/drm/radeon/radeon_object.c
+++ b/drivers/gpu/drm/radeon/radeon_object.c
@@ -301,6 +301,7 @@ int radeon_bo_list_reserve(struct list_head *head)
301 r = radeon_bo_reserve(lobj->bo, false); 301 r = radeon_bo_reserve(lobj->bo, false);
302 if (unlikely(r != 0)) 302 if (unlikely(r != 0))
303 return r; 303 return r;
304 lobj->reserved = true;
304 } 305 }
305 return 0; 306 return 0;
306} 307}
@@ -311,7 +312,7 @@ void radeon_bo_list_unreserve(struct list_head *head)
311 312
312 list_for_each_entry(lobj, head, list) { 313 list_for_each_entry(lobj, head, list) {
313 /* only unreserve object we successfully reserved */ 314 /* only unreserve object we successfully reserved */
314 if (radeon_bo_is_reserved(lobj->bo)) 315 if (lobj->reserved && radeon_bo_is_reserved(lobj->bo))
315 radeon_bo_unreserve(lobj->bo); 316 radeon_bo_unreserve(lobj->bo);
316 } 317 }
317} 318}
@@ -322,6 +323,9 @@ int radeon_bo_list_validate(struct list_head *head)
322 struct radeon_bo *bo; 323 struct radeon_bo *bo;
323 int r; 324 int r;
324 325
326 list_for_each_entry(lobj, head, list) {
327 lobj->reserved = false;
328 }
325 r = radeon_bo_list_reserve(head); 329 r = radeon_bo_list_reserve(head);
326 if (unlikely(r != 0)) { 330 if (unlikely(r != 0)) {
327 return r; 331 return r;