diff mbox series

tests/functional: Add PCI hotplug test for aarch64

Message ID 20250509232156.106465-1-gustavo.romero@linaro.org
State Superseded
Headers show
Series tests/functional: Add PCI hotplug test for aarch64 | expand

Commit Message

Gustavo Romero May 9, 2025, 11:19 p.m. UTC
Add a functional test, aarch64_hotplug_pci, to exercise PCI hotplug and
hot-unplug on arm64. Currently, the aarch64 'virt' machine uses the PCIe
native controller and does not support ACPI-based hotplugging. However,
since support is planned, this test sets 'acpi=force' and specifies an
EDK2 firmware image in advance. This is harmless and prepares for future
ACPI support.

Signed-off-by: Gustavo Romero <gustavo.romero@linaro.org>
---
 tests/functional/meson.build                 |  1 +
 tests/functional/test_aarch64_hotplug_pci.py | 73 ++++++++++++++++++++
 2 files changed, 74 insertions(+)
 create mode 100755 tests/functional/test_aarch64_hotplug_pci.py

Comments

Thomas Huth May 12, 2025, 7:59 a.m. UTC | #1
Hi!

On 10/05/2025 01.19, Gustavo Romero wrote:
> Add a functional test, aarch64_hotplug_pci, to exercise PCI hotplug and
> hot-unplug on arm64. Currently, the aarch64 'virt' machine uses the PCIe
> native controller and does not support ACPI-based hotplugging. However,
> since support is planned, this test sets 'acpi=force' and specifies an
> EDK2 firmware image in advance. This is harmless and prepares for future
> ACPI support.
> 
> Signed-off-by: Gustavo Romero <gustavo.romero@linaro.org>
> ---
>   tests/functional/meson.build                 |  1 +
>   tests/functional/test_aarch64_hotplug_pci.py | 73 ++++++++++++++++++++
>   2 files changed, 74 insertions(+)
>   create mode 100755 tests/functional/test_aarch64_hotplug_pci.py

Could you also add the test file to one of the sections in the MAINTAINERS 
file, please?

> diff --git a/tests/functional/test_aarch64_hotplug_pci.py b/tests/functional/test_aarch64_hotplug_pci.py
> new file mode 100755
> index 0000000000..031540ba22
> --- /dev/null
> +++ b/tests/functional/test_aarch64_hotplug_pci.py
> @@ -0,0 +1,73 @@
> +#!/usr/bin/env python3
> +#
> +# The test hotplugs a PCI device and checks it on a Linux guest.
> +#
> +# Copyright (c) 2025 Linaro Ltd.
> +#
> +# Author:
> +#  Gustavo Romero <gustavo.romero@linaro.org>
> +#
> +# This work is licensed under the terms of the GNU GPL, version 2 or
> +# later.  See the COPYING file in the top-level directory.
> +
> +from os import path
> +from qemu_test import LinuxKernelTest, Asset, exec_command_and_wait_for_pattern
> +from qemu_test import BUILD_DIR
> +
> +class HotplugPCI(LinuxKernelTest):
> +
> +    ASSET_KERNEL = Asset(
> +        ('https://ftp.debian.org/debian/dists/stable/main/installer-arm64/'
> +         'current/images/netboot/debian-installer/arm64/linux'),
> +        '3821d4db56d42c6a4eac62f31846e35465940afd87746b4cfcdf5c9eca3117b2')
> +
> +    ASSET_INITRD = Asset(
> +        ('https://ftp.debian.org/debian/dists/stable/main/installer-arm64/'
> +         'current/images/netboot/debian-installer/arm64/initrd.gz'),
> +        '2583ec22b45265ad69e82f198674f53d4cd85be124fe012eedc2fd91156bc4b4')
> +
> +    def test_hotplug_pci(self):
> +
> +        self.vm.add_args('-m', '512M')
> +        self.vm.add_args('-machine', 'type=virt')

Please use self.set_machine('virt') instead so that the test gets correctly 
skipped in case the machine has not been compiled into the binary.

  Thanks,
   Thomas
