This commit is contained in:
yan 2024-09-25 17:04:06 +08:00
parent 5daaace5f2
commit 3ab356a937
12 changed files with 182 additions and 59 deletions

View File

@ -0,0 +1,37 @@
#!/bin/bash
source ../config.sh
logdir=$logbasedir/rtm/
loop=(0)
threads=(32)
modes=(non log rtmlog)
size_types=(0 1)
mkdir -p $logdir
function run {
cd $basedir
./quick-build.sh
for thread in ${threads[@]}
do
for size_type in ${size_types[@]}
do
# baseline
mkdir -p $logdir/$thread/$1
$appdir/rtm.exp $size_type 2>&1 | tee $logdir/$thread/$1/$size_type.out
sleep 30
done
done
}
run rtmlog
sed -i 's/^\(#define USE_TSX\)/\/\/ \1/' $rtmconfig
run log
sed -i 's/^\(#define USE_LOG\)/\/\/ \1/' $rtmconfig
run non
sed -i '/^\/\/ #define USE_TSX$/s/^\/\/ //' $rtmconfig
sed -i '/^\/\/ #define USE_LOG$/s/^\/\/ //' $rtmconfig

View File

@ -0,0 +1,29 @@
#!/usr/bin/expect
set timeout 30
set size_type [lindex $argv 0]
# start
spawn ./build/simulate.sh
expect "Welcome to ChCore shell!"
# run anything you like here
# interact
send -- "rtm_test.bin $size_type &\r"
while {1} {
expect {
"rtm test finished" {
puts "success\n"
exit
}
timeout {
puts "failed\n"
exit
}
}
}
expect ""
interact

View File

@ -4,8 +4,9 @@
# test_mode="IPMI" # test_mode="IPMI"
test_mode="QEMU" test_mode="QEMU"
basedir="/home/xxx/treesls" basedir="/home/yjs/treesls"
aedir="$basedir/artificial_evaluation" aedir="$basedir/artificial_evaluation"
logbasedir="$aedir/logs/$test_mode" logbasedir="$aedir/logs/$test_mode"
appdir="$aedir/applications" appdir="$aedir/applications"
kconfig="$basedir/kernel/sls_config.cmake" kconfig="$basedir/kernel/sls_config.cmake"
rtmconfig="$basedir/kernel/include/arch/x86_64/plat/intel/immintrin.h"

View File

@ -33,5 +33,5 @@ chcore_generate_emulate_sh(
"--enable-kvm -machine pc,nvdimm=on -m 16G,slots=2,maxmem=64G \ "--enable-kvm -machine pc,nvdimm=on -m 16G,slots=2,maxmem=64G \
-object memory-backend-file,id=mem1,share=on,mem-path=\$nvm_backend_file,size=16G \ -object memory-backend-file,id=mem1,share=on,mem-path=\$nvm_backend_file,size=16G \
-device nvdimm,id=nvdimm1,memdev=mem1 \ -device nvdimm,id=nvdimm1,memdev=mem1 \
-cpu host -smp 20 -serial mon:stdio -nographic -cdrom \$basedir/chcore.iso" -cpu host -smp 64 -serial mon:stdio -nographic -cdrom \$basedir/chcore.iso"
) )

View File

@ -1,8 +1,8 @@
#pragma once #pragma once
#define USE_TSX // #define USE_TSX
// #define USE_LOG
// #define PRE_TOUCH // #define PRE_TOUCH
// #define PRINT_ABORT_COUNT
#ifndef __RTM__ #ifndef __RTM__
#pragma GCC push_options #pragma GCC push_options

View File

@ -1,7 +1,7 @@
#pragma once #pragma once
/* Should be set at boot time */ /* Should be set at boot time */
#define PLAT_CPU_NUM 10 #define PLAT_CPU_NUM 32
/* MSR Registers */ /* MSR Registers */
#define IA32_APIC_BASE 0x0000001b #define IA32_APIC_BASE 0x0000001b

View File

