SlideShare a Scribd company logo
1 of 18
Download to read offline
/proc/irq/<IRQ>/
                 smp_affinity
                    @syuu1228




12年9月22日土曜日
cat /proc/interrupts




12年9月22日土曜日
$ cat /proc/interrupts
                         CPU0       CPU1
                0:      36843      61973   IO-APIC-edge      timer
                1:        518        591   IO-APIC-edge      i8042
                8:          1          0   IO-APIC-edge      rtc0
                9:        387        321   IO-APIC-fasteoi   acpi
               12:      11236         79   IO-APIC-edge      i8042
               16:          0          0   IO-APIC-fasteoi   uhci_hcd:usb6
               17:         12         11   IO-APIC-fasteoi   uhci_hcd:usb7
               18:          0          0   IO-APIC-fasteoi   uhci_hcd:usb8
               19:       6531        235   IO-APIC-fasteoi   ehci_hcd:usb2
               20:          0          0   IO-APIC-fasteoi   uhci_hcd:usb3
               21:         85         69   IO-APIC-fasteoi   uhci_hcd:usb4
               22:          0          0   IO-APIC-fasteoi   uhci_hcd:usb5
               23:         20         15   IO-APIC-fasteoi   ehci_hcd:usb1
               40:          0          0   PCI-MSI-edge      PCIe PME, pciehp
               41:          0          0   PCI-MSI-edge      PCIe PME, pciehp
               42:          0          0   PCI-MSI-edge      PCIe PME, pciehp
               43:      33199      31756   PCI-MSI-edge      ahci
               44:         19       1583   PCI-MSI-edge      eth0
               45:         10         11   PCI-MSI-edge      mei
               46:      41104      59303   PCI-MSI-edge      i915
               47:     170268        708   PCI-MSI-edge      iwlwifi
               48:         78         77   PCI-MSI-edge      snd_hda_intel
              NMI:       1406       1430   Non-maskable interrupts
              LOC:     342351     327074   Local timer interrupts
              SPU:          0          0   Spurious interrupts
              PMI:       1406       1430   Performance monitoring interrupts
              IWI:          0          0   IRQ work interrupts
              RES:      83855     108903   Rescheduling interrupts
              CAL:        223        195   Function call interrupts
              TLB:       1486       1665   TLB shootdowns
              TRM:          0          6   Thermal event interrupts
              THR:          0          0   Threshold APIC interrupts
              MCE:          0          0   Machine check exceptions
              MCP:         11         11   Machine check polls
              ERR:
              MIS:
                            0
                            0  丁度良く複数コアへ分散されてる?
12年9月22日土曜日
smp_affinity
                # cat /proc/irq/43/smp_affinity
                3
                # echo 1 > /proc/irq/43/smp_affinity



              割り込み先CPU群をビットで指定する
              と、指定されたCPU群にラウンドロビ
              ンで割り込まれる
                         これを書き換えればいいのか!

12年9月22日土曜日
ー完ー




12年9月22日土曜日
それでは#kernelvmらしくない
                # cat /proc/irq/43/smp_affinity
                3
                # echo 1 > /proc/irq/43/smp_affinity




              bitの立ってるコアへ割り込み分散

              bitが一つならいつもそこへ割り込み

                         これ、どうなってるんだろう?

12年9月22日土曜日
イマドキなx86の割り込み
                    CPU                    CPU            CPU

                                         Local APIC     Local APIC
                    Timer
                                                                Legacy PCI
               Local APIC                        IPI

              MSI           8259A Intr


                 MSI                                       Legacy
                Capable                   I/O APIC          PCI
                Devices                                    Devices
                                         8259A PIC
                                    ICH(South bridge)


12年9月22日土曜日
Local APIC
                            CPU                    CPU            CPU

                                                 Local APIC     Local APIC
                            Timer
                                                                        Legacy PCI
                       Local APIC                        IPI

                      MSI           8259A Intr


                         MSI                                       Legacy
                        Capable                   I/O APIC          PCI
                        Devices                                    Devices
                                                 8259A PIC
                                            ICH(South bridge)


              CPU毎の割り込みコントローラ 割り込みを許可・マスクした
              り、EOIしたり

              システム全体で一意なAPIC IDを持つ

              他のLAPICへ割り込める(IPI: Inter-processor Interrupt)

