关于 kernel-concurrency
面向 Linux 内核同步问题的 Agent 技能,介绍锁、RCU、完成量和内存屏障的选择与使用。适用于编写驱动或子系统补丁,以及排查死锁和原子上下文中调度问题。
主要功能
- 01选择适合上下文的锁类型
- 02使用自旋锁保护中断共享数据
- 03使用 RCU 与 seqlock 管理并发读取
- 04通过完成量协调线程
- 05应用内存屏障与 MMIO 访问规则
适用场景
- 01保护中断处理程序与进程间共享数据
- 02为读多写少的数据结构选择同步方案
- 03排查死锁或原子上下文调度错误
- 04协调内核操作的等待与通知
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ mohitmishra786/ low-level-dev-skills --skill kernel-concurrency安装后在 Claude Code 中输入/kernel-concurrency确认已加载。
详细介绍
内核并发
用途
指导 Agent 使用 Linux 内核中的同步机制:自旋锁、互斥锁、信号量、RCU、顺序锁、完成量和内存排序规则——这些对于编写正确的驱动和子系统补丁至关重要。
使用场景
- IRQ 处理程序与进程上下文共享数据
- 需要使用 RCU 的读多写少型数据结构
- 为
probe与ioctl路径选择锁类型 - 调试死锁或
scheduling while atomic
工作流
1. 锁选择树
Context can sleep?
├── No (IRQ, spinlock held, preempt disabled)
│ └── spin_lock_irqsave() / atomic_t
└── Yes
├── Exclusive long-held → mutex
├── Reader/writer → rw_semaphore or RCU (read-mostly)
└── One-shot signal → completion
持有自旋锁时绝不能睡眠(kmalloc(GFP_KERNEL)、mutex_lock)。
2. 自旋锁 + IRQ
spinlock_t lock;
unsigned long flags;
spin_lock_irqsave(&lock, flags);
/* critical section — no blocking */
spin_unlock_irqrestore(&lock, flags);
如果问题在于软中断与任务队列之间的数据共享,请使用 spin_lock_bh。
3. 进程上下文中的互斥锁
struct mutex m;
mutex_lock(&m);
/* may allocate, may sleep */
mutex_unlock(&m);
4. RCU(读-复制-更新)
/* Readers — no lock */
rcu_read_lock();
p = rcu_dereference(ptr);
/* use p */
rcu_read_unlock();
/* Writer */
new = kmalloc(...);
rcu_assign_pointer(ptr, new);
synchronize_rcu();
kfree(old);
RCU 读者不得无限期阻塞。所有 CPU 都进入静止状态后,宽限期才会结束。
5. 顺序锁(jiffies、时间戳)
unsigned seq;
do {
seq = read_seqbegin(&seqlock);
/* read shared data */
} while (read_seqretry(&seqlock, seq));
写入者使用 write_seqlock / write_sequnlock。
6. 完成量
DECLARE_COMPLETION(done);
/* waiter */
wait_for_completion(&done);
/* signaller */
complete(&done);
7. 内存屏障
内核提供 smp_mb()、smp_wmb()、smp_rmb()。设备 MMIO 使用 readl/writel(在大多数架构上有序)。用户空间类比请参见 skills/low-level-programming/memory-model。
8. Agent 用法
/kernel-concurrency Protect shared ring buffer between IRQ and read() syscall
常见问题
| 症状 | 原因 | 修复方法 |
|---|---|---|
scheduling while atomic | 持有自旋锁时睡眠 | 使用 GFP_ATOMIC 或延后工作 |
| 死锁 | 互斥锁顺序导致 AB-BA | 使用全局锁顺序 |
| RCU 停滞 | 读者阻塞时间过长 | 尽量缩短 rcu_read_lock 临界区 |
| 丢失唤醒 | 在 wait 之前调用 complete | 每个周期都使用 INIT_COMPLETION |
| 计数器损坏 | IRQ 中的非原子读-改-写操作 | 使用 atomic_t 或锁 |
相关技能
skills/kernel/device-drivers— 线程化 IRQ 模式skills/low-level-programming/memory-model— C11 原子操作与内核原子操作skills/debuggers/concurrency-debugging— 用户空间 TSanskills/kernel/kernel-internals— 调度器抢占skills/profilers/linux-perf— 锁竞争分析
评论
支持 Markdown