Files
hakmem/core/hakmem_tiny_superslab_constants.h
Moe Charm (CI) d2f0d84584 Phase 6-2.5: Fix SuperSlab alignment bug + refactor constants
## Problem: 53-byte misalignment mystery
**Symptom:** All SuperSlab allocations misaligned by exactly 53 bytes
```
[TRC_FAILFAST_PTR] stage=alloc_ret_align cls=7 ptr=0x..f835
offset=63541 (expected: 63488)
Diff: 63541 - 63488 = 53 bytes
```

## Root Cause (Ultrathink investigation)
**sizeof(SuperSlab) != hardcoded offset:**
- `sizeof(SuperSlab)` = 1088 bytes (actual struct size)
- `tiny_slab_base_for()` used: 1024 (hardcoded)
- `superslab_init_slab()` assumed: 2048 (in capacity calc)

**Impact:**
1. Memory corruption: 64-byte overlap with SuperSlab metadata
2. Misalignment: 1088 % 1024 = 64 (violates class 7 alignment)
3. Inconsistency: Init assumed 2048, but runtime used 1024

## Solution
### 1. Centralize constants (NEW)
**File:** `core/hakmem_tiny_superslab_constants.h`
- `SLAB_SIZE` = 64KB
- `SUPERSLAB_HEADER_SIZE` = 1088
- `SUPERSLAB_SLAB0_DATA_OFFSET` = 2048 (aligned to 1024)
- `SUPERSLAB_SLAB0_USABLE_SIZE` = 63488 (64KB - 2048)
- Compile-time validation checks

**Why 2048?**
- Round up 1088 to next 1024-byte boundary
- Ensures proper alignment for class 7 (1024-byte blocks)
- Previous: (1088 + 1023) & ~1023 = 2048

### 2. Update all code to use constants
- `hakmem_tiny_superslab.h`: `tiny_slab_base_for()` → use `SUPERSLAB_SLAB0_DATA_OFFSET`
- `hakmem_tiny_superslab.c`: `superslab_init_slab()` → use `SUPERSLAB_SLAB0_USABLE_SIZE`
- Removed hardcoded 1024, 2048 magic numbers

### 3. Add class consistency check
**File:** `core/tiny_superslab_alloc.inc.h:433-449`
- Verify `tls->ss->size_class == class_idx` before allocation
- Unbind TLS if mismatch detected
- Prevents using wrong block_size for calculations

## Status
⚠️ **INCOMPLETE - New issue discovered**

After fix, benchmark hits different error:
```
[TRC_FAILFAST] stage=freelist_next cls=7 node=0x...d474
```

Freelist corruption detected. Likely caused by:
- 2048 offset change affects free() path
- Block addresses no longer match freelist expectations
- Needs further investigation

## Files Modified
- `core/hakmem_tiny_superslab_constants.h` - NEW: Centralized constants
- `core/hakmem_tiny_superslab.h` - Use SUPERSLAB_SLAB0_DATA_OFFSET
- `core/hakmem_tiny_superslab.c` - Use SUPERSLAB_SLAB0_USABLE_SIZE
- `core/tiny_superslab_alloc.inc.h` - Add class consistency check
- `core/hakmem_tiny_init.inc` - Remove diet mode override (Phase 6-2.5)
- `core/hakmem_super_registry.h` - Remove debug output (cleaned)
- `PERFORMANCE_INVESTIGATION_REPORT.md` - Task agent analysis

## Next Steps
1. Investigate freelist corruption with 2048 offset
2. Verify free() path uses tiny_slab_base_for() correctly
3. Consider reverting to 1024 and fixing capacity calculation instead

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-07 21:45:20 +09:00

60 lines
2.3 KiB
C

// hakmem_tiny_superslab_constants.h - SuperSlab Layout Constants
// Purpose: Centralize all SuperSlab layout magic numbers
// Phase 6-2.5: Created to fix sizeof(SuperSlab) vs hardcoded offset mismatch
#ifndef HAKMEM_TINY_SUPERSLAB_CONSTANTS_H
#define HAKMEM_TINY_SUPERSLAB_CONSTANTS_H
// ============================================================================
// SuperSlab Layout Constants
// ============================================================================
// Size of each slab within SuperSlab (fixed, never changes)
#define SLAB_SIZE (64 * 1024) // 64KB per slab
// SuperSlab struct size (as of Phase 6-2.5)
// Actual value: sizeof(SuperSlab) = 1088 bytes
// This includes: magic, lg_size, size_class, total_active_blocks,
// remote_heads[], slabs[], slab_listed[], etc.
#define SUPERSLAB_HEADER_SIZE 1088
// Slab 0 data offset (CRITICAL: Must be aligned to largest block size)
// Phase 6-2.5 FIX: Changed from 1024 to 2048
//
// Why 2048?
// - sizeof(SuperSlab) = 1088 bytes
// - Largest block size = 1024 bytes (class 7)
// - Must round up to next 1024-byte boundary: (1088 + 1023) & ~1023 = 2048
//
// Layout:
// [0..1087] SuperSlab header (1088 bytes)
// [1088..2047] Padding (960 bytes, unused)
// [2048..65535] Slab 0 data (63488 bytes = 64KB - 2048)
//
// Previous value (1024) caused:
// - 64-byte overlap with SuperSlab metadata (corruption)
// - Misalignment for class 7 allocations (1024 % 1024 != 0)
#define SUPERSLAB_SLAB0_DATA_OFFSET 2048
// Slab 0 usable size (for capacity calculation)
#define SUPERSLAB_SLAB0_USABLE_SIZE (SLAB_SIZE - SUPERSLAB_SLAB0_DATA_OFFSET) // 63488 bytes
// Regular slab (i > 0) usable size
#define SUPERSLAB_SLAB_USABLE_SIZE SLAB_SIZE // 65536 bytes
// ============================================================================
// Validation (compile-time check)
// ============================================================================
// Ensure SLAB0_DATA_OFFSET is aligned to largest block size (1024)
#if (SUPERSLAB_SLAB0_DATA_OFFSET % 1024) != 0
#error "SUPERSLAB_SLAB0_DATA_OFFSET must be 1024-byte aligned for class 7"
#endif
// Ensure SLAB0_DATA_OFFSET is large enough to contain SuperSlab header
#if SUPERSLAB_SLAB0_DATA_OFFSET < SUPERSLAB_HEADER_SIZE
#error "SUPERSLAB_SLAB0_DATA_OFFSET must be >= sizeof(SuperSlab)"
#endif
#endif // HAKMEM_TINY_SUPERSLAB_CONSTANTS_H