12年9月22日土曜日
I/O APIC
                           CPU                    CPU            CPU

                                                Local APIC     Local APIC
                           Timer
                                                                       Legacy PCI
                      Local APIC                        IPI

                     MSI           8259A Intr


                        MSI                                       Legacy
                       Capable                   I/O APIC          PCI
                       Devices                                    Devices
                                                8259A PIC
                                           ICH(South bridge)



              限られたIRQを複数のPCIデバイスで共有

              各IRQをどのLAPICへ転送するかを定義するRedirection Table(I/
              O APIC上のレジスタ群)を持つ

              PCIデバイスはI/O APICを通じてLAPICへ割り込みメッセージを送信


12年9月22日土曜日
MSI capable PCI devices
                           CPU                    CPU            CPU

                                                Local APIC     Local APIC
                           Timer
                                                                       Legacy PCI
                      Local APIC                        IPI

                     MSI           8259A Intr


                          MSI                                     Legacy
                         Capable                 I/O APIC          PCI
                         Devices                                  Devices
                                                8259A PIC
                                           ICH(South bridge)


              各デバイスが任意の数のIRQを持てる

              各IRQの割り込み先LAPICはPCIデバイスのPCI Configuration
              Spaceに持つ

              PCIデバイスは直接LAPICへ割り込みメッセージを送信

12年9月22日土曜日
割り込み先の指定方法
              Physical Destination Mode
                 Destination FieldにAPIC IDを指定
                 「常に同じCPUへ割り込み」を実現

              Logical Destination Mode(Flat Model)
                 Destination Fieldのbitで宛先LAPIC群の範囲を表現

                 Delivery Mode
                     Fixed
                     指定範囲の全てのLAPICへ割り込み

                     Lowest Priority
                     指定範囲の中で、最もTPR(Task Priority Register)の
                     値が低いCPUへ割り込み



12年9月22日土曜日
Lowest Priority Mode

              指定範囲の中で、最もTPR(Task
              Priority Register)の値が低いLAPIC
              へ割り込み

              最小値のTPRを持つLAPICが複数ある
              場合はラウンドロビンで1つ選択


12年9月22日土曜日
echo 1 > /proc/irq/<IRQ>/
              smp_affinityした時に何が起きるのか
              MSIなPCIeデバイスで確かめてみる

              Intel Pro/1000(e1000e)
              PCI Configuration Spaceはrootな
              ら/sys/bus/pciから読める
              →ユーザランドから読める
              →もしかして:lspci

12年9月22日土曜日
_人人 人人_

              >   lspci   <

               ̄Y^Y^Y^Y ̄




12年9月22日土曜日
# lspci -vvvv -s 00:19.0
  00:19.0 Ethernet controller: Intel Corporation 82567LM Gigabit Network Connection (rev 03)
       Subsystem: Lenovo Device 20ee
       Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR+ FastB2B- DisINTx+
       Status: Cap+ 66MHz- UDF- FastB2B- ParErr- DEVSEL=fast >TAbort- <TAbort- <MAbort- >SERR- <PERR- INTx-
       Latency: 0
       Interrupt: pin A routed to IRQ 44
       Region 0: Memory at f2600000 (32-bit, non-prefetchable) [size=128K]
       Region 1: Memory at f2625000 (32-bit, non-prefetchable) [size=4K]
       Region 2: I/O ports at 1840 [size=32]
       Capabilities: [c8] Power Management version 2
            Flags: PMEClk- DSI+ D1- D2- AuxCurrent=0mA PME(D0+,D1-,D2-,D3hot+,D3cold+)
            Status: D0 NoSoftRst- PME-Enable- DSel=0 DScale=1 PME-
       Capabilities: [d0] MSI: Enable+ Count=1/1 Maskable- 64bit+
            Address: 00000000fee0300c Data: 41b9
       Capabilities: [e0] PCI Advanced Features
            AFCap: TP+ FLR+
            AFCtrl: FLR-
            AFStatus: TP-
       Kernel driver in use: e1000e
       Kernel modules: e1000e

               赤く塗った所がMSIのフィールドだけれど、こ
               れだと良く分からないのでlspciをforkして
               MSIフィールドを表示するツールを作成
               https://gist.github.com/1568777
12年9月22日土曜日
# gcc -lpci msireg.c
  # ./a.out 00:19.0
  Message Signalled Interrupts: 64bit+ Queue=0/0 Enable+
  address_hi=0
  address_lo=fee0300c dest_mode=logical redirection=lowpri dest_id=3
  data=41b9 trigger=edge level=assert delivery_mode=lowpri vector=185


              Logical modeでLowpri、destid=3、
              vector=185になってる
  # echo 1 > /proc/irq/44/smp_affinity
  # ./a.out 00:19.0
  Message Signalled Interrupts: 64bit+ Queue=0/0 Enable+
  address_hi=0
  address_lo=fee0100c dest_mode=logical redirection=lowpri dest_id=1
  data=41b9 trigger=edge level=assert delivery_mode=lowpri vector=185


              dest_idが1に書き換わった!



