gallium/radeon: Fix losing holes when allocating virtual address space.
authorMichel Dänzer <michel.daenzer@amd.com>
Thu, 26 Apr 2012 09:44:11 +0000 (11:44 +0200)
committerMichel Dänzer <michel@daenzer.net>
Thu, 16 Aug 2012 09:58:23 +0000 (11:58 +0200)
If a hole exactly matches the allocated size plus alignment, we would fail to
preserve the alignment as a hole. This would result in never being able to use
the alignment area for an allocation again.

Signed-off-by: Michel Dänzer <michel.daenzer@amd.com>
Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
src/gallium/winsys/radeon/drm/radeon_drm_bo.c

index f09e7e8..a01cc15 100644 (file)
@@ -221,7 +221,7 @@ static uint64_t radeon_bomgr_find_va(struct radeon_bomgr *mgr, uint64_t size, ui
             pipe_mutex_unlock(mgr->bo_va_mutex);
             return offset;
         }
-        if ((hole->size - waste) >= size) {
+        if ((hole->size - waste) > size) {
             if (waste) {
                 n = CALLOC_STRUCT(radeon_bo_va_hole);
                 n->size = waste;
@@ -233,6 +233,11 @@ static uint64_t radeon_bomgr_find_va(struct radeon_bomgr *mgr, uint64_t size, ui
             pipe_mutex_unlock(mgr->bo_va_mutex);
             return offset;
         }
+        if ((hole->size - waste) == size) {
+            hole->size = waste;
+            pipe_mutex_unlock(mgr->bo_va_mutex);
+            return offset;
+        }
     }
 
     offset = mgr->va_offset;