Gustavo Romero May 12, 2025, 12:08 p.m. UTC | #2
Hi Thomas,

Thanks for the review.

On 5/12/25 04:59, Thomas Huth wrote:
>   Hi!
> 
> On 10/05/2025 01.19, Gustavo Romero wrote:
>> Add a functional test, aarch64_hotplug_pci, to exercise PCI hotplug and
>> hot-unplug on arm64. Currently, the aarch64 'virt' machine uses the PCIe
>> native controller and does not support ACPI-based hotplugging. However,
>> since support is planned, this test sets 'acpi=force' and specifies an
>> EDK2 firmware image in advance. This is harmless and prepares for future
>> ACPI support.
>>
>> Signed-off-by: Gustavo Romero <gustavo.romero@linaro.org>
>> ---
>>   tests/functional/meson.build                 |  1 +
>>   tests/functional/test_aarch64_hotplug_pci.py | 73 ++++++++++++++++++++
>>   2 files changed, 74 insertions(+)
>>   create mode 100755 tests/functional/test_aarch64_hotplug_pci.py
> 
> Could you also add the test file to one of the sections in the MAINTAINERS file, please?

Any idea under which section I should add this test?

Currently, it's only TCG, but in the future probably there will be
1) a variant with --enable-kvm option and 2) it will have a variant
with ACPI enabled. Hence, currently it doesn't seem to fit neither
under "PCI" nor under "ARM ACPI Subsystem", I think I can create a
section tho? Maybe "ARM PCI Hotplug"? Could you please advise?


>> diff --git a/tests/functional/test_aarch64_hotplug_pci.py b/tests/functional/test_aarch64_hotplug_pci.py
>> new file mode 100755
>> index 0000000000..031540ba22
>> --- /dev/null
>> +++ b/tests/functional/test_aarch64_hotplug_pci.py
>> @@ -0,0 +1,73 @@
>> +#!/usr/bin/env python3
>> +#
>> +# The test hotplugs a PCI device and checks it on a Linux guest.
>> +#
>> +# Copyright (c) 2025 Linaro Ltd.
>> +#
>> +# Author:
>> +#  Gustavo Romero <gustavo.romero@linaro.org>
>> +#
>> +# This work is licensed under the terms of the GNU GPL, version 2 or
>> +# later.  See the COPYING file in the top-level directory.
>> +
>> +from os import path
>> +from qemu_test import LinuxKernelTest, Asset, exec_command_and_wait_for_pattern
>> +from qemu_test import BUILD_DIR
>> +
>> +class HotplugPCI(LinuxKernelTest):
>> +
>> +    ASSET_KERNEL = Asset(
>> +        ('https://ftp.debian.org/debian/dists/stable/main/installer-arm64/'
>> +         'current/images/netboot/debian-installer/arm64/linux'),
>> +        '3821d4db56d42c6a4eac62f31846e35465940afd87746b4cfcdf5c9eca3117b2')
>> +
>> +    ASSET_INITRD = Asset(
>> +        ('https://ftp.debian.org/debian/dists/stable/main/installer-arm64/'
>> +         'current/images/netboot/debian-installer/arm64/initrd.gz'),
>> +        '2583ec22b45265ad69e82f198674f53d4cd85be124fe012eedc2fd91156bc4b4')
>> +
>> +    def test_hotplug_pci(self):
>> +
>> +        self.vm.add_args('-m', '512M')
>> +        self.vm.add_args('-machine', 'type=virt')
> 
> Please use self.set_machine('virt') instead so that the test gets correctly skipped in case the machine has not been compiled into the binary.

Sure!