12年9月22日土曜日
余談

              調子に乗ってユーザランドからフィー
              ルド書き換えたら何かおかしくなりま
              した

              カーネルさんと喧嘩してるか、フィー
              ルドの書き方間違えたか…


12年9月22日土曜日
参考資料
              Intel® 64 and IA-32 Architectures Software Developer
              Manuals
              Intel® I/O Controller Hub 10 (ICH10) Family Datasheet
              linux/Documentation/IRQ-affinity.txt
              Understanding the Linux Kernel, 3rd Edition
              PCI Local Bus Specification Revision 3.0
              最近のPCアーキテクチャにおける割り込みルーティングの仕組み

              /proc/irq/<IRQ>/smp_affinityの書き換えでPCIコンフィグレ
              ーション空間はどのように書き換わるか

              Interrupts on xv6



12年9月22日土曜日

More Related Content

What's hot

LAS16-200: SCMI - System Management and Control Interface
LAS16-200:  SCMI - System Management and Control InterfaceLAS16-200:  SCMI - System Management and Control Interface
LAS16-200: SCMI - System Management and Control InterfaceLinaro
 
Hyper vを理解する
Hyper vを理解するHyper vを理解する
Hyper vを理解するNaoki Abe
 
Page Cache in Linux 2.6.pdf
Page Cache in Linux 2.6.pdfPage Cache in Linux 2.6.pdf
Page Cache in Linux 2.6.pdfycelgemici1
 
ACPI Debugging from Linux Kernel
ACPI Debugging from Linux KernelACPI Debugging from Linux Kernel
ACPI Debugging from Linux KernelSUSE Labs Taipei
 
Page cache in Linux kernel
Page cache in Linux kernelPage cache in Linux kernel
Page cache in Linux kernelAdrian Huang
 
4章 Linuxカーネル - 割り込み・例外 3
4章 Linuxカーネル - 割り込み・例外 34章 Linuxカーネル - 割り込み・例外 3
4章 Linuxカーネル - 割り込み・例外 3mao999
 
Linux KVM のコードを追いかけてみよう
Linux KVM のコードを追いかけてみようLinux KVM のコードを追いかけてみよう
Linux KVM のコードを追いかけてみようTsuyoshi OZAWA
 
用Raspberry Pi 學Linux I2C Driver
用Raspberry Pi 學Linux I2C Driver用Raspberry Pi 學Linux I2C Driver
用Raspberry Pi 學Linux I2C Driver艾鍗科技
 
Linux Initialization Process (2)
Linux Initialization Process (2)Linux Initialization Process (2)
Linux Initialization Process (2)shimosawa
 
SFO15-TR9: PSCI, ACPI (and UEFI to boot)
SFO15-TR9: PSCI, ACPI (and UEFI to boot)SFO15-TR9: PSCI, ACPI (and UEFI to boot)
SFO15-TR9: PSCI, ACPI (and UEFI to boot)Linaro
 
NEDIA_SNIA_CXL_講演資料.pdf
NEDIA_SNIA_CXL_講演資料.pdfNEDIA_SNIA_CXL_講演資料.pdf
NEDIA_SNIA_CXL_講演資料.pdfYasunori Goto
 
Linux Kernel Booting Process (2) - For NLKB
Linux Kernel Booting Process (2) - For NLKBLinux Kernel Booting Process (2) - For NLKB
Linux Kernel Booting Process (2) - For NLKBshimosawa
 
Linux SD/MMC device driver
Linux SD/MMC device driverLinux SD/MMC device driver
Linux SD/MMC device driver艾鍗科技
 
Linux kernel memory allocators
Linux kernel memory allocatorsLinux kernel memory allocators
Linux kernel memory allocatorsHao-Ran Liu
 
Linuxのプロセススケジューラ(Reading the Linux process scheduler)
Linuxのプロセススケジューラ(Reading the Linux process scheduler)Linuxのプロセススケジューラ(Reading the Linux process scheduler)
Linuxのプロセススケジューラ(Reading the Linux process scheduler)Hiraku Toyooka
 
Linux Memory Management
Linux Memory ManagementLinux Memory Management
Linux Memory ManagementNi Zo-Ma
 
