kernel-concurrency について
Linux カーネルの同期処理を案内するエージェントスキルです。ドライバーやサブシステムのパッチを作成する開発者向けに、ロック、RCU、完了通知、メモリバリアを解説します。
主な機能
- 01実行コンテキストに応じたロック選択
- 02IRQ 共有データのスピンロック保護
- 03RCU とシーケンスロックによる並行読み取り
- 04完了通知によるスレッド間連携
- 05メモリバリアと MMIO アクセス規則の適用
活用シーン
- 01IRQ ハンドラーとプロセス間の共有データ保護
- 02読み取り中心の構造に使う同期方式の選定
- 03デッドロックや atomic 中のスケジューリング問題の調査
- 04カーネル処理の待機と通知の連携
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ mohitmishra786/ low-level-dev-skills --skill kernel-concurrencyインストール後、Claude Code で/kernel-concurrencyを入力して読み込まれたか確認します。
詳細
カーネルの並行処理
目的
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);
ソフト IRQ/タスクレットとの共有が問題になる場合は、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. エージェントでの使用
/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 内でアトミックでない RMW を行っている | 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 対応