diff options
author | Michel Dänzer <[email protected]> | 2012-04-26 20:41:17 +0200 |
---|---|---|
committer | Michel Dänzer <[email protected]> | 2012-08-16 11:58:23 +0200 |
commit | 6d59b7f6dc3131e773e9c9729388c08a2f987364 (patch) | |
tree | 93e89021c59de46d2bc42216df9b14b38669fe31 /src/gallium/winsys/radeon | |
parent | f5fe81daea622f8f043edc19fb61ba367b6958aa (diff) |
gallium/radeon: Delete uppermost virtual address space hole if it's at the top.
Signed-off-by: Michel Dänzer <[email protected]>
Reviewed-by: Alex Deucher <[email protected]>
Diffstat (limited to 'src/gallium/winsys/radeon')
-rw-r--r-- | src/gallium/winsys/radeon/drm/radeon_drm_bo.c | 13 |
1 files changed, 12 insertions, 1 deletions
diff --git a/src/gallium/winsys/radeon/drm/radeon_drm_bo.c b/src/gallium/winsys/radeon/drm/radeon_drm_bo.c index a01cc15b1ca..1bf22a71d91 100644 --- a/src/gallium/winsys/radeon/drm/radeon_drm_bo.c +++ b/src/gallium/winsys/radeon/drm/radeon_drm_bo.c @@ -287,11 +287,22 @@ static void radeon_bomgr_force_va(struct radeon_bomgr *mgr, uint64_t va, uint64_ static void radeon_bomgr_free_va(struct radeon_bomgr *mgr, uint64_t va, uint64_t size) { + struct radeon_bo_va_hole *hole; + pipe_mutex_lock(mgr->bo_va_mutex); if ((va + size) == mgr->va_offset) { mgr->va_offset = va; + /* Delete uppermost hole if it reaches the new top */ + if (!LIST_IS_EMPTY(&mgr->va_holes)) { + hole = container_of(mgr->va_holes.next, hole, list); + if ((hole->offset + hole->size) == va) { + mgr->va_offset = hole->offset; + list_del(&hole->list); + FREE(hole); + } + } } else { - struct radeon_bo_va_hole *hole, *next; + struct radeon_bo_va_hole *next; hole = container_of(&mgr->va_holes, hole, list); LIST_FOR_EACH_ENTRY(next, &mgr->va_holes, list) { |