bigsys-gnu / mvcc-os

KhronOS, a scalable operating systems based on sv6 (MIT) with MV-RLU (multi-version concurrency control mechanism)
Other
1 stars 0 forks source link

support ORDO feature #41

Closed kjhnet closed 9 months ago

kjhnet commented 3 years ago
MadPlayer commented 3 years ago

Trap 6 Occured on QEMU

기존에 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);
}
kjhnet commented 3 years ago

scalefs에서 사용하는 rdtsc_serialized( ) 사용하는 경우 실행이 잘되요?

MadPlayer commented 3 years ago

scalefs에서 사용하는 rdtsc_serialized( ) 사용하는 경우 실행이 잘되요?

일단 qemu에서 실행했는데 문제는 없습니다. 성능은 기존과 그렇게 크게 차이있는 것을 없는 것 같습니다. 다만 아직 코어수를 늘려보지는 않았습니다. 성능은 spinlock을 넘지는 않으면서 등락이 있습니다. thread 3, bucket 1, time 1.5 sec 로 실험했습니다.

동작하는데 오류가 발생하지는 않지만 user level에서 실행하면 MVRLU_ORDO_TIMESTAMPING 값이 1로 나옵니다.

kjhnet commented 3 years ago

scalefs에서 사용하는 rdtsc_serialized( ) 사용하는 경우 실행이 잘되요?

일단 qemu에서 실행했는데 문제는 없습니다. 성능은 기존과 그렇게 크게 차이있는 것을 없는 것 같습니다. 다만 아직 코어수를 늘려보지는 않았습니다. 성능은 spinlock을 넘지는 않으면서 등락이 있습니다. thread 3, bucket 1, time 1.5 sec 로 실험했습니다.

동작하는데 오류가 발생하지는 않지만 user level에서 실행하면 MVRLU_ORDO_TIMESTAMPING 값이 1로 나옵니다.

ORDO 값을 다르게 변경해볼래요. 현재 150인가 그렇게 되어 있을거에요.

kjhnet commented 2 years ago