Files
hakmem/core/hakmem_batch.h
Moe Charm (CI) 52386401b3 Debug Counters Implementation - Clean History
Major Features:
- Debug counter infrastructure for Refill Stage tracking
- Free Pipeline counters (ss_local, ss_remote, tls_sll)
- Diagnostic counters for early return analysis
- Unified larson.sh benchmark runner with profiles
- Phase 6-3 regression analysis documentation

Bug Fixes:
- Fix SuperSlab disabled by default (HAKMEM_TINY_USE_SUPERSLAB)
- Fix profile variable naming consistency
- Add .gitignore patterns for large files

Performance:
- Phase 6-3: 4.79 M ops/s (has OOM risk)
- With SuperSlab: 3.13 M ops/s (+19% improvement)

This is a clean repository without large log files.

🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-05 12:31:14 +09:00

50 lines
1.7 KiB
C
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// hakmem_batch.h - madvise Batching for TLB Optimization (Box Theory)
//
// Priority 3 optimization from ChatGPT Pro feedback:
// Batch MADV_DONTNEED calls to reduce TLB flush overhead
//
// Why batching matters:
// - mimalloc is 2× faster on VM scenario partly due to batched madvise
// - Each madvise() call triggers TLB flush (expensive!)
// - Batching 4MB worth of blocks reduces TLB flushes by 50-100×
//
// Expected Gain: +20-30% on VM scenario
#pragma once
#include <stddef.h>
#include <stdint.h>
// Configuration
#define BATCH_THRESHOLD (8 * 1024 * 1024) // 8MB: flush batch when reached (Phase 6.11: increased from 1MB for 2MB allocations)
#define BATCH_MIN_SIZE (64 * 1024) // 64KB: only batch large blocks
#define BATCH_MAX_BLOCKS 256 // Max blocks in batch
// Batch state
typedef struct {
void* blocks[BATCH_MAX_BLOCKS]; // Pointers to blocks
size_t sizes[BATCH_MAX_BLOCKS]; // Sizes of blocks
int count; // Number of blocks in batch
size_t total_bytes; // Total bytes in batch
} DontneedBatch;
// Batching API (Box Interface)
void hak_batch_init(void);
void hak_batch_shutdown(void);
// Add block to batch (returns 1 if flushed, 0 if buffered)
int hak_batch_add(void* ptr, size_t size);
// Force flush all batched blocks
void hak_batch_flush(void);
// Statistics
void hak_batch_print_stats(void);
// Query
size_t hak_batch_get_pending_bytes(void);
int hak_batch_get_pending_count(void);
// Page-level DONTNEED batching (for managed pool pages): enqueue whole pages
// Flush performs MADV_DONTNEED only (no munmap), safe with retained VA pointers.
int hak_batch_add_page(void* page, size_t size);