ConcurrentReal-Time-Logo

リアルタイムテクニカルドキュメント KVM-RT編 最終更新 2025.4.14

外部リンクを除く、以下のドキュメントの著作権は、特に記載の無い限りConcurrent Real-Time社に帰属します。
下記ドキュメントの弊社を除く営利目的の利用は禁じますが、ウィキペディアからの参照や社内教育、
大学等の非営利の目的であれば、ご自身の責任において自由に利用して頂いてかまいません。
ドキュメントの内容は予告無く変更する事がありますが、出来る限りリンクが消滅しないように保存しています。
ここに、記載した商品名は、一般に各社の商標または登録商標です。
外部リンク先の著作権は、各サイトの著作権表示をご覧ください。弊社著作権についてのポリシーは、 [hand.right] こちらをご覧ください。


RedHawk KVM-RTは、Concurrent Real-Timeによって開発されたTYPE-1 ハイパーバイザーであり、実績のあるカーネルベースの仮想マシン(KVM)オープンソーステクノロジーをRedHawkLinuxリアルタイムオペレーティングシステムと統合します。ConcurrentのKVM-RT構成ツールを使用すると、RedHawk Linuxのリアルタイム機能を単一の物理ホストシステムで実行されているVMに拡張する仮想マシン(VM)を簡単に作成できます。

RedHawkは、Intelx86およびARM64プラットフォーム向けのオープンソースLinuxオペレーティングシステムのConcurrentReal-Timeに特化したリアルタイムバージョンです。KVM-RT構成ツールは、RedHawk Linuxホストの独自の機能を活用して、メモリ管理、プロセススケジューリング、デバイスアクセス、およびI/Oを実現します。リアルタイムのパフォーマンスは、RedHawkLinuxのシールドおよびスケジューリングメカニズムによって保証されています。

リアルタイムのRedHawkLinuxディストリビューションにRedHawk KVM-RTを実装すると、KVMの機能が拡張され、仮想マシンでのリアルタイムパフォーマンスが保証されます。また、複数のリアルタイムゲストと非リアルタイムゲストのサポートも提供します。RedHawk KVM-RTは、認定されたハードウェアプラットフォームで20マイクロ秒未満の最悪の場合の最大応答時間を達成できます。

KVM-RT 1.5 ベンチマーク試験例
ホスト
ノード 0 でのストレス テスト
ノード 0 で Heaven GPU ベンチマークを実行している Windows 11 VM
完全にシールドされたノード 3 の 1 つの CPU で実行される Cyclictest

RT VM (RT 仮想マシン)
RedHawk 7.5.14 VM (ノード 1)
RedHawk 9.2.1 VM (ノード 2)
テスト (各 RT VM)
単一のシールドコアでcyclictestを実行
他のすべてのコアへの負荷がかかる
3つのCUDAデモ(nbody、oceanFFT、randomFog)
Heaven GPUベンチマーク

Host max PDL: 9us
RedHawk 7.5.14 VM max PDL: 17us
RedHawk 9.2.1 VM max PDL: 19us

Duration 16.5 hours

KVM-RT 1.4 ベンチマーク試験例
 
Maximum VM PDL(μ秒) KVM-RT 1.4(Duration: 46 hours) VMware ESXi 8(Duration: 19 hours)
RedHawk 6.5 6 953
RedHawk 7.5 7 3371
RedHawk 8.4 17 2724

下記に、KVM-RTのベンチマーク例を2つ示します。(2024.11.27)
いずれも、100%負荷状態で15マイクロ秒以下のPDLを実現しています。

例1

RedHawk8.4.9上でRedHawk8.4.9を20コアの仮想マシンとして構築、 ディスプレイはVGAパススルーした
0-18コアにstresstestで100%負荷をかけ、19コア上で、3時間1msのタイマーループ試験を行った結果。
Stress


例2
RedHawk8.4.9上でRedHawk8.4.9を20コアの仮想マシンとして構築、 ディスプレイはVGAパススルーした、その上でRedHawk7.2.0ユーザランドをPODMANコンテナとして構築
、0-18コアにstresstestで100%負荷をかけ、19コア上で、1時間1msのタイマーループ試験を行った結果。
Stress

[hand.right] 資料: KVM-RT 1.6 Release Notes

   KVM-RT Version 1.6 Release Notes(PDF)

[hand.right] 資料: KVM-RT 1.6 Users Guide

   KVM-RT Version 1.6 Users Guide(PDF)



