Linux RT 分析Linux 6.12.107

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-73PREEMPT_DYNAMIC :96-101
arch/Kconfig:1356-1360 ARCH_NO_PREEMPTARCH_SUPPORTS_RT
arch/x86/Kconfig:128arch/arm64/Kconfig:105arch/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/enableis_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_QUEUERT_PUSH_IPIRT_RUNTIME_SHARE
kernel/sched/sched.h:1306-1308, 1365-1374, 2594-2648, 2833-2837 nr_pinnedis_migration_disabledSCA_*get_push_taskSCHED_NR_MIGRATE_BREAK
kernel/sched/fair.c:9328-9525, 11835-12049 can_migrate_taskLBF_*
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_disablednet_xmitsoftirq_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_basemax_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-63include/linux/rwlock_rt.h:51-111 RT rwlock
include/linux/rwbase_rt.h:8-37 READER_BIAS/WRITER_BIASrwbase_rt
include/linux/rwsem.h:135-141 RT rwsem
include/linux/mutex_types.h:11-67include/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_MUTEXmax_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_locktimer_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_PARTIALCOMPACT_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-38mm/zsmalloc.c:261-266, 1224-1276
mm/compaction.c:3285-3294 告警
include/linux/highmem-internal.h:97-132, 205-235include/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, 1286stallwarn.rst:56-60rcu_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, 629include/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-2067net/ipv4/tcp_ipv4.c:892-1034net/ipv4/tcp_sigpool.c:14, 287-297net/ipv6/seg6_local.c:1427-1431 local_lock_nested_bh
include/linux/netdevice.h:3250, 3302-3339, 4983-5003include/net/sock.h:557include/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:6drivers/gpu/drm/mgag200/Kconfig:15-21drivers/leds/trigger/Kconfig:65-67drivers/firmware/efi/Kconfig:238-249drivers/cpuidle/Kconfig.arm:17-33arch/arm/Kconfig:1230-1232lib/Kconfig.debug:811-812, 1351-1358, 1398-1411, 1415-1420, 1454-1491lib/Kconfig.kmsan:11-15Documentation/admin-guide/kernel-parameters.txt:4826-4833, 5214-5222, 5589-5600, 6725-6727Documentation/admin-guide/sysctl/vm.rst:144-146Documentation/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_WORKIRQ_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-183arch/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-44drivers/cpuidle/cpuidle.c:40-45, 811-818drivers/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-38drivers/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_awareSD_ASYM_CPUCAPACITY
drivers/tty/serial/amba-pl011.c:2504drivers/tty/serial/8250/8250_core.c:502include/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 说明

小结