On 7/3/26 10:59, Aditya Gupta wrote:
In the past there have been hard to recreate issues where XIVE changes
cause qemu crashes due to multi-socket interrupts such as in [1].
Add a functional test explicitly to test whether remote interrupts work.
The test can also work as additional boot test for multi-socket boot,
initrd boot test, as well as a check for e1000e to be working in powernv,
though that's not a target goal, and are additional benefits.
From docs/system/devices/net.rst:
In order to check that the user mode network is working, you can ping
the address 10.0.2.2 and verify that you got an address in the range
10.0.2.x from the QEMU virtual DHCP server.
Hence use 10.0.2.2 with ping.
[1]:
https://lore.kernel.org/qemu-devel/[email protected]/
Tested-by: Shivang Upadhyay <[email protected]>
Reviewed-by: Shivang Upadhyay <[email protected]>
Tested-by: Misbah Anjum N <[email protected]>
Signed-off-by: Aditya Gupta <[email protected]>
---
tests/functional/ppc64/test_powernv.py | 95 ++++++++++++++++++++++++++
1 file changed, 95 insertions(+)
diff --git a/tests/functional/ppc64/test_powernv.py
b/tests/functional/ppc64/test_powernv.py
index b5b2f0d15857..bac2017e18df 100755
--- a/tests/functional/ppc64/test_powernv.py
+++ b/tests/functional/ppc64/test_powernv.py
@@ -9,6 +9,7 @@
from qemu_test import LinuxKernelTest, Asset
from qemu_test import wait_for_console_pattern
+from qemu_test import exec_command_and_wait_for_pattern
class PowernvMachine(LinuxKernelTest):
@@ -32,6 +33,17 @@ class PowernvMachine(LinuxKernelTest):
('https://github.com/roz3x/qemu/raw/refs/heads/sample-dtb/qemu-powernv11.dtb'),
'ea1271516264eea1eb58a067a99d0c2ca9528be8dc7d4e46bb2d5ae0d42fc568')
+ def shell_exec_command_check_fail(self, command):
+ fail_msg="Fail"
+ self.shell_exec_command(f"export __FAIL_MSG={fail_msg}")
+
+ # If the exit code for the command is non 0, print fail message
+ command = command + " || echo $__FAIL_MSG"
+ exec_command_and_wait_for_pattern(self, command, '#', fail_msg)
+
+ def shell_exec_command(self, command):
+ exec_command_and_wait_for_pattern(self, command, '#',
self.panic_message)
+
def do_test_linux_boot(self, command_line = KERNEL_COMMON_COMMAND_LINE):
self.require_accelerator("tcg")
kernel_path = self.ASSET_KERNEL.fetch()
@@ -76,6 +88,89 @@ def test_linux_smt_boot(self):
wait_for_console_pattern(self, console_pattern, self.panic_message)
wait_for_console_pattern(self, self.good_message, self.panic_message)
+ def test_linux_remote_interrupts(self):
+ self.require_accelerator("tcg")
+ self.set_machine('powernv')
+
+ # Have below setup in this test:
+ # 1. e1000e attached to pcie.6, which is from 7th PHB, belonging to 2nd
+ # socket (chip 1), in a powernv boot with default 6 PHBs per socket
+ # 2. CPU on 2nd socket (chip 1) disabled
+ # 3. RX IRQ's affinity to chip 2, and TX IRQ's affinity to chip 3
+ #
+ # Then ping is done, to generate interrupts from e1000e which should go
+ # to IRQ server on the remote sockets
+ self.vm.add_args('-smp', '4,sockets=4,cores=1,threads=1')
+ self.vm.add_args('-netdev', 'user,id=net0')
+ self.vm.add_args('-device', 'e1000e,netdev=net0,bus=pcie.6')
2 sockets are enough.
# grep -E "eth0|nvme" /proc/interrupts
76: 12 0 PNV-PCI-MSI 268959744 Edge nvme0q0
77: 62 0 PNV-PCI-MSI 268959745 Edge nvme0q1
78: 0 67 PNV-PCI-MSI 268959746 Edge nvme0q2
79: 0 34 PNV-PCI-MSI 2416443392 Edge eth0-rx-0
80: 0 20 PNV-PCI-MSI 2416443393 Edge eth0-tx-0
81: 0 4 PNV-PCI-MSI 2416443394 Edge eth0
# echo 0 > /sys/devices/system/cpu/cpu1/online
# grep -E "eth0|nvme" /proc/interrupts
76: 12 PNV-PCI-MSI 268959744 Edge nvme0q0
77: 62 PNV-PCI-MSI 268959745 Edge nvme0q1
78: 0 PNV-PCI-MSI 268959746 Edge nvme0q2
79: 10 PNV-PCI-MSI 2416443392 Edge eth0-rx-0
80: 0 PNV-PCI-MSI 2416443393 Edge eth0-tx-0
81: 0 PNV-PCI-MSI 2416443394 Edge eth0
A non-zero count on eth0-rx is good enough.
# ping -W2 -c5 10.0.2.2
PING 10.0.2.2 (10.0.2.2): 56 data bytes
64 bytes from 10.0.2.2: seq=0 ttl=255 time=7.339 ms
64 bytes from 10.0.2.2: seq=1 ttl=255 time=0.673 ms
64 bytes from 10.0.2.2: seq=2 ttl=255 time=0.405 ms
64 bytes from 10.0.2.2: seq=3 ttl=255 time=0.369 ms
64 bytes from 10.0.2.2: seq=4 ttl=255 time=0.516 ms
--- 10.0.2.2 ping statistics ---
5 packets transmitted, 5 packets received, 0% packet loss
# grep -E "eth0|nvme" /proc/interrupts
76: 12 PNV-PCI-MSI 268959744 Edge nvme0q0
77: 62 PNV-PCI-MSI 268959745 Edge nvme0q1
78: 0 PNV-PCI-MSI 268959746 Edge nvme0q2
79: 34 PNV-PCI-MSI 2416443392 Edge eth0-rx-0
80: 10 PNV-PCI-MSI 2416443393 Edge eth0-tx-0
81: 0 PNV-PCI-MSI 2416443394 Edge eth0
That's even better I agree.
Reviewed-by: Cédric Le Goater <[email protected]>
Thanks,
C.