mcpField
K
kernel-concurrency

kernel-concurrency

github.com/mohitmishra786開発269311 回インストール18 週間前に更新
リポジトリ

kernel-concurrency について

Linux カーネルの同期処理を案内するエージェントスキルです。ドライバーやサブシステムのパッチを作成する開発者向けに、ロック、RCU、完了通知、メモリバリアを解説します。

主な機能

  1. 01実行コンテキストに応じたロック選択
  2. 02IRQ 共有データのスピンロック保護
  3. 03RCU とシーケンスロックによる並行読み取り
  4. 04完了通知によるスレッド間連携
  5. 05メモリバリアと MMIO アクセス規則の適用

活用シーン

  1. 01IRQ ハンドラーとプロセス間の共有データ保護
  2. 02読み取り中心の構造に使う同期方式の選定
  3. 03デッドロックや atomic 中のスケジューリング問題の調査
  4. 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 — ユーザー空間の TSan
  • skills/kernel/kernel-internals — スケジューラーのプリエンプション
  • skills/profilers/linux-perf — ロック競合のプロファイリング

コメント