Uboot startup sequence
Uboot startup sequenceUboot startup sequence
Uboot startup sequenceHoucheng Lin
 
Slab Allocator in Linux Kernel
Slab Allocator in Linux KernelSlab Allocator in Linux Kernel
Slab Allocator in Linux KernelAdrian Huang
 

What's hot (20)

LAS16-200: SCMI - System Management and Control Interface
LAS16-200:  SCMI - System Management and Control InterfaceLAS16-200:  SCMI - System Management and Control Interface
LAS16-200: SCMI - System Management and Control Interface
 
Hyper vを理解する
Hyper vを理解するHyper vを理解する
Hyper vを理解する
 
Page Cache in Linux 2.6.pdf
Page Cache in Linux 2.6.pdfPage Cache in Linux 2.6.pdf
Page Cache in Linux 2.6.pdf
 
ACPI Debugging from Linux Kernel
ACPI Debugging from Linux KernelACPI Debugging from Linux Kernel
ACPI Debugging from Linux Kernel
 
Page cache in Linux kernel
Page cache in Linux kernelPage cache in Linux kernel
Page cache in Linux kernel
 
4章 Linuxカーネル - 割り込み・例外 3
4章 Linuxカーネル - 割り込み・例外 34章 Linuxカーネル - 割り込み・例外 3
4章 Linuxカーネル - 割り込み・例外 3
 
Linux KVM のコードを追いかけてみよう
Linux KVM のコードを追いかけてみようLinux KVM のコードを追いかけてみよう
Linux KVM のコードを追いかけてみよう
 
用Raspberry Pi 學Linux I2C Driver
用Raspberry Pi 學Linux I2C Driver用Raspberry Pi 學Linux I2C Driver
用Raspberry Pi 學Linux I2C Driver
 
Linux Initialization Process (2)
Linux Initialization Process (2)Linux Initialization Process (2)
Linux Initialization Process (2)
 
SFO15-TR9: PSCI, ACPI (and UEFI to boot)
SFO15-TR9: PSCI, ACPI (and UEFI to boot)SFO15-TR9: PSCI, ACPI (and UEFI to boot)
SFO15-TR9: PSCI, ACPI (and UEFI to boot)
 
Xvisor: embedded and lightweight hypervisor
Xvisor: embedded and lightweight hypervisorXvisor: embedded and lightweight hypervisor
Xvisor: embedded and lightweight hypervisor
 
NEDIA_SNIA_CXL_講演資料.pdf
NEDIA_SNIA_CXL_講演資料.pdfNEDIA_SNIA_CXL_講演資料.pdf
NEDIA_SNIA_CXL_講演資料.pdf
 
Linux Kernel Booting Process (2) - For NLKB
Linux Kernel Booting Process (2) - For NLKBLinux Kernel Booting Process (2) - For NLKB
Linux Kernel Booting Process (2) - For NLKB
 
Linux SD/MMC device driver
Linux SD/MMC device driverLinux SD/MMC device driver
Linux SD/MMC device driver
 
Linux kernel memory allocators
Linux kernel memory allocatorsLinux kernel memory allocators
Linux kernel memory allocators
 
Linux Porting
Linux PortingLinux Porting
Linux Porting
 
Linuxのプロセススケジューラ(Reading the Linux process scheduler)
Linuxのプロセススケジューラ(Reading the Linux process scheduler)Linuxのプロセススケジューラ(Reading the Linux process scheduler)
Linuxのプロセススケジューラ(Reading the Linux process scheduler)
 
Linux Memory Management
Linux Memory ManagementLinux Memory Management
Linux Memory Management
 
Uboot startup sequence
Uboot startup sequenceUboot startup sequence
Uboot startup sequence
 
Slab Allocator in Linux Kernel
Slab Allocator in Linux KernelSlab Allocator in Linux Kernel
Slab Allocator in Linux Kernel
 

Similar to /proc/irq/&lt;irq>/smp_affinity

OSC2011 Tokyo/Fall 濃いバナ(virtio)
OSC2011 Tokyo/Fall 濃いバナ(virtio)OSC2011 Tokyo/Fall 濃いバナ(virtio)
OSC2011 Tokyo/Fall 濃いバナ(virtio)Takeshi HASEGAWA
 
20120519_qpstudy 2012.05 いやらしい@hasegawのI/O入門
20120519_qpstudy 2012.05 いやらしい@hasegawのI/O入門20120519_qpstudy 2012.05 いやらしい@hasegawのI/O入門
20120519_qpstudy 2012.05 いやらしい@hasegawのI/O入門Takeshi HASEGAWA
 
