Mesa (master): r600g: Check for other references before checking for existing mappings in radeon_bo_pb_map_internal ().

Henri Verbeet hverbeet at kemper.freedesktop.org
Sun Sep 19 17:43:57 UTC 2010


Module: Mesa
Branch: master
Commit: b68030e9f8211e5905c81b4c7f8de5780f48b655
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=b68030e9f8211e5905c81b4c7f8de5780f48b655

Author: Henri Verbeet <hverbeet at gmail.com>
Date:   Sun Sep 19 19:27:30 2010 +0200

r600g: Check for other references before checking for existing mappings in radeon_bo_pb_map_internal().

Having a non-NULL data pointer doesn't imply it's safe to reuse that mapping,
it may have been unmapped but not flushed yet.

---

 src/gallium/winsys/r600/drm/radeon_bo_pb.c |   14 ++++++++------
 1 files changed, 8 insertions(+), 6 deletions(-)

diff --git a/src/gallium/winsys/r600/drm/radeon_bo_pb.c b/src/gallium/winsys/r600/drm/radeon_bo_pb.c
index 65ba962..8cf6a78 100644
--- a/src/gallium/winsys/r600/drm/radeon_bo_pb.c
+++ b/src/gallium/winsys/r600/drm/radeon_bo_pb.c
@@ -53,11 +53,16 @@ radeon_bo_pb_map_internal(struct pb_buffer *_buf,
 			  unsigned flags, void *ctx)
 {
 	struct radeon_bo_pb *buf = radeon_bo_pb(_buf);
-	
-	if (flags & PB_USAGE_DONTBLOCK) {
-		if (p_atomic_read(&buf->bo->reference.count) > 1)
+
+	if (p_atomic_read(&buf->bo->reference.count) > 1) {
+		if (flags & PB_USAGE_DONTBLOCK) {
 			return NULL;
+		}
+		if (ctx) {
+			r600_flush_ctx(ctx);
+		}
 	}
+
 	if (buf->bo->data != NULL) {
 		LIST_DELINIT(&buf->maplist);
 		return buf->bo->data;
@@ -69,9 +74,6 @@ radeon_bo_pb_map_internal(struct pb_buffer *_buf,
 			return NULL;
 	}
 
-	if (p_atomic_read(&buf->bo->reference.count) > 1 && ctx) {
-		r600_flush_ctx(ctx);
-	}
 	if (radeon_bo_map(buf->mgr->radeon, buf->bo)) {
 		return NULL;
 	}




More information about the mesa-commit mailing list