@ -198,10 +198,12 @@ struct page *buddy_get_pages(struct phys_mem_pool *pool, int order)
if (!list_empty(free_list)) { if (!list_empty(free_list)) {
/* Get a free memory chunck from the free list */ /* Get a free memory chunck from the free list */
page = list_entry(free_list->next, struct page, node); page = list_entry(free_list->next, struct page, node);
#ifdef USE_LOG
prepare_latest_log(pool, prepare_latest_log(pool,
ADD_PAGES, ADD_PAGES,
(u64)page, (u64)page,
order, cur_order); order, cur_order);
#endif
list_del(&page->node); list_del(&page->node);
pool->free_lists[cur_order].nr_free -= 1; pool->free_lists[cur_order].nr_free -= 1;
break; break;
@ -249,10 +251,12 @@ struct page *buddy_get_pages(struct phys_mem_pool *pool, int order)
goto redo; goto redo;
} }
} else { } else {
#ifdef USE_LOG
prepare_latest_log(pool, prepare_latest_log(pool,
ADD_PAGES, ADD_PAGES,
(u64)page, (u64)page,
order, cur_order); order, cur_order);
#endif
list_del(&page->node); list_del(&page->node);
pool->free_lists[cur_order].nr_free -= 1; pool->free_lists[cur_order].nr_free -= 1;
page = split_chunk(pool, order, page); page = split_chunk(pool, order, page);
@ -267,7 +271,9 @@ struct page *buddy_get_pages(struct phys_mem_pool *pool, int order)
} }
out: out:
#ifdef USE_LOG
commit_latest_log(pool); commit_latest_log(pool);
#endif
unlock(&pool->buddy_lock); unlock(&pool->buddy_lock);
return page; return page;
} }

View File

