WIP: Add TLS SLL validation and SuperSlab registry fallback

ChatGPT's diagnostic changes to address TLS_SLL_HDR_RESET issue.
Current status: Partial mitigation, but root cause remains.

Changes Applied:
1. SuperSlab Registry Fallback (hakmem_super_registry.h)
   - Added legacy table probe when hash map lookup misses
   - Prevents NULL returns for valid SuperSlabs during initialization
   - Status:  Works but may hide underlying registration issues

2. TLS SLL Push Validation (tls_sll_box.h)
   - Reject push if SuperSlab lookup returns NULL
   - Reject push if class_idx mismatch detected
   - Added [TLS_SLL_PUSH_NO_SS] diagnostic message
   - Status:  Prevents list corruption (defensive)

3. SuperSlab Allocation Class Fix (superslab_allocate.c)
   - Pass actual class_idx to sp_internal_allocate_superslab
   - Prevents dummy class=8 causing OOB access
   - Status:  Root cause fix for allocation path

4. Debug Output Additions
   - First 256 push/pop operations traced
   - First 4 mismatches logged with details
   - SuperSlab registration state logged
   - Status:  Diagnostic tool (not a fix)

5. TLS Hint Box Removed
   - Deleted ss_tls_hint_box.{c,h} (Phase 1 optimization)
   - Simplified to focus on stability first
   - Status:  Can be re-added after root cause fixed

Current Problem (REMAINS UNSOLVED):
- [TLS_SLL_HDR_RESET] still occurs after ~60 seconds of sh8bench
- Pointer is 16 bytes offset from expected (class 1 → class 2 boundary)
- hak_super_lookup returns NULL for that pointer
- Suggests: Use-After-Free, Double-Free, or pointer arithmetic error

Root Cause Analysis:
- Pattern: Pointer offset by +16 (one class 1 stride)
- Timing: Cumulative problem (appears after 60s, not immediately)
- Location: Header corruption detected during TLS SLL pop

Remaining Issues:
⚠️ Registry fallback is defensive (may hide registration bugs)
⚠️ Push validation prevents symptoms but not root cause
⚠️ 16-byte pointer offset source unidentified

Next Steps for Investigation:
1. Full pointer arithmetic audit (Magazine ⇔ TLS SLL paths)
2. Enhanced logging at HDR_RESET point:
   - Expected vs actual pointer value
   - Pointer provenance (where it came from)
   - Allocation trace for that block
3. Verify Headerless flag is OFF throughout build
4. Check for double-offset application in conversions

Technical Assessment:
- 60% root cause fixes (allocation class, validation)
- 40% defensive mitigation (registry fallback, push rejection)

Performance Impact:
- Registry fallback: +10-30 cycles on cold path (negligible)
- Push validation: +5-10 cycles per push (acceptable)
- Overall: < 2% performance impact estimated

Related Issues:
- Phase 1 TLS Hint Box removed temporarily
- Phase 2 Headerless blocked until stability achieved

