10 KiB
10 KiB
CURRENT TASK (Phase 12: Shared SuperSlab Pool – Debug Phase)
Phase12 の設計に沿った shared SuperSlab pool 実装および Box API 境界リファクタリングは導入済み。 現在は shared backend 有効状態での SEGV 解消と安定化 を行うデバッグフェーズに入っている。
本タスクでは以下をゴールとする:
- shared Superslab pool backend (
hakmem_shared_pool.[ch]+hak_tiny_alloc_superslab_backend_shared) を Box API (hak_tiny_alloc_superslab_box) 経由で安全に運用できる状態にする。 bench_random_mixed_hakmem実行時に SEGV が発生しないことを確認し、 shared backend を実用レベルの「最小安定実装」として確定させる。
2. 現状サマリ(実装済み)
-
Box/API 境界
- tiny フロントエンドから Superslab への入口:
hak_tiny_alloc_superslab_box(int class_idx)に一本化。
- TLS SLL:
- slow path を含む呼び出しは
tls_sll_box.h(tls_sll_pop(int, void**)等) の Box API 経由に統一。
- slow path を含む呼び出しは
- tiny フロントエンドから Superslab への入口:
-
shared Superslab pool 実装
hakmem_shared_pool.[ch]:SharedSuperSlabPool g_shared_poolとshared_pool_init,shared_pool_acquire_slab,shared_pool_release_slabを実装。- SuperSlab を global に管理し、slab 単位で
class_idxを割当/解放する shared pool 構造を提供。
hakmem_tiny_superslab.c:hak_tiny_alloc_superslab_backend_shared(int class_idx):shared_pool_acquire_slabにより(ss, slab_idx)を取得。superslab_init_slabで未初期化 slab を初期化。- ジオメトリは
SUPERSLAB_SLAB0_DATA_OFFSET+slab_idx * SUPERSLAB_SLAB_USABLE_SIZE+used * strideを使用。 - 単純 bump でブロックを返却。
hak_tiny_alloc_superslab_backend_legacy(int class_idx):- 旧 per-class
g_superslab_headsベースの実装を static backend に封じ込め。
- 旧 per-class
hak_tiny_alloc_superslab_box(int class_idx):- shared backend → 失敗時に legacy backend へフォールバックする実装に更新。
make bench_random_mixed_hakmem:- ビルドは成功し、shared backend を含む構造的な不整合は解消済み。
-
現状の問題(2025-11-14 更新)
bench_random_mixed_hakmemは SLL(TLS 単方向リスト)有効時に早期 SEGV。- SLL を無効化(
HAKMEM_TINY_TLS_SLL=0)すると、shared ON/OFF いずれも安定完走(Throughput 表示)。 - よって、現時点のクラッシュ主因は「共有SS」ではなく「SLL フロント経路の不整合(BASE/USER/next 取り扱い)」である可能性が高い。
以降は、この SEGV を潰し「shared Superslab pool 最小安定版」を完成させるためのデバッグタスクとする。
3. デバッグフェーズの具体タスク
3-1. shared backend ON/OFF 制御と原因切り分け
- shared backend スイッチ導入・確認
hak_tiny_alloc_superslab_box(int class_idx)に環境変数または定数フラグを導入し:HAKMEM_TINY_SS_SHARED=0→ legacy backend のみ(回帰確認用)HAKMEM_TINY_SS_SHARED=1→ 現行 shared backend(デバッグ対象)
- 手順:
- legacy 固定で
bench_random_mixed_hakmem実行 → SEGV が消えることを確認し、問題が shared 経路に限定されることを保証。
- legacy 固定で
3-2. shared slab メタデータの一貫性検証
-
shared_pool_acquire_slabとhak_tiny_alloc_superslab_backend_sharedの整合確認- 確認事項:
class_idx割当時に:meta->class_idxが正しくclass_idxにセットされているか。superslab_init_slab呼び出し後、capacity > 0,used == 0,freelist == NULLになっているか。
meta->used++/total_active_blocks++の更新が free パスの期待と一致しているか。
- 必要なら:
- debug build で
assert(meta->class_idx == class_idx)等を追加して早期検出。
- debug build で
- 確認事項:
-
free/refill 経路との整合性
- 対象ファイル:
tiny_superslab_free.inc.hhakmem_tiny_free.inchakmem_tiny_bg_spill.c
- 確認事項:
- pointer→SuperSlab→TinySlabMeta 解決ロジックが:
meta->class_idxベースで正しい class を判定しているか。- shared/legacy の違いに依存せず動作するか。
- 空 slab 判定時に:
shared_pool_release_slabを呼ぶ条件とmeta->used == 0の扱いが矛盾していないか。
- pointer→SuperSlab→TinySlabMeta 解決ロジックが:
- 必要な修正:
- shared slab 専用の「空になった slab の返却」パスを導入し、UNASSIGNED への戻しを一元化。
- 対象ファイル:
3-3. Superslab registry / LRU / shared pool の連携確認
- Registry & LRU 連携
hakmem_super_registry.cの:hak_super_register,hak_super_unregisterhak_ss_lru_pop/push
- 確認:
- shared pool で確保した SuperSlab も registry に登録されていること。
- LRU 経由再利用時に
class_idx/slab 割付が破綻していないこと。
- 必要に応じて:
- shared pool 管理下の SuperSlab を区別するフラグや、再利用前のメタリセットを追加。
3-4. SEGV の直接解析
- gdb によるスタックトレース取得(実施)
- コマンド例:
cd hakmemgdb --args ./bench_random_mixed_hakmemrunbt
- 結果(抜粋):
hak_tiny_alloc_fast_wrapper()内で SEGV。SLL 無効化で再現しないため、SLL 経路の BASE/USER/next の整合に絞る。
- コマンド例:
3-5. 安定版 shared Superslab pool の確定
- 修正後確認
HAKMEM_TINY_SS_SHARED=1(shared 有効)で:bench_random_mixed_hakmemが SEGV 無しで完走すること。- 簡易的な統計・ログで:
- shared Superslab が複数 class で共有されていること。
- メタデータ破綻や異常な解放が発生していないこと。
- これをもって:
- 「Phase12 Shared Superslab Pool 最小安定版」が完了。
2-3. TLS / SLL / Refill の整合性確保
スコープ: core/hakmem_tiny_refill.inc.h, core/hakmem_tiny_tls_ops.h, core/hakmem_tiny.c(局所)
-
sll_refill_small_from_ss の Phase12 対応
- 入力:
class_idx,max_take - 動作:
- shared pool から該当
class_idxの slab を取得 or bind。 - slab の freelist/bump から
max_take個を TLS SLL に積む。
- shared pool から該当
- ここでは:
- g_sll_cap_override を参照しない(将来廃止しやすい形に)。
- cap 計算は
sll_cap_for_class(class_idx, mag_cap)に集約。
- 入力:
-
tiny_fast_refill_and_take / TLS SLL 経路の一貫性
tiny_fast_refill_and_takeが:- まず TLS SLL / FastCache を見る。
- 足りなければ
sll_refill_small_from_ssを必ず経由するよう整理(旧経路の枝刈り)。
- ただし:
- 既存インラインとの整合性を崩さないよう、分岐削除は段階的に行う。
2-4. g_sll_cap_override の段階的無効化(安全版)
-
参照経路のサニタイズ(非破壊)
hakmem_tiny_intel.inc,hakmem_tiny_background.inc,hakmem_tiny_init.incなどで:- g_sll_cap_override を書き換える経路を
#if 0or コメントアウトで停止。 - 配列定義自体はそのまま残し、リンク切れを防ぐ。
- g_sll_cap_override を書き換える経路を
sll_cap_for_class()は Phase12 ポリシーに従う実装に置き換える。- これにより:
- 実際の SLL cap は sll_cap_for_class 経由に統一されるが、
- ABI/シンボル互換性は保持される。
-
ビルド & アセンブリ確認
make bench_random_mixed_hakmemgdb -q ./bench_random_mixed_hakmem -ex "disassemble sll_refill_small_from_ss" -ex "quit"- 確認項目:
- g_sll_cap_override 更新経路は実際には使われていない。
- sll_refill_small_from_ss が shared SuperSlab pool を用いる単一ロジックになっている。
2-5. Shared Pool 実装の検証とバグ切り分け
-
機能検証
bench_random_mixed_hakmemを実行:- SIGSEGV / abort の有無
- ログと
HAKMEM_TINY_SUPERSLAB_TRACEで shared pool の挙動を確認。
-
パフォーマンス確認
- 目標: 設計書の期待値に対し、オーダーとして妥当な速度になっているか:
- 9M → 70–90M ops/s のレンジを狙う(まずは退行していないことを確認)。
- 目標: 設計書の期待値に対し、オーダーとして妥当な速度になっているか:
-
問題発生時の切り分け
- クラッシュ/不正挙動があれば:
- まず shared pool 周辺(slab class_idx, freelist 管理, owner/bind/unbind)に絞って原因特定。
- Tiny front-end (bump, SLL, HotMag 等) を疑うのはその後。
- クラッシュ/不正挙動があれば:
3. 実装ルール(再確認)
- hakmem_tiny.c は write_to_file で全書き換えしない。
- 変更は:
#if 0/ コメントアウト- 局所的な関数実装差し替え
- 新しい shared pool 関数の追加
- 既存呼び出し先の付け替え に限定し、逐次ビルド確認する。
4. 直近の変更(2025-11-14 追記)
- 定数/APIの復元・宣言不足解消(
SUPERSLAB_LG_*, 所有権API, active dec, fail-fast スタブ 等)。 - Box 2 drain 境界を
_ss_remote_drain_to_freelist_unsafe()に一本化。 tiny_fast_pop()が USER を返していた不具合を修正(BASE返却へ)。- SLL トグルの実効化:
- free v2(ヘッダ系)で
g_tls_sll_enable==0時は即スローパスへ。 - alloc fast でも SLL 無効時は TLS SLL pop を完全スキップ。
- free v2(ヘッダ系)で
tls_sll_boxの capacity > 1<<20 を「無制限」扱いへ(過剰警告を抑制)。
暫定ガイド(shared の検証を先に進めるため)
HAKMEM_TINY_TLS_SLL=0で shared ON/OFF の安定動作を確認し、shared 経路の SEGV 有無を切り分ける。
次の一手(SLL ルートの最小修正)
- SLL push/pop すべての呼び出しを Box API 経由(BASEのみ)に強制。直書き・next手計算を禁止。
tls_sll_boxにデバッグ限定の軽量ガードを追加(slab範囲+stride整合)して最初の破綻ノードを特定。- 必要なら一時的に
HAKMEM_TINY_SLL_C03_ONLY=1(C0–C3 のみ SLL 使用)で範囲を狭め、原因箇所を早期確定。