15 · 源码索引:6.12.107 中所有 RT 相关位置
按子系统汇总前面各章引用的
路径:行号,全部对照本仓库linux/目录(Linux 6.12.107,Makefile:2-4)。同时列出在 6.12.107 中不存在的 RT 相关机制,避免与更新版本的资料混淆。
抢占与调度
| 位置 | 内容 |
|---|---|
kernel/Kconfig.preempt:14-101 |
抢占模型 choice;PREEMPT_RT :70-73;PREEMPT_DYNAMIC :96-101 |
arch/Kconfig:1356-1360 |
ARCH_NO_PREEMPT、ARCH_SUPPORTS_RT |
arch/x86/Kconfig:128、arch/arm64/Kconfig:105、arch/riscv/Kconfig:68 |
select ARCH_SUPPORTS_RT |
include/linux/preempt.h:27-65 |
preempt_count 位布局 |
include/linux/preempt.h:110-133 |
RT 的 softirq_count() / in_task() |
include/linux/preempt.h:157-162 |
PREEMPT_LOCK_OFFSET = 0 |
include/linux/preempt.h:227-255 |
preemptible()、preempt_enable() |
include/linux/preempt.h:371-436 |
migrate_disable 声明与设计说明 |
include/linux/preempt.h:438-482 |
preempt_disable_nested、guard |
kernel/entry/common.c:303-358 |
中断返回抢占 |
kernel/sched/core.c:2304-2401 |
migrate_disable_switch/disable/enable、is_cpu_allowed |
kernel/sched/core.c:2655-2691, 2807-2874 |
亲和性变更与 migrate-disable 的交互 |
kernel/sched/core.c:3291, 3540, 6724, 6883-6889 |
set_task_cpu 断言、唤醒选核、切换钩子、schedule_rtlock |
kernel/sched/core.c:6891-7058 |
preempt_schedule* |
kernel/sched/core.c:7123 |
rt_mutex_setprio |
kernel/sched/core.c:7251-7353 |
__cond_resched* |
kernel/sched/core.c:7939-7952, 8328, 8728-8757 |
热插拔与钉住任务、__cant_migrate |
kernel/sched/features.h:75-119 |
TTWU_QUEUE、RT_PUSH_IPI、RT_RUNTIME_SHARE |
kernel/sched/sched.h:1306-1308, 1365-1374, 2594-2648, 2833-2837 |
nr_pinned、is_migration_disabled、SCA_*、get_push_task、SCHED_NR_MIGRATE_BREAK |
kernel/sched/fair.c:9328-9525, 11835-12049 |
can_migrate_task、LBF_* |
kernel/sched/rt.c:8-47 |
RT 限流默认值与 sysctl |
kernel/sched/rt.c:1946-1957, 2006-2045, 2364-2371 |
RT push/pull 对钉住任务的处理 |
kernel/sched/deadline.c:2887-2896, 2947-2948, 3069-3076 |
DL push/pull |
kernel/sched/syscalls.c:836-881 |
sched_set_fifo(50)、sched_set_fifo_low(1)、sched_set_normal |
include/linux/sched.h:888-891, 1021-1023, 1225-1227 |
migration_disabled、net_xmit、softirq_disable_cnt |
include/linux/sched/prio.h:16-20 |
MAX_RT_PRIO 100 |
锁
| 位置 | 内容 |
|---|---|
include/linux/spinlock_types_raw.h:14-23, 71 |
raw_spinlock_t(两种内核相同) |
include/linux/spinlock_types.h:14-61 |
非 RT / RT spinlock_t |
include/linux/rtmutex.h:21-27 |
rt_mutex_base、max_lock_depth 声明 |
include/linux/spinlock.h:318-455 |
映射分叉 |
include/linux/spinlock_rt.h:19-147 |
RT spin_lock* 系列(irqsave :96-101) |
include/linux/rwlock_types.h:53-63、include/linux/rwlock_rt.h:51-111 |
RT rwlock |
include/linux/rwbase_rt.h:8-37 |
READER_BIAS/WRITER_BIAS、rwbase_rt |
include/linux/rwsem.h:135-141 |
RT rwsem |
include/linux/mutex_types.h:11-67、include/linux/mutex.h:78-123 |
RT mutex |
kernel/locking/Makefile:27-28 |
构建对象 |
kernel/locking/spinlock_rt.c:3-260 |
RT 自旋锁/读写锁实现 |
kernel/locking/rtmutex.c:67-103, 194-226, 300-320 |
owner 编码、快路径 |
kernel/locking/rtmutex.c:381-463, 503 |
等待者排序 |
kernel/locking/rtmutex.c:435-446 |
横向偷锁规则 |
kernel/locking/rtmutex.c:526-539, 640-723 |
rt_mutex_adjust_prio、PI 链遍历 |
kernel/locking/rtmutex.c:1195-1304 |
task_blocks_on_rt_mutex |
kernel/locking/rtmutex.c:1486-1529, 1828-1904 |
自适应自旋、rtlock_slowlock* |
kernel/locking/rtmutex_api.c:8, 14, 498-531 |
RT_MUTEX_BUILD_MUTEX、max_lock_depth = 1024、RT mutex API |
kernel/locking/rtmutex_common.h:156-162 |
RT_MUTEX_HAS_WAITERS |
kernel/locking/rwbase_rt.c:4-300 |
读写基底 |
kernel/locking/rwsem.c:32, 1402-1516 |
非 RT / RT rwsem |
kernel/locking/mutex.c:36 |
经典 mutex 被排除 |
kernel/sysctl.c:1937-1945 |
max_lock_depth sysctl |
kernel/Kconfig.locks:252-254 |
QUEUED_RWLOCKS |
init/Kconfig:2024-2026 |
RT_MUTEXES |
Documentation/locking/locktypes.rst |
:46-50, 122-206, 211-318, 324-534 |
中断与软中断
| 位置 | 内容 |
|---|---|
include/linux/interrupt.h:77-90, 516-525 |
标志、force_irqthreads() |
kernel/irq/Kconfig:115-117 |
IRQ_FORCED_THREADING |
kernel/irq/manage.c:27-35 |
threadirqs(非 RT) |
kernel/irq/manage.c:1111-1120, 1134-1177, 1184-1231 |
等待、oneshot、线程处理函数 |
kernel/irq/manage.c:1250-1329, 1347-1400, 1457-1488, 1547-1564 |
析构、主循环、唤醒、线程化决策、线程创建 |
kernel/irq/handle.c:61-90, 139-177 |
__irq_wake_thread、__handle_irq_event_percpu |
kernel/irq/settings.h:115-118 |
irq_settings_can_thread |
kernel/irq/spurious.c:450-468 |
irqfixup/irqpoll 拒绝 |
include/linux/bottom_half.h:8-40 |
local_bh_* 声明 |
kernel/softirq.c:64-136 |
向量名、计数模型、softirq_ctrl |
kernel/softirq.c:142-319 |
RT 分支全部 |
kernel/softirq.c:321-358, 418-465 |
非 RT 分支 |
kernel/softirq.c:487-614 |
预算与主循环 |
kernel/softirq.c:652-665, 695-726 |
irq_exit、raise |
kernel/softirq.c:868-919, 944-997 |
tasklet、ksoftirqd |
kernel/time/tick-sched.c:1137-1168 |
idle 与 bh 锁 |
arch/Kconfig:1045-1046 |
SOFTIRQ_ON_OWN_STACK |
定时器
| 位置 | 内容 |
|---|---|
include/linux/hrtimer.h:30-55 |
模式 |
include/linux/hrtimer_defs.h:86-121 |
softirq_expiry_lock、timer_waiters |
kernel/time/hrtimer.c:58-59, 568-617, 1205 |
掩码、下一事件 |
kernel/time/hrtimer.c:1332-1340, 1392-1512 |
一致性检查、expiry_lock、hrtimer_cancel |
kernel/time/hrtimer.c:1609-1663 |
__hrtimer_init(RT 强制 soft)、hrtimer_init |
kernel/time/hrtimer.c:1785-1879, 1974, 2309 |
到期分流 |
kernel/time/hrtimer.c:2005-2044 |
sleeper HARD 规则 |
include/linux/timer.h:47-49 |
TIMER_* 标志 |
kernel/time/timer.c:214-256, 1541-1613, 1658-1674, 1839-1850, 2424-2457, 2744 |
timer wheel RT 处理 |
kernel/time/posix-cpu-timers.c:1272-1300 |
task_work 与 RT tick 处理 |
kernel/time/Kconfig:53-58 |
POSIX_CPU_TIMERS_TASK_WORK |
内存
| 位置 | 内容 |
|---|---|
mm/slub.c:119-149, 186-205, 385-400, 688-700 |
设计、切换宏、kmem_cache_cpu、策略 |
mm/slub.c:3081-3089, 3222-3317, 3717-3987, 4034-4054, 4467, 4621-4646, 4945-5009 |
各路径 |
mm/Kconfig:319-328, 648-652, 816-818 |
SLUB_CPU_PARTIAL、COMPACT_UNEVICTABLE_DEFAULT、THP |
mm/page_alloc.c:95-190, 1287, 2709-2846, 3086-3117, 4740-4790 |
pcp 宏与路径 |
include/linux/mmzone.h:683-684, 948-949 |
锁类型 |
mm/vmstat.c:351-529 |
preempt_disable_nested 用户 |
mm/memcontrol.c:535-554, 1700-1717, 1745-2886 |
memcg |
mm/memcontrol-v1.c:1523-1524, 1557-1560, 1946-1947, 2576-2577 |
cgroup v1 RT 限制 |
mm/swap.c:49-70, 213-233, 906-916 |
LRU batch |
mm/mlock.c:31-38、mm/zsmalloc.c:261-266, 1224-1276 |
|
mm/compaction.c:3285-3294 |
告警 |
include/linux/highmem-internal.h:97-132, 205-235、include/linux/highmem.h:136-147 |
kmap |
lib/debugobjects.c:608-624 |
PI 阻塞时不填池 |
init/Kconfig:949-953 |
NUMA_BALANCING |
per-CPU
| 位置 | 内容 |
|---|---|
include/linux/local_lock.h:10-73 |
API |
include/linux/local_lock_internal.h:9-170 |
两种实现 |
include/linux/lockdep.h:616-622 |
softirq 断言 |
26 处 local_lock_t 实例 |
见第 07 章 |
RCU
| 位置 | 内容 |
|---|---|
kernel/rcu/Kconfig:8-34, 94, 143-170, 198-298 |
|
kernel/rcu/tree.c:105-109, 163-169, 2877-2958, 4928, 4959, 5393-5396, 5541-5558, 5739 |
|
kernel/rcu/tree_plugin.h:70-71, 107-108, 705-746, 1112-1126, 1217-1220, 1287-1343 |
|
kernel/rcu/update.c:60-62, 290, 299, 667-668 |
|
include/linux/rcupdate.h:70-101, 832-843 |
|
Documentation/RCU/whatisRCU.rst:177-179, 1286、stallwarn.rst:56-60、rcu_dereference.rst:414 |
printk
| 位置 | 内容 |
|---|---|
kernel/printk/internal.h:24-35, 64, 107-109 |
|
kernel/printk/printk.c:2984-3009, 3531, 3596-3617, 3658-3687, 4455-4456, 4528-4550 |
|
kernel/printk/nbcon.c:1-3, 1045, 1157, 1181-1186, 1271, 1299, 1326-1350, 1496 |
|
include/linux/console.h:355-393, 629、include/linux/printk.h:170-175, 497-498 |
网络
| 位置 | 内容 |
|---|---|
net/core/dev.c:204-244, 1508, 3957-3967, 4071-4090, 5302-5387, 6113-6276, 6339-6351, 6540-6602, 6959-7058, 11202-11210, 11798-11844, 12297 |
|
net/core/hotdata.c:13-15 |
NAPI 预算 |
net/core/skbuff.c:283-292, 320-367, 762-859, 1458-1470 |
napi_alloc_cache |
net/core/filter.c:1679, 2060-2067、net/ipv4/tcp_ipv4.c:892-1034、net/ipv4/tcp_sigpool.c:14, 287-297、net/ipv6/seg6_local.c:1427-1431 |
local_lock_nested_bh |
include/linux/netdevice.h:3250, 3302-3339, 4983-5003、include/net/sock.h:557、include/net/seg6_local.h:22 |
|
net/Kconfig:343-345 |
NET_RX_BUSY_POLL |
Documentation/networking/napi.rst:145-148 |
Kconfig 其它
drivers/gpu/drm/i915/Kconfig:6、drivers/gpu/drm/mgag200/Kconfig:15-21、drivers/leds/trigger/Kconfig:65-67、drivers/firmware/efi/Kconfig:238-249、drivers/cpuidle/Kconfig.arm:17-33、arch/arm/Kconfig:1230-1232、lib/Kconfig.debug:811-812, 1351-1358, 1398-1411, 1415-1420, 1454-1491、lib/Kconfig.kmsan:11-15、Documentation/admin-guide/kernel-parameters.txt:4826-4833, 5214-5222, 5589-5600, 6725-6727、Documentation/admin-guide/sysctl/vm.rst:144-146、Documentation/admin-guide/cgroup-v1/memory.rst:68, 80。
ARM64 特有
| 位置 | 内容 |
|---|---|
arch/arm64/Kconfig:58-83, 99-105, 128, 148-156, 191, 224-237, 249, 1372-1394, 1527-1544, 1678-1680, 2292-2315 |
内联锁开关、ARCH_SUPPORTS_RT、NUMA/THP 支持、硬死锁检测、HAVE_POSIX_CPU_TIMERS_TASK_WORK、IRQ_FORCED_THREADING、页大小、调度拓扑、伪 NMI |
arch/arm64/include/asm/preempt.h:8-90 |
PREEMPT_NEED_RESCHED = BIT(32)、非原子 RMW、should_resched |
arch/arm64/include/asm/thread_info.h:29-40 |
preempt_count u64 union |
arch/arm64/kernel/entry-common.c:70-96, 193-211, 262-302, 445-462, 614-640 |
出口路径、NMI 进出、arm64_preempt_schedule_irq、调试异常、__el1_irq/__el1_pnmi |
arch/arm64/include/asm/irqflags.h:33-183、arch/arm64/include/asm/ptrace.h:26-29, 215-221 |
PMR 关中断、interrupts_enabled() |
arch/arm64/kernel/cpufeature.c:1091-1113, 1660, 2221-2232, 2394, 2686 |
irqchip.gicv3_pseudo_nmi 参数与能力检测 |
arch/arm64/kernel/smp.c:920, 1016-1091, 1189 |
IPI 注册、NMI IPI |
arch/arm64/kernel/irq.c:30-31, 123-137 |
NMI 上下文、init_IRQ PMR 初始化 |
arch/arm64/kernel/watchdog_hld.c:15-35 |
perf 硬死锁检测 |
arch/arm64/kernel/topology.c:52-67, 153-214 |
ACPI PPTT 拓扑、AMU 频率不变性 |
arch/arm64/kernel/efi.c:179 |
EFI runtime 异常修复(无 RT 说明) |
drivers/irqchip/irq-gic-v3.c:42, 117, 515-519, 627-635, 859, 919-922, 966-969, 1569, 1588, 2045-2053 |
伪 NMI 实现 |
include/linux/irqchip/arm-gic-v3-prio.h:23-48 |
GIC 优先级常量 |
drivers/clocksource/arm_arch_timer.c:97-103, 252-256, 915-981, 1101, 1251-1269, 1326 |
arch timer |
drivers/cpuidle/Kconfig.arm:17-44、drivers/cpuidle/cpuidle.c:40-45, 811-818、drivers/cpuidle/sysfs.c:302-339 |
PSCI idle 与 RT 限制、cpuidle.off/governor、逐态 disable |
drivers/cpufreq/cpufreq.c:51, 1123-1137, 3078-3084 |
cpufreq.default_governor |
drivers/firmware/psci/psci.c:88-90, 160-171, 469-480, 736-740 |
OSI/PC 模式、cpu_suspend SMC |
drivers/firmware/Kconfig:31-38、drivers/firmware/arm_sdei.c:1-3 |
SDEI |
drivers/base/arch_topology.c:156-161, 215, 258, 285-322 |
CPU capacity |
kernel/sched/topology.c:211, 317-329, 432, 723, 1374-1381, 2433 |
sched_energy_aware、SD_ASYM_CPUCAPACITY |
drivers/tty/serial/amba-pl011.c:2504、drivers/tty/serial/8250/8250_core.c:502、include/linux/serial_core.h:596-713 |
串口控制台仍为 legacy;nbcon 接线 |
Documentation/admin-guide/kernel-parameters.txt:894-906, 2001-2002, 2260-2262, 2417-2420, 2436-2438, 3984-3990, 4883, 7013-7016 |
参数与其架构标签 |
6.12.107 中不存在(避免误引)
| 机制 | 状态 | 出现版本 |
|---|---|---|
PREEMPT_LAZY / TIF_NEED_RESCHED_LAZY |
全树无 | 6.13 |
arm64 select GENERIC_ENTRY |
无,自有 entry-common.c |
后续 |
pl011 / 8250 的 nbcon write_atomic |
无(全树无驱动实现) | 6.13+ |
| SDEI 看门狗 | 无(厂商补丁) | — |
ARM64_PAGE_SHIFT 符号 |
无,改用 HAVE_PAGE_SIZE_* |
— |
enable_gicv3_pseudo_nmi 符号 |
无,实际是 enable_pseudo_nmi(arch)/ supports_pseudo_nmis(驱动) |
— |
ktimerd / timersd / raise_ktimers_thread |
全树无 | 6.13+ |
hrtimer_setup() |
无,只有 hrtimer_init() |
6.13+ |
task_is_pushable() |
无,用 get_push_task() |
后续 |
SLUB allow_spin / hardirq 分配运行时检查 |
无,仅注释策略 | 6.15+ |
SLUB_CPU_PARTIAL depends on !PREEMPT_RT |
无,仅 help 建议 | — |
PREEMPT_RT select IRQ_FORCED_THREADING |
无,由架构 select | — |
preempt=rt 启动参数 |
无 | — |
kernel/time/ 的 local_lock |
无 | — |
Documentation/scheduler/ 的 RT 说明 |
无 | — |
小结
- 索引按子系统排列,与各章「源码定位」一一对应;升级内核时以函数名为锚重新定位,行号会漂移。
- 「6.12.107 中不存在」一节用于避免把 6.13+ 的机制(
PREEMPT_LAZY、ktimerd、hrtimer_setup)误读进来。 - 承上启下:第 16 章把全文收拢为一句话、一张表和一个决策。