[hand.right] 資料: KVM-RT 1.5 Release Notes

   KVM-RT Version 1.5 Release Notes(PDF)

[hand.right] 資料: KVM-RT 1.5 Users Guide

   KVM-RT Version 1.5 Users Guide(PDF)


[hand.right] 資料: KVM-RT 1.4 Release Notes

   KVM-RT Version 1.4 Release Notes(PDF)

[hand.right] 資料: KVM-RT 1.4 Users Guide

   KVM-RT Version 1.4 Users Guide(PDF)


[hand.right] 資料: KVM-RT 1.3 Release Notes

   KVM-RT Version 1.3 Release Notes(PDF)

[hand.right] 資料: KVM-RT 1.3 Users Guide

   KVM-RT Version 1.3 Users Guide(PDF)


[hand.right] 資料: KVM-RT 1.2 Release Notes

   KVM-RT Version 1.2 Release Notes(PDF)

[hand.right] 資料: KVM-RT 1.2 Users Guide

   KVM-RT Version 1.2 Users Guide(PDF)


[hand.right] KVM-RT上でゲストOSとNFS共有する方法について(2024.01.07)
(1) ベアメタルホスト:インストールされるべきパッケージ

	# rpm -q nfs-utils
	nfs-utils-2.3.3-59.el8.x86_64

(2) ベアメタルホスト:仮想マシンxに割り当てたIPアドレスの範囲を確認

	# virsh domifaddr VM1
	 名前     MAC アドレス     Protocol     アドレス
	-------------------------------------------------------------------------------
	 vnet0      52:54:00:f3:40:25    ipv4         192.168.122.187/24

(3) ベアメタルホスト:共有するディレクトリを/etc/exportsに記述

	# cat /etc/exports
	/home/shared 192.168.122.*(rw,insecure,sync,no_subtree_check,no_root_squash)

(4) ベアメタルホスト:NFSを起動

	# exportfs -a
	# systemctl enebale nfs-server
	# systemctl start nfs-server

(5) 仮想マシン:/etc/hostsに"192.168.122.1 baremetal"を追記

	# cat /etc/hosts
	127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
	::1     localhost localhost.localdomain localhost6 localhost6.localdomain6
	192.168.122.1 baremetal

(6) 仮想マシン:/etc/fstabに"baremetal:/home/shared /home/shared nfs defaults,lookupcache=none 0 2"を追記

	# cat /etc/fstab
	UUID=ff89e4d2-76de-11ef-8eb6-5254000b2616 /                       xfs     defaults        1 1
	UUID=ff89e68a-76de-11ef-8eb6-5254000b2616 /boot                   xfs     defaults        1 2
	UUID=ff89e748-76de-11ef-8eb6-5254000b2616 /home                   xfs     defaults        1 2
	UUID=ff89e7fc-76de-11ef-8eb6-5254000b2616 /var/lib/containers     xfs     defaults,defaults,uquota,pquota,gquota        1 2
	baremetal:/home/shared /home/shared nfs defaults,lookupcache=none 0 2

(7) 仮想マシン:再起動後、NFSマウントされていることを確認

	# df
	ファイルシス           1K-ブロック      使用    使用可 使用% マウント位置
	devtmpfs                    690980         0    690980    0% /dev
	tmpfs                       750188        84    750104    1% /dev/shm
	tmpfs                       750188     17920    732268    3% /run
	tmpfs                       750188         0    750188    0% /sys/fs/cgroup
	/dev/vda3                104806400  20939424  83866976   20% /
	/dev/vda5                 26201600    220412  25981188    1% /home
	/dev/vda2                  2086912    191660   1895252   10% /boot
	/dev/vda4                134151172  22093880 112057292   17% /var/lib/containers
	baremetal:/home/shared   612612096 568369152  44242944   93% /home/shared
	tmpfs                       150036        24    150012    1% /run/user/0


[hand.right] 仮想マシンをinit 3(multiuser mode)で起動時、rootで自動ログイン後、アプリケーションを自動実行する方法について(2024.01.07)
仮想マシン上で下記の作業を行う
(1) rootで自動ログイン

	$ sudo systemctl edit getty@tty1

上記のコマンドを実行、次の内容を設定する。

	[Service]
	ExecStart=
	ExecStart=-/sbin/agetty --autologin root --noclear %I $TERM

この操作を行うと以下のファイルが作成される。