4章 Linuxカーネル - 割り込み・例外 2
4章 Linuxカーネル - 割り込み・例外 24章 Linuxカーネル - 割り込み・例外 2
4章 Linuxカーネル - 割り込み・例外 2mao999
 
「前回の COMSTAR ネタに刺激されてしまったので、オレも COMSTAR を使ってみた。」(仮)
「前回の COMSTAR ネタに刺激されてしまったので、オレも COMSTAR を使ってみた。」(仮)「前回の COMSTAR ネタに刺激されてしまったので、オレも COMSTAR を使ってみた。」(仮)
「前回の COMSTAR ネタに刺激されてしまったので、オレも COMSTAR を使ってみた。」(仮)Kazuyuki Sato
 
200625material naruse
200625material naruse200625material naruse
200625material naruseRCCSRENKEI
 
統合ソフトウェアプラットフォームVitisとFPGA無償利用環境「ACRiルーム」のご紹介
統合ソフトウェアプラットフォームVitisとFPGA無償利用環境「ACRiルーム」のご紹介統合ソフトウェアプラットフォームVitisとFPGA無償利用環境「ACRiルーム」のご紹介
統合ソフトウェアプラットフォームVitisとFPGA無償利用環境「ACRiルーム」のご紹介Jun Ando
 
FPGAアクセラレータの作り方
FPGAアクセラレータの作り方FPGAアクセラレータの作り方
FPGAアクセラレータの作り方Mr. Vengineer
 
あるブートローダの話
あるブートローダの話あるブートローダの話
あるブートローダの話nullnilaki
 
オリジナルMIDIシーケンサ 開発ノート
オリジナルMIDIシーケンサ 開発ノートオリジナルMIDIシーケンサ 開発ノート
オリジナルMIDIシーケンサ 開発ノートyou_ucchy
 
FPGAスタートアップ資料
FPGAスタートアップ資料FPGAスタートアップ資料
FPGAスタートアップ資料marsee101
 
OpenStack with SR-IOV
OpenStack with SR-IOVOpenStack with SR-IOV
OpenStack with SR-IOVHideki Saito
 
SDN Japan: ovs-hw
SDN Japan: ovs-hwSDN Japan: ovs-hw
SDN Japan: ovs-hwykuga
 
プリント基板設計 RaspberryPi HAT基板設計実習
プリント基板設計 RaspberryPi HAT基板設計実習プリント基板設計 RaspberryPi HAT基板設計実習
プリント基板設計 RaspberryPi HAT基板設計実習MarbleStream
 
Trema day 1
Trema day 1Trema day 1
Trema day 1ykuga
 
日本OpenStackユーザ会 第37回勉強会
日本OpenStackユーザ会 第37回勉強会日本OpenStackユーザ会 第37回勉強会
日本OpenStackユーザ会 第37回勉強会Yushiro Furukawa
 

Similar to /proc/irq/&lt;irq>/smp_affinity (20)

OSC2011 Tokyo/Fall 濃いバナ(virtio)
OSC2011 Tokyo/Fall 濃いバナ(virtio)OSC2011 Tokyo/Fall 濃いバナ(virtio)
OSC2011 Tokyo/Fall 濃いバナ(virtio)
 
20120519_qpstudy 2012.05 いやらしい@hasegawのI/O入門
20120519_qpstudy 2012.05 いやらしい@hasegawのI/O入門20120519_qpstudy 2012.05 いやらしい@hasegawのI/O入門
20120519_qpstudy 2012.05 いやらしい@hasegawのI/O入門
 
4章 Linuxカーネル - 割り込み・例外 2
4章 Linuxカーネル - 割り込み・例外 24章 Linuxカーネル - 割り込み・例外 2
4章 Linuxカーネル - 割り込み・例外 2
 
「前回の COMSTAR ネタに刺激されてしまったので、オレも COMSTAR を使ってみた。」(仮)
「前回の COMSTAR ネタに刺激されてしまったので、オレも COMSTAR を使ってみた。」(仮)「前回の COMSTAR ネタに刺激されてしまったので、オレも COMSTAR を使ってみた。」(仮)
「前回の COMSTAR ネタに刺激されてしまったので、オレも COMSTAR を使ってみた。」(仮)
 
200625material naruse
200625material naruse200625material naruse
200625material naruse
 
Interrupts on xv6
Interrupts on xv6Interrupts on xv6
Interrupts on xv6
 
Fpga local 20130322
Fpga local 20130322Fpga local 20130322
Fpga local 20130322
 
