drivers/gpu/drm/i915/gt/intel_breadcrumbs.c
Source file repositories/reference/linux-study-clean/drivers/gpu/drm/i915/gt/intel_breadcrumbs.c
File Facts
- System
- Linux kernel
- Corpus path
drivers/gpu/drm/i915/gt/intel_breadcrumbs.c- Extension
.c- Size
- 13903 bytes
- Lines
- 527
- 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.
- Uses kernel synchronization; read lock ordering, sleepability, and interrupt context assumptions before translating.
- 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/kthread.hlinux/string_helpers.htrace/events/dma_fence.huapi/linux/sched/types.hdrm/drm_print.hi915_drv.hi915_trace.hintel_breadcrumbs.hintel_context.hintel_engine_pm.hintel_gt_pm.hintel_gt_requests.h
Detected Declarations
function irq_enablefunction irq_disablefunction __intel_breadcrumbs_arm_irqfunction intel_breadcrumbs_arm_irqfunction __intel_breadcrumbs_disarm_irqfunction intel_breadcrumbs_disarm_irqfunction add_signaling_contextfunction remove_signaling_contextfunction check_signal_orderfunction __dma_fence_signalfunction __dma_fence_signal__timestampfunction __dma_fence_signal__notifyfunction list_for_each_entry_safefunction add_retirefunction slist_addfunction signal_irq_workfunction list_for_each_entry_rcufunction llist_for_each_safefunction intel_breadcrumbs_createfunction intel_breadcrumbs_resetfunction __intel_breadcrumbs_parkfunction intel_breadcrumbs_freefunction irq_signal_requestfunction insert_breadcrumbfunction requestfunction i915_request_enable_breadcrumbfunction i915_request_cancel_breadcrumbfunction intel_context_remove_breadcrumbsfunction list_for_each_entry_safefunction print_signalsfunction intel_engine_print_breadcrumbs
Annotated Snippet
list_for_each_entry_rcu(rq, &ce->signals, signal_link) {
bool release;
if (!__i915_request_is_complete(rq))
break;
if (!test_and_clear_bit(I915_FENCE_FLAG_SIGNAL,
&rq->fence.flags))
break;
/*
* Queue for execution after dropping the signaling
* spinlock as the callback chain may end up adding
* more signalers to the same context or engine.
*/
spin_lock(&ce->signal_lock);
list_del_rcu(&rq->signal_link);
release = remove_signaling_context(b, ce);
spin_unlock(&ce->signal_lock);
if (release) {
if (intel_timeline_is_last(ce->timeline, rq))
add_retire(b, ce->timeline);
intel_context_put(ce);
}
if (__dma_fence_signal(&rq->fence))
/* We own signal_node now, xfer to local list */
signal = slist_add(&rq->signal_node, signal);
else
i915_request_put(rq);
}
}
atomic_dec(&b->signaler_active);
rcu_read_unlock();
llist_for_each_safe(signal, sn, signal) {
struct i915_request *rq =
llist_entry(signal, typeof(*rq), signal_node);
struct list_head cb_list;
if (rq->engine->sched_engine->retire_inflight_request_prio)
rq->engine->sched_engine->retire_inflight_request_prio(rq);
spin_lock(&rq->lock);
list_replace(&rq->fence.cb_list, &cb_list);
__dma_fence_signal__timestamp(&rq->fence, timestamp);
__dma_fence_signal__notify(&rq->fence, &cb_list);
spin_unlock(&rq->lock);
i915_request_put(rq);
}
/* Lazy irq enabling after HW submission */
if (!READ_ONCE(b->irq_armed) && !list_empty(&b->signalers))
intel_breadcrumbs_arm_irq(b);
/* And confirm that we still want irqs enabled before we yield */
if (READ_ONCE(b->irq_armed) && !atomic_read(&b->active))
intel_breadcrumbs_disarm_irq(b);
}
struct intel_breadcrumbs *
intel_breadcrumbs_create(struct intel_engine_cs *irq_engine)
{
struct intel_breadcrumbs *b;
b = kzalloc_obj(*b);
if (!b)
return NULL;
kref_init(&b->ref);
spin_lock_init(&b->signalers_lock);
INIT_LIST_HEAD(&b->signalers);
init_llist_head(&b->signaled_requests);
spin_lock_init(&b->irq_lock);
init_irq_work(&b->irq_work, signal_irq_work);
b->irq_engine = irq_engine;
b->irq_enable = irq_enable;
b->irq_disable = irq_disable;
return b;
}
void intel_breadcrumbs_reset(struct intel_breadcrumbs *b)
{
unsigned long flags;
Annotation
- Immediate include surface: `linux/kthread.h`, `linux/string_helpers.h`, `trace/events/dma_fence.h`, `uapi/linux/sched/types.h`, `drm/drm_print.h`, `i915_drv.h`, `i915_trace.h`, `intel_breadcrumbs.h`.
- Detected declarations: `function irq_enable`, `function irq_disable`, `function __intel_breadcrumbs_arm_irq`, `function intel_breadcrumbs_arm_irq`, `function __intel_breadcrumbs_disarm_irq`, `function intel_breadcrumbs_disarm_irq`, `function add_signaling_context`, `function remove_signaling_context`, `function check_signal_order`, `function __dma_fence_signal`.
- Atlas domain: Driver Families / drivers/gpu.
- Implementation status: source implementation candidate.
- Synchronization appears in or near this file; preserve lock ordering, sleepability, and interrupt-context constraints.
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.