/etc/systemd/system/getty@tty1.service.d/override.conf

(2) 自動ログイン後、アプリケーションプログラムを.bash_profileから自動実行する
ここでは、KVM-RT上でコンテナを自動実行する
/root/.bash_profileに下記の内容を追記する

	# cat .bash_profile 
	# .bash_profile

	# Get the aliases and functions
	if [ -f ~/.bashrc ]; then
		. ~/.bashrc
	fi

	# User specific environment and startup programs

	PATH=$PATH:$HOME/bin

	export PATH
	# ここから追記
	# execute Container
	#
	LEVEL=`/usr/bin/who -r|/usr/bin/awk '{print $2}'`
	#
	# 仮想マシンのSpiceデバイスで動作するXorgとVGA パススルーしたXorgは、排他的(同時デバイス設定はクラッシュする)
	#
	if [ "$LEVEL" -eq "3" ]
	then
	#
	# 仮想マシンでは、最初にnvidia_uvmを組み込む必要がある(KVM-RT側で、Nvidiaドライバを強制ロードする)
	#
		modprobe nvidia_uvm
	#
	# 仮想マシンでは、podman 再起動時に備えて、ログイン時shield状態を解除しておかなくではならない
	#
		/usr/bin/shield -r
	#
	# podmanを起動するとKVM-RT上で観測することはできないが、仮想マシンのデーモンと、podmanコンテナのデーモンが共に動作する
	# この時、仮想マシンの上で動作するデーモンを仮想コア0で動作させ、podmanの優先度をRR:97に設定する、
	# -rを付与しないとコンテナプロセスがすべて97で動作する。
	#
		run -b0 -u0 ; run -b0 -g0 ;run -b0 -r -s rr -P 97 podman start gnome
	fi
	# ここまで


[hand.right] KVM-RT上でinit 5状態からVGAパススルーしたNvidiaを動作させる方法について(2024.01.07)
下記の通り、Xに関わる環境変数をリセットして
/usr/bin/startx -- :2 -sharevts -config /etc/X11/xorg.conf.nvidia -auth /run/user/0/gdm/Xauthority
で起動しなければならない
環境変数を消去しない場合、Xがクラッシュする
この例では、仮想OS側でのNvidiaカードは仮想PCIスロットの5に存在するものとしている。
またキーボードとマウスは、ベアメタルとは別のUSBに用意され、仮想OS側にパススルーされているものとする。

# cat ~/bin/xorg.nvidia
#!/usr/bin/bash
if [ "$DISPLAY" == ":1" ]
then
	unset DESKTOP_SESSION
	unset GNOME_TERMINAL_SCREEN
	unset XDG_SESSION_TYPE
	unset XDG_DATA_DIRS
	unset XDG_SESSION_DESKTOP
	unset QT_IM_MODULE
	unset XMODIFIERS
	unset XDG_CURRENT_DESKTOP
	unset GNOME_TERMINAL_SERVICE
	unset XDG_SEAT
	unset SHLVL
	unset GDK_BACKEND
	unset GDMSESSION
	unset GNOME_DESKTOP_SESSION_ID
	unset DBUS_SESSION_BUS_ADDRESS
	unset XDG_RUNTIME_DIR
	unset XAUTHORITY
	unset SESSION_MANAGER
	unset DBUS_SESSION_BUS_ADDRESS
	unset DISPLAY
	sleep 3
	/usr/bin/startx -- :2 -sharevts -config /etc/X11/xorg.conf.nvidia -auth /run/user/0/gdm/Xauthority
fi

# cat /etc/X11/xorg.conf.nvidia

# nvidia-xconfig: X configuration file generated by nvidia-xconfig
# nvidia-xconfig:  version 550.67

Section "ServerLayout"
    Identifier     "Layout0"
    Screen      0  "Screen0"
    InputDevice    "Keyboard0" "CoreKeyboard"
    InputDevice    "Keyboard1" "CoreKeyboard"
    InputDevice    "Mouse0" "CorePointer"
    InputDevice    "Mouse1" "CorePointer"
EndSection

Section "ServerFlags"
        Option  "AutoAddGPU"    "off"
EndSection

Section "Files"
EndSection

Section "InputClass"
        Identifier      "Ignore libinput"
        Driver          "libinput"
        Option          "Ignore"        "True"
EndSection