🤖 Generated with Claude Code (https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
Moe Charm (CI)
2025-12-03 20:42:28 +09:00
parent 2624dcce62
commit 0546454168
27 changed files with 543 additions and 46 deletions

View File

@ -102,6 +102,8 @@ ACE Learning Layer (Adaptive Control Engine)
- User guide: `docs/ACE_LEARNING_LAYER.md`
- Technical plan: `docs/ACE_LEARNING_LAYER_PLAN.md`
- Progress report: `ACE_PHASE1_PROGRESS.md`
- Learning layer overview: `docs/analysis/LEARNING_LAYER_OVERVIEW.md`
- Learning A/B results: `docs/benchmarks/LEARNING_AB_RESULTS.md` (growing log)
- **Phase 1 Deliverables** (COMPLETE ✅):
- ✅ Metrics collection (`hakmem_ace_metrics.{c,h}`)
- ✅ UCB1 learning algorithm (`hakmem_ace_ucb1.{c,h}`)

View File

@ -1,12 +1,67 @@
HAKMEM Environment Variables (Tiny focus)
Core toggles
このファイルは HAKMEM の Tiny 系機能Tiny allocator / TLS SLL / SuperSlabに関わる環境変数をまとめたものです。
数が多いため、まず「よく使うもの」だけをざっと把握できるようにし、その後に詳細なカテゴリ別リストを載せています。
### このファイルと他ドキュメントの関係(現状整理)
- リポジトリ全体の `getenv()` 呼び出しを集計した結果は `ENV_VARIABLE_SURVEY.md` にまとまっています(変数 228 個)。
- `ENV_VARIABLE_SURVEY.md` では各変数に対して **KEEP / CONSOLIDATE / DEPRECATE** のステータスを付けています。
- KEEP: 本番運用・安全性・主要なチューニングで今後も使う前提の変数
- CONSOLIDATE: 将来的に `HAKMEM_DEBUG` / `HAKMEM_TRACE` / `HAKMEM_STATS` 等のマスター系に統合する予定の変数
- DEPRECATE: 段階的に削除予定の変数(新規利用は非推奨)
- この `ENV_VARS.md` はその中から、**Tiny / SuperSlab / TLS SLL 周りで日常的に触るべきものを中心に抜き出した実用リファレンス** です。
- Tiny 以外を含む網羅的な説明や、個々の変数のステータス詳細が必要な場合は:
- `ENV_VARIABLE_SURVEY.md`(最新のサーベイとステータス)
- `docs/specs/ENV_VARS_COMPLETE.md`(より古いが網羅的なリファレンス)
をあわせて参照してください。
## Quick cheat sheetよく使うENV
### コア動作トグル(常用)
- `HAKMEM_WRAP_TINY`
Tiny allocator を有効化(直リンクまたは LD_PRELOAD 時の主経路にする)。
- `HAKMEM_TINY_USE_SUPERSLAB`
Tiny が SuperSlab バックエンドを使うかどうか(既定 ON
- `HAKMEM_TINY_TLS_SLL`
Tiny TLS SLL を有効化Headerless/Phase2 でもコア機能)。
- `HAKMEM_SAFE_FREE` / `HAKMEM_INVALID_FREE` / `HAKMEM_INVALID_FREE_LOG`
free() 経路の安全性・invalid free 検出モード。
- `HAKMEM_LD_SAFE` / `HAKMEM_LD_BLOCK_JEMALLOC` / `HAKMEM_FORCE_LIBC_ALLOC(_INIT)`
LD_PRELOAD 時の安全モードと jemalloc との共存制御。
### Tiny/SuperSlab/TLS の主要チューニング
- `HAKMEM_TINY_REFILL_MAX` / `HAKMEM_TINY_REFILL_MAX_HOT` / `HAKMEM_TINY_REFILL_MAX_C{0..7}`
Tiny TLS キャッシュのリフィル上限(全体/ホットクラス/クラス別)。
- `HAKMEM_TINY_SS_ADOPT*` / `HAKMEM_TINY_SS_REQTRACE`
SuperSlab publish/adopt 経路と採用ゲートの挙動。
- `HAKMEM_TINY_SLL_DRAIN_ENABLE` / `HAKMEM_TINY_SLL_DRAIN_INTERVAL`
TLS SLL → freelist drain の頻度・有効/無効。
### ベンチ/実験用(通常運用では OFF 推奨)
- `HAKMEM_BENCH_FAST_FRONT` / `HAKMEM_BENCH_WARMUP` / `HAKMEM_TINY_BENCH_*`
ベンチマーク専用の fast front / warmup / refill 設定。
- `HAKMEM_TINY_ULTRA*` / `HAKMEM_TINY_BENCH_SLL_ONLY`
Ultra Tiny / SLLonly などの実験経路。
### デバッグ/トレース/統計(マスター系)
- `HAKMEM_DEBUG_ALL` / `HAKMEM_DEBUG_LEVEL` / `HAKMEM_QUIET`
全体デバッグの一括 ON/OFF と冗長度。
- `HAKMEM_TRACE` / `HAKMEM_TRACE_LEVEL`
トレース対象ptr/refill/free/mailbox/...)と冗長度。
- `HAKMEM_STATS` / `HAKMEM_STATS_DUMP`
統計モジュールの有効化と終了時ダンプ。
以降のセクションでは、これらを含むすべての ENV をカテゴリ別に詳しく説明します。
---
## Core toggles
- HAKMEM_WRAP_TINY=1
- Tiny allocatorを有効化直リンク
- HAKMEM_TINY_USE_SUPERSLAB=0/1
- SuperSlab経路のON/OFF既定ON
SFC (Super Front Cache) stats / A/B
## SFC (Super Front Cache) stats / A/B
- HAKMEM_SFC_ENABLE=0/1
- Box 5NEW: Super Front Cache を有効化既定OFF; A/B用
- HAKMEM_SFC_CAPACITY=16..256 / HAKMEM_SFC_REFILL_COUNT=8..256
@ -15,7 +70,7 @@ SFC (Super Front Cache) stats / A/B
- プロセス終了時に SFC 統計をstderrへダンプalloc_hits/misses, refill_calls など)。
- 使い方: make CFLAGS+=" -DHAKMEM_DEBUG_COUNTERS=1" larson_hakmem; HAKMEM_SFC_ENABLE=1 HAKMEM_SFC_STATS_DUMP=1 ./larson_hakmem …
Larson defaults (publish→mail→adopt)
## Larson defaults (publish→mail→adopt)
- 忘れがちな必須変数をスクリプトで一括設定するため、`scripts/run_larson_defaults.sh` を用意しています。
- 既定で以下を export しますA/B は環境変数で上書き可能):
- `HAKMEM_TINY_USE_SUPERSLAB=1` / `HAKMEM_TINY_MUST_ADOPT=1` / `HAKMEM_TINY_SS_ADOPT=1`
@ -24,7 +79,7 @@ Larson defaults (publish→mail→adopt)
- `HAKMEM_TINY_MAILBOX_SLOWDISC=1`
- `HAKMEM_TINY_MAILBOX_SLOWDISC_PERIOD=256`
Front Gate (A/B for boxified fast path)
## Front Gate (A/B for boxified fast path)
- `HAKMEM_TINY_FRONT_GATE_BOX=1` — Use Front Gate Box implementation (SFC→SLL) for fast-path pop/push/cascade. Default 0. Safe to toggle during builds via `make EXTRA_CFLAGS+=" -DHAKMEM_TINY_FRONT_GATE_BOX=1"`.
- Debug visibility任意: `HAKMEM_TINY_RF_TRACE=1`
- Force-notify任意, デバッグ補助): `HAKMEM_TINY_RF_FORCE_NOTIFY=1`
@ -32,7 +87,7 @@ Front Gate (A/B for boxified fast path)
- tput: `HAKMEM_TINY_SS_FORCE_LG=21`, `HAKMEM_TINY_SS_CACHE=0`, `HAKMEM_TINY_SS_PRECHARGE=0`
- pf: `HAKMEM_TINY_SS_FORCE_LG=20`, `HAKMEM_TINY_SS_CACHE=4`, `HAKMEM_TINY_SS_PRECHARGE=1`
Ultra Tiny (SLL-only, experimental)
## Ultra Tiny (SLL-only, experimental)
- HAKMEM_TINY_ULTRA=0/1
- Ultra TinyモードのON/OFFSLL中心の最小ホットパス
- HAKMEM_TINY_ULTRA_VALIDATE=0/1
@ -42,7 +97,7 @@ Ultra Tiny (SLL-only, experimental)
- HAKMEM_TINY_ULTRA_SLL_CAP_C{0..7}=N
- クラス別SLL上限上書き
SuperSlab adopt/publish実験
## SuperSlab adopt/publish実験
- HAKMEM_TINY_SS_ADOPT=0/1
- SuperSlab の publish/adopt + remote drain + owner移譲を有効化既定OFF
- 4T Larson など cross-thread free が多いワークロードで再利用密度を高めるための実験用スイッチ。
@ -60,22 +115,22 @@ SuperSlab adopt/publish実験
- remote queue がすでに非空old!=0でも、`slab_listed==0` の場合に publish を強制通知。
- 初回の空→非空通知を見逃した可能性をあぶり出す用途に有効A/B 推奨)。
Ready ListRefill最適化の箱
## Ready ListRefill最適化の箱
- 2025-12 cleanup: Ready系ENVは廃止。Ready ringは常時有効、幅/予算は固定width=TINY_READY_RING, budget=1
Background Remote Drain束ね箱・軽量ステップ
## Background Remote Drain束ね箱・軽量ステップ
- 2025-12 cleanup: BG Remote系ENVHAKMEM_TINY_BG_REMOTE*は廃止。BGリモート/aggregatorは固定OFF。
Ready AggregatorBG, 非破壊peek
## Ready AggregatorBG, 非破壊peek
- 2025-12 cleanup: Ready Aggregator系ENVも廃止固定OFF
Registry 窓探索コストのA/B
## Registry 窓探索コストのA/B
- HAKMEM_TINY_REG_SCAN_MAX=N
- Registry の“小窓”で走査する最大エントリ数既定256
- 値を小さくすると superslab_refill() と mmap直前ゲートでの探索コストが減る一方、adopt 命中率が低下し OOM/新規mmap が増える可能性あり。
- TinyHotなど命中率が高い場合は 64/128 などをA/B推奨。
Mid 向け簡素化リフィル1281024B向けの分岐削減
## Mid 向け簡素化リフィル1281024B向けの分岐削減
- HAKMEM_TINY_MID_REFILL_SIMPLE=0/1
- クラス>=4128B以上で、sticky/hot/mailbox/registry/adopt の多段探索をスキップし、
1) 既存TLSのSuperSlabに未使用Slabがあれば直接初期化→bind、
@ -224,7 +279,7 @@ New (debug isolation)
- 小クラス用の小型TLSマガジン128要素, classes 0..3を有効化。既定0A/B用
- alloc: HotMag→SLL→Magazine の順でヒットを狙う。free: SLL優先、溢れ時にHotMag→Magazine。
USDT/tracepointsperfのユーザ空間静的トレース
## USDT/tracepointsperfのユーザ空間静的トレース
- ビルド時に `CFLAGS+=-DHAKMEM_USDT=1` を付与すると、主要分岐にUSDTDTrace互換プローブが埋め込まれます。
- 依存: `<sys/sdt.h>`Debian/Ubuntu: `sudo apt-get install systemtap-sdt-dev`)。
- プローブ名provider=hakmem例:
@ -242,7 +297,7 @@ USDT/tracepointsperfのユーザ空間静的トレース
- `sudo sysctl kernel.perf_event_paranoid=1`
- WSLなど一部カーネルでは UPROBE/USDT が無効な場合がありますPMUのみにフォールバック
ビルドプリセットTinyHot最短フロント
## ビルドプリセットTinyHot最短フロント
- コンパイル時フラグ: `-DHAKMEM_TINY_MINIMAL_FRONT=1`
- 入口から UltraFront/Quick/Frontend/HotMag/SuperSlab try/BumpShadow を物理的に除去
- 残る経路: `SLL → TLS Magazine → SuperSlab →(以降のスローパス)`
@ -253,7 +308,7 @@ USDT/tracepointsperfのユーザ空間静的トレース
- 入口で SuperSlab TLSバンプ→SuperSlab直経路を優先ビルド除去ではなく分岐
- TinyHotでは概ね不利命令・分岐増なため、既定OFF。ベンチA/B用途のみ。
Scripts
## Scripts
- scripts/run_tiny_hot_triad.sh <cycles>
- scripts/run_tiny_benchfast_triad.sh <cycles> — bench-only fast path triad
- scripts/run_tiny_sllonly_triad.sh <cycles> — SLL-only + warmup + PGO triad
@ -495,4 +550,3 @@ Update History:
- 2025-11-29: Added benchmark env vars (BENCH_FAST_FRONT, BENCH_WARMUP, FREE_ROUTE_TRACE)
- 2025-11-29: Added HAKMEM_TINY_SS_TRUST_MMAP_ZERO build flag
- 2025-11-29: Marked DISABLE_MINCORE_CHECK as removed