Am 28.02.23 um 20:13 schrieb Danilo Krummrich:
[SNIP]
+    if (exec->prelocked) {
+        dma_resv_unlock(exec->prelocked->resv);
+        drm_gem_object_put(exec->prelocked);
+        exec->prelocked = NULL;
+    }

Let's say we try to lock 3 objects A, B and C in chronological order and in the first "drm_exec_cleanup() iteration" C is contended. Firstly, we lock C in the next iteration. If now A or B is contended, we never set exec->prelocked to NULL in drm_exec_prepare_obj(), since we did not yet reach C.

Hence, this causes a double unlock, since the prelocked object is also unlocked in the above loop.

Maybe I miss a detail, but to me it looks like setting exec->prelocked to NULL and dropping the reference should be enough.

Ah, yes of course. That wasn't correct and my test cases didn't covered it.

Going to fix this and all the comments you pointed out and update the test cases, should be done by next week.

Thanks,
Christian.

Reply via email to