mirror of
https://github.com/torvalds/linux.git
synced 2026-04-18 06:44:00 -04:00
Implement per-fence spinlocks, allowing implementations to not give an
external spinlock to protect the fence internal state. Instead a spinlock
embedded into the fence structure itself is used in this case.
Shared spinlocks have the problem that implementations need to guarantee
that the lock lives at least as long all fences referencing them.
Using a per-fence spinlock allows completely decoupling spinlock producer
and consumer life times, simplifying the handling in most use cases.
v2: improve naming, coverage and function documentation
v3: fix one additional locking in the selftests
v4: separate out some changes to make the patch smaller,
fix one amdgpu crash found by CI systems
v5: improve comments
Signed-off-by: Christian König <christian.koenig@amd.com>
Reviewed-by: Boris Brezillon <boris.brezillon@collabora.com>
Link: https://lore.kernel.org/r/20260219160822.1529-5-christian.koenig@amd.com
73 lines
1.8 KiB
C
73 lines
1.8 KiB
C
/*
|
|
* Sync File validation framework and debug infomation
|
|
*
|
|
* Copyright (C) 2012 Google, Inc.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
*/
|
|
|
|
#ifndef _LINUX_SYNC_H
|
|
#define _LINUX_SYNC_H
|
|
|
|
#include <linux/list.h>
|
|
#include <linux/rbtree.h>
|
|
#include <linux/spinlock.h>
|
|
#include <linux/dma-fence.h>
|
|
|
|
#include <linux/sync_file.h>
|
|
#include <uapi/linux/sync_file.h>
|
|
|
|
/**
|
|
* struct sync_timeline - sync object
|
|
* @kref: reference count on fence.
|
|
* @name: name of the sync_timeline. Useful for debugging
|
|
* @lock: lock protecting @pt_list and @value
|
|
* @pt_tree: rbtree of active (unsignaled/errored) sync_pts
|
|
* @pt_list: list of active (unsignaled/errored) sync_pts
|
|
* @sync_timeline_list: membership in global sync_timeline_list
|
|
*/
|
|
struct sync_timeline {
|
|
struct kref kref;
|
|
char name[32];
|
|
|
|
/* protected by lock */
|
|
u64 context;
|
|
int value;
|
|
|
|
struct rb_root pt_tree;
|
|
struct list_head pt_list;
|
|
spinlock_t lock;
|
|
|
|
struct list_head sync_timeline_list;
|
|
};
|
|
|
|
static inline struct sync_timeline *dma_fence_parent(struct dma_fence *fence)
|
|
{
|
|
return container_of(fence->extern_lock, struct sync_timeline, lock);
|
|
}
|
|
|
|
/**
|
|
* struct sync_pt - sync_pt object
|
|
* @base: base fence object
|
|
* @link: link on the sync timeline's list
|
|
* @node: node in the sync timeline's tree
|
|
* @deadline: the earliest fence deadline hint
|
|
*/
|
|
struct sync_pt {
|
|
struct dma_fence base;
|
|
struct list_head link;
|
|
struct rb_node node;
|
|
ktime_t deadline;
|
|
};
|
|
|
|
extern const struct file_operations sw_sync_debugfs_fops;
|
|
|
|
void sync_timeline_debug_add(struct sync_timeline *obj);
|
|
void sync_timeline_debug_remove(struct sync_timeline *obj);
|
|
|
|
#endif /* _LINUX_SYNC_H */
|