Phase 36-37: TinyHotHeap v2 HotBox redesign and C7 current_page policy fixes
- Redefine TinyHotHeap v2 as per-thread Hot Box with clear boundaries - Add comprehensive OS statistics tracking for SS allocations - Implement route-based free handling for TinyHeap v2 - Add C6/C7 debugging and statistics improvements - Update documentation with implementation guidelines and analysis - Add new box headers for stats, routing, and front-end management
This commit is contained in:
@ -4,6 +4,7 @@
|
||||
// Date: 2025-11-28
|
||||
|
||||
#include "hakmem_tiny_superslab_internal.h"
|
||||
#include "box/ss_os_acquire_box.h"
|
||||
|
||||
// ============================================================================
|
||||
// Cache System - Global Variables
|
||||
@ -60,10 +61,12 @@ void* ss_os_acquire(uint8_t size_class, size_t ss_size, uintptr_t ss_mask, int p
|
||||
-1, 0);
|
||||
if (ptr != MAP_FAILED) {
|
||||
atomic_fetch_add(&g_ss_mmap_count, 1);
|
||||
ss_os_stats_record_alloc();
|
||||
if (((uintptr_t)ptr & ss_mask) == 0) {
|
||||
ss_stats_os_alloc(size_class, ss_size);
|
||||
return ptr;
|
||||
}
|
||||
ss_os_stats_record_free();
|
||||
munmap(ptr, ss_size);
|
||||
ptr = NULL;
|
||||
} else {
|
||||
@ -79,6 +82,7 @@ void* ss_os_acquire(uint8_t size_class, size_t ss_size, uintptr_t ss_mask, int p
|
||||
-1, 0);
|
||||
if (raw != MAP_FAILED) {
|
||||
uint64_t count = atomic_fetch_add(&g_ss_mmap_count, 1) + 1;
|
||||
ss_os_stats_record_alloc();
|
||||
#if !HAKMEM_BUILD_RELEASE
|
||||
if (log_count < 10) {
|
||||
fprintf(stderr, "[SUPERSLAB_MMAP] #%lu: class=%d size=%zu (total SuperSlab mmaps so far)\n",
|
||||
@ -98,11 +102,13 @@ void* ss_os_acquire(uint8_t size_class, size_t ss_size, uintptr_t ss_mask, int p
|
||||
|
||||
size_t prefix_size = aligned_addr - raw_addr;
|
||||
if (prefix_size > 0) {
|
||||
ss_os_stats_record_free();
|
||||
munmap(raw, prefix_size);
|
||||
}
|
||||
size_t suffix_size = alloc_size - prefix_size - ss_size;
|
||||
if (suffix_size > 0) {
|
||||
// 余剰領域は常に munmap して、実際に使用する SuperSlab サイズだけを残す。
|
||||
ss_os_stats_record_free();
|
||||
munmap((char*)ptr + ss_size, suffix_size);
|
||||
}
|
||||
|
||||
@ -111,6 +117,7 @@ void* ss_os_acquire(uint8_t size_class, size_t ss_size, uintptr_t ss_mask, int p
|
||||
// CRITICAL FIX (2025-12-05): Use MADV_POPULATE_WRITE for efficiency
|
||||
#ifdef MADV_POPULATE_WRITE
|
||||
int ret = madvise(ptr, ss_size, MADV_POPULATE_WRITE);
|
||||
ss_os_stats_record_madvise();
|
||||
if (ret != 0) {
|
||||
// Fallback: explicit memset
|
||||
memset(ptr, 0, ss_size);
|
||||
@ -118,6 +125,7 @@ void* ss_os_acquire(uint8_t size_class, size_t ss_size, uintptr_t ss_mask, int p
|
||||
#else
|
||||
// Fallback for kernels < 5.14
|
||||
memset(ptr, 0, ss_size);
|
||||
ss_os_stats_record_madvise();
|
||||
#endif
|
||||
|
||||
ss_stats_os_alloc(size_class, ss_size);
|
||||
|
||||
Reference in New Issue
Block a user