mcpField
K
kernel-concurrency

kernel-concurrency

github.com/mohitmishra786开发269311 次安装18 周前更新
代码仓库

关于 kernel-concurrency

面向 Linux 内核同步问题的 Agent 技能,介绍锁、RCU、完成量和内存屏障的选择与使用。适用于编写驱动或子系统补丁,以及排查死锁和原子上下文中调度问题。

主要功能

  1. 01选择适合上下文的锁类型
  2. 02使用自旋锁保护中断共享数据
  3. 03使用 RCU 与 seqlock 管理并发读取
  4. 04通过完成量协调线程
  5. 05应用内存屏障与 MMIO 访问规则

适用场景

  1. 01保护中断处理程序与进程间共享数据
  2. 02为读多写少的数据结构选择同步方案
  3. 03排查死锁或原子上下文调度错误
  4. 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 — 用户空间 TSan
  • skills/kernel/kernel-internals — 调度器抢占
  • skills/profilers/linux-perf — 锁竞争分析

评论

支持 Markdown