Cheers,
Gustavo
Thomas Huth May 12, 2025, 12:37 p.m. UTC | #3
On 12/05/2025 14.08, Gustavo Romero wrote:
> Hi Thomas,
> 
> Thanks for the review.
> 
> On 5/12/25 04:59, Thomas Huth wrote:
>>   Hi!
>>
>> On 10/05/2025 01.19, Gustavo Romero wrote:
>>> Add a functional test, aarch64_hotplug_pci, to exercise PCI hotplug and
>>> hot-unplug on arm64. Currently, the aarch64 'virt' machine uses the PCIe
>>> native controller and does not support ACPI-based hotplugging. However,
>>> since support is planned, this test sets 'acpi=force' and specifies an
>>> EDK2 firmware image in advance. This is harmless and prepares for future
>>> ACPI support.
>>>
>>> Signed-off-by: Gustavo Romero <gustavo.romero@linaro.org>
>>> ---
>>>   tests/functional/meson.build                 |  1 +
>>>   tests/functional/test_aarch64_hotplug_pci.py | 73 ++++++++++++++++++++
>>>   2 files changed, 74 insertions(+)
>>>   create mode 100755 tests/functional/test_aarch64_hotplug_pci.py
>>
>> Could you also add the test file to one of the sections in the MAINTAINERS 
>> file, please?
> 
> Any idea under which section I should add this test?
> 
> Currently, it's only TCG, but in the future probably there will be
> 1) a variant with --enable-kvm option and 2) it will have a variant
> with ACPI enabled. Hence, currently it doesn't seem to fit neither
> under "PCI" nor under "ARM ACPI Subsystem", I think I can create a
> section tho? Maybe "ARM PCI Hotplug"? Could you please advise?

A separate section likely only makes sense if there are other files that you 
could add there. Otherwise, simply add it to the arm "Virt" machine section?

  Thomas
Gustavo Romero May 12, 2025, 12:42 p.m. UTC | #4
Hi Thomas,

On 5/12/25 09:08, Gustavo Romero wrote:
> Hi Thomas,
> 
> Thanks for the review.
> 
> On 5/12/25 04:59, Thomas Huth wrote:
>>   Hi!
>>
>> On 10/05/2025 01.19, Gustavo Romero wrote:
>>> Add a functional test, aarch64_hotplug_pci, to exercise PCI hotplug and
>>> hot-unplug on arm64. Currently, the aarch64 'virt' machine uses the PCIe
>>> native controller and does not support ACPI-based hotplugging. However,
>>> since support is planned, this test sets 'acpi=force' and specifies an
>>> EDK2 firmware image in advance. This is harmless and prepares for future
>>> ACPI support.
>>>
>>> Signed-off-by: Gustavo Romero <gustavo.romero@linaro.org>
>>> ---
>>>   tests/functional/meson.build                 |  1 +
>>>   tests/functional/test_aarch64_hotplug_pci.py | 73 ++++++++++++++++++++
>>>   2 files changed, 74 insertions(+)
>>>   create mode 100755 tests/functional/test_aarch64_hotplug_pci.py
>>
>> Could you also add the test file to one of the sections in the MAINTAINERS file, please?
> 
> Any idea under which section I should add this test?
> 
> Currently, it's only TCG, but in the future probably there will be
> 1) a variant with --enable-kvm option and 2) it will have a variant
> with ACPI enabled. Hence, currently it doesn't seem to fit neither
> under "PCI" nor under "ARM ACPI Subsystem", I think I can create a
> section tho? Maybe "ARM PCI Hotplug"? Could you please advise?

Well, I'll introduce all these variants into the test so I created a new
section "ARM PCI Hotplug" and added me as the maintainer. When I introduce
the variants I can change the section name to fit it better.

I just sent a v2.


Cheers,
Gustavo
Gustavo Romero May 12, 2025, 12:46 p.m. UTC | #5
Hi Thomas,