統合ソフトウェアプラットフォームVitisとFPGA無償利用環境「ACRiルーム」のご紹介
統合ソフトウェアプラットフォームVitisとFPGA無償利用環境「ACRiルーム」のご紹介統合ソフトウェアプラットフォームVitisとFPGA無償利用環境「ACRiルーム」のご紹介
統合ソフトウェアプラットフォームVitisとFPGA無償利用環境「ACRiルーム」のご紹介
 
FPGAアクセラレータの作り方
FPGAアクセラレータの作り方FPGAアクセラレータの作り方
FPGAアクセラレータの作り方
 
あるブートローダの話
あるブートローダの話あるブートローダの話
あるブートローダの話
 
オリジナルMIDIシーケンサ 開発ノート
オリジナルMIDIシーケンサ 開発ノートオリジナルMIDIシーケンサ 開発ノート
オリジナルMIDIシーケンサ 開発ノート
 
Adk2012
Adk2012Adk2012
Adk2012
 
FPGAスタートアップ資料
FPGAスタートアップ資料FPGAスタートアップ資料
FPGAスタートアップ資料
 
OpenStack with SR-IOV
OpenStack with SR-IOVOpenStack with SR-IOV
OpenStack with SR-IOV
 
SDN Japan: ovs-hw
SDN Japan: ovs-hwSDN Japan: ovs-hw
SDN Japan: ovs-hw
 
プリント基板設計 RaspberryPi HAT基板設計実習
プリント基板設計 RaspberryPi HAT基板設計実習プリント基板設計 RaspberryPi HAT基板設計実習
プリント基板設計 RaspberryPi HAT基板設計実習
 
Trema day 1
Trema day 1Trema day 1
Trema day 1
 
日本OpenStackユーザ会 第37回勉強会
日本OpenStackユーザ会 第37回勉強会日本OpenStackユーザ会 第37回勉強会
日本OpenStackユーザ会 第37回勉強会
 
Imaocande LT
Imaocande LTImaocande LT
Imaocande LT
 
PFI Seminar 2010/01/21
PFI Seminar 2010/01/21PFI Seminar 2010/01/21
PFI Seminar 2010/01/21
 

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
 
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
 
Implements BIOS emulation support for BHyVe: A BSD Hypervisor
Implements BIOS emulation support for BHyVe: A BSD HypervisorImplements BIOS emulation support for BHyVe: A BSD Hypervisor
Implements BIOS emulation support for BHyVe: A BSD HypervisorTakuya 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が起動しないわけがない
 
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高速化
 
Implements BIOS emulation support for BHyVe: A BSD Hypervisor
Implements BIOS emulation support for BHyVe: A BSD HypervisorImplements BIOS emulation support for BHyVe: A BSD Hypervisor
Implements BIOS emulation support for BHyVe: A BSD Hypervisor
 

Recently uploaded

Utilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native IntegrationsUtilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native IntegrationsWSO2
 
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。iPride Co., Ltd.
 
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
LoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイスLoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイス
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイスCRI Japan, Inc.
 
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルLoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルCRI Japan, Inc.
 
新人研修 後半 2024/04/26の勉強会で発表されたものです。
新人研修 後半        2024/04/26の勉強会で発表されたものです。新人研修 後半        2024/04/26の勉強会で発表されたものです。
新人研修 後半 2024/04/26の勉強会で発表されたものです。iPride Co., Ltd.
 
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video UnderstandingToru Tamaki
 
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Gamesatsushi061452
 
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)Hiroshi Tomioka
 
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。iPride Co., Ltd.
 
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NTT DATA Technology & Innovation
 
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...Toru Tamaki
 
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptxsn679259
 

Recently uploaded (12)

Utilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native IntegrationsUtilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native Integrations
 
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
 
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
LoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイスLoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイス
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
 
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルLoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
 
新人研修 後半 2024/04/26の勉強会で発表されたものです。
新人研修 後半        2024/04/26の勉強会で発表されたものです。新人研修 後半        2024/04/26の勉強会で発表されたものです。
新人研修 後半 2024/04/26の勉強会で発表されたものです。
 
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
 
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
 
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
 
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
 
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
 
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
 
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
 