Section "InputDevice"
    # generated from default
    Identifier     "Keyboard0"
    Driver         "evdev"
    Option "Device" "/dev/input/by-path/pci-0000:02:00.0-usb-0:4:1.0-event-kbd"
EndSection

Section "InputDevice"
    # generated from default
    Identifier     "Keyboard1"
    Driver         "evdev"
    Option "Device" "/dev/input/by-path/pci-0000:02:00.0-usb-0:5:1.0-event-kbd"
EndSection

Section "InputDevice"
    # generated from default
    Identifier     "Mouse0"
    Driver         "evdev"
    Option "Device" "/dev/input/by-path/pci-0000:02:00.0-usb-0:4:1.0-event-mouse"
EndSection

Section "InputDevice"
    # generated from default
    Identifier     "Mouse1"
    Driver         "evdev"
    Option "Device" "/dev/input/by-path/pci-0000:02:00.0-usb-0:5:1.0-event-mouse"
EndSection

Section "Monitor"
    Identifier     "Monitor0"
    VendorName     "Unknown"
    ModelName      "Unknown"
    Option         "DPMS"
EndSection

Section "Device"
    Identifier     "Device0"
    Driver         "nvidia"
    VendorName     "NVIDIA Corporation"
    BusID          "PCI:5:0:0"
EndSection

Section "Screen"
    Identifier     "Screen0"
    Device         "Device0"
    Monitor        "Monitor0"
    DefaultDepth    24
    SubSection     "Display"
        Depth       24
    EndSubSection
EndSection


[hand.right] KVM-RT上でゲストOS個別のIP アドレスを持つようにする方法について(2023.03.10)
ゲストが外部ネットワーク上で個別のIP アドレスを持つようにするには、ホスト上の物理ネットワーク インターフェイスを共有するようにネットワークブリッジを構成する必要があります。

ネットワークブリッジは、NetworkManagerコマンドラインインターフェイスツール(nmcli)を使用して作成できます。
現在のネットワーク接続のリストは、次のように表示できます。

# nmcli connection show
NAME    UUID                                  TYPE      DEVICE 
eth0    3002a73e-cdb5-4b9f-9fcb-1224e135779b  ethernet  eth0   
virbr0  932d006c-c49e-4e3d-a9fc-3dc22f5156f6  bridge    virbr0 

上記の出力では、ホストにeth0というNAMEのデバイスを介して確立されたイーサネットネットワーク接続があり、 virbr0というNAMEのデフォルトのブリッジインターフェイスが、KVM-RTゲストシステムがdefaultで接続されているNATベースの仮想ネットワークへのアクセスを提供していることがわかります。
virshコマンドを使用して、システムに現在構成されている仮想ネットワークを一覧表示することもできます。

# virsh net-list --all
 名前      状態     自動起動     永続
---------------------------------------------
 default   動作中   はい (yes)   はい (yes)

(1) ネットワーク構成に新しい接続を追加する。

# nmcli con add ifname br0 type bridge con-name br0
接続 'br0' (16165e87-0cd1-45c4-ad53-62024c5a4fae) が正常に追加されました。

接続が追加されたら、次のように、物理デバイスeth0(スレーブ)とブリッジ接続br0(マスター)の間にブリッジスレーブインターフェイスを確立します。

# nmcli con add type bridge-slave ifname eth0 master br0
接続 'bridge-slave-eth0' (3785d32d-692b-4687-affd-c20afc60dbf3) が正常に追加されました。

この時点で、NetworkManager接続リストは次のようになります。

# nmcli connection show
NAME               UUID                                  TYPE      DEVICE 
br0                15d881a2-9ea4-4134-875f-84b32bed888c  bridge    br0    
bridge-slave-eth0  c86598fc-7043-4e75-90fc-d7baeb9ecd5b  ethernet  eth0   
virbr0             932d006c-c49e-4e3d-a9fc-3dc22f5156f6  bridge    virbr0 

(2) ブリッジインターフェイスを起動する

# nmcli connection down eth0
接続 'eth0' が正常に非アクティブ化されました (D-Bus アクティブパス: /org/freedesktop/NetworkManager/ActiveConnection/1)
# nmcli connection up br0
接続が正常にアクティベートされました (master waiting for slaves) (D-Bus アクティブパス: /org/freedesktop/NetworkManager/ActiveConnection/13)

ブリッジが稼働すると、接続リストにブリッジ接続とブリッジスレーブ接続の両方が含まれるようになります。

