SlideShare a Scribd company logo
1 of 72
SMP Implementation for
OpenBSD/sgi [         ]
   Takuya ASADA<syuu@openbsd.org>
•                AsiaBSDCon 2010



•
    http://bit.ly/octane2
•          BSD   EmbeddedOS 64bit         SMP



•                  MIPS
    *BSD                   MIPS     SMP



•

•      SMP
                 …
MIPS/SMP                          (1)

• Broadcom SiByte BCM1250
  2core 1GHz MIPS64, DDR DRAM, GbE,
  PCI, HT
• Cisco 3845
•
MIPS/SMP                          (1)

• Broadcom SiByte BCM1250
  2core 1GHz MIPS64, DDR DRAM, GbE,
  PCI, HT
• Cisco 3845
•
      128                   orz
MIPS/SMP                    (2)

•         SGI               ebay



•
• SGI Octane    2core   OpenBSD
MIPS/SMP                      (2)

•         SGI                 ebay



•
• SGI Octane     2core    OpenBSD


                $33!!!!
Octane2
Processors MIPS R12000 400MHz x2


 Memory         1GB SDRAM

Graphics     3D Graphics Card

 Sound     Integrated Digital Audio

 Storage      35GB SCSI HDD

Ethernet         100BASE-T
OpenBSD developer
•   2009/4


•                OpenBSD/sgi



•   2009/9 developer



•   2009/11
• OpenBSD
• -current

•
Demo
'(&!!"   4% overhead
 '(%!!"
 '($!!"
 '(#!!"                     46% speed up
 '(!!!"
                                           ,-.-/01)02+!"
  &!!"
                                           ,-.-/01)02+!342"
  %!!"
  $!!"
  #!!"
     !"
(sec)        ")*'"      ")*#"      ")*+"
OpenBSD/amd64
 &!!"

 %#!"
        2% overhead

 %!!"
                              44% speed up
 $#!"                                        )*+*,-."
                                             )*+*,-./01"
 $!!"

  #!"

   !"
           "'($"      "'(%"          "'(&"
(sec)
•         cpu_info   •
                     •
•   per-processor
    cpu_info
                     •   IPI: Inter-Processor Interrupt
•                    •   Per-processor ASID

•                    •   TLB shootdown

                     •   Lazy FPU handling
•                    •   Per-processor clock
•   per-processor

•

•
…
per-processor

•                   sgi port




•
    per-processor                  cpu_info

•
    pmap       per-processor * per-process
clock.c
// defined as global variables
       u_int32_t cpu_counter_last;
       u_int32_t cpu_counter_interval;
       u_int32_t pendingticks;

