浏览代码

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>
Jerome Glisse 15 年之前
父节点
当前提交
e865275335
共有 2 个文件被更改,包括 6 次插入1 次删除
  1. 1 0
      drivers/gpu/drm/radeon/radeon.h
  2. 5 1
      drivers/gpu/drm/radeon/radeon_object.c

+ 1 - 0
drivers/gpu/drm/radeon/radeon.h

@@ -261,6 +261,7 @@ struct radeon_bo_list {
 	unsigned		rdomain;
 	unsigned		rdomain;
 	unsigned		wdomain;
 	unsigned		wdomain;
 	u32			tiling_flags;
 	u32			tiling_flags;
+	bool			reserved;
 };
 };
 
 
 /*
 /*

+ 5 - 1
drivers/gpu/drm/radeon/radeon_object.c

@@ -301,6 +301,7 @@ int radeon_bo_list_reserve(struct list_head *head)
 		r = radeon_bo_reserve(lobj->bo, false);
 		r = radeon_bo_reserve(lobj->bo, false);
 		if (unlikely(r != 0))
 		if (unlikely(r != 0))
 			return r;
 			return r;
+		lobj->reserved = true;
 	}
 	}
 	return 0;
 	return 0;
 }
 }
@@ -311,7 +312,7 @@ void radeon_bo_list_unreserve(struct list_head *head)
 
 
 	list_for_each_entry(lobj, head, list) {
 	list_for_each_entry(lobj, head, list) {
 		/* only unreserve object we successfully reserved */
 		/* 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);
 			radeon_bo_unreserve(lobj->bo);
 	}
 	}
 }
 }
@@ -322,6 +323,9 @@ int radeon_bo_list_validate(struct list_head *head)
 	struct radeon_bo *bo;
 	struct radeon_bo *bo;
 	int r;
 	int r;
 
 
+	list_for_each_entry(lobj, head, list) {
+		lobj->reserved = false;
+	}
 	r = radeon_bo_list_reserve(head);
 	r = radeon_bo_list_reserve(head);
 	if (unlikely(r != 0)) {
 	if (unlikely(r != 0)) {
 		return r;
 		return r;