bool update_offset = false;
 
         if (sz < TRANSIENT_SLAB_SIZE) {
-                /* TODO: Lookup free */
-
+                /* First, look for a free slot */
+                unsigned count = util_dynarray_num_elements(&screen->transient_bo, void *);
                 unsigned index = 0;
 
-                if (!bo)
+                unsigned free = __bitset_ffs(
+                                screen->free_transient,
+                                count / BITSET_WORDBITS);
+
+                if (likely(free)) {
+                        /* Use this one */
+                        index = free - 1;
+
+                        /* It's ours, so no longer free */
+                        BITSET_CLEAR(screen->free_transient, index);
+
+                        /* Grab the BO */
+                        bo = pan_bo_for_index(screen, index);
+                } else {
+                        /* Otherwise, create a new BO */
                         bo = panfrost_create_slab(screen, &index);
+                }
 
                 /* Remember we created this */
                 util_dynarray_append(&batch->transient_indices, unsigned, index);
 
                 panfrost_bo_unreference(ctx->base.screen, bo);
         }
 
+        /* Free up the transient BOs we're sitting on */
+        struct panfrost_screen *screen = pan_screen(ctx->base.screen);
+
+        util_dynarray_foreach(&job->transient_indices, unsigned, index) {
+                /* Mark it free */
+                BITSET_SET(screen->free_transient, *index);
+        }
+
         _mesa_hash_table_remove_key(ctx->jobs, &job->key);
 
         if (ctx->job == job)