Files
hakmem/core/hakmem_shared_pool_internal.h

61 lines
2.2 KiB
C
Raw Permalink Normal View History

#ifndef HAKMEM_SHARED_POOL_INTERNAL_H
#define HAKMEM_SHARED_POOL_INTERNAL_H
#include "hakmem_shared_pool.h"
#include "hakmem_tiny_superslab.h"
#include "hakmem_tiny_superslab_constants.h"
#include <stdatomic.h>
#include <pthread.h>
// Global Shared Pool Instance
extern SharedSuperSlabPool g_shared_pool;
// Lock Statistics
// Counters are defined always to avoid compilation errors in Release build
// (usage is guarded by g_lock_stats_enabled which is 0 in Release)
extern _Atomic uint64_t g_lock_acquire_count;
extern _Atomic uint64_t g_lock_release_count;
extern _Atomic uint64_t g_lock_acquire_slab_count;
extern _Atomic uint64_t g_lock_release_slab_count;
extern int g_lock_stats_enabled;
#if !HAKMEM_BUILD_RELEASE
void lock_stats_init(void);
#else
static inline void lock_stats_init(void) {
// No-op for release build
}
#endif
// Stage Statistics
extern _Atomic uint64_t g_sp_stage1_hits[TINY_NUM_CLASSES_SS];
extern _Atomic uint64_t g_sp_stage2_hits[TINY_NUM_CLASSES_SS];
extern _Atomic uint64_t g_sp_stage3_hits[TINY_NUM_CLASSES_SS];
extern int g_sp_stage_stats_enabled;
void sp_stage_stats_init(void);
// Per-class lock acquisition statisticsStage2/Stage3 の alloc_lock 観測用)
extern _Atomic uint64_t g_sp_stage2_lock_acquired_by_class[TINY_NUM_CLASSES_SS];
extern _Atomic uint64_t g_sp_stage3_lock_acquired_by_class[TINY_NUM_CLASSES_SS];
// Internal Helpers (Shared between acquire/release/pool)
void shared_pool_ensure_capacity_unlocked(uint32_t min_capacity);
WIP: Add TLS SLL validation and SuperSlab registry fallback ChatGPT's diagnostic changes to address TLS_SLL_HDR_RESET issue. Current status: Partial mitigation, but root cause remains. Changes Applied: 1. SuperSlab Registry Fallback (hakmem_super_registry.h) - Added legacy table probe when hash map lookup misses - Prevents NULL returns for valid SuperSlabs during initialization - Status: ✅ Works but may hide underlying registration issues 2. TLS SLL Push Validation (tls_sll_box.h) - Reject push if SuperSlab lookup returns NULL - Reject push if class_idx mismatch detected - Added [TLS_SLL_PUSH_NO_SS] diagnostic message - Status: ✅ Prevents list corruption (defensive) 3. SuperSlab Allocation Class Fix (superslab_allocate.c) - Pass actual class_idx to sp_internal_allocate_superslab - Prevents dummy class=8 causing OOB access - Status: ✅ Root cause fix for allocation path 4. Debug Output Additions - First 256 push/pop operations traced - First 4 mismatches logged with details - SuperSlab registration state logged - Status: ✅ Diagnostic tool (not a fix) 5. TLS Hint Box Removed - Deleted ss_tls_hint_box.{c,h} (Phase 1 optimization) - Simplified to focus on stability first - Status: ⏳ Can be re-added after root cause fixed Current Problem (REMAINS UNSOLVED): - [TLS_SLL_HDR_RESET] still occurs after ~60 seconds of sh8bench - Pointer is 16 bytes offset from expected (class 1 → class 2 boundary) - hak_super_lookup returns NULL for that pointer - Suggests: Use-After-Free, Double-Free, or pointer arithmetic error Root Cause Analysis: - Pattern: Pointer offset by +16 (one class 1 stride) - Timing: Cumulative problem (appears after 60s, not immediately) - Location: Header corruption detected during TLS SLL pop Remaining Issues: ⚠️ Registry fallback is defensive (may hide registration bugs) ⚠️ Push validation prevents symptoms but not root cause ⚠️ 16-byte pointer offset source unidentified Next Steps for Investigation: 1. Full pointer arithmetic audit (Magazine ⇔ TLS SLL paths) 2. Enhanced logging at HDR_RESET point: - Expected vs actual pointer value - Pointer provenance (where it came from) - Allocation trace for that block 3. Verify Headerless flag is OFF throughout build 4. Check for double-offset application in conversions Technical Assessment: - 60% root cause fixes (allocation class, validation) - 40% defensive mitigation (registry fallback, push rejection) Performance Impact: - Registry fallback: +10-30 cycles on cold path (negligible) - Push validation: +5-10 cycles per push (acceptable) - Overall: < 2% performance impact estimated Related Issues: - Phase 1 TLS Hint Box removed temporarily - Phase 2 Headerless blocked until stability achieved 🤖 Generated with Claude Code (https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-03 20:42:28 +09:00
SuperSlab* sp_internal_allocate_superslab(int class_idx);
// Slot & Meta Helpers
int sp_slot_mark_active(SharedSSMeta* meta, int slot_idx, int class_idx);
int sp_slot_mark_empty(SharedSSMeta* meta, int slot_idx);
int sp_slot_claim_lockfree(SharedSSMeta* meta, int class_idx);
SharedSSMeta* sp_meta_find_or_create(SuperSlab* ss);
void sp_meta_sync_slots_from_ss(SharedSSMeta* meta, SuperSlab* ss);
// Free List Helpers
int sp_freelist_push_lockfree(int class_idx, SharedSSMeta* meta, int slot_idx);
int sp_freelist_pop_lockfree(int class_idx, SharedSSMeta** meta_out, int* slot_idx_out);
// Policy & Geometry Helpers
uint32_t sp_class_active_limit(int class_idx);
void sp_fix_geometry_if_needed(SuperSlab* ss, int slab_idx, int class_idx);
#endif // HAKMEM_SHARED_POOL_INTERNAL_H