144 lines
7.1 KiB
Markdown
144 lines
7.1 KiB
Markdown
|
|
# TLS_SLL_HDR_RESET Investigation V2
|
|||
|
|
|
|||
|
|
TLS SLLヘッダー破損を「箱理論」で根治するためのChatGPT向け指示書。現状と仮説を整理し、再現手順と修正パターンをまとめる。
|
|||
|
|
Box境界で原因を特定し、A/Bで戻せる形で修正すること。
|
|||
|
|
|
|||
|
|
## 現在の状況
|
|||
|
|
|
|||
|
|
- ✅ ヘッダー書き込みデフォルトON(`core/tiny_region_id.h`、`HAKMEM_TINY_WRITE_HEADER`未設定で書く)
|
|||
|
|
- ✅ ASan版 `libhakmem_asan.so` では sh8bench baseline / SAFEHEADER いずれも `TLS_SLL_HDR_RESET` 未再現(`sh8bench_baseline_v2.log`, `sh8bench_safeheader_v2.log`)
|
|||
|
|
- ❌ リリース版 `libhakmem.so` は `unified_cache_refill` 内で SIGSEGV(TLS SLLに到達する前に崩れる)
|
|||
|
|
- ❓ 過去にリリース版 sh8bench で `[TLS_SLL_HDR_RESET]` が発生していたが、現在はクラッシュが優先して観測(TLS SLL経路が怪しいまま)
|
|||
|
|
|
|||
|
|
### 直近の再現結果(release + gdb)
|
|||
|
|
- `unified_cache_refill+1128` で SEGV。`meta->freelist` が **スラブ基底を 8bit 右シフトした値**(例: slab_base=0x7fffc02d0000 → freelist=0x0000007fffc02d20)になっており、生アドレスではない。
|
|||
|
|
- `TinySlabMeta` も汚染されており、`used=0x1e80`(capacity=0x0400を大きく超過)など整合性崩壊。スラブ内部へのオフセット(0x2000相当)を持った「圧縮ポインタ」風の値が freelist に混入している可能性が高い。
|
|||
|
|
- 仮説A/B を再強調:freelist 書き込み境界(free_remote/local/TLS SLL drain/remote drain)でポインタが右シフト(region-id?)された形で保存されている箇所を watch する必要あり。
|
|||
|
|
|
|||
|
|
## 新仮説(3本)
|
|||
|
|
|
|||
|
|
- **仮説A: unified_cache_refill → free → TLS SLL 経路でヘッダー復元漏れ**
|
|||
|
|
- unified cacheで返したバッファがfree時にTLS SLLへ落ちる経路でヘッダー未復元/破損。
|
|||
|
|
- 先にクラッシュするので経路の可視化が必要。
|
|||
|
|
|
|||
|
|
- **仮説B: TLS SLL内部での破損**
|
|||
|
|
- `tiny_tls_sll_push()`がヘッダーを書かない/順序が逆(next上書き先行)/競合で壊す。
|
|||
|
|
- push直前のヘッダー値が既に壊れている可能性も含め検証。
|
|||
|
|
|
|||
|
|
- **仮説C: Class Mapとヘッダー契約の不整合**
|
|||
|
|
- Class Map経路ではヘッダー不要の前提だが、TLS SLL popは検証を要求。
|
|||
|
|
- `g_write_header`のON/OFFと検証条件がズレている可能性。
|
|||
|
|
|
|||
|
|
## デバッグ手順(4ステップ)
|
|||
|
|
|
|||
|
|
### Step 1: 詳細ログ有効化
|
|||
|
|
```bash
|
|||
|
|
cd /mnt/workdisk/public_share/hakmem
|
|||
|
|
HAKMEM_TINY_SLL_RING=1 HAKMEM_DEBUG_LEVEL=3 \
|
|||
|
|
LD_PRELOAD=./libhakmem.so ./mimalloc-bench/out/bench/sh8bench \
|
|||
|
|
2>&1 | tee sh8bench_tls_sll_debug.log
|
|||
|
|
|
|||
|
|
grep -E "TLS_SLL_HDR_RESET|TLS_SLL_PUSH|TLS_SLL_POP" sh8bench_tls_sll_debug.log | head -50
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### Step 2: TLS SLL push境界の検証
|
|||
|
|
- 対象: `core/box/tls_sll_box.h` の `tiny_tls_sll_push()`
|
|||
|
|
- 確認ポイント:
|
|||
|
|
1. `tiny_class_preserves_header` のとき `*(uint8_t*)raw_base = 0xa0 | cls` を必ず実行しているか
|
|||
|
|
2. next書き込みより前にヘッダーを書き、`__atomic_thread_fence(__ATOMIC_RELEASE)` で順序を固定しているか
|
|||
|
|
- 必要なら一時的にトレースを挿入(非リリース限定)して push前ヘッダー値を記録。
|
|||
|
|
|
|||
|
|
### Step 3: unified_cache_refill→free→TLS SLL経路の追跡
|
|||
|
|
- 対象ファイル:
|
|||
|
|
- `core/front/tiny_unified_cache.c` (`unified_cache_refill`, `unified_cache_free_list_drain`)
|
|||
|
|
- `core/hakmem_tiny_free.inc` / `core/box/tiny_front_cold_box.h`(free入口→TLS SLL)
|
|||
|
|
- 手順:
|
|||
|
|
1. `unified_cache_refill` の out[] 生成直後に `tiny_header_validate` を一度呼んでヘッダーの健全性をリングに記録(ワンショット)。
|
|||
|
|
2. free経路で TLS SLL に入る直前(push直前)にも同じ base でヘッダー値を記録し、差分を見る。
|
|||
|
|
3. 再現しやすさのため `HAKMEM_TINY_UNIFIED_CACHE=0` で迂回し、TLS SLL経路で再現有無を分離。
|
|||
|
|
|
|||
|
|
### Step 4: SAFEHEADER検証
|
|||
|
|
```bash
|
|||
|
|
HAKMEM_TINY_SLL_SAFEHEADER=1 HAKMEM_TINY_SLL_VALIDATE_HDR=1 \
|
|||
|
|
HAKMEM_TINY_SLL_RING=1 HAKMEM_DEBUG_LEVEL=3 \
|
|||
|
|
LD_PRELOAD=./libhakmem.so ./mimalloc-bench/out/bench/sh8bench \
|
|||
|
|
2>&1 | tee sh8bench_safeheader_debug.log
|
|||
|
|
|
|||
|
|
grep -E "TLS_SLL_PUSH_BAD_HDR|TLS_SLL_REJECT|TLS_SLL_HDR_RESET" sh8bench_safeheader_debug.log
|
|||
|
|
```
|
|||
|
|
- push側で拒否が出れば仮説B/Cを優先。
|
|||
|
|
|
|||
|
|
## 修正パターン(A/B/C)
|
|||
|
|
|
|||
|
|
- **パターンA: TLS SLL pushで常にヘッダー復元(境界固定)**
|
|||
|
|
- `tiny_tls_sll_push()` の先頭でヘッダーを書き戻し + release fence。
|
|||
|
|
- Box境界をpushに集約し、他経路の漏れを吸収。
|
|||
|
|
|
|||
|
|
- **パターンB: unified_cache_refill境界でヘッダー確定**
|
|||
|
|
- `unified_cache_refill` が out[] へ入れる直前に `tiny_header_write_if_preserved` を実行。
|
|||
|
|
- free経路でTLS SLLに落ちる前にヘッダーが既に正しいことを保証。
|
|||
|
|
- 必要なら `HAKMEM_TINY_UNIFIED_CACHE=0` でA/B切替を残す。
|
|||
|
|
|
|||
|
|
- **パターンC: Class Mapと検証条件の整合**
|
|||
|
|
- `g_write_header` がOFFのときは TLS SLL pop 検証をスキップするか、Class Map経路をTLS SLLから分離。
|
|||
|
|
- ONの場合は push/pop 双方で `tiny_class_preserves_header` を強制し、Fail-Fastで露呈。
|
|||
|
|
|
|||
|
|
## 環境変数
|
|||
|
|
```bash
|
|||
|
|
# ログ/検証
|
|||
|
|
HAKMEM_TINY_SLL_RING=1
|
|||
|
|
HAKMEM_TINY_SLL_VALIDATE_HDR=1
|
|||
|
|
HAKMEM_TINY_SLL_SAFEHEADER=1
|
|||
|
|
HAKMEM_DEBUG_LEVEL=3
|
|||
|
|
|
|||
|
|
# 経路A/B切替
|
|||
|
|
HAKMEM_TINY_WRITE_HEADER=1 # 既定でON(省略可)
|
|||
|
|
HAKMEM_TINY_UNIFIED_CACHE=0 # unified cache無効化で分離試験
|
|||
|
|
|
|||
|
|
# 追加トレース
|
|||
|
|
HAKMEM_WRAP_DIAG=1
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## ビルド方法
|
|||
|
|
```bash
|
|||
|
|
cd /mnt/workdisk/public_share/hakmem
|
|||
|
|
find . -name "*.o" -delete
|
|||
|
|
find . -name "*.so" -delete
|
|||
|
|
|
|||
|
|
# リリース相当
|
|||
|
|
make shared -j8
|
|||
|
|
|
|||
|
|
# ASan
|
|||
|
|
make asan-shared-alloc -j8
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## テスト手順
|
|||
|
|
```bash
|
|||
|
|
# ベースライン(リリース): クラッシュ/RESETの有無確認
|
|||
|
|
LD_PRELOAD=./libhakmem.so ./mimalloc-bench/out/bench/sh8bench \
|
|||
|
|
2>&1 | tee sh8bench_baseline_v3.log
|
|||
|
|
|
|||
|
|
# unified cache切替
|
|||
|
|
HAKMEM_TINY_UNIFIED_CACHE=0 LD_PRELOAD=./libhakmem.so \
|
|||
|
|
./mimalloc-bench/out/bench/sh8bench 2>&1 | tee sh8bench_uc_off.log
|
|||
|
|
|
|||
|
|
# SAFEHEADER強化
|
|||
|
|
HAKMEM_TINY_SLL_SAFEHEADER=1 HAKMEM_TINY_SLL_VALIDATE_HDR=1 \
|
|||
|
|
HAKMEM_TINY_SLL_RING=1 HAKMEM_DEBUG_LEVEL=3 \
|
|||
|
|
LD_PRELOAD=./libhakmem.so ./mimalloc-bench/out/bench/sh8bench \
|
|||
|
|
2>&1 | tee sh8bench_safeheader_v3.log
|
|||
|
|
```
|
|||
|
|
- いずれも `[TLS_SLL_HDR_RESET]` や SIGSEGV が出た場合はリング先頭〜直前のイベントを確認。
|
|||
|
|
|
|||
|
|
## 調査対象ファイル(優先度順)
|
|||
|
|
- `core/front/tiny_unified_cache.c` (仮説A/Bの境界)
|
|||
|
|
- `core/box/tls_sll_box.h` (push/pop実装、仮説B/A)
|
|||
|
|
- `core/hakmem_tiny_free.inc`, `core/box/tiny_front_cold_box.h` (free入口→TLS SLL)
|
|||
|
|
- `core/tiny_region_id.h`, `core/box/tiny_header_box.h` (ヘッダー契約とClass Map、仮説C)
|
|||
|
|
- 参考: `docs/tls_sll_header_corruption_investigation.md`(初回調査ログ)
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
この指示書をChatGPTに渡せば、`TLS_SLL_HDR_RESET` と unified cacheクラッシュの根本原因を箱境界で特定・修正できる。
|
|||
|
|
Step 2〜3で経路を可視化し、A/B/Cのいずれか(または組み合わせ)で確実に「書くべき場所でヘッダーを復元する」こと。
|