# nmcli connection show --active
NAME               UUID                                  TYPE      DEVICE 
br0                15d881a2-9ea4-4134-875f-84b32bed888c  bridge    br0    
bridge-slave-eth0  c86598fc-7043-4e75-90fc-d7baeb9ecd5b  ethernet  eth0   
virbr0             932d006c-c49e-4e3d-a9fc-3dc22f5156f6  bridge    virbr0 

(3) KVM-RTブリッジネットワークの作成
この時点で、ブリッジ接続はシステムに存在しますが、KVM-RT 環境には表示されません。
virshコマンドを実行すると、デフォルトネットワークが唯一の利用可能なネットワークオプションとしてリストされます。

# virsh net-list --all
 名前      状態     自動起動     永続
---------------------------------------------
 default   動作中   はい (yes)   はい (yes)

ブリッジを仮想マシンで使用する前に、ブリッジを宣言してKVM-RT ネットワーク構成に追加する必要があります。
まず、 bridge.xmlという名前のブリッジネットワークの定義ファイルを作成します。
# vi bridge.xml 
  <network>
  <name>br0</name>
  <forward mode="bridge"/>
  <bridge name="br0" />
  </network>
次に、ファイルを使用して新しいネットワークを定義します。

# virsh net-define bridge.xml
ネットワーク br0 が bridge.xml から定義されました

(4) ネットワークを定義したら、ネットワークを起動し、必要に応じて、システムが再起動するたびに自動起動するようにネットワークを構成します。

# virsh net-start br0
ネットワーク br0 が起動されました

# virsh net-autostart br0
ネットワーク br0 が自動起動に設定されました

もう一度ネットワークを一覧表示して、KVM-RT 環境内でブリッジネットワークにアクセスできるようになったことを確認します。

# virsh net-list --all
 名前      状態     自動起動     永続
---------------------------------------------
 br0       動作中   はい (yes)   はい (yes)
 default   動作中   はい (yes)   はい (yes)

(5) ブリッジを使用するように既存の仮想マシンを変更するには、virsh editコマンドを使用します。

# virsh edit ゲストOS名
デフォルトの仮想ネットワークから変更するには、ファイルの セクションを次のように見つけます。
source bridge プロパティをdefaultからbr0に変更し、ファイルを保存します。

# virsh edit RedHawk8.4

    <interface type='bridge'>
      <mac address='52:54:00:a4:a4:63'/>
      <source bridge='default'/>
      <model type='virtio'/>
      <address type='pci' domain='0x0000' bus='0x01' slot='0x00' function='0x0'/>
    </interface>

    <interface type='bridge'>
      <mac address='52:54:00:a4:a4:63'/>
      <source bridge='br0'/>
      <model type='virtio'/>
      <address type='pci' domain='0x0000' bus='0x01' slot='0x00' function='0x0'/>
    </interface>

(6) 仮想マシンを再起動するまで変更は有効になりません。

[hand.right] PCIパススルーする場合の注意事項について(2023.03.10)

(1) VT-d 仕様では、PCIe-to PCI/PCI-X ブリッジまたは従来の PCI ブリッジの背後にあるすべての従来の PCI デバイスは、同じゲストにまとめてのみ割り当てることができると規定しています。
(PCIe デバイスにはこの制限はありません。)
デバイスが MSI をサポートしておらず、他のデバイスと IRQ を(物理的に)共有している場合、割り当てられたデバイスのホストIRQでは、共有がサポートされていないため、割り当てることができません
下記は、ホスト側で見たPCIカードデバイスの情報です。

ホスト側
# lspci -s 0000:03:0c.0 -vvv
03:0c.0 Unassigned class [ff00]: Interface Corp Device 0b61 (rev 02)
      Subsystem: Interface Corp Device 2cd8
      Control: I/O- Mem+ BusMaster- SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- DisINTx-
      Status: Cap- 66MHz- UDF- FastB2B- ParErr- DEVSEL=slow >TAbort- <TAbort- <MAbort- >SERR- <PERR- INTx-
      Interrupt: pin A routed to IRQ 16
      NUMA node: 0
      IOMMU group: 24
      Region 0: Memory at a0200000 (32-bit, non-prefetchable) [size=32]
      Kernel driver in use: vfio-pci

この状態でKVM-RTを起動すると、下記のようなエラーが発生します。