/proc/irq/&lt;irq>/smp_affinity

  • 1. /proc/irq/<IRQ>/ smp_affinity @syuu1228 12年9月22日土曜日
  • 3. $ cat /proc/interrupts CPU0 CPU1 0: 36843 61973 IO-APIC-edge timer 1: 518 591 IO-APIC-edge i8042 8: 1 0 IO-APIC-edge rtc0 9: 387 321 IO-APIC-fasteoi acpi 12: 11236 79 IO-APIC-edge i8042 16: 0 0 IO-APIC-fasteoi uhci_hcd:usb6 17: 12 11 IO-APIC-fasteoi uhci_hcd:usb7 18: 0 0 IO-APIC-fasteoi uhci_hcd:usb8 19: 6531 235 IO-APIC-fasteoi ehci_hcd:usb2 20: 0 0 IO-APIC-fasteoi uhci_hcd:usb3 21: 85 69 IO-APIC-fasteoi uhci_hcd:usb4 22: 0 0 IO-APIC-fasteoi uhci_hcd:usb5 23: 20 15 IO-APIC-fasteoi ehci_hcd:usb1 40: 0 0 PCI-MSI-edge PCIe PME, pciehp 41: 0 0 PCI-MSI-edge PCIe PME, pciehp 42: 0 0 PCI-MSI-edge PCIe PME, pciehp 43: 33199 31756 PCI-MSI-edge ahci 44: 19 1583 PCI-MSI-edge eth0 45: 10 11 PCI-MSI-edge mei 46: 41104 59303 PCI-MSI-edge i915 47: 170268 708 PCI-MSI-edge iwlwifi 48: 78 77 PCI-MSI-edge snd_hda_intel NMI: 1406 1430 Non-maskable interrupts LOC: 342351 327074 Local timer interrupts SPU: 0 0 Spurious interrupts PMI: 1406 1430 Performance monitoring interrupts IWI: 0 0 IRQ work interrupts RES: 83855 108903 Rescheduling interrupts CAL: 223 195 Function call interrupts TLB: 1486 1665 TLB shootdowns TRM: 0 6 Thermal event interrupts THR: 0 0 Threshold APIC interrupts MCE: 0 0 Machine check exceptions MCP: 11 11 Machine check polls ERR: MIS: 0 0 丁度良く複数コアへ分散されてる? 12年9月22日土曜日
  • 4. smp_affinity # cat /proc/irq/43/smp_affinity 3 # echo 1 > /proc/irq/43/smp_affinity 割り込み先CPU群をビットで指定する と、指定されたCPU群にラウンドロビ ンで割り込まれる これを書き換えればいいのか! 12年9月22日土曜日
  • 6. それでは#kernelvmらしくない # cat /proc/irq/43/smp_affinity 3 # echo 1 > /proc/irq/43/smp_affinity bitの立ってるコアへ割り込み分散 bitが一つならいつもそこへ割り込み これ、どうなってるんだろう? 12年9月22日土曜日
  • 7. イマドキなx86の割り込み CPU CPU CPU Local APIC Local APIC Timer Legacy PCI Local APIC IPI MSI 8259A Intr MSI Legacy Capable I/O APIC PCI Devices Devices 8259A PIC ICH(South bridge) 12年9月22日土曜日
  • 8. Local APIC CPU CPU CPU Local APIC Local APIC Timer Legacy PCI Local APIC IPI MSI 8259A Intr MSI Legacy Capable I/O APIC PCI Devices Devices 8259A PIC ICH(South bridge) CPU毎の割り込みコントローラ 割り込みを許可・マスクした り、EOIしたり システム全体で一意なAPIC IDを持つ 他のLAPICへ割り込める(IPI: Inter-processor Interrupt) 12年9月22日土曜日
  • 9. I/O APIC CPU CPU CPU Local APIC Local APIC Timer Legacy PCI Local APIC IPI MSI 8259A Intr MSI Legacy Capable I/O APIC PCI Devices Devices 8259A PIC ICH(South bridge) 限られたIRQを複数のPCIデバイスで共有 各IRQをどのLAPICへ転送するかを定義するRedirection Table(I/ O APIC上のレジスタ群)を持つ PCIデバイスはI/O APICを通じてLAPICへ割り込みメッセージを送信 12年9月22日土曜日
  • 10. MSI capable PCI devices CPU CPU CPU Local APIC Local APIC Timer Legacy PCI Local APIC IPI MSI 8259A Intr MSI Legacy Capable I/O APIC PCI Devices Devices 8259A PIC ICH(South bridge) 各デバイスが任意の数のIRQを持てる 各IRQの割り込み先LAPICはPCIデバイスのPCI Configuration Spaceに持つ PCIデバイスは直接LAPICへ割り込みメッセージを送信 12年9月22日土曜日
  • 11. 割り込み先の指定方法 Physical Destination Mode Destination FieldにAPIC IDを指定 「常に同じCPUへ割り込み」を実現 Logical Destination Mode(Flat Model) Destination Fieldのbitで宛先LAPIC群の範囲を表現 Delivery Mode Fixed 指定範囲の全てのLAPICへ割り込み Lowest Priority 指定範囲の中で、最もTPR(Task Priority Register)の 値が低いCPUへ割り込み 12年9月22日土曜日
  • 12. Lowest Priority Mode 指定範囲の中で、最もTPR(Task Priority Register)の値が低いLAPIC へ割り込み 最小値のTPRを持つLAPICが複数ある 場合はラウンドロビンで1つ選択 12年9月22日土曜日
  • 13. echo 1 > /proc/irq/<IRQ>/ smp_affinityした時に何が起きるのか MSIなPCIeデバイスで確かめてみる Intel Pro/1000(e1000e) PCI Configuration Spaceはrootな ら/sys/bus/pciから読める →ユーザランドから読める →もしかして:lspci 12年9月22日土曜日
  • 14. _人人 人人_ > lspci <  ̄Y^Y^Y^Y ̄ 12年9月22日土曜日
  • 15. # lspci -vvvv -s 00:19.0 00:19.0 Ethernet controller: Intel Corporation 82567LM Gigabit Network Connection (rev 03) Subsystem: Lenovo Device 20ee Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR+ FastB2B- DisINTx+ Status: Cap+ 66MHz- UDF- FastB2B- ParErr- DEVSEL=fast >TAbort- <TAbort- <MAbort- >SERR- <PERR- INTx- Latency: 0 Interrupt: pin A routed to IRQ 44 Region 0: Memory at f2600000 (32-bit, non-prefetchable) [size=128K] Region 1: Memory at f2625000 (32-bit, non-prefetchable) [size=4K] Region 2: I/O ports at 1840 [size=32] Capabilities: [c8] Power Management version 2 Flags: PMEClk- DSI+ D1- D2- AuxCurrent=0mA PME(D0+,D1-,D2-,D3hot+,D3cold+) Status: D0 NoSoftRst- PME-Enable- DSel=0 DScale=1 PME- Capabilities: [d0] MSI: Enable+ Count=1/1 Maskable- 64bit+ Address: 00000000fee0300c Data: 41b9 Capabilities: [e0] PCI Advanced Features AFCap: TP+ FLR+ AFCtrl: FLR- AFStatus: TP- Kernel driver in use: e1000e Kernel modules: e1000e 赤く塗った所がMSIのフィールドだけれど、こ れだと良く分からないのでlspciをforkして MSIフィールドを表示するツールを作成 https://gist.github.com/1568777 12年9月22日土曜日
  • 16. # gcc -lpci msireg.c # ./a.out 00:19.0 Message Signalled Interrupts: 64bit+ Queue=0/0 Enable+ address_hi=0 address_lo=fee0300c dest_mode=logical redirection=lowpri dest_id=3 data=41b9 trigger=edge level=assert delivery_mode=lowpri vector=185 Logical modeでLowpri、destid=3、 vector=185になってる # echo 1 > /proc/irq/44/smp_affinity # ./a.out 00:19.0 Message Signalled Interrupts: 64bit+ Queue=0/0 Enable+ address_hi=0 address_lo=fee0100c dest_mode=logical redirection=lowpri dest_id=1 data=41b9 trigger=edge level=assert delivery_mode=lowpri vector=185 dest_idが1に書き換わった! 12年9月22日土曜日
  • 17. 余談 調子に乗ってユーザランドからフィー ルド書き換えたら何かおかしくなりま した カーネルさんと喧嘩してるか、フィー ルドの書き方間違えたか… 12年9月22日土曜日
  • 18. 参考資料 Intel® 64 and IA-32 Architectures Software Developer Manuals Intel® I/O Controller Hub 10 (ICH10) Family Datasheet linux/Documentation/IRQ-affinity.txt Understanding the Linux Kernel, 3rd Edition PCI Local Bus Specification Revision 3.0 最近のPCアーキテクチャにおける割り込みルーティングの仕組み /proc/irq/<IRQ>/smp_affinityの書き換えでPCIコンフィグレ ーション空間はどのように書き換わるか Interrupts on xv6 12年9月22日土曜日

Editor's Notes

  1. \n
  2. \n
  3. \n
  4. \n
  5. \n
  6. \n
  7. \n
  8. \n
  9. \n
  10. \n
  11. \n
  12. \n
  13. \n
  14. \n
  15. \n
  16. \n
  17. \n
  18. \n