Phase v6-1/2/3/4: SmallObject Core v6 - C6-only implementation + refactor

Phase v6-1: C6-only route stub (v1/pool fallback)
Phase v6-2: Segment v6 + ColdIface v6 + Core v6 HotPath implementation
  - 2MiB segment / 64KiB page allocation
  - O(1) ptr→page_meta lookup with segment masking
  - C6-heavy A/B: SEGV-free but -44% performance (15.3M ops/s)

Phase v6-3: Thin-layer optimization (TLS ownership check + batch header + refill batching)
  - TLS ownership fast-path skip page_meta for 90%+ of frees
  - Batch header writes during refill (32 allocs = 1 header write)
  - TLS batch refill (1/32 refill frequency)
  - C6-heavy A/B: v6-2 15.3M → v6-3 27.1M ops/s (±0% vs baseline) 

Phase v6-4: Mixed hang fix (segment metadata lookup correction)
  - Root cause: metadata lookup was reading mmap region instead of TLS slot
  - Fix: use TLS slot descriptor with in_use validation
  - Mixed health: 5M iterations SEGV-free, 35.8M ops/s 

Phase v6-refactor: Code quality improvements (macro unification + inline + docs)
  - Add SMALL_V6_* prefix macros (header, pointer conversion, page index)
  - Extract inline validation functions (small_page_v6_valid, small_ptr_in_segment_v6)
  - Doxygen-style comments for all public functions
  - Result: 0 compiler warnings, maintained +1.2% performance

Files:
- core/box/smallobject_core_v6_box.h (new, type & API definitions)
- core/box/smallobject_cold_iface_v6.h (new, cold iface API)
- core/box/smallsegment_v6_box.h (new, segment type definitions)
- core/smallobject_core_v6.c (new, C6 alloc/free implementation)
- core/smallobject_cold_iface_v6.c (new, refill/retire logic)
- core/smallsegment_v6.c (new, segment allocator)
- docs/analysis/SMALLOBJECT_CORE_V6_DESIGN.md (new, design document)
- core/box/tiny_route_env_box.h (modified, v6 route added)
- core/front/malloc_tiny_fast.h (modified, v6 case in route switch)
- Makefile (modified, v6 objects added)
- CURRENT_TASK.md (modified, v6 status added)

Status:
- C6-heavy: v6 OFF 27.1M → v6-3 ON 27.1M ops/s (±0%) 
- Mixed: v6 ON 35.8M ops/s (C6-only, other classes via v1) 
- Build: 0 warnings, fully documented 

🤖 Generated with Claude Code

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
This commit is contained in:
Moe Charm (CI)
2025-12-11 15:29:59 +09:00
parent 8789542a9f
commit c60199182e
15 changed files with 1305 additions and 37 deletions

View File

@ -43,6 +43,7 @@
#include "../box/smallobject_hotbox_v3_box.h" // SmallObject HotHeap v3 skeleton
#include "../box/smallobject_hotbox_v4_box.h" // SmallObject HotHeap v4 (C7 stub)
#include "../box/smallobject_hotbox_v5_box.h" // SmallObject HotHeap v5 (C6-only route stub, Phase v5-1)
#include "../box/smallobject_core_v6_box.h" // SmallObject Core v6 (C6-only route stub, Phase v6-1)
#include "../box/tiny_c7_ultra_box.h" // C7 ULTRA stub (UF-1, delegates to v3)
#include "../box/tiny_front_v3_env_box.h" // Tiny front v3 snapshot gate
#include "../box/tiny_heap_env_box.h" // ENV gate for TinyHeap front (A/B)
@ -136,7 +137,8 @@ static inline void* malloc_tiny_fast(size_t size) {
} else if (!route_trusted &&
route != TINY_ROUTE_LEGACY && route != TINY_ROUTE_HEAP &&
route != TINY_ROUTE_HOTHEAP_V2 && route != TINY_ROUTE_SMALL_HEAP_V3 &&
route != TINY_ROUTE_SMALL_HEAP_V4) {
route != TINY_ROUTE_SMALL_HEAP_V4 && route != TINY_ROUTE_SMALL_HEAP_V5 &&
route != TINY_ROUTE_SMALL_HEAP_V6) {
route = tiny_route_for_class((uint8_t)class_idx);
}
@ -155,6 +157,17 @@ static inline void* malloc_tiny_fast(size_t size) {
}
switch (route) {
case TINY_ROUTE_SMALL_HEAP_V6: {
// Phase v6-1: C6-only Core v6 route stub (pool v1 fallback)
SmallHeapCtxV6* ctx_v6 = small_heap_ctx_v6();
const SmallPolicySnapshotV6* snap_v6 = tiny_policy_snapshot_v6();
void* v6p = small_alloc_fast_v6(size, (uint32_t)class_idx, ctx_v6, snap_v6);
if (TINY_HOT_LIKELY(v6p != NULL)) {
return v6p;
}
// fallthrough to v5/v2/v1
__attribute__((fallthrough));
}
case TINY_ROUTE_SMALL_HEAP_V3: {
void* v3p = so_alloc((uint32_t)class_idx);
if (TINY_HOT_LIKELY(v3p != NULL)) {
@ -360,6 +373,13 @@ static inline int free_tiny_fast(void* ptr) {
// Same-thread + TinyHeap route → route-based free
if (__builtin_expect(use_tiny_heap, 0)) {
switch (route) {
case TINY_ROUTE_SMALL_HEAP_V6: {
// Phase v6-1: C6-only Core v6 route stub
SmallHeapCtxV6* ctx_v6 = small_heap_ctx_v6();
const SmallPolicySnapshotV6* snap_v6 = tiny_policy_snapshot_v6();
small_free_fast_v6(base, (uint32_t)class_idx, ctx_v6, snap_v6);
return 1;
}
case TINY_ROUTE_SMALL_HEAP_V5: {
// Phase v5-2: C6-only full implementation
SmallHeapCtxV5* ctx = small_heap_ctx_v5();