# kvmrt-boot
NUMA node memory shielding is not supported or configured on this system.
error: Failed to start domain 'RedHawk8'
error: Internal error: qemu unexpectedly closed the monitor: 2023-03-03T02:34:32.782025Z qemu-kvm: -device vfio-pci,host=0000:03:0c.0,id=hostdev0,bus=pci.9,addr=0x1: vfio 0000:03:0c.0: Failed to set up TRIGGER eventfd signaling for interrupt INTX-0: VFIO_DEVICE_SET_IRQS failure: Device or resource busy
Error: VM "rocky8" failed to boot.

これは、下記の様にIRQ 16が共有されている事が原因です。

# lspci -vvv
:
00:1f.4 SMBus: Intel Corporation C620 Series Chipset Family SMBus (rev 09)
        Subsystem: Dell Device 0739
        Control: I/O+ Mem+ BusMaster- SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- DisINTx-
        Status: Cap- 66MHz- UDF- FastB2B+ ParErr- DEVSEL=medium >TAbort- <TAbort- <MAbort- >SERR- <PERR- INTx-
        Interrupt: pin A routed to IRQ 16
        NUMA node: 0
        IOMMU group: 21
        Region 0: Memory at 380000000000 (64-bit, non-prefetchable) [size=256]
        Region 4: I/O ports at 0780 [size=32]
        Kernel driver in use: i801_smbus
        Kernel modules: i2c_i801
:

IRQ16を利用中かどうかは、下記の様に/proc/interruptsで確認することも出来ます。

# cat /proc/interrupts
            CPU0       CPU1       CPU2       CPU3      
   0:         22          0          0          0  IR-IO-APIC    2-edge      timer
   8:          0          1          0          0  IR-IO-APIC    8-edge      rtc0
   9:          0          0          0          0  IR-IO-APIC    9-fasteoi   acpi
  16:          0          0          0          0  IR-IO-APIC   16-fasteoi   i801_smbus
  29:          0          0     105603          0  IR-PCI-MSI 376832-edge    ahci[0000:00:17.0]
       :

別のスロット位置に変更したところ以下の様に、問題は解決しました。

ホスト側

    # lspci -s b4:0c.0  -vvv
    b4:0c.0 Unassigned class [ff00]: Interface Corp Device 0b61 (rev 02)
          Subsystem: Interface Corp Device 2cd8
          Control: I/O- Mem- BusMaster- SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- DisINTx-
          Status: Cap- 66MHz- UDF- FastB2B- ParErr- DEVSEL=slow >TAbort- <TAbort- <MAbort- >SERR- <PERR- INTx-
          Interrupt: pin A routed to IRQ 11
          NUMA node: 0
          IOMMU group: 84
          Region 0: Memory at fbe00000 (32-bit, non-prefetchable) [disabled] [size=32]
          Kernel driver in use: vfio-pci

    # cat /proc/interrupts(ホスト側にIRQ11を利用しているデバイスは無い)
                CPU0       CPU1       CPU2       CPU3      
       0:         23          0          0          0  IR-IO-APIC    2-edge      timer
       8:          0          0          0          1  IR-IO-APIC    8-edge      rtc0
       9:          0          0          0          0  IR-IO-APIC    9-fasteoi   acpi
      16:          0          0          0          0  IR-IO-APIC   16-fasteoi   i801_smbus
      30:          0      55184          0          0  IR-PCI-MSI 376832-edge      ahci[0000:00:17.0]
      31:          0          0       1714          0  IR-PCI-MSI 327680-edge      xhci_hcd
      32:          0        293          0          0  IR-PCI-MSI 520192-edge      enp0s31f6
      35:          0          0          2          0  IR-PCI-MSI 65536-edge      ioat-msix
      37:          0          0          0          2  IR-PCI-MSI 67584-edge      ioat-msix
      38:          0          2          0          0  IR-PCI-MSI 69632-edge      ioat-msix
      39:          0          0          2          0  IR-PCI-MSI 71680-edge      ioat-msix
      40:          0          0          0          2  IR-PCI-MSI 73728-edge      ioat-msix
      41:          0          2          0          0  IR-PCI-MSI 75776-edge      ioat-msix
      42:          0          0          2          0  IR-PCI-MSI 77824-edge      ioat-msix
      43:          0          0          0          2  IR-PCI-MSI 79872-edge      ioat-msix
      44:         62          0          0          0  IR-PCI-MSI 360448-edge      mei_me
      45:          0          0        288          0  IR-PCI-MSI 514048-edge      snd_hda_intel:card0
      46:          0          0          0        299  IR-IO-APIC    4-fasteoi   snd_hda_intel:card1
      47:       6702          0          0          0  IR-PCI-MSI 12058624-edge      nvidia
      56:          0          0          0          0  DMAR-MSI    2-edge      dmar2
      57:          0          0          0          0  DMAR-MSI    1-edge      dmar1
      58:          0          0          0          0  DMAR-MSI    0-edge      dmar0
      59:          0          0          0          0  DMAR-MSI    3-edge      dmar3
     NMI:          0          0          0          0   Non-maskable interrupts
     NMD:          0          0          0          0   Duration in usecs of most recent NMI
     LOC:      69069      58010     551652      49761   Local timer interrupts
     SPU:          0          0          0          0   Spurious interrupts
     PMI:          0          0          0          0   Performance monitoring interrupts
     IWI:          0          0          0          0   IRQ work interrupts
     RTR:          0          0          0          0   APIC ICR read retries
     RES:       5301       2607       3167       3238   Rescheduling interrupts
     FBS:          0          0          0          0   FBS cross cpu interrupts
     CAL:       5052      25807      22664      25595   Function call interrupts
     TLB:       1881       1930       1397       3367   TLB shootdowns
     MOV:          0          0          0          0   IRQ-move cleanup interrupts
     TRM:          0          0          0          0   Thermal event interrupts
     THR:          0          0          0          0   Threshold APIC interrupts
     DFR:          0          0          0          0   Deferred Error APIC interrupts
     MCE:          0          0          0          0   Machine check exceptions
     MCP:          1          2          2          2   Machine check polls
     RTE:          0          0          0          0   RT throttling events
     ERR:          0
     MIS:          0
     PIN:          0          0          0          0   Posted-interrupt notification event
     NPI:          0          0          0          0   Nested posted-interrupt event
     PIW:          0          0          0          0   Posted-interrupt wakeup event

