Files
vystem-b/shelter/lib/src/kernel/tests/test_malloc.c
2026-05-27 19:34:54 +02:00

92 lines
4.3 KiB
C

// SPDX-License-Identifier: MPL-2.0
#include "kernel/tests/test_malloc.h"
#include "kernel/tests/test_utils.h"
#include "kernel/tests/payloads/test_malloc_payload.h"
#include "kernel/log.h"
#include "memory/page.h"
#include "std/mem.h"
#include "std/malloc.h"
static sh_uint64 iter_num=10000;
__attribute__((section(".bss")))
static sh_uint64 address_list[10000];
SH_STATUS sh_test_malloc_benchmark() {
sh_tsc_TSC_VALUE *tsc_value=sh_test_get_tsc_values_buffer_ptr();
sh_mem_set_8((sh_uint8*)tsc_value,0x00,10000*sizeof(sh_tsc_TSC_VALUE));
sh_mem_set_8((sh_uint8*)address_list,0x00,sizeof(address_list));
sh_log_test("Benchmarking Malloc subsystem...");
sh_tsc_TSC_VALUE start=0;
sh_tsc_TSC_VALUE end=0;
for (sh_iter64 i=0;i<iter_num;i++) {
start=sh_tsc_get_kernel_current_tsc();
address_list[i]=(sh_uint64)sh_malloc(test_malloc_small_size[i]);
end=sh_tsc_get_kernel_current_tsc();
tsc_value[i]=end-start;
if (sh_malloc_get_last_status()!=SH_STATUS_SUCCESS) {
sh_log_error("Test failed for sh_malloc for small size. See detail below:",SH_LOG_SOURCE_TEST);
sh_log_ferror(SH_LOG_SOURCE_TEST,"Error code: %8s\n",sh_malloc_get_last_status());
sh_log_ferror(SH_LOG_SOURCE_TEST,"Index: %8u\n",i);
sh_log_ferror(SH_LOG_SOURCE_TEST,"Size: %4u\n",test_malloc_small_size[i]);
return SH_STATUS_TEST_FAILED;
}
}
sh_test_compute_print_stats("sh_malloc for small size",tsc_value,iter_num,SH_FALSE);
sh_mem_set_8((sh_uint8*)tsc_value,0x00,10000*sizeof(sh_tsc_TSC_VALUE));
for (sh_iter64 i=0;i<iter_num;i++) {
start=sh_tsc_get_kernel_current_tsc();
sh_free((void*)address_list[i]);
end=sh_tsc_get_kernel_current_tsc();
tsc_value[i]=end-start;
if (sh_malloc_get_last_status()!=SH_STATUS_SUCCESS) {
sh_log_error("Test failed for sh_free for small size. See detail below:",SH_LOG_SOURCE_TEST);
sh_log_ferror(SH_LOG_SOURCE_TEST,"Error code: %8s\n",sh_malloc_get_last_status());
sh_log_ferror(SH_LOG_SOURCE_TEST,"Index: %8u\n",i);
sh_log_ferror(SH_LOG_SOURCE_TEST,"Size: %4u\n",test_malloc_small_size[i]);
return SH_STATUS_TEST_FAILED;
}
}
sh_test_compute_print_stats("sh_free for small size",tsc_value,iter_num,SH_FALSE);
sh_mem_set_8((sh_uint8*)tsc_value,0x00,10000*sizeof(sh_tsc_TSC_VALUE));
sh_mem_set_8((sh_uint8*)address_list,0x00,sizeof(address_list));
sh_uint16 alloc_count=0;
sh_uint16 free_count=1000;
for (sh_iter64 i=0;i<2000;i++) {
sh_uint64 alloc_num=test_malloc_big_alloc[i];
sh_uint64 alloc_size=test_malloc_big_size[alloc_num]*SH_PAGE_SIZE;
if (address_list[alloc_num]==0) {
start=sh_tsc_get_kernel_current_tsc();
address_list[alloc_num]=(sh_uint64)sh_malloc(alloc_size);
end=sh_tsc_get_kernel_current_tsc();
tsc_value[alloc_count]=end-start;
alloc_count++;
if (sh_malloc_get_last_status()!=SH_STATUS_SUCCESS) {
sh_log_error("Test failed for sh_malloc for big size. See detail below:",SH_LOG_SOURCE_TEST);
sh_log_ferror(SH_LOG_SOURCE_TEST,"Error code: %8s\n",sh_malloc_get_last_status());
sh_log_ferror(SH_LOG_SOURCE_TEST,"Index: %8u\n",i);
sh_log_ferror(SH_LOG_SOURCE_TEST,"Size: %8u\n",alloc_size);
sh_log_ferror(SH_LOG_SOURCE_TEST,"Alloc Num: %8u\n",alloc_num);
sh_log_mem_stats(SH_LOG_SOURCE_TEST);
return SH_STATUS_TEST_FAILED;
}
} else {
start=sh_tsc_get_kernel_current_tsc();
sh_free((void*)address_list[alloc_num]);
end=sh_tsc_get_kernel_current_tsc();
tsc_value[free_count]=end-start;
free_count++;
if (sh_malloc_get_last_status()!=SH_STATUS_SUCCESS) {
sh_log_error("Test failed for sh_free for big size. See detail below:",SH_LOG_SOURCE_TEST);
sh_log_ferror(SH_LOG_SOURCE_TEST,"Error code: %8s\n",sh_malloc_get_last_status());
sh_log_ferror(SH_LOG_SOURCE_TEST,"Index: %8u\n",i);
sh_log_ferror(SH_LOG_SOURCE_TEST,"Size: %8u\n",alloc_size);
sh_log_ferror(SH_LOG_SOURCE_TEST,"Alloc Num: %8u\n",alloc_num);
sh_log_mem_stats(SH_LOG_SOURCE_TEST);
return SH_STATUS_TEST_FAILED;
}
}
}
sh_test_compute_print_stats("sh_malloc for pages allocations",tsc_value,alloc_count,SH_FALSE);
sh_test_compute_print_stats("sh_free for pages allocations",tsc_value+1000,free_count-1000,SH_FALSE);
sh_log_mem_stats(SH_LOG_SOURCE_TEST);
return SH_STATUS_SUCCESS;
}