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>
37 lines
1.3 KiB
C
37 lines
1.3 KiB
C
// hakmem_trace.h - Optional USDT tracepoints for perf (user-space static probes)
|
|
// Enable by building with: CFLAGS+=-DHAKMEM_USDT=1 and having <sys/sdt.h> available
|
|
// When disabled, all macros compile to no-ops (zero overhead).
|
|
|
|
#ifndef HAKMEM_TRACE_H
|
|
#define HAKMEM_TRACE_H
|
|
|
|
#if HAKMEM_USDT
|
|
# include <sys/sdt.h>
|
|
# define HAK_TP0(name) DTRACE_PROBE(hakmem, name)
|
|
# define HAK_TP1(name,a1) DTRACE_PROBE1(hakmem, name, (a1))
|
|
# define HAK_TP2(name,a1,a2) DTRACE_PROBE2(hakmem, name, (a1), (a2))
|
|
# define HAK_TP3(name,a1,a2,a3) DTRACE_PROBE3(hakmem, name, (a1), (a2), (a3))
|
|
#else
|
|
# define HAK_TP0(name) do{}while(0)
|
|
# define HAK_TP1(name,a1) do{ (void)(a1); }while(0)
|
|
# define HAK_TP2(name,a1,a2) do{ (void)(a1); (void)(a2); }while(0)
|
|
# define HAK_TP3(name,a1,a2,a3) do{ (void)(a1); (void)(a2); (void)(a3); }while(0)
|
|
#endif
|
|
|
|
// Lightweight printf-free tracing for early-init / SEGV triage.
|
|
// Enabled only when built with -DHAKMEM_DEBUG_INIT_TRACE=1.
|
|
#ifdef HAKMEM_DEBUG_INIT_TRACE
|
|
# include <unistd.h>
|
|
# include <string.h>
|
|
static inline void hak_trace(const char* msg)
|
|
{
|
|
if (!msg) return;
|
|
write(2, msg, (size_t)strlen(msg));
|
|
}
|
|
# define HAK_TRACE(msg) hak_trace(msg)
|
|
#else
|
|
# define HAK_TRACE(msg) ((void)0)
|
|
#endif
|
|
|
|
#endif // HAKMEM_TRACE_H
|