uint32_t clock_int5(uint32_t mask, struct trap_frame *tf)
...
       clkdiff = cp0_get_count() - cpu_counter_last;
       while (clkdiff >= cpu_counter_interval) {
               cpu_counter_last += cpu_counter_interval;
               clkdiff = cp0_get_count() - cpu_counter_last;
               pendingticks++;
clock.c


uint32_t clock_int5(uint32_t mask, struct trap_frame *tf)
...
       struct cpu_info *ci = curcpu();
       clkdiff = cp0_get_count() - ci->ci_cpu_counter_last;
       while (clkdiff >= ci->ci_cpu_counter_interval) {
               ci->ci_cpu_counter_last +=
                   ci->ci_cpu_counter_interval;
               clkdiff =
                  cp0_get_count() - ci->ci_cpu_counter_last;
               ci->ci_pendingticks++;
pmap
•   MIPS TLB            ASID         8bit                 ID
                                             TLB



•      8bit      PID                               ASID


              ASID Process

•          SMP                              ASID



•
    ASID                     per-processor * per-process
pmap


uint pmap_alloc_tlbpid(struct proc *p)
...
               tlbpid_cnt = id + 1;
               pmap->pm_tlbpid = id;




uint pmap_alloc_tlbpid(struct proc *p)
...
               tlbpid_cnt[cpuid] = id + 1;
               pmap->pm_tlbpid[cpuid] = id;
•
    •            : mutex, mp_lock

    •                : CAS, 64bit add, etc..

•

    •
    •
    •   trap()
uint32_t clock_int5(uint32_t mask, struct trap_frame *tf)
...
       if (tf->ipl < IPL_CLOCK) {
#ifdef MULTIPROCESSOR
                __mp_lock(&kernel_lock);
#endif
                while (ci->ci_pendingticks) {
                        clk_count.ec_count++;
                        hardclock(tf);
                        ci->ci_pendingticks--;
                }
#ifdef MULTIPROCESSOR
                __mp_unlock(&kernel_lock);
#endif
uint32_t clock_int5(uint32_t mask, struct trap_frame *tf)
...
       if (tf->ipl < IPL_CLOCK) {
#ifdef MULTIPROCESSOR
                __mp_lock(&kernel_lock);
#endif
                while (ci->ci_pendingticks) {
                        clk_count.ec_count++;
                        hardclock(tf);
                        ci->ci_pendingticks--;
                }
#ifdef MULTIPROCESSOR
                __mp_unlock(&kernel_lock);
#endif

       Actually, it causes a bug... described later
•
•   TLB

•
•
    •

•
    •

        →
TLB

•   MIPS TLB




•   TLB shootdown                              TLB
        invalidate/update

    •   IPI(Inter-Processor Interrupt)
TLB shootdown
              CPU A         CPU B
      Fault
TLB shootdown                  IPI
                      IPI
TLB invalidate                 TLB invalidate
CPU B                          CPU A
• MIPS R10000/R12000

•       Octane

•
SMP

•
    •
    •

    • TLB shootdown
•

•

•

•
JTAG ICE
•
•


•   Embedded OS SMP



•      Octane
                  or
ddb
•   OpenBSD

•


•                 SMP
          ddb
    ddb

•         …
printf()!
•
•   printf(message)

•
    •

    •                  printf()



•
printf

•   Octane

•

•

•                   cpu0         com0 cpu1
             com1

•                          ;-)
print
•

    •           printf

    •
•
•
•

•
void mtx_enter(struct mutex *mtx)
...
        for (;;) {
                if (mtx->mtx_wantipl != IPL_NONE)
                        s = splraise(mtx->mtx_wantipl);
                if (try_lock(mtx)) {
                        if (mtx->mtx_wantipl != IPL_NONE)
                                mtx->mtx_oldipl = s;
                        mtx->mtx_owner = curcpu();
                        return;
                }
                if (mtx->mtx_wantipl != IPL_NONE)
                        splx(s);
                if (++i > MTX_TIMEOUT)
                        panic("mtx deadlockedn”);
        }
void mtx_enter(struct mutex *mtx)
...
        for (;;) {
                if (mtx->mtx_wantipl != IPL_NONE)
                        s = splraise(mtx->mtx_wantipl);
                if (try_lock(mtx)) {
                        if (mtx->mtx_wantipl != IPL_NONE)
                                mtx->mtx_oldipl = s;
                        mtx->mtx_owner = curcpu();
                        return;
                }
                if (mtx->mtx_wantipl != IPL_NONE)
                        splx(s);
                if (++i > MTX_TIMEOUT)
                        panic("mtx deadlockedn”);
        }
CPU A                 CPU B



        Lock   Lock
         A      B
CPU A                 CPU B



        Lock   Lock
         A      B
CPU A                 CPU B



        Lock   Lock
         A      B
void mtx_enter(struct mutex *mtx)
...
        for (;;) {
                if (mtx->mtx_wantipl != IPL_NONE)
                        s = splraise(mtx->mtx_wantipl);
                if (try_lock(mtx)) {
                        if (mtx->mtx_wantipl != IPL_NONE)
                                mtx->mtx_oldipl = s;
                        mtx->mtx_owner = curcpu();
                        mtx->mtx_ra =
                            __builtin_return_address(0);
                        return;
                }
                if (mtx->mtx_wantipl != IPL_NONE)
                        splx(s);
                if (++i > MTX_TIMEOUT)
                        panic("mtx deadlocked ra:%pn",
                                mtx->mtx_ra);
        }
IPI
           CPU A          CPU B
                                  Interrupt
       Fault
                             Disable interrupt
  Acquire lock
                   Lock
                             Wait until released
TLB shootdown                 Blocked
                   IPI
    Wait ACK
IPI
           CPU A          CPU B
                                  Interrupt
       Fault
                             Disable interrupt
  Acquire lock
                   Lock
                             Wait until released
TLB shootdown
                   IPI
    Wait ACK
IPI
           CPU A          CPU B
                                  Interrupt
       Fault
                             Disable interrupt
  Acquire lock               Re-enable interrupt
                   Lock
                             Wait until released
TLB shootdown                Accept Interrupt
                   IPI
    Wait ACK
IPI
           CPU A          CPU B
                                  Interrupt
       Fault
                             Disable interrupt
  Acquire lock               Re-enable interrupt
                   Lock
                             Wait until released
TLB shootdown                Accept Interrupt
                   IPI
    Wait ACK                 ACK for rendezvous
IPI
           CPU A              CPU B
                                      Interrupt
       Fault
                 IPI             Disable interrupt
  Acquire lock                   Re-enable interrupt
                       Lock
                                 Wait until released
TLB shootdown                    Accept Interrupt
                       IPI
    Wait ACK                     ACK for rendezvous
uint32_t clock_int5(uint32_t mask, struct trap_frame *tf)
...
       if (tf->ipl < IPL_CLOCK) {
#ifdef MULTIPROCESSOR
                u_int32_t sr;

                sr = getsr();
                ENABLEIPI();
                __mp_lock(&kernel_lock);
#endif
                while (ci->ci_pendingticks) {
                        clk_count.ec_count++;
                        hardclock(tf);
                        ci->ci_pendingticks--;
                }
#ifdef MULTIPROCESSOR
                __mp_unlock(&kernel_lock);
                setsr(sr);
#endif
splhigh()       IPI
           CPU A              CPU B
                                      splhigh()
       Fault
  Acquire lock
                       Lock
                                 Wait until released
TLB shootdown                     Blocked
                       IPI
    Wait ACK
splhigh()       IPI
           CPU A              CPU B
                                      splhigh()
       Fault
  Acquire lock
                       Lock
                                 Wait until released
TLB shootdown
                       IPI
    Wait ACK
splhigh()       IPI
           CPU A              CPU B
                                      splhigh()
       Fault
  Acquire lock
                       Lock
                                 Wait until released
TLB shootdown                    Accept Interrupt
                       IPI
    Wait ACK
splhigh()       IPI
           CPU A              CPU B
                                      splhigh()
       Fault
  Acquire lock
                       Lock
                                 Wait until released
TLB shootdown                    Accept Interrupt
                       IPI
    Wait ACK                     ACK for rendezvous
splhigh()         IPI
           CPU A                CPU B
                 IPL_IPI                splhigh()
       Fault
                                IPL_HIGH
  Acquire lock
                         Lock
                                   Wait until released
TLB shootdown                      Accept Interrupt
                         IPI
    Wait ACK                        ACK for rendezvous
 #define          IPL_TTY           4         /*   terminal */
 #define          IPL_VM            5         /*   memory allocation */
 #define          IPL_CLOCK         6         /*   clock */
 #define          IPL_HIGH          7         /*   everything */
 #define          NIPLS             8         /*   Number of levels */



 #define          IPL_TTY           4         /*   terminal */
 #define          IPL_VM            5         /*   memory allocation */
 #define          IPL_CLOCK         6         /*   clock */
 #define          IPL_HIGH          7         /*   everything */
 #define          IPL_IPI           8         /*   ipi */
 #define          NIPLS             9         /*   Number of levels */
•                                    cpu_info



•   malloc()              →

    •             TLB



    •   MIPS             TLB   TLB
        TLB                          cpu_info



•
               wrapper
wrapper
vaddr_t smp_malloc(size_t size)
...
       if (size < PAGE_SIZE) {
                va = (vaddr_t)malloc(size, M_DEVBUF, M_NOWAIT);
                if (va == NULL)
                        return NULL;
                error = pmap_extract(pmap_kernel(), va, &pa);
                if (error == FALSE)
                        return NULL;
       } else {
                TAILQ_INIT(&mlist);
                error = uvm_pglistalloc(size, 0, -1L, 0, 0,
                    &mlist, 1, UVM_PLA_NOWAIT);
                if (error)
                        return NULL;
                m = TAILQ_FIRST(&mlist);
                pa = VM_PAGE_TO_PHYS(m);
       }

       return PHYS_TO_XKPHYS(pa, CCA_CACHED);
TLB shootdown
•   invalidate/update    TLB shootdown



           kernel mode
            user mode

•                        shootdown
                               shootdown
    ASID

•               pmap                       TLB shootdown
void pmap_invalidate_page(pmap_t pmap, vm_offset_t va)
...
   arg.pmap = pmap;
   arg.va = va;
   smp_rendezvous(0, pmap_invalidate_page_action, 0,
    (void *)&arg);

void pmap_invalidate_page_action(void *arg)
...
   pmap_t pmap = ((struct pmap_invalidate_page_arg *)arg)->pmap;
   vm_offset_t va = ((struct pmap_invalidate_page_arg *)arg)->va;
   if (is_kernel_pmap(pmap)) {
      pmap_TLB_invalidate_kernel(va);
      return;
   }
   if (pmap->pm_asid[PCPU_GET(cpuid)].gen
       != PCPU_GET(asid_generation))
      return;
   else if (!(pmap->pm_active & PCPU_GET(cpumask))) {
      pmap->pm_asid[PCPU_GET(cpuid)].gen = 0;
      return;
   }
   va = pmap_va_asid(pmap, (va & ~PGOFSET));
   mips_TBIS(va);
CPU_INFO_FOREACH(cii, ci)
        if (cpuset_isset(&cpus_running, ci)) {
                unsigned int i = ci->ci_cpuid;
                unsigned int m = 1 << i;
                if (pmap->pm_asid[i].pma_asidgen !=
                    pmap_asid_info[i].pma_asidgen)
                        continue;
                else if (ci->ci_curpmap != pmap) {
                        pmap->pm_asid[i].pma_asidgen = 0;
                        continue;
                }
                cpumask |= m;
        }

if (cpumask == 1 << cpuid) {
        u_long asid;

        asid = pmap->pm_asid[cpuid].pma_asid << VMTLB_PID_SHIFT;
        tlb_flush_addr(va | asid);
} else if (cpumask) {
        struct pmap_invalidate_page_arg arg;
        arg.pmap = pmap;
        arg.va = va;

        smp_rendezvous_cpus(cpumask, pmap_invalidate_user_page_action,
                &arg);
}
•   SGI Origin 350   SMP

•   Cavium OCTEON OpenBSD
                           SoC



•   SMP

    •   rthread

    •

More Related Content

What's hot

FreeBSD under DigitalOcean VPS
FreeBSD under DigitalOcean VPSFreeBSD under DigitalOcean VPS
FreeBSD under DigitalOcean VPSRyo ONODERA
 
[5]投影片 futurewad樹莓派研習會 141218
[5]投影片 futurewad樹莓派研習會 141218[5]投影片 futurewad樹莓派研習會 141218
[5]投影片 futurewad樹莓派研習會 141218CAVEDU Education
 
移植FreeRTOS 之嵌入式軟體研究與開發
移植FreeRTOS 之嵌入式軟體研究與開發移植FreeRTOS 之嵌入式軟體研究與開發
移植FreeRTOS 之嵌入式軟體研究與開發艾鍗科技
 
Specializing the Data Path - Hooking into the Linux Network Stack
Specializing the Data Path - Hooking into the Linux Network StackSpecializing the Data Path - Hooking into the Linux Network Stack
Specializing the Data Path - Hooking into the Linux Network StackKernel TLV
 
Making OpenBSD Useful on the Octeon Network Gear by Paul Irofti
Making OpenBSD Useful on the Octeon Network Gear by Paul IroftiMaking OpenBSD Useful on the Octeon Network Gear by Paul Irofti
Making OpenBSD Useful on the Octeon Network Gear by Paul Iroftieurobsdcon
 
Semtex.c [CVE-2013-2094] - A Linux Privelege Escalation
Semtex.c [CVE-2013-2094] - A Linux Privelege EscalationSemtex.c [CVE-2013-2094] - A Linux Privelege Escalation
Semtex.c [CVE-2013-2094] - A Linux Privelege EscalationKernel TLV
 
Building Network Functions with eBPF & BCC
Building Network Functions with eBPF & BCCBuilding Network Functions with eBPF & BCC
Building Network Functions with eBPF & BCCKernel TLV
 
Raspberry Pi I/O控制與感測器讀取
Raspberry Pi I/O控制與感測器讀取Raspberry Pi I/O控制與感測器讀取
Raspberry Pi I/O控制與感測器讀取艾鍗科技
 
スケジューラからみたOSの話
スケジューラからみたOSの話スケジューラからみたOSの話
スケジューラからみたOSの話Takeshi Fujiwara
 
Cs423 raw sockets_bw
Cs423 raw sockets_bwCs423 raw sockets_bw
Cs423 raw sockets_bwjktjpc
 
用Raspberry Pi 學Linux I2C Driver
用Raspberry Pi 學Linux I2C Driver用Raspberry Pi 學Linux I2C Driver
用Raspberry Pi 學Linux I2C Driver艾鍗科技
 
Embedded TCP/IP stack for FreeRTOS
Embedded TCP/IP stack for FreeRTOSEmbedded TCP/IP stack for FreeRTOS
Embedded TCP/IP stack for FreeRTOS艾鍗科技
 
Kernel Recipes 2018 - New GPIO interface for linux user space - Bartosz Golas...
Kernel Recipes 2018 - New GPIO interface for linux user space - Bartosz Golas...Kernel Recipes 2018 - New GPIO interface for linux user space - Bartosz Golas...
Kernel Recipes 2018 - New GPIO interface for linux user space - Bartosz Golas...Anne Nicolas
 
“Linux Kernel CPU Hotplug in the Multicore System”
“Linux Kernel CPU Hotplug in the Multicore System”“Linux Kernel CPU Hotplug in the Multicore System”
“Linux Kernel CPU Hotplug in the Multicore System”GlobalLogic Ukraine
 
Stm32 f4 first touch
Stm32 f4 first touchStm32 f4 first touch
Stm32 f4 first touchBenux Wei
 

What's hot (20)

FreeBSD under DigitalOcean VPS
FreeBSD under DigitalOcean VPSFreeBSD under DigitalOcean VPS
FreeBSD under DigitalOcean VPS
 
[5]投影片 futurewad樹莓派研習會 141218
[5]投影片 futurewad樹莓派研習會 141218[5]投影片 futurewad樹莓派研習會 141218
[5]投影片 futurewad樹莓派研習會 141218
 
移植FreeRTOS 之嵌入式軟體研究與開發
移植FreeRTOS 之嵌入式軟體研究與開發移植FreeRTOS 之嵌入式軟體研究與開發
移植FreeRTOS 之嵌入式軟體研究與開發
 
Specializing the Data Path - Hooking into the Linux Network Stack
Specializing the Data Path - Hooking into the Linux Network StackSpecializing the Data Path - Hooking into the Linux Network Stack
Specializing the Data Path - Hooking into the Linux Network Stack
 
Making OpenBSD Useful on the Octeon Network Gear by Paul Irofti
Making OpenBSD Useful on the Octeon Network Gear by Paul IroftiMaking OpenBSD Useful on the Octeon Network Gear by Paul Irofti
Making OpenBSD Useful on the Octeon Network Gear by Paul Irofti
 
Semtex.c [CVE-2013-2094] - A Linux Privelege Escalation
Semtex.c [CVE-2013-2094] - A Linux Privelege EscalationSemtex.c [CVE-2013-2094] - A Linux Privelege Escalation
Semtex.c [CVE-2013-2094] - A Linux Privelege Escalation
 
Building Network Functions with eBPF & BCC
Building Network Functions with eBPF & BCCBuilding Network Functions with eBPF & BCC
Building Network Functions with eBPF & BCC
 
Gnu linux on arm for $50 - $100
Gnu linux on arm for $50 - $100Gnu linux on arm for $50 - $100
Gnu linux on arm for $50 - $100
 
Raspberry Pi I/O控制與感測器讀取
Raspberry Pi I/O控制與感測器讀取Raspberry Pi I/O控制與感測器讀取
Raspberry Pi I/O控制與感測器讀取
 
スケジューラからみたOSの話
スケジューラからみたOSの話スケジューラからみたOSの話
スケジューラからみたOSの話
 
Cs423 raw sockets_bw
Cs423 raw sockets_bwCs423 raw sockets_bw
Cs423 raw sockets_bw
 
用Raspberry Pi 學Linux I2C Driver
用Raspberry Pi 學Linux I2C Driver用Raspberry Pi 學Linux I2C Driver
用Raspberry Pi 學Linux I2C Driver
 
Embedded TCP/IP stack for FreeRTOS
Embedded TCP/IP stack for FreeRTOSEmbedded TCP/IP stack for FreeRTOS
Embedded TCP/IP stack for FreeRTOS
 
Prototipare col raspberry pi
Prototipare col raspberry piPrototipare col raspberry pi
Prototipare col raspberry pi
 
Linux Device Tree
Linux Device TreeLinux Device Tree
Linux Device Tree
 
OpenBTS AirPutih
OpenBTS AirPutihOpenBTS AirPutih
OpenBTS AirPutih
 
Kernel Recipes 2018 - New GPIO interface for linux user space - Bartosz Golas...
Kernel Recipes 2018 - New GPIO interface for linux user space - Bartosz Golas...Kernel Recipes 2018 - New GPIO interface for linux user space - Bartosz Golas...
Kernel Recipes 2018 - New GPIO interface for linux user space - Bartosz Golas...
 
“Linux Kernel CPU Hotplug in the Multicore System”
“Linux Kernel CPU Hotplug in the Multicore System”“Linux Kernel CPU Hotplug in the Multicore System”
“Linux Kernel CPU Hotplug in the Multicore System”
 
ARM 64bit has come!
ARM 64bit has come!ARM 64bit has come!
ARM 64bit has come!
 
Stm32 f4 first touch
Stm32 f4 first touchStm32 f4 first touch
Stm32 f4 first touch
 

Viewers also liked

"Archaeology and RPG" hack: LUNA's development progress, at NBUG meeting 2017-02
"Archaeology and RPG" hack: LUNA's development progress, at NBUG meeting 2017-02"Archaeology and RPG" hack: LUNA's development progress, at NBUG meeting 2017-02
"Archaeology and RPG" hack: LUNA's development progress, at NBUG meeting 2017-02Kenji Aoyama
 
Intra process memory protection for applications on ARM and x86
Intra process memory protection for applications on ARM and x86Intra process memory protection for applications on ARM and x86
Intra process memory protection for applications on ARM and x86Priyanka Aash
 
あるキャッシュメモリの話
あるキャッシュメモリの話あるキャッシュメモリの話
あるキャッシュメモリの話nullnilaki
 
ABI란 무엇인가요?
ABI란 무엇인가요?ABI란 무엇인가요?
ABI란 무엇인가요?진상 문
 
家に帰るまでが遠足です
家に帰るまでが遠足です家に帰るまでが遠足です
家に帰るまでが遠足ですCryolite
 
120529 railsとか勉強会v2
120529 railsとか勉強会v2120529 railsとか勉強会v2
120529 railsとか勉強会v2Yoshiteru Toki
 
(昔は)人気のあーきてくちゃ
(昔は)人気のあーきてくちゃ(昔は)人気のあーきてくちゃ
(昔は)人気のあーきてくちゃYojiro Uo
 
あるmmapの話
あるmmapの話あるmmapの話
あるmmapの話nullnilaki
 
C++が仲間になりたそうにこちらを見ている
C++が仲間になりたそうにこちらを見ているC++が仲間になりたそうにこちらを見ている
C++が仲間になりたそうにこちらを見ているfjnl
 
C++14 solve explicit_default_constructor
C++14 solve explicit_default_constructorC++14 solve explicit_default_constructor
C++14 solve explicit_default_constructorAkira Takahashi
 
Introduction of OpenBSD/luna88k at OSC 2014 Nagoya
Introduction of OpenBSD/luna88k at OSC 2014 NagoyaIntroduction of OpenBSD/luna88k at OSC 2014 Nagoya
Introduction of OpenBSD/luna88k at OSC 2014 NagoyaKenji Aoyama
 
ネトゲで人生を変えたい
ネトゲで人生を変えたいネトゲで人生を変えたい
ネトゲで人生を変えたいEric Sartre
 
エンジニアなら知っておきたい「仮想マシン」のしくみ v1.1 (hbstudy 17)
エンジニアなら知っておきたい「仮想マシン」のしくみ v1.1 (hbstudy 17)エンジニアなら知っておきたい「仮想マシン」のしくみ v1.1 (hbstudy 17)
エンジニアなら知っておきたい「仮想マシン」のしくみ v1.1 (hbstudy 17)Takeshi HASEGAWA
 
C# 뉴비를 위한 맛보기
C# 뉴비를 위한 맛보기C# 뉴비를 위한 맛보기
C# 뉴비를 위한 맛보기진상 문
 
やさしい日本語言い換えシステムを支える技術
やさしい日本語言い換えシステムを支える技術やさしい日本語言い換えシステムを支える技術
やさしい日本語言い換えシステムを支える技術Eric Sartre
 
Back to school 2015
Back to school 2015Back to school 2015
Back to school 2015Laura Rieben
 
39 41 Feature Jan11
39 41 Feature Jan1139 41 Feature Jan11
39 41 Feature Jan11Alan Bassett
 

Viewers also liked (20)

"Archaeology and RPG" hack: LUNA's development progress, at NBUG meeting 2017-02
"Archaeology and RPG" hack: LUNA's development progress, at NBUG meeting 2017-02"Archaeology and RPG" hack: LUNA's development progress, at NBUG meeting 2017-02
"Archaeology and RPG" hack: LUNA's development progress, at NBUG meeting 2017-02
 
Intra process memory protection for applications on ARM and x86
Intra process memory protection for applications on ARM and x86Intra process memory protection for applications on ARM and x86
Intra process memory protection for applications on ARM and x86
 
あるキャッシュメモリの話
あるキャッシュメモリの話あるキャッシュメモリの話
あるキャッシュメモリの話
 
Scheme to x86コンパイラ
Scheme to x86コンパイラScheme to x86コンパイラ
Scheme to x86コンパイラ
 
ABI란 무엇인가요?
ABI란 무엇인가요?ABI란 무엇인가요?
ABI란 무엇인가요?
 
家に帰るまでが遠足です
家に帰るまでが遠足です家に帰るまでが遠足です
家に帰るまでが遠足です
 
120529 railsとか勉強会v2
120529 railsとか勉強会v2120529 railsとか勉強会v2
120529 railsとか勉強会v2
 
(昔は)人気のあーきてくちゃ
(昔は)人気のあーきてくちゃ(昔は)人気のあーきてくちゃ
(昔は)人気のあーきてくちゃ
 
あるmmapの話
あるmmapの話あるmmapの話
あるmmapの話
 
C++が仲間になりたそうにこちらを見ている
C++が仲間になりたそうにこちらを見ているC++が仲間になりたそうにこちらを見ている
C++が仲間になりたそうにこちらを見ている
 
Codevs5.0勉強会
Codevs5.0勉強会Codevs5.0勉強会
Codevs5.0勉強会
 
C++14 solve explicit_default_constructor
C++14 solve explicit_default_constructorC++14 solve explicit_default_constructor
C++14 solve explicit_default_constructor
 
Introduction of OpenBSD/luna88k at OSC 2014 Nagoya
Introduction of OpenBSD/luna88k at OSC 2014 NagoyaIntroduction of OpenBSD/luna88k at OSC 2014 Nagoya
Introduction of OpenBSD/luna88k at OSC 2014 Nagoya
 
ネトゲで人生を変えたい
ネトゲで人生を変えたいネトゲで人生を変えたい
ネトゲで人生を変えたい
 
エンジニアなら知っておきたい「仮想マシン」のしくみ v1.1 (hbstudy 17)
エンジニアなら知っておきたい「仮想マシン」のしくみ v1.1 (hbstudy 17)エンジニアなら知っておきたい「仮想マシン」のしくみ v1.1 (hbstudy 17)
エンジニアなら知っておきたい「仮想マシン」のしくみ v1.1 (hbstudy 17)
 
C# 뉴비를 위한 맛보기
C# 뉴비를 위한 맛보기C# 뉴비를 위한 맛보기
C# 뉴비를 위한 맛보기
 
やさしい日本語言い換えシステムを支える技術
やさしい日本語言い換えシステムを支える技術やさしい日本語言い換えシステムを支える技術
やさしい日本語言い換えシステムを支える技術
 
R3 l+ module slides draft
R3 l+ module slides draftR3 l+ module slides draft
R3 l+ module slides draft
 
Back to school 2015
Back to school 2015Back to school 2015
Back to school 2015
 
39 41 Feature Jan11
39 41 Feature Jan1139 41 Feature Jan11
39 41 Feature Jan11
 

Similar to SMP Implementation for OpenBSD/sgi [Japanese Edition]

オペレーティングシステム 設計と実装 第3版(20101211)
オペレーティングシステム 設計と実装 第3版(20101211)オペレーティングシステム 設計と実装 第3版(20101211)
オペレーティングシステム 設計と実装 第3版(20101211)Ryousei Takano
 
리눅스 드라이버 실습 #3
리눅스 드라이버 실습 #3리눅스 드라이버 실습 #3
리눅스 드라이버 실습 #3Sangho Park
 
Performance tweaks and tools for Linux (Joe Damato)
Performance tweaks and tools for Linux (Joe Damato)Performance tweaks and tools for Linux (Joe Damato)
Performance tweaks and tools for Linux (Joe Damato)Ontico
 
Protocol T50: Five months later... So what?
Protocol T50: Five months later... So what?Protocol T50: Five months later... So what?
Protocol T50: Five months later... So what?Nelson Brito
 
JVM Memory Model - Yoav Abrahami, Wix
JVM Memory Model - Yoav Abrahami, WixJVM Memory Model - Yoav Abrahami, Wix
JVM Memory Model - Yoav Abrahami, WixCodemotion Tel Aviv
 
Using ARM Dev.Board in physical experimental instruments
Using ARM Dev.Board in physical experimental instrumentsUsing ARM Dev.Board in physical experimental instruments
Using ARM Dev.Board in physical experimental instrumentsa_n0v
 
Java Jit. Compilation and optimization by Andrey Kovalenko
Java Jit. Compilation and optimization by Andrey KovalenkoJava Jit. Compilation and optimization by Andrey Kovalenko
Java Jit. Compilation and optimization by Andrey KovalenkoValeriia Maliarenko
 
Linux kernel debugging
Linux kernel debuggingLinux kernel debugging
Linux kernel debugginglibfetion
 
BSides London - Scapy Workshop
BSides London - Scapy WorkshopBSides London - Scapy Workshop
BSides London - Scapy WorkshopAdam Maxwell
 
IOT Firmware: Best Pratices
IOT Firmware:  Best PraticesIOT Firmware:  Best Pratices
IOT Firmware: Best Praticesfarmckon
 
May2010 hex-core-opt
May2010 hex-core-optMay2010 hex-core-opt
May2010 hex-core-optJeff Larkin
 
Multiplatform JIT Code Generator for NetBSD by Alexander Nasonov
Multiplatform JIT Code Generator for NetBSD by Alexander NasonovMultiplatform JIT Code Generator for NetBSD by Alexander Nasonov
Multiplatform JIT Code Generator for NetBSD by Alexander Nasonoveurobsdcon
 
Magnetic door lock using arduino
Magnetic door lock using arduinoMagnetic door lock using arduino
Magnetic door lock using arduinoSravanthi Sinha
 
eu-19-LimitedResults-Fatal-Fury-On-ESP32-Time-To-Release-Hardware-Exploits.pdf
eu-19-LimitedResults-Fatal-Fury-On-ESP32-Time-To-Release-Hardware-Exploits.pdfeu-19-LimitedResults-Fatal-Fury-On-ESP32-Time-To-Release-Hardware-Exploits.pdf
eu-19-LimitedResults-Fatal-Fury-On-ESP32-Time-To-Release-Hardware-Exploits.pdfssuser6e61b3
 
Bits of Advice for the VM Writer, by Cliff Click @ Curry On 2015
Bits of Advice for the VM Writer, by Cliff Click @ Curry On 2015Bits of Advice for the VM Writer, by Cliff Click @ Curry On 2015
Bits of Advice for the VM Writer, by Cliff Click @ Curry On 2015curryon
 
Debugging Ruby Systems
Debugging Ruby SystemsDebugging Ruby Systems
Debugging Ruby SystemsEngine Yard
 
Stealing from Thieves: Breaking IonCUBE VM to RE Exploit Kits
Stealing from Thieves: Breaking IonCUBE VM to RE Exploit KitsStealing from Thieves: Breaking IonCUBE VM to RE Exploit Kits
Stealing from Thieves: Breaking IonCUBE VM to RE Exploit KitsМохачёк Сахер
 

Similar to SMP Implementation for OpenBSD/sgi [Japanese Edition] (20)

オペレーティングシステム 設計と実装 第3版(20101211)
オペレーティングシステム 設計と実装 第3版(20101211)オペレーティングシステム 設計と実装 第3版(20101211)
オペレーティングシステム 設計と実装 第3版(20101211)
 
리눅스 드라이버 실습 #3
리눅스 드라이버 실습 #3리눅스 드라이버 실습 #3
리눅스 드라이버 실습 #3
 
Ctf hello,world!
Ctf hello,world! Ctf hello,world!
Ctf hello,world!
 
Performance tweaks and tools for Linux (Joe Damato)
Performance tweaks and tools for Linux (Joe Damato)Performance tweaks and tools for Linux (Joe Damato)
Performance tweaks and tools for Linux (Joe Damato)
 
Protocol T50: Five months later... So what?
Protocol T50: Five months later... So what?Protocol T50: Five months later... So what?
Protocol T50: Five months later... So what?
 
JVM Memory Model - Yoav Abrahami, Wix
JVM Memory Model - Yoav Abrahami, WixJVM Memory Model - Yoav Abrahami, Wix
JVM Memory Model - Yoav Abrahami, Wix
 
Using ARM Dev.Board in physical experimental instruments
Using ARM Dev.Board in physical experimental instrumentsUsing ARM Dev.Board in physical experimental instruments
Using ARM Dev.Board in physical experimental instruments
 
Java Jit. Compilation and optimization by Andrey Kovalenko
Java Jit. Compilation and optimization by Andrey KovalenkoJava Jit. Compilation and optimization by Andrey Kovalenko
Java Jit. Compilation and optimization by Andrey Kovalenko
 
Linux kernel debugging
Linux kernel debuggingLinux kernel debugging
Linux kernel debugging
 
Jvm memory model
Jvm memory modelJvm memory model
Jvm memory model
 
Security Onion Advance
Security Onion AdvanceSecurity Onion Advance
Security Onion Advance
 
BSides London - Scapy Workshop
BSides London - Scapy WorkshopBSides London - Scapy Workshop
BSides London - Scapy Workshop
 
IOT Firmware: Best Pratices
IOT Firmware:  Best PraticesIOT Firmware:  Best Pratices
IOT Firmware: Best Pratices
 
May2010 hex-core-opt
May2010 hex-core-optMay2010 hex-core-opt
May2010 hex-core-opt
 
Multiplatform JIT Code Generator for NetBSD by Alexander Nasonov
Multiplatform JIT Code Generator for NetBSD by Alexander NasonovMultiplatform JIT Code Generator for NetBSD by Alexander Nasonov
Multiplatform JIT Code Generator for NetBSD by Alexander Nasonov
 
Magnetic door lock using arduino
Magnetic door lock using arduinoMagnetic door lock using arduino
Magnetic door lock using arduino
 
eu-19-LimitedResults-Fatal-Fury-On-ESP32-Time-To-Release-Hardware-Exploits.pdf
eu-19-LimitedResults-Fatal-Fury-On-ESP32-Time-To-Release-Hardware-Exploits.pdfeu-19-LimitedResults-Fatal-Fury-On-ESP32-Time-To-Release-Hardware-Exploits.pdf
eu-19-LimitedResults-Fatal-Fury-On-ESP32-Time-To-Release-Hardware-Exploits.pdf
 
Bits of Advice for the VM Writer, by Cliff Click @ Curry On 2015
Bits of Advice for the VM Writer, by Cliff Click @ Curry On 2015Bits of Advice for the VM Writer, by Cliff Click @ Curry On 2015
Bits of Advice for the VM Writer, by Cliff Click @ Curry On 2015
 
Debugging Ruby Systems
Debugging Ruby SystemsDebugging Ruby Systems
Debugging Ruby Systems
 
Stealing from Thieves: Breaking IonCUBE VM to RE Exploit Kits
Stealing from Thieves: Breaking IonCUBE VM to RE Exploit KitsStealing from Thieves: Breaking IonCUBE VM to RE Exploit Kits
Stealing from Thieves: Breaking IonCUBE VM to RE Exploit Kits
 

More from Takuya ASADA

Seastar in 歌舞伎座.tech#8「C++初心者会」
Seastar in 歌舞伎座.tech#8「C++初心者会」Seastar in 歌舞伎座.tech#8「C++初心者会」
Seastar in 歌舞伎座.tech#8「C++初心者会」Takuya ASADA
 
Seastar:高スループットなサーバアプリケーションの為の新しいフレームワーク
Seastar:高スループットなサーバアプリケーションの為の新しいフレームワークSeastar:高スループットなサーバアプリケーションの為の新しいフレームワーク
Seastar:高スループットなサーバアプリケーションの為の新しいフレームワークTakuya ASADA
 
高スループットなサーバアプリケーションの為の新しいフレームワーク
「Seastar」
高スループットなサーバアプリケーションの為の新しいフレームワーク
「Seastar」高スループットなサーバアプリケーションの為の新しいフレームワーク
「Seastar」
高スループットなサーバアプリケーションの為の新しいフレームワーク
「Seastar」Takuya ASADA
 
ヤマノススメ〜秋山郷 de ハッカソン〜
ヤマノススメ〜秋山郷 de ハッカソン〜ヤマノススメ〜秋山郷 de ハッカソン〜
ヤマノススメ〜秋山郷 de ハッカソン〜Takuya ASADA
 
UEFI時代のブートローダ
UEFI時代のブートローダUEFI時代のブートローダ
UEFI時代のブートローダTakuya ASADA
 
OSvのご紹介 in 
Java 8 HotSpot meeting
OSvのご紹介 in 
Java 8 HotSpot meetingOSvのご紹介 in 
Java 8 HotSpot meeting
OSvのご紹介 in 
Java 8 HotSpot meetingTakuya ASADA
 
OSvパンフレット v3
OSvパンフレット v3OSvパンフレット v3
OSvパンフレット v3Takuya ASADA
 
OSvのご紹介 in OSC2014 Tokyo/Fall
OSvのご紹介 in OSC2014 Tokyo/FallOSvのご紹介 in OSC2014 Tokyo/Fall
OSvのご紹介 in OSC2014 Tokyo/FallTakuya ASADA
 
OSvの概要と実装
OSvの概要と実装OSvの概要と実装
OSvの概要と実装Takuya ASADA
 
Linux network stack
Linux network stackLinux network stack
Linux network stackTakuya ASADA
 
Ethernetの受信処理
Ethernetの受信処理Ethernetの受信処理
Ethernetの受信処理Takuya ASADA
 
Presentation on your terminal
Presentation on your terminalPresentation on your terminal
Presentation on your terminalTakuya ASADA
 
僕のIntel nucが起動しないわけがない
僕のIntel nucが起動しないわけがない僕のIntel nucが起動しないわけがない
僕のIntel nucが起動しないわけがないTakuya ASADA
 
Interrupt Affinityについて
Interrupt AffinityについてInterrupt Affinityについて
Interrupt AffinityについてTakuya ASADA
 
OSvパンフレット
OSvパンフレットOSvパンフレット
OSvパンフレットTakuya ASADA
 
BHyVeでOSvを起動したい
〜BIOSがなくてもこの先生きのこるには〜
BHyVeでOSvを起動したい
〜BIOSがなくてもこの先生きのこるには〜BHyVeでOSvを起動したい
〜BIOSがなくてもこの先生きのこるには〜
BHyVeでOSvを起動したい
〜BIOSがなくてもこの先生きのこるには〜Takuya ASADA
 
「ハイパーバイザの作り方」読書会#2
「ハイパーバイザの作り方」読書会#2「ハイパーバイザの作り方」読書会#2
「ハイパーバイザの作り方」読書会#2Takuya ASADA
 
「ハイパーバイザの作り方」読書会#1
「ハイパーバイザの作り方」読書会#1「ハイパーバイザの作り方」読書会#1
「ハイパーバイザの作り方」読書会#1Takuya ASADA
 
10GbE時代のネットワークI/O高速化
10GbE時代のネットワークI/O高速化10GbE時代のネットワークI/O高速化
10GbE時代のネットワークI/O高速化Takuya ASADA
 

More from Takuya ASADA (20)

Seastar in 歌舞伎座.tech#8「C++初心者会」
Seastar in 歌舞伎座.tech#8「C++初心者会」Seastar in 歌舞伎座.tech#8「C++初心者会」
Seastar in 歌舞伎座.tech#8「C++初心者会」
 
Seastar:高スループットなサーバアプリケーションの為の新しいフレームワーク
Seastar:高スループットなサーバアプリケーションの為の新しいフレームワークSeastar:高スループットなサーバアプリケーションの為の新しいフレームワーク
Seastar:高スループットなサーバアプリケーションの為の新しいフレームワーク
 
高スループットなサーバアプリケーションの為の新しいフレームワーク
「Seastar」
高スループットなサーバアプリケーションの為の新しいフレームワーク
「Seastar」高スループットなサーバアプリケーションの為の新しいフレームワーク
「Seastar」
高スループットなサーバアプリケーションの為の新しいフレームワーク
「Seastar」
 
ヤマノススメ〜秋山郷 de ハッカソン〜
ヤマノススメ〜秋山郷 de ハッカソン〜ヤマノススメ〜秋山郷 de ハッカソン〜
ヤマノススメ〜秋山郷 de ハッカソン〜
 
UEFI時代のブートローダ
UEFI時代のブートローダUEFI時代のブートローダ
UEFI時代のブートローダ
 
OSvのご紹介 in 
Java 8 HotSpot meeting
OSvのご紹介 in 
Java 8 HotSpot meetingOSvのご紹介 in 
Java 8 HotSpot meeting
OSvのご紹介 in 
Java 8 HotSpot meeting
 
OSvパンフレット v3
OSvパンフレット v3OSvパンフレット v3
OSvパンフレット v3
 
OSvのご紹介 in OSC2014 Tokyo/Fall
OSvのご紹介 in OSC2014 Tokyo/FallOSvのご紹介 in OSC2014 Tokyo/Fall
OSvのご紹介 in OSC2014 Tokyo/Fall
 
OSv噺
OSv噺OSv噺
OSv噺
 
OSvの概要と実装
OSvの概要と実装OSvの概要と実装
OSvの概要と実装
 
Linux network stack
Linux network stackLinux network stack
Linux network stack
 
Ethernetの受信処理
Ethernetの受信処理Ethernetの受信処理
Ethernetの受信処理
 
Presentation on your terminal
Presentation on your terminalPresentation on your terminal
Presentation on your terminal
 
僕のIntel nucが起動しないわけがない
僕のIntel nucが起動しないわけがない僕のIntel nucが起動しないわけがない
僕のIntel nucが起動しないわけがない
 
Interrupt Affinityについて
Interrupt AffinityについてInterrupt Affinityについて
Interrupt Affinityについて
 
OSvパンフレット
OSvパンフレットOSvパンフレット
OSvパンフレット
 
BHyVeでOSvを起動したい
〜BIOSがなくてもこの先生きのこるには〜
BHyVeでOSvを起動したい
〜BIOSがなくてもこの先生きのこるには〜BHyVeでOSvを起動したい
〜BIOSがなくてもこの先生きのこるには〜
BHyVeでOSvを起動したい
〜BIOSがなくてもこの先生きのこるには〜
 
「ハイパーバイザの作り方」読書会#2
「ハイパーバイザの作り方」読書会#2「ハイパーバイザの作り方」読書会#2
「ハイパーバイザの作り方」読書会#2
 
「ハイパーバイザの作り方」読書会#1
「ハイパーバイザの作り方」読書会#1「ハイパーバイザの作り方」読書会#1
「ハイパーバイザの作り方」読書会#1
 
10GbE時代のネットワークI/O高速化
10GbE時代のネットワークI/O高速化10GbE時代のネットワークI/O高速化
10GbE時代のネットワークI/O高速化
 

Recently uploaded

08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking Men08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking MenDelhi Call girls
 
[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdf[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdfhans926745
 
Salesforce Community Group Quito, Salesforce 101
Salesforce Community Group Quito, Salesforce 101Salesforce Community Group Quito, Salesforce 101
Salesforce Community Group Quito, Salesforce 101Paola De la Torre
 
The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024Rafal Los
 
Data Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonData Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonAnna Loughnan Colquhoun
 
Kalyanpur ) Call Girls in Lucknow Finest Escorts Service 🍸 8923113531 🎰 Avail...
Kalyanpur ) Call Girls in Lucknow Finest Escorts Service 🍸 8923113531 🎰 Avail...Kalyanpur ) Call Girls in Lucknow Finest Escorts Service 🍸 8923113531 🎰 Avail...
Kalyanpur ) Call Girls in Lucknow Finest Escorts Service 🍸 8923113531 🎰 Avail...gurkirankumar98700
 
Scaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organizationScaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organizationRadu Cotescu
 
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptxHampshireHUG
 
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...Miguel Araújo
 
The Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptxThe Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptxMalak Abu Hammad
 
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
08448380779 Call Girls In Diplomatic Enclave Women Seeking MenDelhi Call girls
 
Understanding the Laravel MVC Architecture
Understanding the Laravel MVC ArchitectureUnderstanding the Laravel MVC Architecture
Understanding the Laravel MVC ArchitecturePixlogix Infotech
 
Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...
Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...
Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...HostedbyConfluent
 
#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024BookNet Canada
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerThousandEyes
 
SQL Database Design For Developers at php[tek] 2024
SQL Database Design For Developers at php[tek] 2024SQL Database Design For Developers at php[tek] 2024
SQL Database Design For Developers at php[tek] 2024Scott Keck-Warren
 
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time AutomationFrom Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time AutomationSafe Software
 
08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking MenDelhi Call girls
 
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking MenDelhi Call girls
 
Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024The Digital Insurer
 

Recently uploaded (20)

08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking Men08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking Men
 
[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdf[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdf
 
Salesforce Community Group Quito, Salesforce 101
Salesforce Community Group Quito, Salesforce 101Salesforce Community Group Quito, Salesforce 101
Salesforce Community Group Quito, Salesforce 101
 
The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024
 
Data Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonData Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt Robison
 
Kalyanpur ) Call Girls in Lucknow Finest Escorts Service 🍸 8923113531 🎰 Avail...
Kalyanpur ) Call Girls in Lucknow Finest Escorts Service 🍸 8923113531 🎰 Avail...Kalyanpur ) Call Girls in Lucknow Finest Escorts Service 🍸 8923113531 🎰 Avail...
Kalyanpur ) Call Girls in Lucknow Finest Escorts Service 🍸 8923113531 🎰 Avail...
 
Scaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organizationScaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organization
 
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
 
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
 
The Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptxThe Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptx
 
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
 
Understanding the Laravel MVC Architecture
Understanding the Laravel MVC ArchitectureUnderstanding the Laravel MVC Architecture
Understanding the Laravel MVC Architecture
 
Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...
Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...
Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...
 
#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected Worker
 
SQL Database Design For Developers at php[tek] 2024
SQL Database Design For Developers at php[tek] 2024SQL Database Design For Developers at php[tek] 2024
SQL Database Design For Developers at php[tek] 2024
 
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time AutomationFrom Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
 
08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men
 
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
 
Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024
 

SMP Implementation for OpenBSD/sgi [Japanese Edition]

  • 1. SMP Implementation for OpenBSD/sgi [ ] Takuya ASADA<syuu@openbsd.org>
  • 2. AsiaBSDCon 2010 • http://bit.ly/octane2
  • 3. BSD EmbeddedOS 64bit SMP • MIPS *BSD MIPS SMP • • SMP …
  • 4. MIPS/SMP (1) • Broadcom SiByte BCM1250 2core 1GHz MIPS64, DDR DRAM, GbE, PCI, HT • Cisco 3845 •
  • 5. MIPS/SMP (1) • Broadcom SiByte BCM1250 2core 1GHz MIPS64, DDR DRAM, GbE, PCI, HT • Cisco 3845 • 128 orz
  • 6. MIPS/SMP (2) • SGI ebay • • SGI Octane 2core OpenBSD
  • 7. MIPS/SMP (2) • SGI ebay • • SGI Octane 2core OpenBSD $33!!!!
  • 8. Octane2 Processors MIPS R12000 400MHz x2 Memory 1GB SDRAM Graphics 3D Graphics Card Sound Integrated Digital Audio Storage 35GB SCSI HDD Ethernet 100BASE-T
  • 9.
  • 10.
  • 11.
  • 12.
  • 13. OpenBSD developer • 2009/4 • OpenBSD/sgi • 2009/9 developer • 2009/11
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 23. Demo
  • 24. '(&!!" 4% overhead '(%!!" '($!!" '(#!!" 46% speed up '(!!!" ,-.-/01)02+!" &!!" ,-.-/01)02+!342" %!!" $!!" #!!" !" (sec) ")*'" ")*#" ")*+"
  • 25. OpenBSD/amd64 &!!" %#!" 2% overhead %!!" 44% speed up $#!" )*+*,-." )*+*,-./01" $!!" #!" !" "'($" "'(%" "'(&" (sec)
  • 26. cpu_info • • • per-processor cpu_info • IPI: Inter-Processor Interrupt • • Per-processor ASID • • TLB shootdown • Lazy FPU handling • • Per-processor clock
  • 27. per-processor • • …
  • 28. per-processor • sgi port • per-processor cpu_info • pmap per-processor * per-process
  • 29. clock.c // defined as global variables u_int32_t cpu_counter_last; u_int32_t cpu_counter_interval; u_int32_t pendingticks; uint32_t clock_int5(uint32_t mask, struct trap_frame *tf) ... clkdiff = cp0_get_count() - cpu_counter_last; while (clkdiff >= cpu_counter_interval) { cpu_counter_last += cpu_counter_interval; clkdiff = cp0_get_count() - cpu_counter_last; pendingticks++;
  • 30. clock.c uint32_t clock_int5(uint32_t mask, struct trap_frame *tf) ... struct cpu_info *ci = curcpu(); clkdiff = cp0_get_count() - ci->ci_cpu_counter_last; while (clkdiff >= ci->ci_cpu_counter_interval) { ci->ci_cpu_counter_last += ci->ci_cpu_counter_interval; clkdiff = cp0_get_count() - ci->ci_cpu_counter_last; ci->ci_pendingticks++;
  • 31. pmap • MIPS TLB ASID 8bit ID TLB • 8bit PID ASID ASID Process • SMP ASID • ASID per-processor * per-process
  • 32. pmap uint pmap_alloc_tlbpid(struct proc *p) ... tlbpid_cnt = id + 1; pmap->pm_tlbpid = id; uint pmap_alloc_tlbpid(struct proc *p) ... tlbpid_cnt[cpuid] = id + 1; pmap->pm_tlbpid[cpuid] = id;
  • 33. • : mutex, mp_lock • : CAS, 64bit add, etc.. • • • • trap()
  • 34. uint32_t clock_int5(uint32_t mask, struct trap_frame *tf) ... if (tf->ipl < IPL_CLOCK) { #ifdef MULTIPROCESSOR __mp_lock(&kernel_lock); #endif while (ci->ci_pendingticks) { clk_count.ec_count++; hardclock(tf); ci->ci_pendingticks--; } #ifdef MULTIPROCESSOR __mp_unlock(&kernel_lock); #endif
  • 35. uint32_t clock_int5(uint32_t mask, struct trap_frame *tf) ... if (tf->ipl < IPL_CLOCK) { #ifdef MULTIPROCESSOR __mp_lock(&kernel_lock); #endif while (ci->ci_pendingticks) { clk_count.ec_count++; hardclock(tf); ci->ci_pendingticks--; } #ifdef MULTIPROCESSOR __mp_unlock(&kernel_lock); #endif Actually, it causes a bug... described later
  • 36. • • TLB •
  • 37. • • • →
  • 38. TLB • MIPS TLB • TLB shootdown TLB invalidate/update • IPI(Inter-Processor Interrupt)
  • 39. TLB shootdown CPU A CPU B Fault TLB shootdown IPI IPI TLB invalidate TLB invalidate CPU B CPU A
  • 41. SMP • • • • TLB shootdown
  • 43. JTAG ICE • • • Embedded OS SMP • Octane or
  • 44. ddb • OpenBSD • • SMP ddb ddb • …
  • 45. printf()! • • printf(message) • • • printf() •
  • 46. printf • Octane • • • cpu0 com0 cpu1 com1 • ;-)
  • 47. print • • printf • •
  • 49. void mtx_enter(struct mutex *mtx) ...         for (;;) {                 if (mtx->mtx_wantipl != IPL_NONE)                         s = splraise(mtx->mtx_wantipl);                 if (try_lock(mtx)) {                         if (mtx->mtx_wantipl != IPL_NONE)                                 mtx->mtx_oldipl = s;                         mtx->mtx_owner = curcpu();                         return;                 }                 if (mtx->mtx_wantipl != IPL_NONE)                         splx(s);                 if (++i > MTX_TIMEOUT)                         panic("mtx deadlockedn”);         }
  • 50. void mtx_enter(struct mutex *mtx) ...         for (;;) {                 if (mtx->mtx_wantipl != IPL_NONE)                         s = splraise(mtx->mtx_wantipl);                 if (try_lock(mtx)) {                         if (mtx->mtx_wantipl != IPL_NONE)                                 mtx->mtx_oldipl = s;                         mtx->mtx_owner = curcpu();                         return;                 }                 if (mtx->mtx_wantipl != IPL_NONE)                         splx(s);                 if (++i > MTX_TIMEOUT)                         panic("mtx deadlockedn”);         }
  • 51. CPU A CPU B Lock Lock A B
  • 52. CPU A CPU B Lock Lock A B
  • 53. CPU A CPU B Lock Lock A B
  • 54. void mtx_enter(struct mutex *mtx) ...         for (;;) {                 if (mtx->mtx_wantipl != IPL_NONE)                         s = splraise(mtx->mtx_wantipl);                 if (try_lock(mtx)) {                         if (mtx->mtx_wantipl != IPL_NONE)                                 mtx->mtx_oldipl = s;                         mtx->mtx_owner = curcpu();                         mtx->mtx_ra =                          __builtin_return_address(0);                         return;                 }                 if (mtx->mtx_wantipl != IPL_NONE)                         splx(s);                 if (++i > MTX_TIMEOUT)                         panic("mtx deadlocked ra:%pn",                                 mtx->mtx_ra);         }
  • 55. IPI CPU A CPU B Interrupt Fault Disable interrupt Acquire lock Lock Wait until released TLB shootdown Blocked IPI Wait ACK
  • 56. IPI CPU A CPU B Interrupt Fault Disable interrupt Acquire lock Lock Wait until released TLB shootdown IPI Wait ACK
  • 57. IPI CPU A CPU B Interrupt Fault Disable interrupt Acquire lock Re-enable interrupt Lock Wait until released TLB shootdown Accept Interrupt IPI Wait ACK
  • 58. IPI CPU A CPU B Interrupt Fault Disable interrupt Acquire lock Re-enable interrupt Lock Wait until released TLB shootdown Accept Interrupt IPI Wait ACK ACK for rendezvous
  • 59. IPI CPU A CPU B Interrupt Fault IPI Disable interrupt Acquire lock Re-enable interrupt Lock Wait until released TLB shootdown Accept Interrupt IPI Wait ACK ACK for rendezvous
  • 60. uint32_t clock_int5(uint32_t mask, struct trap_frame *tf) ... if (tf->ipl < IPL_CLOCK) { #ifdef MULTIPROCESSOR u_int32_t sr; sr = getsr(); ENABLEIPI(); __mp_lock(&kernel_lock); #endif while (ci->ci_pendingticks) { clk_count.ec_count++; hardclock(tf); ci->ci_pendingticks--; } #ifdef MULTIPROCESSOR __mp_unlock(&kernel_lock); setsr(sr); #endif
  • 61. splhigh() IPI CPU A CPU B splhigh() Fault Acquire lock Lock Wait until released TLB shootdown Blocked IPI Wait ACK
  • 62. splhigh() IPI CPU A CPU B splhigh() Fault Acquire lock Lock Wait until released TLB shootdown IPI Wait ACK
  • 63. splhigh() IPI CPU A CPU B splhigh() Fault Acquire lock Lock Wait until released TLB shootdown Accept Interrupt IPI Wait ACK
  • 64. splhigh() IPI CPU A CPU B splhigh() Fault Acquire lock Lock Wait until released TLB shootdown Accept Interrupt IPI Wait ACK ACK for rendezvous
  • 65. splhigh() IPI CPU A CPU B IPL_IPI splhigh() Fault IPL_HIGH Acquire lock Lock Wait until released TLB shootdown Accept Interrupt IPI Wait ACK ACK for rendezvous
  • 66.  #define        IPL_TTY         4       /* terminal */  #define        IPL_VM          5       /* memory allocation */  #define        IPL_CLOCK       6       /* clock */ #define        IPL_HIGH        7       /* everything */ #define        NIPLS           8       /* Number of levels */  #define        IPL_TTY         4       /* terminal */  #define        IPL_VM          5       /* memory allocation */  #define        IPL_CLOCK       6       /* clock */ #define        IPL_HIGH        7       /* everything */ #define        IPL_IPI         8       /* ipi */ #define        NIPLS           9       /* Number of levels */
  • 67. cpu_info • malloc() → • TLB • MIPS TLB TLB TLB cpu_info • wrapper
  • 68. wrapper vaddr_t smp_malloc(size_t size) ... if (size < PAGE_SIZE) { va = (vaddr_t)malloc(size, M_DEVBUF, M_NOWAIT); if (va == NULL) return NULL; error = pmap_extract(pmap_kernel(), va, &pa); if (error == FALSE) return NULL; } else { TAILQ_INIT(&mlist); error = uvm_pglistalloc(size, 0, -1L, 0, 0, &mlist, 1, UVM_PLA_NOWAIT); if (error) return NULL; m = TAILQ_FIRST(&mlist); pa = VM_PAGE_TO_PHYS(m); } return PHYS_TO_XKPHYS(pa, CCA_CACHED);
  • 69. TLB shootdown • invalidate/update TLB shootdown kernel mode user mode • shootdown shootdown ASID • pmap TLB shootdown
  • 70. void pmap_invalidate_page(pmap_t pmap, vm_offset_t va) ... arg.pmap = pmap; arg.va = va; smp_rendezvous(0, pmap_invalidate_page_action, 0, (void *)&arg); void pmap_invalidate_page_action(void *arg) ... pmap_t pmap = ((struct pmap_invalidate_page_arg *)arg)->pmap; vm_offset_t va = ((struct pmap_invalidate_page_arg *)arg)->va; if (is_kernel_pmap(pmap)) { pmap_TLB_invalidate_kernel(va); return; } if (pmap->pm_asid[PCPU_GET(cpuid)].gen != PCPU_GET(asid_generation)) return; else if (!(pmap->pm_active & PCPU_GET(cpumask))) { pmap->pm_asid[PCPU_GET(cpuid)].gen = 0; return; } va = pmap_va_asid(pmap, (va & ~PGOFSET)); mips_TBIS(va);
  • 71. CPU_INFO_FOREACH(cii, ci) if (cpuset_isset(&cpus_running, ci)) { unsigned int i = ci->ci_cpuid; unsigned int m = 1 << i; if (pmap->pm_asid[i].pma_asidgen != pmap_asid_info[i].pma_asidgen) continue; else if (ci->ci_curpmap != pmap) { pmap->pm_asid[i].pma_asidgen = 0; continue; } cpumask |= m; } if (cpumask == 1 << cpuid) { u_long asid; asid = pmap->pm_asid[cpuid].pma_asid << VMTLB_PID_SHIFT; tlb_flush_addr(va | asid); } else if (cpumask) { struct pmap_invalidate_page_arg arg; arg.pmap = pmap; arg.va = va; smp_rendezvous_cpus(cpumask, pmap_invalidate_user_page_action, &arg); }
  • 72. SGI Origin 350 SMP • Cavium OCTEON OpenBSD SoC • SMP • rthread •

Editor's Notes