Phase 9: SuperSlab optimization & EMPTY slab recycling (WIP)
Phase 9-1: O(1) SuperSlab lookup optimization - Created ss_addr_map_box: Hash table (8192 buckets) for O(1) SuperSlab lookup - Created ss_tls_hint_box: TLS caching layer for SuperSlab hints - Integrated hash table into registry (init, insert, remove, lookup) - Modified hak_super_lookup() to use new hash table - Expected: 50-80 cycles → 10-20 cycles (not verified - SuperSlab disabled by default) Phase 9-2: EMPTY slab recycling implementation - Created slab_recycling_box: SLAB_TRY_RECYCLE() macro following Box pattern - Integrated into remote drain (superslab_slab.c) - Integrated into TLS SLL drain (tls_sll_drain_box.h) with touched slab tracking - Observable: Debug tracing via HAKMEM_SLAB_RECYCLE_TRACE - Updated Makefile: Added new box objects to 3 build targets Known Issues: - SuperSlab registry exhaustion still occurs (unregistration not working) - shared_pool_release_slab() may not be removing from g_super_reg[] - Needs investigation before Phase 9-2 can be completed Expected Impact (when fixed): - Stage 1 hit rate: 0% → 80% - shared_fail events: 4 → 0 - Kernel overhead: 55% → 15% - Throughput: 16.5M → 25-30M ops/s (+50-80%) 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
@ -4,6 +4,7 @@
|
||||
// Date: 2025-11-28
|
||||
|
||||
#include "hakmem_tiny_superslab_internal.h"
|
||||
#include "box/slab_recycling_box.h"
|
||||
|
||||
// ============================================================================
|
||||
// Remote Drain (MPSC queue to freelist conversion)
|
||||
@ -108,6 +109,10 @@ void _ss_remote_drain_to_freelist_unsafe(SuperSlab* ss, int slab_idx, TinySlabMe
|
||||
// Reset remote count after full drain
|
||||
atomic_store_explicit(&ss->remote_counts[slab_idx], 0, memory_order_release);
|
||||
|
||||
// Phase 9-2: Try to recycle slab if EMPTY after remote drain
|
||||
// This fixes the bug where EMPTY slabs accumulate and never get returned to freelist
|
||||
SLAB_TRY_RECYCLE(ss, slab_idx, meta);
|
||||
|
||||
// Update freelist/nonempty visibility bits
|
||||
uint32_t bit = (1u << slab_idx);
|
||||
atomic_fetch_or_explicit(&ss->freelist_mask, bit, memory_order_release);
|
||||
|
||||
Reference in New Issue
Block a user