ゲスト側

    # lspci -s 08:01.0 -vvv
    08:01.0 Unassigned class [ff00]: Interface Corp Device 0b61 (rev 02)
        Subsystem: Interface Corp Device 2cd8
        Physical Slot: 1
        Control: I/O- Mem+ BusMaster- SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- DisINTx-
        Status: Cap- 66MHz- UDF- FastB2B- ParErr- DEVSEL=slow >TAbort- <TAbort- <MAbort- >SERR- <PERR- INTx-
        Interrupt: pin A routed to IRQ 23
        Region 0: Memory at fc000000 (32-bit, non-prefetchable) [size=32]
    # cat /proc/interrupts
               CPU0       CPU1       
      1:          0       2406   IO-APIC   1-edge      i8042
      8:          0          0   IO-APIC   8-edge      rtc0
      9:          0          0   IO-APIC   9-fasteoi   acpi
     12:        144          0   IO-APIC  12-edge      i8042
     16:          0          0   IO-APIC  16-fasteoi   i801_smbus
     21:          0       1044   IO-APIC  21-fasteoi   qxl
     22:          0          5   IO-APIC  22-fasteoi   virtio4, virtio3
     23:        490          0   IO-APIC  23-fasteoi   extmem
     24:          0          0   PCI-MSI 32768-edge      aerdrv
           :

(2) 下記、Interface社PEXH224020等、一部のPCIカードでは、1枚のカードで2つのバスブリッジを持っている場合があります。

ホスト側(通常の場合)

# lspci -d 1147:08c0 -vv
23:0c.0 Unassigned class [ff00]: Interface Corp Device 08c0 (rev 01)
	Subsystem: Interface Corp Device 2d14
	Control: I/O- Mem+ BusMaster- SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- DisINTx-
	Status: Cap- 66MHz- UDF- FastB2B- ParErr- DEVSEL=slow >TAbort- <TAbort- <MAbort- >SERR- <PERR- INTx-
	Interrupt: pin A routed to IRQ 27
	Region 0: Memory at dfffe000 (32-bit, non-prefetchable) [size=32]

23:0c.1 Unassigned class [ff00]: Interface Corp Device 08c0 (rev 01)
	Subsystem: Interface Corp Device 2d94
	Control: I/O- Mem+ BusMaster- SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- DisINTx-
	Status: Cap- 66MHz- UDF- FastB2B- ParErr- DEVSEL=slow >TAbort- <TAbort- <MAbort- >SERR- <PERR- INTx-
	Interrupt: pin B routed to IRQ 28
	Region 0: Memory at dffff000 (32-bit, non-prefetchable) [size=32]


