freedreno/drm: Fix race in zombie import

The check for the zombie case (racing with final unref of the bo vs
removal from table) must be atomic.

Fixes spec@ext_image_dma_buf_import@ext_image_dma_buf_import-refcount-multithread

Fixes: a192923f99 ("freedreno/drm: Restart import on zombie race")
Signed-off-by: Rob Clark <robdclark@chromium.org>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/25995>
This commit is contained in:
Rob Clark 2023-11-01 09:42:21 -07:00 committed by Marge Bot
parent 4a627af0e3
commit 6ac133c646

View file

@ -61,15 +61,12 @@ lookup_bo(struct hash_table *tbl, uint32_t key)
* remove an object it is about to free. Fortunately since table
* lookup and removal are protected by the same lock (and table
* removal happens before obj free) we can easily detect this by
* checking for refcnt==0.
* checking for refcnt==0 (ie. 1 after p_atomic_inc_return).
*/
if (bo->refcnt == 0) {
if (p_atomic_inc_return(&bo->refcnt) == 1) {
return &zombie;
}
/* found, incr refcnt and return: */
fd_bo_ref(bo);
if (!list_is_empty(&bo->node)) {
mesa_logw("bo was in cache, size=%u, alloc_flags=0x%x\n",
bo->size, bo->alloc_flags);