drivers/gpu/drm/drm_mm.c
Source file repositories/reference/linux-study-clean/drivers/gpu/drm/drm_mm.c
File Facts
- System
- Linux kernel
- Corpus path
drivers/gpu/drm/drm_mm.c- Extension
.c- Size
- 30124 bytes
- Lines
- 1008
- Domain
- Driver Families
- Bucket
- drivers/gpu
- Inferred role
- Driver Families: exported/initcall integration point
- Status
- integration 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.
- Exports symbols or registers init work; inspect boot/module ordering and who consumes the exported contract.
- Allocates kernel memory; connect allocation flags and lifetime to context constraints.
- Defines or uses C structs; map object ownership, embedded links, reference counts, and lock ownership.
Dependency Surface
linux/export.hlinux/interval_tree_generic.hlinux/seq_file.hlinux/slab.hlinux/stacktrace.hdrm/drm_mm.hdrm/drm_print.hlinux/stackdepot.h
Detected Declarations
function filesfunction show_leaksfunction list_for_each_entryfunction save_stackfunction drm_mm_interval_tree_add_nodefunction rb_to_hole_sizefunction insert_hole_sizefunction insert_hole_addrfunction add_holefunction rm_holefunction usable_hole_addrfunction first_holefunction next_holefunction drm_mm_reserve_nodefunction rb_to_hole_size_or_zerofunction drm_mm_insert_node_in_rangefunction drm_mm_node_scanned_blockfunction drm_mm_remove_nodefunction offunction drm_mm_scan_add_blockfunction addedfunction drm_mm_initfunction drm_mm_takedownfunction drm_mm_dump_holefunction drm_mm_printfunction drm_mm_for_each_nodeexport __drm_mm_interval_firstexport drm_mm_reserve_nodeexport drm_mm_insert_node_in_rangeexport drm_mm_remove_nodeexport drm_mm_scan_init_with_rangeexport drm_mm_scan_add_blockexport drm_mm_scan_remove_blockexport drm_mm_scan_color_evictexport drm_mm_initexport drm_mm_takedownexport drm_mm_print
Annotated Snippet
if (!node->stack) {
DRM_ERROR("node [%08llx + %08llx]: unknown owner\n",
node->start, node->size);
continue;
}
stack_depot_snprint(node->stack, buf, BUFSZ, 0);
DRM_ERROR("node [%08llx + %08llx]: inserted at\n%s",
node->start, node->size, buf);
}
kfree(buf);
}
#undef STACKDEPTH
#undef BUFSZ
#else
static void save_stack(struct drm_mm_node *node) { }
static void show_leaks(struct drm_mm *mm) { }
#endif
#define START(node) ((node)->start)
#define LAST(node) ((node)->start + (node)->size - 1)
INTERVAL_TREE_DEFINE(struct drm_mm_node, rb,
u64, __subtree_last,
START, LAST, static inline __maybe_unused, drm_mm_interval_tree)
struct drm_mm_node *
__drm_mm_interval_first(const struct drm_mm *mm, u64 start, u64 last)
{
return drm_mm_interval_tree_iter_first((struct rb_root_cached *)&mm->interval_tree,
start, last) ?: (struct drm_mm_node *)&mm->head_node;
}
EXPORT_SYMBOL(__drm_mm_interval_first);
static void drm_mm_interval_tree_add_node(struct drm_mm_node *hole_node,
struct drm_mm_node *node)
{
struct drm_mm *mm = hole_node->mm;
struct rb_node **link, *rb;
struct drm_mm_node *parent;
bool leftmost;
node->__subtree_last = LAST(node);
if (drm_mm_node_allocated(hole_node)) {
rb = &hole_node->rb;
while (rb) {
parent = rb_entry(rb, struct drm_mm_node, rb);
if (parent->__subtree_last >= node->__subtree_last)
break;
parent->__subtree_last = node->__subtree_last;
rb = rb_parent(rb);
}
rb = &hole_node->rb;
link = &hole_node->rb.rb_right;
leftmost = false;
} else {
rb = NULL;
link = &mm->interval_tree.rb_root.rb_node;
leftmost = true;
}
while (*link) {
rb = *link;
parent = rb_entry(rb, struct drm_mm_node, rb);
if (parent->__subtree_last < node->__subtree_last)
parent->__subtree_last = node->__subtree_last;
if (node->start < parent->start) {
link = &parent->rb.rb_left;
} else {
link = &parent->rb.rb_right;
leftmost = false;
}
}
rb_link_node(&node->rb, rb, link);
rb_insert_augmented_cached(&node->rb, &mm->interval_tree, leftmost,
&drm_mm_interval_tree_augment);
}
#define HOLE_SIZE(NODE) ((NODE)->hole_size)
#define HOLE_ADDR(NODE) (__drm_mm_hole_node_start(NODE))
static u64 rb_to_hole_size(struct rb_node *rb)
{
return rb_entry(rb, struct drm_mm_node, rb_hole_size)->hole_size;
Annotation
- Immediate include surface: `linux/export.h`, `linux/interval_tree_generic.h`, `linux/seq_file.h`, `linux/slab.h`, `linux/stacktrace.h`, `drm/drm_mm.h`, `drm/drm_print.h`, `linux/stackdepot.h`.
- Detected declarations: `function files`, `function show_leaks`, `function list_for_each_entry`, `function save_stack`, `function drm_mm_interval_tree_add_node`, `function rb_to_hole_size`, `function insert_hole_size`, `function insert_hole_addr`, `function add_hole`, `function rm_hole`.
- Atlas domain: Driver Families / drivers/gpu.
- Implementation status: integration 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.