これらのカードをKVM-RTに対してPCIパススルーを行った場合、ゲストOS側の起動時に pci=routeirq を付与しないと、IRQがゲストOSに到達しない場合があります。

ホスト側(PCIパススルーを行った場合)

# lspci -d 1147:08c0 -vvv
67:0c.0 Unassigned class [ff00]: Interface Corp Device 08c0 (rev 01)
	Subsystem: Interface Corp Device 2d14
	Control: I/O- Mem+ BusMaster- SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- DisINTx-
	Status: Cap- 66MHz- UDF- FastB2B- ParErr- DEVSEL=slow >TAbort- <TAbort- <MAbort- >SERR- <PERR- INTx-
	Interrupt: pin A routed to IRQ 94
	NUMA node: 0
	IOMMU group: 91
	Region 0: Memory at e0e01000 (32-bit, non-prefetchable) [size=32]
	Kernel driver in use: vfio-pci

67:0c.1 Unassigned class [ff00]: Interface Corp Device 08c0 (rev 01)
	Subsystem: Interface Corp Device 2d94
	Control: I/O- Mem+ BusMaster- SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- DisINTx-
	Status: Cap- 66MHz- UDF- FastB2B- ParErr- DEVSEL=slow >TAbort- <TAbort- <MAbort- >SERR- <PERR- INTx-
	Interrupt: pin B routed to IRQ 95
	NUMA node: 0
	IOMMU group: 91
	Region 0: Memory at e0e00000 (32-bit, non-prefetchable) [size=32]
	Kernel driver in use: vfio-pci


ゲスト側側(PCIパススルーを行った場合)
(ボードが2つに分割されて見える)

# lspci -d 1147:08c0 -vvv
0a:01.0 Unassigned class [ff00]: Interface Corp Device 08c0 (rev 01)
	Subsystem: Interface Corp Device 2d14
	Physical Slot: 1
	Control: I/O- Mem+ BusMaster- SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- DisINTx-
	Status: Cap- 66MHz- UDF- FastB2B- ParErr- DEVSEL=slow >TAbort- <TAbort- <MAbort- >SERR- <PERR- INTx-
	Interrupt: pin A routed to IRQ 20
	Region 0: Memory at fa808000 (32-bit, non-prefetchable) [size=32]

0a:02.0 Unassigned class [ff00]: Interface Corp Device 08c0 (rev 01)
	Subsystem: Interface Corp Device 2d94
	Physical Slot: 2
	Control: I/O- Mem+ BusMaster- SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- DisINTx-
	Status: Cap- 66MHz- UDF- FastB2B- ParErr- DEVSEL=slow >TAbort- <TAbort- <MAbort- >SERR- <PERR- INTx-
	Interrupt: pin B routed to IRQ 22
	Region 0: Memory at fa809000 (32-bit, non-prefetchable) [size=32]


# cat /proc/interrupts
           CPU0       CPU1       CPU2       CPU3             
  0:         19          0          0          0         IO-APIC-edge      timer
  1:        200          0          0          0         IO-APIC-edge      i8042
  8:          0          0          0          0         IO-APIC-edge      rtc0
  9:          0          0          0          0         IO-APIC-fasteoi   acpi
 12:        134          0          0          0         IO-APIC-edge      i8042
 16:          0          0          0          0         IO-APIC-fasteoi   i801_smbus
 20:          0          0          0          0         IO-APIC-fasteoi   extmem
 21:       1030          0          0          0         IO-APIC-fasteoi   qxl
 22:          0          0          0          0         IO-APIC-fasteoi   extmem
     :

# lsirq
16	00:1f.3 Intel Corporation 82801I (ICH9 Family) SMBus Controller (rev 02)
20	0a:01.0 Interface Corp Unknown device (rev 01)
21	00:01.0 Red Hat, Inc. QXL paravirtual graphic card (rev 04)
22	0a:02.0 Interface Corp Unknown device (rev 01)
:



[hand.right] Nvidie製品をVGAパススルーする場合の注意事項について(2022.05.19)
VGAパススルーを利用して、
ホストOS側でオンボードVGAなどNvidiaではないグラフィックカードを
ゲストOS側でNvidiaグラフィックカードグラフィックカードを
構成する場合の注意事項について以下に示します。



[hand.right] バグ等

[back]Back