On 5/12/25 09:37, Thomas Huth wrote:
> On 12/05/2025 14.08, Gustavo Romero wrote:
>> Hi Thomas,
>>
>> Thanks for the review.
>>
>> On 5/12/25 04:59, Thomas Huth wrote:
>>>   Hi!
>>>
>>> On 10/05/2025 01.19, Gustavo Romero wrote:
>>>> Add a functional test, aarch64_hotplug_pci, to exercise PCI hotplug and
>>>> hot-unplug on arm64. Currently, the aarch64 'virt' machine uses the PCIe
>>>> native controller and does not support ACPI-based hotplugging. However,
>>>> since support is planned, this test sets 'acpi=force' and specifies an
>>>> EDK2 firmware image in advance. This is harmless and prepares for future
>>>> ACPI support.
>>>>
>>>> Signed-off-by: Gustavo Romero <gustavo.romero@linaro.org>
>>>> ---
>>>>   tests/functional/meson.build                 |  1 +
>>>>   tests/functional/test_aarch64_hotplug_pci.py | 73 ++++++++++++++++++++
>>>>   2 files changed, 74 insertions(+)
>>>>   create mode 100755 tests/functional/test_aarch64_hotplug_pci.py
>>>
>>> Could you also add the test file to one of the sections in the MAINTAINERS file, please?
>>
>> Any idea under which section I should add this test?
>>
>> Currently, it's only TCG, but in the future probably there will be
>> 1) a variant with --enable-kvm option and 2) it will have a variant
>> with ACPI enabled. Hence, currently it doesn't seem to fit neither
>> under "PCI" nor under "ARM ACPI Subsystem", I think I can create a
>> section tho? Maybe "ARM PCI Hotplug"? Could you please advise?
> 
> A separate section likely only makes sense if there are other files that you could add there. Otherwise, simply add it to the arm "Virt" machine section?

hm but in this case wouldn't I be kind "forcing" Peter to maintain
this test? And, otoh, if I add me to "Virt" section then I'm saying that
I'll maintain all the other tests as well?


Cheers,
Gustavo
Thomas Huth May 12, 2025, 12:58 p.m. UTC | #6
On 12/05/2025 14.46, Gustavo Romero wrote:
> Hi Thomas,
> 
> On 5/12/25 09:37, Thomas Huth wrote:
>> On 12/05/2025 14.08, Gustavo Romero wrote:
>>> Hi Thomas,
>>>
>>> Thanks for the review.
>>>
>>> On 5/12/25 04:59, Thomas Huth wrote:
>>>>   Hi!
>>>>
>>>> On 10/05/2025 01.19, Gustavo Romero wrote:
>>>>> Add a functional test, aarch64_hotplug_pci, to exercise PCI hotplug and
>>>>> hot-unplug on arm64. Currently, the aarch64 'virt' machine uses the PCIe
>>>>> native controller and does not support ACPI-based hotplugging. However,
>>>>> since support is planned, this test sets 'acpi=force' and specifies an
>>>>> EDK2 firmware image in advance. This is harmless and prepares for future
>>>>> ACPI support.
>>>>>
>>>>> Signed-off-by: Gustavo Romero <gustavo.romero@linaro.org>
>>>>> ---
>>>>>   tests/functional/meson.build                 |  1 +
>>>>>   tests/functional/test_aarch64_hotplug_pci.py | 73 ++++++++++++++++++++
>>>>>   2 files changed, 74 insertions(+)
>>>>>   create mode 100755 tests/functional/test_aarch64_hotplug_pci.py
>>>>
>>>> Could you also add the test file to one of the sections in the 
>>>> MAINTAINERS file, please?
>>>
>>> Any idea under which section I should add this test?
>>>
>>> Currently, it's only TCG, but in the future probably there will be
>>> 1) a variant with --enable-kvm option and 2) it will have a variant
>>> with ACPI enabled. Hence, currently it doesn't seem to fit neither
>>> under "PCI" nor under "ARM ACPI Subsystem", I think I can create a
>>> section tho? Maybe "ARM PCI Hotplug"? Could you please advise?
>>
>> A separate section likely only makes sense if there are other files that 
>> you could add there. Otherwise, simply add it to the arm "Virt" machine 
>> section?
> 
> hm but in this case wouldn't I be kind "forcing" Peter to maintain
> this test? And, otoh, if I add me to "Virt" section then I'm saying that
> I'll maintain all the other tests as well?

Ok, in that case a separate section makes sense ... Peter, do you have any 
preferences?

  Thomas
diff mbox series

Patch

