Closed kjhnet closed 9 months ago
기존에 Trap 6이 발생하였는데 이는 Illegal Op Code로 인해 발생하는 것입니다. include/traps.h에서 확인할 수 있습니다.
$ kbench -t 3 -r 1
kernel lavel benchmark start
-t #threads : 3
-i Initial size : 32
-b Buckets : 2
-d Duration : 1500
-u Update rate : 200
-r bench type : 1
-Set type : hash-list
Run Kernel Level Benchmark
initialize 32 nodes...kernel trap 6 err 0x0 cpu 0 cs 16 ds 24 ss 24
rip ffffffffc0188607 rsp ffffff0025ed7ec0 rbp ffffff0025ed7f10
cr2 0000000000410067 cr3 0000000025e05000 cr4 00000000000006b0
rdi ffffffffc08dcf80 rsi 0000000000000000 rdx ffffffffc08dcf98
rcx 0000000000000001 r8 0000000000000006 r9 0000000000000000
rax 0000000000000000 rbx ffffffffc08dcf80 r10 00000000000005dc
r11 0000000000000202 r12 ffffffffc01885d0 r13 ffffffffc08dcf80
r14 0000000000000000 r15 0000000000000000 rflags 0000000000000046
proc: name qp_thread pid 22 kstack 0xffffff0025ed0000
ffffffffc0134917
ffffffffc015b9af
QEMU에서 지원하지 않는 Opcode는 바로
/* in the ordo_clock.h file ...*/
static inline unsigned long ordo_get_clock(void)
{
/* rdtscp() is a serializing variant, which is not
* reordered in an instruction pipeline. */
return rdtscp();
}
/* in the amd64.h file ...*/
static inline uint64_t
rdtscp(void)
{
uint64_t a, d, c;
__asm volatile("rdtscp" : "=a" (a), "=d" (d), "=c" (c));
return a | (d << 32);
}
rdtscp 였습니다. 실제 하드웨어에서 위의 명령을 지원해줄 경우 실행하는데 문제는 없을 것으로 보입니다.
scalefs에서는 CPU가 rdtscp를 지원하지 않을시에 대안으로 아래의 방법을 사용하고 있습니다.
// Alternative to rdtscp on processors that don't support it
static inline uint64_t
rdtsc_serialized(void)
{
uint32_t hi, lo;
uint32_t eax, ebx, ecx, edx;
__asm volatile("cpuid"
: "=a" (eax), "=b" (ebx), "=c" (ecx), "=d" (edx)
: "a" (0));
__asm volatile("rdtsc" : "=a"(lo), "=d"(hi));
return ((uint64_t)lo)|(((uint64_t)hi)<<32);
}
scalefs에서 사용하는 rdtsc_serialized( ) 사용하는 경우 실행이 잘되요?
scalefs에서 사용하는 rdtsc_serialized( ) 사용하는 경우 실행이 잘되요?
일단 qemu에서 실행했는데 문제는 없습니다. 성능은 기존과 그렇게 크게 차이있는 것을 없는 것 같습니다. 다만 아직 코어수를 늘려보지는 않았습니다. 성능은 spinlock을 넘지는 않으면서 등락이 있습니다. thread 3, bucket 1, time 1.5 sec 로 실험했습니다.
동작하는데 오류가 발생하지는 않지만 user level에서 실행하면 MVRLU_ORDO_TIMESTAMPING 값이 1로 나옵니다.
scalefs에서 사용하는 rdtsc_serialized( ) 사용하는 경우 실행이 잘되요?
일단 qemu에서 실행했는데 문제는 없습니다. 성능은 기존과 그렇게 크게 차이있는 것을 없는 것 같습니다. 다만 아직 코어수를 늘려보지는 않았습니다. 성능은 spinlock을 넘지는 않으면서 등락이 있습니다. thread 3, bucket 1, time 1.5 sec 로 실험했습니다.
동작하는데 오류가 발생하지는 않지만 user level에서 실행하면 MVRLU_ORDO_TIMESTAMPING 값이 1로 나옵니다.
ORDO 값을 다르게 변경해볼래요. 현재 150인가 그렇게 되어 있을거에요.
How to find ORDO value in a machine
ORDO value for machines