Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

dma-buf: add dma_fence_was_initialized function v2

Some driver use fence->ops to test if a fence was initialized or not.
The problem is that this utilizes internal behavior of the dma_fence
implementation.

So better abstract that into a function.

v2: use a flag instead of testing fence->ops, rename the function, move
to the beginning of the patch set.

Signed-off-by: Christian König <christian.koenig@amd.com>
Reviewed-by: Tvrtko Ursulin <tvrtko.ursulin@igalia.com>
Link: https://lore.kernel.org/r/20260120105655.7134-2-christian.koenig@amd.com

+24 -8
+1 -1
drivers/dma-buf/dma-fence.c
··· 1054 1054 fence->lock = lock; 1055 1055 fence->context = context; 1056 1056 fence->seqno = seqno; 1057 - fence->flags = flags; 1057 + fence->flags = flags | BIT(DMA_FENCE_FLAG_INITIALIZED_BIT); 1058 1058 fence->error = 0; 1059 1059 1060 1060 trace_dma_fence_init(fence);
+7 -6
drivers/gpu/drm/amd/amdgpu/amdgpu_job.c
··· 282 282 unsigned i; 283 283 284 284 /* Check if any fences were initialized */ 285 - if (job->base.s_fence && job->base.s_fence->finished.ops) 285 + if (job->base.s_fence && 286 + dma_fence_was_initialized(&job->base.s_fence->finished)) 286 287 f = &job->base.s_fence->finished; 287 - else if (job->hw_fence && job->hw_fence->base.ops) 288 + else if (dma_fence_was_initialized(&job->hw_fence->base)) 288 289 f = &job->hw_fence->base; 289 290 else 290 291 f = NULL; ··· 302 301 303 302 amdgpu_sync_free(&job->explicit_sync); 304 303 305 - if (job->hw_fence->base.ops) 304 + if (dma_fence_was_initialized(&job->hw_fence->base)) 306 305 dma_fence_put(&job->hw_fence->base); 307 306 else 308 307 kfree(job->hw_fence); 309 - if (job->hw_vm_fence->base.ops) 308 + if (dma_fence_was_initialized(&job->hw_vm_fence->base)) 310 309 dma_fence_put(&job->hw_vm_fence->base); 311 310 else 312 311 kfree(job->hw_vm_fence); ··· 340 339 if (job->gang_submit != &job->base.s_fence->scheduled) 341 340 dma_fence_put(job->gang_submit); 342 341 343 - if (job->hw_fence->base.ops) 342 + if (dma_fence_was_initialized(&job->hw_fence->base)) 344 343 dma_fence_put(&job->hw_fence->base); 345 344 else 346 345 kfree(job->hw_fence); 347 - if (job->hw_vm_fence->base.ops) 346 + if (dma_fence_was_initialized(&job->hw_vm_fence->base)) 348 347 dma_fence_put(&job->hw_vm_fence->base); 349 348 else 350 349 kfree(job->hw_vm_fence);
+1 -1
drivers/gpu/drm/qxl/qxl_release.c
··· 146 146 idr_remove(&qdev->release_idr, release->id); 147 147 spin_unlock(&qdev->release_idr_lock); 148 148 149 - if (release->base.ops) { 149 + if (dma_fence_was_initialized(&release->base)) { 150 150 WARN_ON(list_empty(&release->bos)); 151 151 qxl_release_free_list(release); 152 152
+15
include/linux/dma-fence.h
··· 48 48 * atomic ops (bit_*), so taking the spinlock will not be needed most 49 49 * of the time. 50 50 * 51 + * DMA_FENCE_FLAG_INITIALIZED_BIT - fence was initialized 51 52 * DMA_FENCE_FLAG_SIGNALED_BIT - fence is already signaled 52 53 * DMA_FENCE_FLAG_TIMESTAMP_BIT - timestamp recorded for fence signaling 53 54 * DMA_FENCE_FLAG_ENABLE_SIGNAL_BIT - enable_signaling might have been called ··· 99 98 }; 100 99 101 100 enum dma_fence_flag_bits { 101 + DMA_FENCE_FLAG_INITIALIZED_BIT, 102 102 DMA_FENCE_FLAG_SEQNO64_BIT, 103 103 DMA_FENCE_FLAG_SIGNALED_BIT, 104 104 DMA_FENCE_FLAG_TIMESTAMP_BIT, ··· 264 262 void dma_fence_release(struct kref *kref); 265 263 void dma_fence_free(struct dma_fence *fence); 266 264 void dma_fence_describe(struct dma_fence *fence, struct seq_file *seq); 265 + 266 + /** 267 + * dma_fence_was_initialized - test if fence was initialized 268 + * @fence: fence to test 269 + * 270 + * Return: True if fence was ever initialized, false otherwise. Works correctly 271 + * only when memory backing the fence structure is zero initialized on 272 + * allocation. 273 + */ 274 + static inline bool dma_fence_was_initialized(struct dma_fence *fence) 275 + { 276 + return fence && test_bit(DMA_FENCE_FLAG_INITIALIZED_BIT, &fence->flags); 277 + } 267 278 268 279 /** 269 280 * dma_fence_put - decreases refcount of the fence