drivers/gpu/drm/xe/xe_range_fence.c
Source file repositories/reference/linux-study-clean/drivers/gpu/drm/xe/xe_range_fence.c
File Facts
- System
- Linux kernel
- Corpus path
drivers/gpu/drm/xe/xe_range_fence.c- Extension
.c- Size
- 4140 bytes
- Lines
- 164
- Domain
- Driver Families
- Bucket
- drivers/gpu
- Inferred role
- Driver Families: implementation source
- Status
- source implementation candidate
Why This File Exists
Repeatable hardware-adapter layer. Deep compatibility for every driver is out of scope; this atlas records patterns, probe lifecycles, bus glue, IRQ/DMA usage, and links back to core abstractions.
- Repeatable hardware-adapter layer. Deep compatibility for every driver is out of scope; this atlas records patterns, probe lifecycles, bus glue, IRQ/DMA usage, and links back to core abstractions.
- Defines or uses C structs; map object ownership, embedded links, reference counts, and lock ownership.
Dependency Surface
linux/dma-fence.hlinux/interval_tree_generic.hlinux/slab.hxe_macros.hxe_range_fence.h
Detected Declarations
function xe_range_fence_signal_notifyfunction __xe_range_fence_tree_cleanupfunction llist_for_each_entry_safefunction xe_range_fence_insertfunction xe_range_fence_tree_remove_allfunction xe_range_fence_tree_initfunction xe_range_fence_tree_finifunction xe_range_fence_tree_firstfunction xe_range_fence_tree_nextfunction xe_range_fence_free
Annotated Snippet
// SPDX-License-Identifier: MIT
/*
* Copyright © 2023 Intel Corporation
*/
#include <linux/dma-fence.h>
#include <linux/interval_tree_generic.h>
#include <linux/slab.h>
#include "xe_macros.h"
#include "xe_range_fence.h"
#define XE_RANGE_TREE_START(_node) ((_node)->start)
#define XE_RANGE_TREE_LAST(_node) ((_node)->last)
INTERVAL_TREE_DEFINE(struct xe_range_fence, rb, u64, __subtree_last,
XE_RANGE_TREE_START, XE_RANGE_TREE_LAST, static,
xe_range_fence_tree);
static void
xe_range_fence_signal_notify(struct dma_fence *fence, struct dma_fence_cb *cb)
{
struct xe_range_fence *rfence = container_of(cb, typeof(*rfence), cb);
struct xe_range_fence_tree *tree = rfence->tree;
llist_add(&rfence->link, &tree->list);
}
static bool __xe_range_fence_tree_cleanup(struct xe_range_fence_tree *tree)
{
struct llist_node *node = llist_del_all(&tree->list);
struct xe_range_fence *rfence, *next;
llist_for_each_entry_safe(rfence, next, node, link) {
xe_range_fence_tree_remove(rfence, &tree->root);
dma_fence_put(rfence->fence);
kfree(rfence);
}
return !!node;
}
/**
* xe_range_fence_insert() - range fence insert
* @tree: range fence tree to insert intoi
* @rfence: range fence
* @ops: range fence ops
* @start: start address of range fence
* @last: last address of range fence
* @fence: dma fence which signals range fence can be removed + freed
*
* Return: 0 on success, non-zero on failure
*/
int xe_range_fence_insert(struct xe_range_fence_tree *tree,
struct xe_range_fence *rfence,
const struct xe_range_fence_ops *ops,
u64 start, u64 last, struct dma_fence *fence)
{
int err = 0;
__xe_range_fence_tree_cleanup(tree);
if (dma_fence_is_signaled(fence))
goto free;
rfence->ops = ops;
rfence->start = start;
rfence->last = last;
rfence->tree = tree;
rfence->fence = dma_fence_get(fence);
err = dma_fence_add_callback(fence, &rfence->cb,
xe_range_fence_signal_notify);
if (err == -ENOENT) {
dma_fence_put(fence);
err = 0;
goto free;
} else if (err == 0) {
xe_range_fence_tree_insert(rfence, &tree->root);
return 0;
} else {
dma_fence_put(fence);
}
free:
if (ops->free)
ops->free(rfence);
return err;
}
Annotation
- Immediate include surface: `linux/dma-fence.h`, `linux/interval_tree_generic.h`, `linux/slab.h`, `xe_macros.h`, `xe_range_fence.h`.
- Detected declarations: `function xe_range_fence_signal_notify`, `function __xe_range_fence_tree_cleanup`, `function llist_for_each_entry_safe`, `function xe_range_fence_insert`, `function xe_range_fence_tree_remove_all`, `function xe_range_fence_tree_init`, `function xe_range_fence_tree_fini`, `function xe_range_fence_tree_first`, `function xe_range_fence_tree_next`, `function xe_range_fence_free`.
- Atlas domain: Driver Families / drivers/gpu.
- Implementation status: source implementation candidate.
Implementation Notes
- This generated page is the file-by-file coverage layer; curated subsystem chapters should link here when they synthesize a multi-file control flow.
- Core OS pages should be promoted from atlas-only to deep-reviewed when they explain data structures, invariants, locking, lifecycle, and C implementation snippets.
- Driver-family pages are intentionally pattern-oriented unless they are part of the selected PCIe/NVMe representative device path.