diff --git a/tests/functional/meson.build b/tests/functional/meson.build
index 52b4706cfe..2d68840fa2 100644
--- a/tests/functional/meson.build
+++ b/tests/functional/meson.build
@@ -83,6 +83,7 @@  tests_aarch64_system_quick = [
 tests_aarch64_system_thorough = [
   'aarch64_aspeed_ast2700',
   'aarch64_aspeed_ast2700fc',
+  'aarch64_hotplug_pci',
   'aarch64_imx8mp_evk',
   'aarch64_raspi3',
   'aarch64_raspi4',
diff --git a/tests/functional/test_aarch64_hotplug_pci.py b/tests/functional/test_aarch64_hotplug_pci.py
new file mode 100755
index 0000000000..031540ba22
--- /dev/null
+++ b/tests/functional/test_aarch64_hotplug_pci.py
@@ -0,0 +1,73 @@ 
+#!/usr/bin/env python3
+#
+# The test hotplugs a PCI device and checks it on a Linux guest.
+#
+# Copyright (c) 2025 Linaro Ltd.
+#
+# Author:
+#  Gustavo Romero <gustavo.romero@linaro.org>
+#
+# This work is licensed under the terms of the GNU GPL, version 2 or
+# later.  See the COPYING file in the top-level directory.
+
+from os import path
+from qemu_test import LinuxKernelTest, Asset, exec_command_and_wait_for_pattern
+from qemu_test import BUILD_DIR
+
+class HotplugPCI(LinuxKernelTest):
+
+    ASSET_KERNEL = Asset(
+        ('https://ftp.debian.org/debian/dists/stable/main/installer-arm64/'
+         'current/images/netboot/debian-installer/arm64/linux'),
+        '3821d4db56d42c6a4eac62f31846e35465940afd87746b4cfcdf5c9eca3117b2')
+
+    ASSET_INITRD = Asset(
+        ('https://ftp.debian.org/debian/dists/stable/main/installer-arm64/'
+         'current/images/netboot/debian-installer/arm64/initrd.gz'),
+        '2583ec22b45265ad69e82f198674f53d4cd85be124fe012eedc2fd91156bc4b4')
+
+    def test_hotplug_pci(self):
+
+        self.vm.add_args('-m', '512M')
+        self.vm.add_args('-machine', 'type=virt')
+        self.vm.add_args('-cpu', 'cortex-a57')
+        self.vm.add_args('-append',
+                         'console=ttyAMA0,115200 acpi=force init=/bin/sh')
+        self.vm.add_args('-device',
+                         'pcie-root-port,bus=pcie.0,chassis=1,slot=1,id=pcie.1')
+        self.vm.add_args('-bios', path.join(BUILD_DIR, 'pc-bios',
+                         'edk2-aarch64-code.fd'))
+
+        # BusyBox prompt
+        prompt = "~ #"
+        self.launch_kernel(self.ASSET_KERNEL.fetch(),
+                           self.ASSET_INITRD.fetch(),
+                           wait_for=prompt)
+
+        # Check for initial state: 2 network adapters, lo and enp0s1.
+        exec_command_and_wait_for_pattern(self,
+                                          'ls -l /sys/class/net | wc -l',
+                                          '2')
+
+        # Hotplug one network adapter to the root port, i.e. pcie.1 bus.
+        self.vm.cmd('device_add',
+                    driver='virtio-net-pci',
+                    bus='pcie.1',
+                    addr=0,
+                    id='na')
+        # Wait for the kernel to recognize the new device.
+        self.wait_for_console_pattern('virtio-pci')
+        self.wait_for_console_pattern('virtio_net')
+
+        # Check if there is a new network adapter.
+        exec_command_and_wait_for_pattern(self,
+                                          'ls -l /sys/class/net | wc -l',
+                                          '3')
+
+        self.vm.cmd('device_del', id='na')
+        exec_command_and_wait_for_pattern(self,
+                                          'ls -l /sys/class/net | wc -l',
+                                          '2')
+
+if __name__ == '__main__':
+    LinuxKernelTest.main()