About kernel-concurrency
An agent skill for synchronization in the Linux kernel, covering locks, RCU, completions, and memory barriers. It is for developers writing drivers or subsystem patches and diagnosing deadlocks or scheduling-in-atomic issues.
Key features
- 01Choose locks for execution context
- 02Protect IRQ-shared data with spinlocks
- 03Use RCU and seqlocks for concurrent reads
- 04Coordinate threads with completions
- 05Apply memory barriers and MMIO access rules
Use cases
- 01Protect data shared by IRQ handlers and processes
- 02Select synchronization for read-mostly structures
- 03Diagnose deadlocks or scheduling-in-atomic errors
- 04Coordinate kernel waits and notifications
Install
Copy the command and run it in a terminal.
npx skills add https:/ / github.com/ mohitmishra786/ low-level-dev-skills --skill kernel-concurrencyAfter installing, type/kernel-concurrencyin Claude Code to confirm it loaded.
Details
From the project READMEKernel Concurrency
Purpose
Guide agents through synchronization in the Linux kernel: spinlocks, mutexes, semaphores, RCU, seqlocks, completions, and memory ordering rules — critical for correct drivers and subsystem patches.
When to Use
- IRQ handler shares data with process context
- Read-mostly data structures needing RCU
- Choosing lock type for
probevsioctlpaths - Debugging deadlocks or
scheduling while atomic
Workflow
1. Lock selection tree
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
Never sleep while holding a spinlock (kmalloc(GFP_KERNEL), mutex_lock).
2. Spinlock + IRQ
spinlock_t lock;
unsigned long flags;
spin_lock_irqsave(&lock, flags);
/* critical section — no blocking */
spin_unlock_irqrestore(&lock, flags);
Use spin_lock_bh when softirq/tasklet sharing is the concern.
3. Mutex in process context
struct mutex m;
mutex_lock(&m);
/* may allocate, may sleep */
mutex_unlock(&m);
4. RCU (read-copy update)
/* 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 readers must not block indefinitely. Grace period completes after all CPUs quiescent.
5. Seqlock (jiffies, timestamps)
unsigned seq;
do {
seq = read_seqbegin(&seqlock);
/* read shared data */
} while (read_seqretry(&seqlock, seq));
Writer uses write_seqlock / write_sequnlock.
6. Completions
DECLARE_COMPLETION(done);
/* waiter */
wait_for_completion(&done);
/* signaller */
complete(&done);
7. Memory barriers
Kernel provides smp_mb(), smp_wmb(), smp_rmb(). Device MMIO uses readl/writel (ordered on most arches). See skills/low-level-programming/memory-model for userspace analogies.
8. Agent usage
/kernel-concurrency Protect shared ring buffer between IRQ and read() syscall
Common Problems
| Symptom | Cause | Fix |
|---|---|---|
scheduling while atomic | Sleep under spinlock | Use GFP_ATOMIC or defer work |
| Deadlock | AB-BA mutex order | Global lock ordering |
| RCU stall | Reader blocked too long | rcu_read_lock section minimal |
| Lost wake | complete before wait | Use INIT_COMPLETION each cycle |
| Corrupt counter | Non-atomic RMW in IRQ | atomic_t or lock |
Related Skills
skills/kernel/device-drivers— threaded IRQ patternskills/low-level-programming/memory-model— C11 atomics vs kernelskills/debuggers/concurrency-debugging— userspace TSanskills/kernel/kernel-internals— scheduler preemptionskills/profilers/linux-perf— lock contention profiling