@ -25,6 +25,7 @@ struct slab_log_entry {
int order; int order;
}; };
#ifdef USE_LOG
static void prepare_slab_log(struct slab_log_entry *log, void *free_list_head, int current_free_count, void *next_slot, int order) { static void prepare_slab_log(struct slab_log_entry *log, void *free_list_head, int current_free_count, void *next_slot, int order) {
log->commited = false; log->commited = false;
log->free_list_head = free_list_head; log->free_list_head = free_list_head;
@ -35,6 +36,7 @@ static void prepare_slab_log(struct slab_log_entry *log, void *free_list_head, i
static void commit_slab_log(struct slab_log_entry *log) { static void commit_slab_log(struct slab_log_entry *log) {
log->commited = true; log->commited = true;
} }
#endif
/* /*
static inline int order_to_index(int order) static inline int order_to_index(int order)
@ -162,13 +164,17 @@ static void *alloc_in_slab_impl(int order)
struct slab_header *current_slab; struct slab_header *current_slab;
struct slab_slot_list* free_list; struct slab_slot_list* free_list;
void* next_slot; void* next_slot;
#ifdef USE_LOG
struct slab_log_entry log; struct slab_log_entry log;
#endif
lock(&slabs_locks[order]); lock(&slabs_locks[order]);
current_slab = slab_pool[order].current_slab; current_slab = slab_pool[order].current_slab;
#ifdef USE_LOG
log.from_init = false; log.from_init = false;
log.current_slab = current_slab; log.current_slab = current_slab;
#endif
/* When serving the first allocation request. */ /* When serving the first allocation request. */
if (unlikely(current_slab == NULL)) { if (unlikely(current_slab == NULL)) {
@ -177,17 +183,19 @@ static void *alloc_in_slab_impl(int order)
unlock(&slabs_locks[order]); unlock(&slabs_locks[order]);
return NULL; return NULL;
} }
#ifdef USE_LOG
log.from_init = true; log.from_init = true;
log.current_slab = current_slab; log.current_slab = current_slab;
#endif
slab_pool[order].current_slab = current_slab; slab_pool[order].current_slab = current_slab;
} }
free_list = (struct slab_slot_list*)current_slab->free_list_head; free_list = (struct slab_slot_list*)current_slab->free_list_head;
BUG_ON(free_list == NULL); BUG_ON(free_list == NULL);
next_slot = free_list->next_free; next_slot = free_list->next_free;
#ifdef USE_LOG
prepare_slab_log(&log, current_slab->free_list_head, current_slab->current_free_cnt, next_slot, order); prepare_slab_log(&log, current_slab->free_list_head, current_slab->current_free_cnt, next_slot, order);
#endif
#ifdef USE_TSX #ifdef USE_TSX
if (start_rtm == true) { if (start_rtm == true) {
int status; int status;
@ -219,8 +227,9 @@ static void *alloc_in_slab_impl(int order)
/* When current_slab is full, choose a new slab as the current one. */ /* When current_slab is full, choose a new slab as the current one. */
if (unlikely(current_slab->current_free_cnt == 0)) if (unlikely(current_slab->current_free_cnt == 0))
choose_new_current_slab(&slab_pool[order], order); choose_new_current_slab(&slab_pool[order], order);
#ifdef USE_LOG
commit_slab_log(&log); commit_slab_log(&log);
#endif
unlock(&slabs_locks[order]); unlock(&slabs_locks[order]);
return (void *)free_list; return (void *)free_list;

View File

@ -1,5 +1,5 @@
# SLS Basic Configruations # SLS Basic Configruations
set(SLS_RESTORE ON) set(SLS_RESTORE OFF)
set(SLS_EXT_SYNC OFF) set(SLS_EXT_SYNC OFF)
set(SLS_HYBRID_MEM ON) set(SLS_HYBRID_MEM ON)

View File

@ -24,7 +24,7 @@ target_compile_options(assert.bin PRIVATE -g3 -ggdb)
add_executable(udp_echo_server.bin udp_echo_server.c) add_executable(udp_echo_server.bin udp_echo_server.c)
add_executable(tcp_echo_server.bin tcp_echo_server.c) add_executable(tcp_echo_server.bin tcp_echo_server.c)
add_executable(tsx_test.bin tsx_test.c) add_executable(rtm_test.bin rtm_test.c)
# TreeSLS # TreeSLS
add_subdirectory(treesls) add_subdirectory(treesls)

View File

@ -0,0 +1,90 @@
#include <malloc.h>
#include <stdio.h>
#include <chcore/pmu.h>
#include <pthread.h>
#include <chcore/syscall.h>
#include <string.h>
#pragma GCC push_options
#pragma GCC optimize ("O0")
#define num_threads 32
s64 time_list[num_threads];
int fixed_size = 128;
int varying_size_times_max = 12;
int total_malloc_times = 100000;
enum test_size_t {
FIXED,
VARYING
} test_size_type;
// non log rtm+log
void *work(void *arg) {
int i = *(int *)arg;
usys_set_affinity(-1, i);
usys_yield();
s64 start = 0, end = 0, period;
int count = total_malloc_times / num_threads;
int size;
pmu_clear_cnt();
start = pmu_read_real_cycle();
for (int i = 0; i < count; i++) {
if (test_size_type == FIXED) {
size = fixed_size;
} else {
size = (1 << ((i % varying_size_times_max)));
}
void *m = malloc(size);
(void)m;
}
end = pmu_read_real_cycle();
period = end - start;
time_list[i] = period;
return NULL;
}
bool parse_args(int argc, char *argv[]) {
if (argc != 2) {
return false;
}
if (strcmp(argv[1], "0")) {
test_size_type = FIXED;
} else {
test_size_type = VARYING;
}
return true;
}
int main(int argc, char *argv[])
{
if (parse_args(argc, argv) == false) {
return -1;
}
pthread_t threads[num_threads];
int thread_index[num_threads];
for (int i = 0; i < num_threads; i++) {
thread_index[i] = i;
if (pthread_create(&threads[i], NULL, work, thread_index + i) != 0) {
perror("Failed to create thread");
return 1;
}
}
for (int i = 0; i < num_threads; i++) {
pthread_join(threads[i], NULL);
}
s64 avg = 0;
for (int i = 0; i < num_threads; i++) {
avg += time_list[i] / num_threads;
}
printf("result: %ld\n", avg);
printf("rtm test finished\n");
return 0;
}
#pragma GCC pop_options

View File

@ -1,49 +0,0 @@
#include <malloc.h>
#include <stdio.h>
#include <chcore/pmu.h>
#include <pthread.h>
#include <chcore/syscall.h>
#pragma GCC push_options
#pragma GCC optimize ("O0")
const int num_threads = 10;
void *work(void *arg) {
int i = *(int *)arg;
usys_set_affinity(-1, i);
usys_yield();
s64 start = 0, end = 0;
int size = 4096;
int count = 1000000 / num_threads;
pmu_clear_cnt();
start = pmu_read_real_cycle();
for (int i = 0; i < count; i++)
{
void *m = malloc(size);
(void)m;
}
end = pmu_read_real_cycle();
printf("tsx_test total %ld\n", end - start);
return NULL;
}
int main(int argc, char *argv[])
{
pthread_t threads[num_threads];
int thread_index[num_threads];
for (int i = 0; i < num_threads; i++) {
thread_index[i] = i;
if (pthread_create(&threads[i], NULL, work, thread_index + i) != 0) {
perror("Failed to create thread");
return 1;
}
}
for (int i = 0; i < num_threads; i++) {
pthread_join(threads[i], NULL);
}
return 0;
}
#pragma GCC pop_options