Phase v11a-3: MID v3.5 Activation (Build Complete)
Integrated MID v3.5 into active code path, making it available for C5/C6/C7 routing. Key Changes: - Policy Box: Added SMALL_ROUTE_MID_V35 with ENV gates (HAKMEM_MID_V35_ENABLED, HAKMEM_MID_V35_CLASSES) - HotBox: Implemented small_mid_v35_alloc/free with TLS-cached page allocation - Front Gate: Wired MID_V35 routing into malloc_tiny_fast.h (priority: ULTRA > MID_V35 > V7) - Build: Added core/smallobject_mid_v35.o to all object lists Architecture: - Slot sizes: C5=384B, C6=512B, C7=1024B - Page size: 64KB (170/128/64 slots) - Integration: ColdIface v2 (refill/retire), Stats v2 (observation), Learner v2 (dormant) Status: Build successful, ready for A/B benchmarking Next: Performance validation (C6-heavy, C5+C6-only, Mixed benchmarks) 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
2131
CURRENT_TASK.md
2131
CURRENT_TASK.md
File diff suppressed because it is too large
Load Diff
6
Makefile
6
Makefile
@ -218,7 +218,7 @@ LDFLAGS += $(EXTRA_LDFLAGS)
|
|||||||
|
|
||||||
# Targets
|
# Targets
|
||||||
TARGET = test_hakmem
|
TARGET = test_hakmem
|
||||||
OBJS_BASE = hakmem.o hakmem_config.o hakmem_tiny_config.o hakmem_ucb1.o hakmem_bigcache.o hakmem_pool.o hakmem_l25_pool.o hakmem_site_rules.o hakmem_tiny.o core/box/ss_allocation_box.o superslab_stats.o superslab_cache.o superslab_ace.o superslab_slab.o superslab_backend.o core/superslab_head_stub.o hakmem_smallmid.o tiny_sticky.o tiny_remote.o tiny_publish.o tiny_debug_ring.o hakmem_tiny_magazine.o hakmem_tiny_stats.o hakmem_tiny_sfc.o hakmem_tiny_query.o hakmem_tiny_rss.o hakmem_tiny_registry.o hakmem_tiny_remote_target.o hakmem_tiny_bg_spill.o tiny_adaptive_sizing.o hakmem_super_registry.o hakmem_shared_pool.o hakmem_shared_pool_acquire.o hakmem_shared_pool_release.o hakmem_elo.o hakmem_batch.o hakmem_p2.o hakmem_sizeclass_dist.o hakmem_evo.o hakmem_debug.o hakmem_sys.o hakmem_whale.o hakmem_policy.o hakmem_ace.o hakmem_ace_stats.o hakmem_prof.o hakmem_learner.o hakmem_size_hist.o hakmem_learn_log.o hakmem_syscall.o hakmem_ace_metrics.o hakmem_ace_ucb1.o hakmem_ace_controller.o tiny_fastcache.o core/box/superslab_expansion_box.o core/box/integrity_box.o core/box/free_publish_box.o core/box/mailbox_box.o core/box/front_gate_box.o core/box/front_gate_classifier.o core/box/capacity_box.o core/box/carve_push_box.o core/box/prewarm_box.o core/box/ss_hot_prewarm_box.o core/box/front_metrics_box.o core/box/bench_fast_box.o core/box/ss_addr_map_box.o core/box/slab_recycling_box.o core/box/pagefault_telemetry_box.o core/box/tiny_sizeclass_hist_box.o core/box/tiny_env_box.o core/box/tiny_route_box.o core/box/free_front_v3_env_box.o core/box/free_path_stats_box.o core/box/free_dispatch_stats_box.o core/box/alloc_gate_stats_box.o core/box/tiny_c6_ultra_free_box.o core/box/tiny_c5_ultra_free_box.o core/box/tiny_c4_ultra_free_box.o core/box/tiny_page_box.o core/box/tiny_class_policy_box.o core/box/tiny_class_stats_box.o core/box/tiny_policy_learner_box.o core/box/ss_budget_box.o core/box/tiny_mem_stats_box.o core/box/c7_meta_used_counter_box.o core/box/wrapper_env_box.o core/box/madvise_guard_box.o core/box/libm_reloc_guard_box.o core/box/ptr_trace_box.o core/box/link_missing_stubs.o core/box/super_reg_box.o core/box/shared_pool_box.o core/box/remote_side_box.o core/page_arena.o core/front/tiny_unified_cache.o core/tiny_alloc_fast_push.o core/tiny_c7_ultra_segment.o core/tiny_c7_ultra.o core/link_stubs.o core/tiny_failfast.o core/tiny_destructors.o core/smallobject_hotbox_v3.o core/smallobject_hotbox_v4.o core/smallobject_hotbox_v5.o core/smallsegment_v5.o core/smallobject_cold_iface_v5.o core/smallsegment_v6.o core/smallobject_cold_iface_v6.o core/smallobject_core_v6.o core/region_id_v6.o core/smallsegment_v7.o core/smallobject_cold_iface_v7.o core/mid_hotbox_v3.o core/smallobject_policy_v7.o core/smallobject_segment_mid_v3.o core/smallobject_cold_iface_mid_v3.o core/smallobject_stats_mid_v3.o core/smallobject_learner_v2.o
|
OBJS_BASE = hakmem.o hakmem_config.o hakmem_tiny_config.o hakmem_ucb1.o hakmem_bigcache.o hakmem_pool.o hakmem_l25_pool.o hakmem_site_rules.o hakmem_tiny.o core/box/ss_allocation_box.o superslab_stats.o superslab_cache.o superslab_ace.o superslab_slab.o superslab_backend.o core/superslab_head_stub.o hakmem_smallmid.o tiny_sticky.o tiny_remote.o tiny_publish.o tiny_debug_ring.o hakmem_tiny_magazine.o hakmem_tiny_stats.o hakmem_tiny_sfc.o hakmem_tiny_query.o hakmem_tiny_rss.o hakmem_tiny_registry.o hakmem_tiny_remote_target.o hakmem_tiny_bg_spill.o tiny_adaptive_sizing.o hakmem_super_registry.o hakmem_shared_pool.o hakmem_shared_pool_acquire.o hakmem_shared_pool_release.o hakmem_elo.o hakmem_batch.o hakmem_p2.o hakmem_sizeclass_dist.o hakmem_evo.o hakmem_debug.o hakmem_sys.o hakmem_whale.o hakmem_policy.o hakmem_ace.o hakmem_ace_stats.o hakmem_prof.o hakmem_learner.o hakmem_size_hist.o hakmem_learn_log.o hakmem_syscall.o hakmem_ace_metrics.o hakmem_ace_ucb1.o hakmem_ace_controller.o tiny_fastcache.o core/box/superslab_expansion_box.o core/box/integrity_box.o core/box/free_publish_box.o core/box/mailbox_box.o core/box/front_gate_box.o core/box/front_gate_classifier.o core/box/capacity_box.o core/box/carve_push_box.o core/box/prewarm_box.o core/box/ss_hot_prewarm_box.o core/box/front_metrics_box.o core/box/bench_fast_box.o core/box/ss_addr_map_box.o core/box/slab_recycling_box.o core/box/pagefault_telemetry_box.o core/box/tiny_sizeclass_hist_box.o core/box/tiny_env_box.o core/box/tiny_route_box.o core/box/free_front_v3_env_box.o core/box/free_path_stats_box.o core/box/free_dispatch_stats_box.o core/box/alloc_gate_stats_box.o core/box/tiny_c6_ultra_free_box.o core/box/tiny_c5_ultra_free_box.o core/box/tiny_c4_ultra_free_box.o core/box/tiny_page_box.o core/box/tiny_class_policy_box.o core/box/tiny_class_stats_box.o core/box/tiny_policy_learner_box.o core/box/ss_budget_box.o core/box/tiny_mem_stats_box.o core/box/c7_meta_used_counter_box.o core/box/wrapper_env_box.o core/box/madvise_guard_box.o core/box/libm_reloc_guard_box.o core/box/ptr_trace_box.o core/box/link_missing_stubs.o core/box/super_reg_box.o core/box/shared_pool_box.o core/box/remote_side_box.o core/page_arena.o core/front/tiny_unified_cache.o core/tiny_alloc_fast_push.o core/tiny_c7_ultra_segment.o core/tiny_c7_ultra.o core/link_stubs.o core/tiny_failfast.o core/tiny_destructors.o core/smallobject_hotbox_v3.o core/smallobject_hotbox_v4.o core/smallobject_hotbox_v5.o core/smallsegment_v5.o core/smallobject_cold_iface_v5.o core/smallsegment_v6.o core/smallobject_cold_iface_v6.o core/smallobject_core_v6.o core/region_id_v6.o core/smallsegment_v7.o core/smallobject_cold_iface_v7.o core/mid_hotbox_v3.o core/smallobject_policy_v7.o core/smallobject_segment_mid_v3.o core/smallobject_cold_iface_mid_v3.o core/smallobject_stats_mid_v3.o core/smallobject_learner_v2.o core/smallobject_mid_v35.o
|
||||||
OBJS = $(OBJS_BASE)
|
OBJS = $(OBJS_BASE)
|
||||||
|
|
||||||
# Shared library
|
# Shared library
|
||||||
@ -250,7 +250,7 @@ endif
|
|||||||
# Benchmark targets
|
# Benchmark targets
|
||||||
BENCH_HAKMEM = bench_allocators_hakmem
|
BENCH_HAKMEM = bench_allocators_hakmem
|
||||||
BENCH_SYSTEM = bench_allocators_system
|
BENCH_SYSTEM = bench_allocators_system
|
||||||
BENCH_HAKMEM_OBJS_BASE = hakmem.o hakmem_config.o hakmem_tiny_config.o hakmem_ucb1.o hakmem_bigcache.o hakmem_pool.o hakmem_l25_pool.o hakmem_site_rules.o hakmem_tiny.o core/box/ss_allocation_box.o superslab_stats.o superslab_cache.o superslab_ace.o superslab_slab.o superslab_backend.o core/superslab_head_stub.o hakmem_smallmid.o tiny_sticky.o tiny_remote.o tiny_publish.o tiny_debug_ring.o hakmem_tiny_magazine.o hakmem_tiny_stats.o hakmem_tiny_sfc.o hakmem_tiny_query.o hakmem_tiny_rss.o hakmem_tiny_registry.o hakmem_tiny_remote_target.o hakmem_tiny_bg_spill.o tiny_adaptive_sizing.o hakmem_super_registry.o hakmem_shared_pool.o hakmem_shared_pool_acquire.o hakmem_shared_pool_release.o hakmem_elo.o hakmem_batch.o hakmem_p2.o hakmem_sizeclass_dist.o hakmem_evo.o hakmem_debug.o hakmem_sys.o hakmem_whale.o hakmem_policy.o hakmem_ace.o hakmem_ace_stats.o hakmem_prof.o hakmem_learner.o hakmem_size_hist.o hakmem_learn_log.o hakmem_syscall.o hakmem_ace_metrics.o hakmem_ace_ucb1.o hakmem_ace_controller.o tiny_fastcache.o core/box/superslab_expansion_box.o core/box/integrity_box.o core/box/free_publish_box.o core/box/mailbox_box.o core/box/front_gate_box.o core/box/front_gate_classifier.o core/box/capacity_box.o core/box/carve_push_box.o core/box/prewarm_box.o core/box/ss_hot_prewarm_box.o core/box/front_metrics_box.o core/box/bench_fast_box.o core/box/ss_addr_map_box.o core/box/slab_recycling_box.o core/box/pagefault_telemetry_box.o core/box/tiny_sizeclass_hist_box.o core/box/tiny_env_box.o core/box/tiny_route_box.o core/box/free_front_v3_env_box.o core/box/free_path_stats_box.o core/box/free_dispatch_stats_box.o core/box/alloc_gate_stats_box.o core/box/tiny_c6_ultra_free_box.o core/box/tiny_c5_ultra_free_box.o core/box/tiny_c4_ultra_free_box.o core/box/tiny_page_box.o core/box/tiny_class_policy_box.o core/box/tiny_class_stats_box.o core/box/tiny_policy_learner_box.o core/box/ss_budget_box.o core/box/tiny_mem_stats_box.o core/box/c7_meta_used_counter_box.o core/box/wrapper_env_box.o core/box/madvise_guard_box.o core/box/libm_reloc_guard_box.o core/box/ptr_trace_box.o core/box/link_missing_stubs.o core/box/super_reg_box.o core/box/shared_pool_box.o core/box/remote_side_box.o core/page_arena.o core/front/tiny_unified_cache.o core/tiny_alloc_fast_push.o core/tiny_c7_ultra_segment.o core/tiny_c7_ultra.o core/link_stubs.o core/tiny_failfast.o core/tiny_destructors.o core/smallobject_hotbox_v3.o core/smallobject_hotbox_v4.o core/smallobject_hotbox_v5.o core/smallsegment_v5.o core/smallobject_cold_iface_v5.o core/smallsegment_v6.o core/smallobject_cold_iface_v6.o core/smallobject_core_v6.o core/region_id_v6.o core/smallsegment_v7.o core/smallobject_cold_iface_v7.o core/mid_hotbox_v3.o core/smallobject_policy_v7.o core/smallobject_segment_mid_v3.o core/smallobject_cold_iface_mid_v3.o core/smallobject_stats_mid_v3.o core/smallobject_learner_v2.o bench_allocators_hakmem.o
|
BENCH_HAKMEM_OBJS_BASE = hakmem.o hakmem_config.o hakmem_tiny_config.o hakmem_ucb1.o hakmem_bigcache.o hakmem_pool.o hakmem_l25_pool.o hakmem_site_rules.o hakmem_tiny.o core/box/ss_allocation_box.o superslab_stats.o superslab_cache.o superslab_ace.o superslab_slab.o superslab_backend.o core/superslab_head_stub.o hakmem_smallmid.o tiny_sticky.o tiny_remote.o tiny_publish.o tiny_debug_ring.o hakmem_tiny_magazine.o hakmem_tiny_stats.o hakmem_tiny_sfc.o hakmem_tiny_query.o hakmem_tiny_rss.o hakmem_tiny_registry.o hakmem_tiny_remote_target.o hakmem_tiny_bg_spill.o tiny_adaptive_sizing.o hakmem_super_registry.o hakmem_shared_pool.o hakmem_shared_pool_acquire.o hakmem_shared_pool_release.o hakmem_elo.o hakmem_batch.o hakmem_p2.o hakmem_sizeclass_dist.o hakmem_evo.o hakmem_debug.o hakmem_sys.o hakmem_whale.o hakmem_policy.o hakmem_ace.o hakmem_ace_stats.o hakmem_prof.o hakmem_learner.o hakmem_size_hist.o hakmem_learn_log.o hakmem_syscall.o hakmem_ace_metrics.o hakmem_ace_ucb1.o hakmem_ace_controller.o tiny_fastcache.o core/box/superslab_expansion_box.o core/box/integrity_box.o core/box/free_publish_box.o core/box/mailbox_box.o core/box/front_gate_box.o core/box/front_gate_classifier.o core/box/capacity_box.o core/box/carve_push_box.o core/box/prewarm_box.o core/box/ss_hot_prewarm_box.o core/box/front_metrics_box.o core/box/bench_fast_box.o core/box/ss_addr_map_box.o core/box/slab_recycling_box.o core/box/pagefault_telemetry_box.o core/box/tiny_sizeclass_hist_box.o core/box/tiny_env_box.o core/box/tiny_route_box.o core/box/free_front_v3_env_box.o core/box/free_path_stats_box.o core/box/free_dispatch_stats_box.o core/box/alloc_gate_stats_box.o core/box/tiny_c6_ultra_free_box.o core/box/tiny_c5_ultra_free_box.o core/box/tiny_c4_ultra_free_box.o core/box/tiny_page_box.o core/box/tiny_class_policy_box.o core/box/tiny_class_stats_box.o core/box/tiny_policy_learner_box.o core/box/ss_budget_box.o core/box/tiny_mem_stats_box.o core/box/c7_meta_used_counter_box.o core/box/wrapper_env_box.o core/box/madvise_guard_box.o core/box/libm_reloc_guard_box.o core/box/ptr_trace_box.o core/box/link_missing_stubs.o core/box/super_reg_box.o core/box/shared_pool_box.o core/box/remote_side_box.o core/page_arena.o core/front/tiny_unified_cache.o core/tiny_alloc_fast_push.o core/tiny_c7_ultra_segment.o core/tiny_c7_ultra.o core/link_stubs.o core/tiny_failfast.o core/tiny_destructors.o core/smallobject_hotbox_v3.o core/smallobject_hotbox_v4.o core/smallobject_hotbox_v5.o core/smallsegment_v5.o core/smallobject_cold_iface_v5.o core/smallsegment_v6.o core/smallobject_cold_iface_v6.o core/smallobject_core_v6.o core/region_id_v6.o core/smallsegment_v7.o core/smallobject_cold_iface_v7.o core/mid_hotbox_v3.o core/smallobject_policy_v7.o core/smallobject_segment_mid_v3.o core/smallobject_cold_iface_mid_v3.o core/smallobject_stats_mid_v3.o core/smallobject_learner_v2.o core/smallobject_mid_v35.o bench_allocators_hakmem.o
|
||||||
BENCH_HAKMEM_OBJS = $(BENCH_HAKMEM_OBJS_BASE)
|
BENCH_HAKMEM_OBJS = $(BENCH_HAKMEM_OBJS_BASE)
|
||||||
ifeq ($(POOL_TLS_PHASE1),1)
|
ifeq ($(POOL_TLS_PHASE1),1)
|
||||||
BENCH_HAKMEM_OBJS += pool_tls.o pool_refill.o pool_tls_arena.o pool_tls_registry.o pool_tls_remote.o
|
BENCH_HAKMEM_OBJS += pool_tls.o pool_refill.o pool_tls_arena.o pool_tls_registry.o pool_tls_remote.o
|
||||||
@ -427,7 +427,7 @@ test-box-refactor: box-refactor
|
|||||||
./larson_hakmem 10 8 128 1024 1 12345 4
|
./larson_hakmem 10 8 128 1024 1 12345 4
|
||||||
|
|
||||||
# Phase 4: Tiny Pool benchmarks (properly linked with hakmem)
|
# Phase 4: Tiny Pool benchmarks (properly linked with hakmem)
|
||||||
TINY_BENCH_OBJS_BASE = hakmem.o hakmem_config.o hakmem_tiny_config.o hakmem_ucb1.o hakmem_bigcache.o hakmem_pool.o hakmem_l25_pool.o hakmem_site_rules.o hakmem_tiny.o core/box/ss_allocation_box.o superslab_stats.o superslab_cache.o superslab_ace.o superslab_slab.o superslab_backend.o core/superslab_head_stub.o hakmem_smallmid.o core/box/superslab_expansion_box.o core/box/integrity_box.o core/box/mailbox_box.o core/box/front_gate_box.o core/box/front_gate_classifier.o core/box/free_publish_box.o core/box/capacity_box.o core/box/carve_push_box.o core/box/prewarm_box.o core/box/ss_hot_prewarm_box.o core/box/front_metrics_box.o core/box/bench_fast_box.o core/box/ss_addr_map_box.o core/box/slab_recycling_box.o core/box/pagefault_telemetry_box.o core/box/tiny_sizeclass_hist_box.o core/box/tiny_env_box.o core/box/tiny_route_box.o core/box/free_front_v3_env_box.o core/box/free_path_stats_box.o core/box/free_dispatch_stats_box.o core/box/alloc_gate_stats_box.o core/box/tiny_c6_ultra_free_box.o core/box/tiny_c5_ultra_free_box.o core/box/tiny_c4_ultra_free_box.o core/box/tiny_page_box.o core/box/tiny_class_policy_box.o core/box/tiny_class_stats_box.o core/box/tiny_policy_learner_box.o core/box/ss_budget_box.o core/box/tiny_mem_stats_box.o core/box/c7_meta_used_counter_box.o core/box/wrapper_env_box.o core/box/madvise_guard_box.o core/box/libm_reloc_guard_box.o core/box/ptr_trace_box.o core/box/link_missing_stubs.o core/box/super_reg_box.o core/box/shared_pool_box.o core/box/remote_side_box.o core/page_arena.o core/front/tiny_unified_cache.o tiny_sticky.o tiny_remote.o tiny_publish.o tiny_debug_ring.o hakmem_tiny_magazine.o hakmem_tiny_stats.o hakmem_tiny_sfc.o hakmem_tiny_query.o hakmem_tiny_rss.o hakmem_tiny_registry.o hakmem_tiny_remote_target.o hakmem_tiny_bg_spill.o tiny_adaptive_sizing.o hakmem_super_registry.o hakmem_shared_pool.o hakmem_shared_pool_acquire.o hakmem_shared_pool_release.o hakmem_elo.o hakmem_batch.o hakmem_p2.o hakmem_sizeclass_dist.o hakmem_evo.o hakmem_debug.o hakmem_sys.o hakmem_whale.o hakmem_policy.o hakmem_ace.o hakmem_ace_stats.o hakmem_prof.o hakmem_learner.o hakmem_size_hist.o hakmem_learn_log.o hakmem_syscall.o hakmem_ace_metrics.o hakmem_ace_ucb1.o hakmem_ace_controller.o tiny_fastcache.o core/tiny_alloc_fast_push.o core/tiny_c7_ultra_segment.o core/tiny_c7_ultra.o core/link_stubs.o core/tiny_failfast.o core/tiny_destructors.o core/smallobject_hotbox_v3.o core/smallobject_hotbox_v4.o core/smallobject_hotbox_v5.o core/smallsegment_v5.o core/smallobject_cold_iface_v5.o core/smallsegment_v6.o core/smallobject_cold_iface_v6.o core/smallobject_core_v6.o core/region_id_v6.o core/smallsegment_v7.o core/smallobject_cold_iface_v7.o core/mid_hotbox_v3.o core/smallobject_policy_v7.o core/smallobject_segment_mid_v3.o core/smallobject_cold_iface_mid_v3.o core/smallobject_stats_mid_v3.o core/smallobject_learner_v2.o
|
TINY_BENCH_OBJS_BASE = hakmem.o hakmem_config.o hakmem_tiny_config.o hakmem_ucb1.o hakmem_bigcache.o hakmem_pool.o hakmem_l25_pool.o hakmem_site_rules.o hakmem_tiny.o core/box/ss_allocation_box.o superslab_stats.o superslab_cache.o superslab_ace.o superslab_slab.o superslab_backend.o core/superslab_head_stub.o hakmem_smallmid.o core/box/superslab_expansion_box.o core/box/integrity_box.o core/box/mailbox_box.o core/box/front_gate_box.o core/box/front_gate_classifier.o core/box/free_publish_box.o core/box/capacity_box.o core/box/carve_push_box.o core/box/prewarm_box.o core/box/ss_hot_prewarm_box.o core/box/front_metrics_box.o core/box/bench_fast_box.o core/box/ss_addr_map_box.o core/box/slab_recycling_box.o core/box/pagefault_telemetry_box.o core/box/tiny_sizeclass_hist_box.o core/box/tiny_env_box.o core/box/tiny_route_box.o core/box/free_front_v3_env_box.o core/box/free_path_stats_box.o core/box/free_dispatch_stats_box.o core/box/alloc_gate_stats_box.o core/box/tiny_c6_ultra_free_box.o core/box/tiny_c5_ultra_free_box.o core/box/tiny_c4_ultra_free_box.o core/box/tiny_page_box.o core/box/tiny_class_policy_box.o core/box/tiny_class_stats_box.o core/box/tiny_policy_learner_box.o core/box/ss_budget_box.o core/box/tiny_mem_stats_box.o core/box/c7_meta_used_counter_box.o core/box/wrapper_env_box.o core/box/madvise_guard_box.o core/box/libm_reloc_guard_box.o core/box/ptr_trace_box.o core/box/link_missing_stubs.o core/box/super_reg_box.o core/box/shared_pool_box.o core/box/remote_side_box.o core/page_arena.o core/front/tiny_unified_cache.o tiny_sticky.o tiny_remote.o tiny_publish.o tiny_debug_ring.o hakmem_tiny_magazine.o hakmem_tiny_stats.o hakmem_tiny_sfc.o hakmem_tiny_query.o hakmem_tiny_rss.o hakmem_tiny_registry.o hakmem_tiny_remote_target.o hakmem_tiny_bg_spill.o tiny_adaptive_sizing.o hakmem_super_registry.o hakmem_shared_pool.o hakmem_shared_pool_acquire.o hakmem_shared_pool_release.o hakmem_elo.o hakmem_batch.o hakmem_p2.o hakmem_sizeclass_dist.o hakmem_evo.o hakmem_debug.o hakmem_sys.o hakmem_whale.o hakmem_policy.o hakmem_ace.o hakmem_ace_stats.o hakmem_prof.o hakmem_learner.o hakmem_size_hist.o hakmem_learn_log.o hakmem_syscall.o hakmem_ace_metrics.o hakmem_ace_ucb1.o hakmem_ace_controller.o tiny_fastcache.o core/tiny_alloc_fast_push.o core/tiny_c7_ultra_segment.o core/tiny_c7_ultra.o core/link_stubs.o core/tiny_failfast.o core/tiny_destructors.o core/smallobject_hotbox_v3.o core/smallobject_hotbox_v4.o core/smallobject_hotbox_v5.o core/smallsegment_v5.o core/smallobject_cold_iface_v5.o core/smallsegment_v6.o core/smallobject_cold_iface_v6.o core/smallobject_core_v6.o core/region_id_v6.o core/smallsegment_v7.o core/smallobject_cold_iface_v7.o core/mid_hotbox_v3.o core/smallobject_policy_v7.o core/smallobject_segment_mid_v3.o core/smallobject_cold_iface_mid_v3.o core/smallobject_stats_mid_v3.o core/smallobject_learner_v2.o core/smallobject_mid_v35.o
|
||||||
TINY_BENCH_OBJS = $(TINY_BENCH_OBJS_BASE)
|
TINY_BENCH_OBJS = $(TINY_BENCH_OBJS_BASE)
|
||||||
ifeq ($(POOL_TLS_PHASE1),1)
|
ifeq ($(POOL_TLS_PHASE1),1)
|
||||||
TINY_BENCH_OBJS += pool_tls.o pool_refill.o core/pool_tls_arena.o pool_tls_registry.o pool_tls_remote.o
|
TINY_BENCH_OBJS += pool_tls.o pool_refill.o core/pool_tls_arena.o pool_tls_registry.o pool_tls_remote.o
|
||||||
|
|||||||
47
core/box/smallobject_mid_v35_box.h
Normal file
47
core/box/smallobject_mid_v35_box.h
Normal file
@ -0,0 +1,47 @@
|
|||||||
|
// smallobject_mid_v35_box.h
|
||||||
|
// Phase v11a-3: MID v3.5 Public API (L1 HotBox)
|
||||||
|
//
|
||||||
|
// Purpose:
|
||||||
|
// - Fast-path alloc/free for C5/C6/C7 (257-1024B range)
|
||||||
|
// - Uses Segment v2 + ColdIface v2 + Stats v2 + Learner v2
|
||||||
|
// - TLS-cached page allocation with refill/retire via ColdIface
|
||||||
|
|
||||||
|
#ifndef SMALLOBJECT_MID_V35_BOX_H
|
||||||
|
#define SMALLOBJECT_MID_V35_BOX_H
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <stddef.h>
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// ============================================================================
|
||||||
|
// MID v3.5 Public API (called from malloc_tiny_fast.h)
|
||||||
|
// ============================================================================
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Allocate from MID v3.5 path
|
||||||
|
* @param class_idx: Size class (C5/C6/C7 only)
|
||||||
|
* @param size: Requested size (for validation/debugging)
|
||||||
|
* @return USER pointer or NULL on failure
|
||||||
|
*/
|
||||||
|
void* small_mid_v35_alloc(uint32_t class_idx, size_t size);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Free to MID v3.5 path
|
||||||
|
* @param ptr: USER pointer to free
|
||||||
|
* @param class_idx: Size class (C5/C6/C7 only)
|
||||||
|
*/
|
||||||
|
void small_mid_v35_free(void *ptr, uint32_t class_idx);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Initialize MID v3.5 (called from hakmem init)
|
||||||
|
*/
|
||||||
|
void small_mid_v35_init(void);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif // SMALLOBJECT_MID_V35_BOX_H
|
||||||
@ -21,6 +21,7 @@ typedef enum {
|
|||||||
SMALL_ROUTE_ULTRA, // L0: C4-C7 ULTRA (FROZEN)
|
SMALL_ROUTE_ULTRA, // L0: C4-C7 ULTRA (FROZEN)
|
||||||
SMALL_ROUTE_V7, // L1: SmallObject v7 (research box)
|
SMALL_ROUTE_V7, // L1: SmallObject v7 (research box)
|
||||||
SMALL_ROUTE_MID_V3, // L1': MID v3 (257-768B mid/small)
|
SMALL_ROUTE_MID_V3, // L1': MID v3 (257-768B mid/small)
|
||||||
|
SMALL_ROUTE_MID_V35, // L1': MID v3.5 (v11a-3: Segment/ColdIface/Stats/Learner v2)
|
||||||
SMALL_ROUTE_LEGACY, // L1': TinyHeap v1 / Pool v1 (fallback)
|
SMALL_ROUTE_LEGACY, // L1': TinyHeap v1 / Pool v1 (fallback)
|
||||||
} SmallRouteKind;
|
} SmallRouteKind;
|
||||||
|
|
||||||
|
|||||||
@ -47,6 +47,7 @@
|
|||||||
#include "../box/smallobject_v6_env_box.h" // SmallObject v6 ENV control (Phase V6-HDR-2)
|
#include "../box/smallobject_v6_env_box.h" // SmallObject v6 ENV control (Phase V6-HDR-2)
|
||||||
#include "../box/smallobject_hotbox_v7_box.h" // SmallObject HotBox v7 stub (Phase v7-1)
|
#include "../box/smallobject_hotbox_v7_box.h" // SmallObject HotBox v7 stub (Phase v7-1)
|
||||||
#include "../box/smallobject_policy_v7_box.h" // Phase v7-4: Policy Box
|
#include "../box/smallobject_policy_v7_box.h" // Phase v7-4: Policy Box
|
||||||
|
#include "../box/smallobject_mid_v35_box.h" // Phase v11a-3: MID v3.5 HotBox
|
||||||
#include "../box/tiny_c7_ultra_box.h" // C7 ULTRA stub (UF-1, delegates to v3)
|
#include "../box/tiny_c7_ultra_box.h" // C7 ULTRA stub (UF-1, delegates to v3)
|
||||||
#include "../box/tiny_c6_ultra_free_box.h" // Phase 4-2: C6 ULTRA-free (free-only, C6-only)
|
#include "../box/tiny_c6_ultra_free_box.h" // Phase 4-2: C6 ULTRA-free (free-only, C6-only)
|
||||||
#include "../box/tiny_c5_ultra_free_box.h" // Phase 5-1/5-2: C5 ULTRA-free + alloc integration
|
#include "../box/tiny_c5_ultra_free_box.h" // Phase 5-1/5-2: C5 ULTRA-free + alloc integration
|
||||||
@ -224,8 +225,18 @@ static inline void* malloc_tiny_fast(size_t size) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Phase v7-4: Check Policy Box for v7 routing (before switch)
|
// Phase v7-4: Check Policy Box for v7/MID_V35 routing (before switch)
|
||||||
const SmallPolicyV7* policy = small_policy_v7_snapshot();
|
const SmallPolicyV7* policy = small_policy_v7_snapshot();
|
||||||
|
|
||||||
|
// Phase v11a-3: MID v3.5 routing
|
||||||
|
if (policy->route_kind[class_idx] == SMALL_ROUTE_MID_V35) {
|
||||||
|
void* v35p = small_mid_v35_alloc(class_idx, size);
|
||||||
|
if (TINY_HOT_LIKELY(v35p != NULL)) {
|
||||||
|
return v35p;
|
||||||
|
}
|
||||||
|
// v35 returned NULL -> fallback to legacy
|
||||||
|
}
|
||||||
|
|
||||||
if (policy->route_kind[class_idx] == SMALL_ROUTE_V7) {
|
if (policy->route_kind[class_idx] == SMALL_ROUTE_V7) {
|
||||||
void* v7p = small_heap_alloc_fast_v7_stub(size, (uint8_t)class_idx);
|
void* v7p = small_heap_alloc_fast_v7_stub(size, (uint8_t)class_idx);
|
||||||
if (TINY_HOT_LIKELY(v7p != NULL)) {
|
if (TINY_HOT_LIKELY(v7p != NULL)) {
|
||||||
@ -378,6 +389,17 @@ static inline int free_tiny_fast(void* ptr) {
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Phase v11a-3: Try MID v3.5 free for C5/C6/C7
|
||||||
|
// For v11a-3: simple ownership check (assumes current route)
|
||||||
|
// For v11b: will add proper segment-based ownership check
|
||||||
|
const SmallPolicyV7* policy_free = small_policy_v7_snapshot();
|
||||||
|
if ((class_idx >= 5 && class_idx <= 7) &&
|
||||||
|
policy_free->route_kind[class_idx] == SMALL_ROUTE_MID_V35) {
|
||||||
|
small_mid_v35_free(ptr, class_idx);
|
||||||
|
FREE_PATH_STAT_INC(smallheap_v7_fast); // Reuse counter for now
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
// Phase v7-5b/v7-7: Always try V7 free for supported classes (C5/C6)
|
// Phase v7-5b/v7-7: Always try V7 free for supported classes (C5/C6)
|
||||||
// V7 returns false if ptr is not in V7 segment.
|
// V7 returns false if ptr is not in V7 segment.
|
||||||
// This is necessary because Learner may switch routes dynamically,
|
// This is necessary because Learner may switch routes dynamically,
|
||||||
|
|||||||
168
core/smallobject_mid_v35.c
Normal file
168
core/smallobject_mid_v35.c
Normal file
@ -0,0 +1,168 @@
|
|||||||
|
// smallobject_mid_v35.c
|
||||||
|
// Phase v11a-3: MID v3.5 HotBox implementation
|
||||||
|
//
|
||||||
|
// Design:
|
||||||
|
// - TLS-cached page for fast allocation
|
||||||
|
// - Refill via ColdIface when page exhausted
|
||||||
|
// - Retire via ColdIface when page is full
|
||||||
|
// - Stats/Learner integration for observability
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
#include "box/smallobject_mid_v35_box.h"
|
||||||
|
#include "box/smallobject_segment_mid_v3_box.h"
|
||||||
|
#include "box/smallobject_cold_iface_mid_v3_box.h"
|
||||||
|
#include "tiny_region_id.h" // For tiny_region_id_write_header
|
||||||
|
|
||||||
|
// Reuse SmallPageMeta from segment implementation (matches cold_iface)
|
||||||
|
typedef struct SmallPageMeta {
|
||||||
|
void *ptr;
|
||||||
|
uint32_t capacity;
|
||||||
|
uint8_t class_idx;
|
||||||
|
uint32_t alloc_count;
|
||||||
|
uint32_t free_count;
|
||||||
|
void *segment;
|
||||||
|
struct SmallPageMeta *next;
|
||||||
|
} SmallPageMeta;
|
||||||
|
|
||||||
|
// ============================================================================
|
||||||
|
// TLS Context (per-thread fast path state)
|
||||||
|
// ============================================================================
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
void *page[8]; // Current page per class
|
||||||
|
uint32_t offset[8]; // Allocation offset (slot index)
|
||||||
|
uint32_t capacity[8]; // Slots per page per class
|
||||||
|
SmallPageMeta *meta[8]; // Page metadata for retire check
|
||||||
|
} SmallMidV35TlsCtx;
|
||||||
|
|
||||||
|
static __thread SmallMidV35TlsCtx tls_mid_v35_ctx = {0};
|
||||||
|
|
||||||
|
// ============================================================================
|
||||||
|
// Slot Configuration (C5/C6/C7)
|
||||||
|
// ============================================================================
|
||||||
|
|
||||||
|
// Slot sizes for C5, C6, C7
|
||||||
|
static const size_t g_slot_sizes[8] = {
|
||||||
|
0, // C0: not used
|
||||||
|
0, // C1: not used
|
||||||
|
0, // C2: not used
|
||||||
|
0, // C3: not used
|
||||||
|
0, // C4: not used (ULTRA handles this)
|
||||||
|
384, // C5: 257-384 bytes → 384 byte slots
|
||||||
|
512, // C6: 385-512 bytes → 512 byte slots
|
||||||
|
1024, // C7: 513-1024 bytes → 1024 byte slots (ULTRA handles this)
|
||||||
|
};
|
||||||
|
|
||||||
|
// Slots per 64KB page
|
||||||
|
static const uint32_t g_slots_per_page[8] = {
|
||||||
|
0, 0, 0, 0, 0,
|
||||||
|
170, // C5: 65536 / 384 = 170
|
||||||
|
128, // C6: 65536 / 512 = 128
|
||||||
|
64, // C7: 65536 / 1024 = 64
|
||||||
|
};
|
||||||
|
|
||||||
|
// ============================================================================
|
||||||
|
// Init
|
||||||
|
// ============================================================================
|
||||||
|
|
||||||
|
void small_mid_v35_init(void) {
|
||||||
|
// Initialize any global state if needed
|
||||||
|
// For v11a-3: nothing to do (TLS is zero-initialized)
|
||||||
|
}
|
||||||
|
|
||||||
|
// ============================================================================
|
||||||
|
// Alloc
|
||||||
|
// ============================================================================
|
||||||
|
|
||||||
|
void* small_mid_v35_alloc(uint32_t class_idx, size_t size) {
|
||||||
|
if (class_idx < 5 || class_idx > 7) return NULL; // Only C5-C7
|
||||||
|
|
||||||
|
SmallMidV35TlsCtx *ctx = &tls_mid_v35_ctx;
|
||||||
|
|
||||||
|
// Fast path: allocate from TLS cached page
|
||||||
|
if (ctx->page[class_idx] && ctx->offset[class_idx] < ctx->capacity[class_idx]) {
|
||||||
|
size_t slot_size = g_slot_sizes[class_idx];
|
||||||
|
void *base = (char*)ctx->page[class_idx] + ctx->offset[class_idx] * slot_size;
|
||||||
|
ctx->offset[class_idx]++;
|
||||||
|
|
||||||
|
// Update page metadata
|
||||||
|
if (ctx->meta[class_idx]) {
|
||||||
|
ctx->meta[class_idx]->alloc_count++;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Write header (1-byte Tiny header with class_idx)
|
||||||
|
// Note: Assumes HAKMEM_TINY_HEADER_CLASSIDX is enabled
|
||||||
|
tiny_region_id_write_header(base, class_idx);
|
||||||
|
|
||||||
|
// Return USER pointer (BASE + 1 byte header)
|
||||||
|
return (char*)base + 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Slow path: need new page via ColdIface
|
||||||
|
SmallPageMeta *page = small_cold_mid_v3_refill_page(class_idx);
|
||||||
|
if (!page) {
|
||||||
|
// Fallback to legacy or return NULL
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Update TLS cache
|
||||||
|
ctx->page[class_idx] = page->ptr;
|
||||||
|
ctx->offset[class_idx] = 1; // First slot already allocated
|
||||||
|
ctx->capacity[class_idx] = g_slots_per_page[class_idx];
|
||||||
|
ctx->meta[class_idx] = page;
|
||||||
|
|
||||||
|
// Record first allocation in page metadata
|
||||||
|
page->alloc_count = 1;
|
||||||
|
|
||||||
|
// Write header for first slot
|
||||||
|
tiny_region_id_write_header(page->ptr, class_idx);
|
||||||
|
|
||||||
|
// Return first slot (USER pointer)
|
||||||
|
return (char*)page->ptr + 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
// ============================================================================
|
||||||
|
// Free (Simplified: just count, no freelist yet)
|
||||||
|
// ============================================================================
|
||||||
|
|
||||||
|
void small_mid_v35_free(void *ptr, uint32_t class_idx) {
|
||||||
|
if (!ptr || class_idx < 5 || class_idx > 7) return;
|
||||||
|
|
||||||
|
// For v11a-3: simplified free (just increment free_count)
|
||||||
|
// In future phases: implement freelist for reuse
|
||||||
|
|
||||||
|
// Calculate BASE from USER pointer
|
||||||
|
void *base = (char*)ptr - 1;
|
||||||
|
|
||||||
|
// Find page metadata via simple calculation
|
||||||
|
// Note: Assumes 64KB pages aligned to 64KB boundary
|
||||||
|
size_t page_size = 64 * 1024; // 64KB
|
||||||
|
void *page_base = (void*)((uintptr_t)base & ~(page_size - 1));
|
||||||
|
|
||||||
|
// Check if this is the current TLS page
|
||||||
|
SmallMidV35TlsCtx *ctx = &tls_mid_v35_ctx;
|
||||||
|
SmallPageMeta *meta = ctx->meta[class_idx];
|
||||||
|
|
||||||
|
if (meta && meta->ptr == page_base) {
|
||||||
|
// Free to current TLS page
|
||||||
|
meta->free_count++;
|
||||||
|
|
||||||
|
// Check if page is fully empty
|
||||||
|
if (meta->free_count >= meta->capacity) {
|
||||||
|
// Retire page via ColdIface
|
||||||
|
small_cold_mid_v3_retire_page(meta);
|
||||||
|
|
||||||
|
// Clear TLS cache for this class
|
||||||
|
ctx->page[class_idx] = NULL;
|
||||||
|
ctx->offset[class_idx] = 0;
|
||||||
|
ctx->meta[class_idx] = NULL;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// Different page: need RegionIdBox lookup
|
||||||
|
// For v11a-3: simple fallback - just count the free
|
||||||
|
// Real implementation needs proper page lookup
|
||||||
|
// TODO: Implement cross-page free via RegionIdBox in v11b
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -75,6 +75,23 @@ static inline uint32_t env_class_mask(const char* name, uint32_t default_mask) {
|
|||||||
return default_mask;
|
return default_mask;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ============================================================================
|
||||||
|
// MID v3.5 ENV Helpers (Phase v11a-3)
|
||||||
|
// ============================================================================
|
||||||
|
|
||||||
|
static inline bool mid_v35_enabled(void) {
|
||||||
|
const char* e = getenv("HAKMEM_MID_V35_ENABLED");
|
||||||
|
return (e && *e && *e != '0');
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline uint32_t mid_v35_class_mask(void) {
|
||||||
|
const char* e = getenv("HAKMEM_MID_V35_CLASSES");
|
||||||
|
if (e && *e) {
|
||||||
|
return (uint32_t)strtoul(e, NULL, 0);
|
||||||
|
}
|
||||||
|
return 0x60; // Default: C5(0x20) + C6(0x40)
|
||||||
|
}
|
||||||
|
|
||||||
// ============================================================================
|
// ============================================================================
|
||||||
// Policy Initialization from ENV
|
// Policy Initialization from ENV
|
||||||
// ============================================================================
|
// ============================================================================
|
||||||
@ -87,7 +104,7 @@ void small_policy_v7_init_from_env(SmallPolicyV7* policy) {
|
|||||||
policy->route_kind[i] = SMALL_ROUTE_LEGACY;
|
policy->route_kind[i] = SMALL_ROUTE_LEGACY;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Priority 3: MID_v3 (257-768B, C5-C6 range)
|
// Priority 4: MID_v3 (257-768B, C5-C6 range)
|
||||||
// ENV: HAKMEM_MID_V3_ENABLED, HAKMEM_MID_V3_CLASSES
|
// ENV: HAKMEM_MID_V3_ENABLED, HAKMEM_MID_V3_CLASSES
|
||||||
if (env_enabled("HAKMEM_MID_V3_ENABLED")) {
|
if (env_enabled("HAKMEM_MID_V3_ENABLED")) {
|
||||||
uint32_t mid_mask = env_class_mask("HAKMEM_MID_V3_CLASSES", 0x60); // C5-C6 default
|
uint32_t mid_mask = env_class_mask("HAKMEM_MID_V3_CLASSES", 0x60); // C5-C6 default
|
||||||
@ -98,6 +115,20 @@ void small_policy_v7_init_from_env(SmallPolicyV7* policy) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Priority 3: MID_v3.5 (Phase v11a-3: higher priority than MID_v3)
|
||||||
|
// ENV: HAKMEM_MID_V35_ENABLED, HAKMEM_MID_V35_CLASSES
|
||||||
|
if (mid_v35_enabled()) {
|
||||||
|
uint32_t v35_mask = mid_v35_class_mask();
|
||||||
|
for (int i = 0; i < 8; i++) {
|
||||||
|
if (v35_mask & (1u << i)) {
|
||||||
|
// Only override if not ULTRA
|
||||||
|
if (policy->route_kind[i] != SMALL_ROUTE_ULTRA) {
|
||||||
|
policy->route_kind[i] = SMALL_ROUTE_MID_V35;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Priority 2: SmallObject v7 (research box, C6-only for now)
|
// Priority 2: SmallObject v7 (research box, C6-only for now)
|
||||||
// ENV: HAKMEM_SMALL_HEAP_V7_ENABLED, HAKMEM_SMALL_HEAP_V7_CLASSES
|
// ENV: HAKMEM_SMALL_HEAP_V7_ENABLED, HAKMEM_SMALL_HEAP_V7_CLASSES
|
||||||
if (env_enabled("HAKMEM_SMALL_HEAP_V7_ENABLED")) {
|
if (env_enabled("HAKMEM_SMALL_HEAP_V7_ENABLED")) {
|
||||||
@ -145,6 +176,7 @@ const char* small_route_kind_name(SmallRouteKind kind) {
|
|||||||
case SMALL_ROUTE_ULTRA: return "ULTRA";
|
case SMALL_ROUTE_ULTRA: return "ULTRA";
|
||||||
case SMALL_ROUTE_V7: return "V7";
|
case SMALL_ROUTE_V7: return "V7";
|
||||||
case SMALL_ROUTE_MID_V3: return "MID_V3";
|
case SMALL_ROUTE_MID_V3: return "MID_V3";
|
||||||
|
case SMALL_ROUTE_MID_V35: return "MID_V35";
|
||||||
case SMALL_ROUTE_LEGACY: return "LEGACY";
|
case SMALL_ROUTE_LEGACY: return "LEGACY";
|
||||||
default: return "UNKNOWN";
|
default: return "UNKNOWN";
|
||||||
}
|
}
|
||||||
|
|||||||
226
docs/analysis/PHASE_V11A3_IMPLEMENTATION_SUMMARY.md
Normal file
226
docs/analysis/PHASE_V11A3_IMPLEMENTATION_SUMMARY.md
Normal file
@ -0,0 +1,226 @@
|
|||||||
|
# Phase v11a-3: MID v3.5 Implementation Summary
|
||||||
|
|
||||||
|
**Date:** 2025-12-12
|
||||||
|
**Status:** Build Complete - Ready for A/B Benchmarking
|
||||||
|
**Author:** Claude Opus 4.5
|
||||||
|
|
||||||
|
## Overview
|
||||||
|
|
||||||
|
Phase v11a-3 successfully integrated MID v3.5 into the active code path, making it available for routing C5/C6/C7 allocations. This phase activates the Segment/ColdIface/Stats/Learner v2 infrastructure implemented in Phase v11a-2.
|
||||||
|
|
||||||
|
## Implementation Tasks Completed
|
||||||
|
|
||||||
|
### Task 1: Policy Box Updates (L3)
|
||||||
|
|
||||||
|
**Files Modified:**
|
||||||
|
- `/mnt/workdisk/public_share/hakmem/core/box/smallobject_policy_v7_box.h`
|
||||||
|
- `/mnt/workdisk/public_share/hakmem/core/smallobject_policy_v7.c`
|
||||||
|
|
||||||
|
**Changes:**
|
||||||
|
1. Added `SMALL_ROUTE_MID_V35` to `SmallRouteKind` enum
|
||||||
|
2. Implemented ENV gate functions:
|
||||||
|
- `mid_v35_enabled()` - checks `HAKMEM_MID_V35_ENABLED`
|
||||||
|
- `mid_v35_class_mask()` - reads `HAKMEM_MID_V35_CLASSES` (default: 0x60 for C5+C6)
|
||||||
|
3. Updated policy init with priority: ULTRA > MID_V35 > V7 > MID_V3 > LEGACY
|
||||||
|
4. Added MID_V35 case to `small_route_kind_name()`
|
||||||
|
|
||||||
|
### Task 2: MID v3.5 HotBox Implementation (L1)
|
||||||
|
|
||||||
|
**Files Created:**
|
||||||
|
- `/mnt/workdisk/public_share/hakmem/core/box/smallobject_mid_v35_box.h` - Public API
|
||||||
|
- `/mnt/workdisk/public_share/hakmem/core/smallobject_mid_v35.c` - Implementation
|
||||||
|
|
||||||
|
**Implementation:**
|
||||||
|
- TLS-cached page allocation (per-class fast path)
|
||||||
|
- Slot sizes: C5=384B, C6=512B, C7=1024B
|
||||||
|
- Page size: 64KB (170/128/64 slots for C5/C6/C7)
|
||||||
|
- Alloc: Fast path (TLS cache hit) + Slow path (refill via ColdIface)
|
||||||
|
- Free: Simplified counting (no freelist yet - deferred to v11b)
|
||||||
|
- Header writing: Integrates with tiny_region_id_write_header
|
||||||
|
|
||||||
|
**Key Design Decisions:**
|
||||||
|
- Reused `SmallPageMeta` typedef (matches segment/cold_iface structure)
|
||||||
|
- Simplified free path (cross-page free deferred to v11b RegionIdBox integration)
|
||||||
|
- Header integration for compatibility with existing Tiny infrastructure
|
||||||
|
|
||||||
|
### Task 3: Front Gate Integration (L0/L1 Boundary)
|
||||||
|
|
||||||
|
**Files Modified:**
|
||||||
|
- `/mnt/workdisk/public_share/hakmem/core/front/malloc_tiny_fast.h`
|
||||||
|
|
||||||
|
**Changes:**
|
||||||
|
1. Added MID v3.5 box header include
|
||||||
|
2. Alloc path: Check policy for MID_V35, call `small_mid_v35_alloc()` before V7
|
||||||
|
3. Free path: Check policy for MID_V35, call `small_mid_v35_free()` after ULTRA checks
|
||||||
|
|
||||||
|
**Priority Order (Alloc/Free):**
|
||||||
|
1. ULTRA (C4-C7)
|
||||||
|
2. MID v3.5 (Policy-driven)
|
||||||
|
3. V7 (Policy-driven)
|
||||||
|
4. Legacy routes
|
||||||
|
|
||||||
|
### Task 4: Build System Updates
|
||||||
|
|
||||||
|
**Files Modified:**
|
||||||
|
- `/mnt/workdisk/public_share/hakmem/Makefile`
|
||||||
|
|
||||||
|
**Changes:**
|
||||||
|
- Added `core/smallobject_mid_v35.o` to `OBJS_BASE`
|
||||||
|
- Added `core/smallobject_mid_v35.o` to `BENCH_HAKMEM_OBJS_BASE`
|
||||||
|
- Added `core/smallobject_mid_v35.o` to `TINY_BENCH_OBJS_BASE`
|
||||||
|
|
||||||
|
**Build Results:**
|
||||||
|
- Clean build successful
|
||||||
|
- Benchmarks compiled: `bench_random_mixed_hakmem`, `bench_mid_large_mt_hakmem`
|
||||||
|
- Minor warnings (unused parameter `size`) - non-critical
|
||||||
|
|
||||||
|
## ENV Configuration
|
||||||
|
|
||||||
|
### MID v3.5 Activation
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Enable MID v3.5
|
||||||
|
export HAKMEM_MID_V35_ENABLED=1
|
||||||
|
|
||||||
|
# Configure classes (default: 0x60 = C5+C6)
|
||||||
|
export HAKMEM_MID_V35_CLASSES=0x60 # C5 + C6
|
||||||
|
# export HAKMEM_MID_V35_CLASSES=0x20 # C5 only
|
||||||
|
# export HAKMEM_MID_V35_CLASSES=0x40 # C6 only
|
||||||
|
```
|
||||||
|
|
||||||
|
### Policy Debug Output
|
||||||
|
|
||||||
|
Policy initialization prints route assignments on first call:
|
||||||
|
```
|
||||||
|
[POLICY_V7_INIT] Route assignments:
|
||||||
|
C0: LEGACY
|
||||||
|
C1: LEGACY
|
||||||
|
C2: LEGACY
|
||||||
|
C3: LEGACY
|
||||||
|
C4: ULTRA
|
||||||
|
C5: MID_V35
|
||||||
|
C6: MID_V35
|
||||||
|
C7: ULTRA
|
||||||
|
```
|
||||||
|
|
||||||
|
## Next Steps (Task 5: A/B Benchmarks)
|
||||||
|
|
||||||
|
### Benchmark 1: C6-Heavy (MID Specialization Check)
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Baseline: MID v3.5 OFF
|
||||||
|
HAKMEM_PROFILE=C6_HEAVY_LEGACY_POOLV1 \
|
||||||
|
HAKMEM_MID_V35_ENABLED=0 \
|
||||||
|
./bench_mid_large_mt_hakmem 1 1000000 400 1
|
||||||
|
|
||||||
|
# Test: MID v3.5 ON (C6 only)
|
||||||
|
HAKMEM_PROFILE=C6_HEAVY_LEGACY_POOLV1 \
|
||||||
|
HAKMEM_MID_V35_ENABLED=1 \
|
||||||
|
HAKMEM_MID_V35_CLASSES=0x40 \
|
||||||
|
./bench_mid_large_mt_hakmem 1 1000000 400 1
|
||||||
|
```
|
||||||
|
|
||||||
|
**Expected:** Performance within ±5% of MID v3
|
||||||
|
|
||||||
|
### Benchmark 2: C5+C6-Only (257-768B Range)
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Baseline: MID v3.5 OFF
|
||||||
|
HAKMEM_BENCH_MIN_SIZE=257 \
|
||||||
|
HAKMEM_BENCH_MAX_SIZE=768 \
|
||||||
|
HAKMEM_MID_V35_ENABLED=0 \
|
||||||
|
./bench_random_mixed_hakmem 1000000 400 1
|
||||||
|
|
||||||
|
# Test: MID v3.5 ON (C5+C6)
|
||||||
|
HAKMEM_BENCH_MIN_SIZE=257 \
|
||||||
|
HAKMEM_BENCH_MAX_SIZE=768 \
|
||||||
|
HAKMEM_MID_V35_ENABLED=1 \
|
||||||
|
HAKMEM_MID_V35_CLASSES=0x60 \
|
||||||
|
./bench_random_mixed_hakmem 1000000 400 1
|
||||||
|
```
|
||||||
|
|
||||||
|
**Expected:** +2-4% improvement (matching v7 gains)
|
||||||
|
|
||||||
|
### Benchmark 3: Mixed 16-1024B (Reference)
|
||||||
|
|
||||||
|
```bash
|
||||||
|
HAKMEM_PROFILE=MIXED_TINYV3_C7_SAFE \
|
||||||
|
HAKMEM_MID_V35_ENABLED=1 \
|
||||||
|
HAKMEM_MID_V35_CLASSES=0x60 \
|
||||||
|
./bench_random_mixed_hakmem 1000000 400 1
|
||||||
|
```
|
||||||
|
|
||||||
|
**Expected:** Baseline ±3% (no regression)
|
||||||
|
|
||||||
|
## Known Limitations (Deferred to v11b)
|
||||||
|
|
||||||
|
1. **Cross-Page Free:** Current implementation only handles frees to the current TLS page
|
||||||
|
- Need RegionIdBox lookup for cross-page free
|
||||||
|
- Planned for v11b with proper segment ownership check
|
||||||
|
|
||||||
|
2. **Freelist Reuse:** No freelist implementation yet
|
||||||
|
- Slots are marked free via counter only
|
||||||
|
- Full freelist support planned for v11b
|
||||||
|
|
||||||
|
3. **Learner Route Switching:** Learner v2 is in observation mode only
|
||||||
|
- Dynamic route switching deferred to v11b
|
||||||
|
- Current implementation: static routing based on ENV
|
||||||
|
|
||||||
|
## Code Quality
|
||||||
|
|
||||||
|
- **Modularity:** Clean L1/L2/L3 separation maintained
|
||||||
|
- **Box Boundaries:** Proper isolation between HotBox/ColdIface/Stats/Learner
|
||||||
|
- **Header Compatibility:** Integrates with existing Tiny region_id infrastructure
|
||||||
|
- **Build Hygiene:** All targets compile cleanly (only unused parameter warnings)
|
||||||
|
|
||||||
|
## Files Summary
|
||||||
|
|
||||||
|
### New Files (2)
|
||||||
|
1. `core/box/smallobject_mid_v35_box.h` - Public API (48 lines)
|
||||||
|
2. `core/smallobject_mid_v35.c` - Implementation (165 lines)
|
||||||
|
|
||||||
|
### Modified Files (4)
|
||||||
|
1. `core/box/smallobject_policy_v7_box.h` - Enum update
|
||||||
|
2. `core/smallobject_policy_v7.c` - ENV helpers + priority logic
|
||||||
|
3. `core/front/malloc_tiny_fast.h` - Route integration
|
||||||
|
4. `Makefile` - Object file lists (3 locations)
|
||||||
|
|
||||||
|
### Total Code Addition
|
||||||
|
- **New:** ~213 lines
|
||||||
|
- **Modified:** ~60 lines
|
||||||
|
- **Total Impact:** ~273 lines
|
||||||
|
|
||||||
|
## Architecture Notes
|
||||||
|
|
||||||
|
### Layer Interaction (L0→L1→L2→L3)
|
||||||
|
|
||||||
|
```
|
||||||
|
L0 (Front) malloc_tiny_fast.h
|
||||||
|
↓ (Policy check: MID_V35?)
|
||||||
|
L1 (HotBox) smallobject_mid_v35.c
|
||||||
|
↓ (Refill needed?)
|
||||||
|
L2 (Cold) smallobject_cold_iface_mid_v3.c
|
||||||
|
↓ (Get page from segment)
|
||||||
|
L2 (Segment) smallobject_segment_mid_v3.c
|
||||||
|
↓ (Stats recording)
|
||||||
|
L2 (Stats) smallobject_stats_mid_v3.c
|
||||||
|
↓ (Learner evaluation - observation only)
|
||||||
|
L2 (Learner) smallobject_learner_v2.c
|
||||||
|
↓ (Policy update - dormant)
|
||||||
|
L3 (Policy) smallobject_policy_v7.c
|
||||||
|
```
|
||||||
|
|
||||||
|
### Memory Layout
|
||||||
|
|
||||||
|
- **Segment:** 2 MiB contiguous region
|
||||||
|
- **Pages:** 64KB per page
|
||||||
|
- **Slots:** 384B (C5), 512B (C6), 1024B (C7)
|
||||||
|
- **TLS Cache:** One current page per class per thread
|
||||||
|
|
||||||
|
## Conclusion
|
||||||
|
|
||||||
|
Phase v11a-3 successfully activated MID v3.5 infrastructure. The implementation is ready for A/B benchmarking to validate performance against the original MID v3 and establish a baseline for future optimizations.
|
||||||
|
|
||||||
|
**Status:** ✅ Build Complete
|
||||||
|
**Next:** Task 5 (A/B Benchmarks) - Performance validation
|
||||||
|
**Future:** Task 6 (Documentation) - Results recording
|
||||||
Reference in New Issue
Block a user