2025-11-08 01:18:37 +09:00
|
|
|
|
# Current Task – 2025-11-08
|
2025-11-05 16:47:04 +09:00
|
|
|
|
|
2025-11-08 01:18:37 +09:00
|
|
|
|
## ✅ 完了: 二重割り当てバグの修正
|
2025-11-07 17:34:24 +09:00
|
|
|
|
|
2025-11-08 01:18:37 +09:00
|
|
|
|
### 根本原因
|
|
|
|
|
|
`trc_linear_carve()` が `meta->used` をカーソルとして使用していたが、`meta->used` はブロック解放時に減少するため、既に割り当て済みのブロックが再度カーブされる**二重割り当てバグ**が発生していた。
|
2025-11-07 17:34:24 +09:00
|
|
|
|
|
2025-11-08 01:18:37 +09:00
|
|
|
|
### 発見プロセス
|
|
|
|
|
|
1. Fail-Fast 診断ログで TLS SLL head の破壊を検出 (`0x...fcf1` = 241バイトの misalignment)
|
|
|
|
|
|
2. 配布ポインタの next 読み取り時にユーザーデータ (`0x6261` = ASCII "ab") を検出
|
|
|
|
|
|
3. ログ解析で同じブロック (offset 0xFC00 = 64512) が 2回割り当てられていることを確認
|
|
|
|
|
|
4. LINEAR_CARVE ログで `used=61 batch=1` → `used=59 batch=3` の矛盾を発見
|
2025-11-05 12:31:14 +09:00
|
|
|
|
|
2025-11-08 01:18:37 +09:00
|
|
|
|
### 証拠ログ
|
2025-11-05 12:31:14 +09:00
|
|
|
|
```
|
2025-11-08 01:18:37 +09:00
|
|
|
|
[LINEAR_CARVE] base=0x...600800 used=61 batch=1 → ブロック 61 を作成
|
|
|
|
|
|
(いくつかのブロックが解放され、used が 62 → 59 に減少)
|
|
|
|
|
|
[LINEAR_CARVE] base=0x...600800 used=59 batch=3 → ブロック 59, 60, 61 を再作成!
|
2025-11-05 12:31:14 +09:00
|
|
|
|
```
|
|
|
|
|
|
|
2025-11-08 01:18:37 +09:00
|
|
|
|
### 実装した修正
|
2025-11-05 12:31:14 +09:00
|
|
|
|
|
2025-11-08 01:18:37 +09:00
|
|
|
|
**1. `TinySlabMeta` 構造体に `carved` フィールド追加** (`core/superslab/superslab_types.h`)
|
2025-11-05 12:31:14 +09:00
|
|
|
|
```c
|
2025-11-08 01:18:37 +09:00
|
|
|
|
typedef struct TinySlabMeta {
|
|
|
|
|
|
void* freelist;
|
|
|
|
|
|
uint16_t used; // 現在使用中のブロック数(増減両方)
|
|
|
|
|
|
uint16_t capacity;
|
|
|
|
|
|
uint16_t carved; // 線形領域からカーブしたブロック数(単調増加のみ)
|
|
|
|
|
|
uint16_t owner_tid; // uint32_t → uint16_t に変更
|
|
|
|
|
|
} TinySlabMeta;
|
2025-11-05 12:31:14 +09:00
|
|
|
|
```
|
|
|
|
|
|
|
2025-11-08 01:18:37 +09:00
|
|
|
|
**2. `trc_linear_carve()` を修正** (`core/tiny_refill_opt.h`)
|
2025-11-05 12:31:14 +09:00
|
|
|
|
```c
|
2025-11-08 01:18:37 +09:00
|
|
|
|
// Before: meta->used をカーソルとして使用(バグ!)
|
|
|
|
|
|
uint8_t* cursor = base + ((size_t)meta->used * bs);
|
|
|
|
|
|
meta->used += batch;
|
2025-11-05 12:31:14 +09:00
|
|
|
|
|
2025-11-08 01:18:37 +09:00
|
|
|
|
// After: meta->carved をカーソルとして使用(修正版)
|
|
|
|
|
|
uint8_t* cursor = base + ((size_t)meta->carved * bs);
|
|
|
|
|
|
meta->carved += batch; // 単調増加のみ
|
|
|
|
|
|
meta->used += batch; // 使用中カウントも更新
|
2025-11-05 12:31:14 +09:00
|
|
|
|
```
|
|
|
|
|
|
|
2025-11-08 01:18:37 +09:00
|
|
|
|
**3. 初期化コード追加** (`core/hakmem_tiny_superslab.c`)
|
2025-11-05 12:31:14 +09:00
|
|
|
|
```c
|
2025-11-08 01:18:37 +09:00
|
|
|
|
meta->carved = 0; // carved カウンター初期化
|
|
|
|
|
|
meta->owner_tid = (uint16_t)owner_tid; // uint16_t にキャスト
|
2025-11-05 12:31:14 +09:00
|
|
|
|
```
|
|
|
|
|
|
|
2025-11-08 01:18:37 +09:00
|
|
|
|
### テスト結果
|
2025-11-05 12:31:14 +09:00
|
|
|
|
```bash
|
2025-11-08 01:18:37 +09:00
|
|
|
|
# Fail-fast モード(診断ログあり)
|
|
|
|
|
|
HAKMEM_TINY_REFILL_FAILFAST=2 ./bench_random_mixed_hakmem 50000 2048 1234567
|
|
|
|
|
|
→ ✅ 651,627 ops/s (クラッシュなし)
|
2025-11-05 12:31:14 +09:00
|
|
|
|
|
2025-11-08 01:18:37 +09:00
|
|
|
|
# 通常モード(診断ログなし)
|
|
|
|
|
|
./bench_random_mixed_hakmem 50000 2048 1234567
|
|
|
|
|
|
→ ✅ 950,037 ops/s (クラッシュなし)
|
2025-11-05 12:31:14 +09:00
|
|
|
|
```
|
|
|
|
|
|
|
2025-11-08 01:18:37 +09:00
|
|
|
|
### 修正されたファイル
|
|
|
|
|
|
- `core/superslab/superslab_types.h` - `TinySlabMeta` に `carved` フィールド追加
|
|
|
|
|
|
- `core/tiny_refill_opt.h` - `trc_linear_carve()` を `carved` 使用に修正
|
|
|
|
|
|
- `core/hakmem_tiny_superslab.c` - `carved` 初期化
|
|
|
|
|
|
- `core/tiny_alloc_fast.inc.h` - 診断ログ追加 (次ポインタ検証)
|
|
|
|
|
|
- `core/hakmem_tiny_free.inc` - 診断ログ追加 (drain/free 検証)
|
2025-11-05 12:31:14 +09:00
|
|
|
|
|
2025-11-08 01:18:37 +09:00
|
|
|
|
## 次のステップ
|
2025-11-05 12:31:14 +09:00
|
|
|
|
|
2025-11-08 01:18:37 +09:00
|
|
|
|
1. **診断ログのクリーンアップ** (Optional)
|
|
|
|
|
|
- Fail-Fast ログを本番向けに最適化
|
|
|
|
|
|
- デバッグ用のログを削除
|
2025-11-05 12:31:14 +09:00
|
|
|
|
|
2025-11-08 01:18:37 +09:00
|
|
|
|
2. **性能ベンチマーク**
|
|
|
|
|
|
- `bench_random_mixed` でスループット計測
|
|
|
|
|
|
- Larson ベンチマークで検証
|
|
|
|
|
|
- System/mimalloc との比較
|
2025-11-05 12:31:14 +09:00
|
|
|
|
|
2025-11-08 01:18:37 +09:00
|
|
|
|
3. **追加テスト**
|
|
|
|
|
|
- マルチスレッドストレステスト
|
|
|
|
|
|
- 長時間実行テスト
|
2025-11-05 12:31:14 +09:00
|
|
|
|
|
2025-11-08 01:18:37 +09:00
|
|
|
|
## 実行コマンド
|
|
|
|
|
|
```bash
|
|
|
|
|
|
# 通常テスト
|
|
|
|
|
|
HAKMEM_TINY_USE_SUPERSLAB=1 ./bench_random_mixed_hakmem 50000 2048 1234567
|
2025-11-05 12:31:14 +09:00
|
|
|
|
|
2025-11-08 01:18:37 +09:00
|
|
|
|
# Fail-fast 診断モード
|
|
|
|
|
|
HAKMEM_TINY_REFILL_FAILFAST=2 HAKMEM_TINY_USE_SUPERSLAB=1 \
|
|
|
|
|
|
./bench_random_mixed_hakmem 50000 2048 1234567
|
2025-11-05 12:31:14 +09:00
|
|
|
|
```
|