Introduction of the s390x cpu topology core functions and
basic tests.
We test the corelation between the command line and
the QMP results in query-cpus-fast for various CPU topology.
Signed-off-by: Pierre Morel <pmorel@linux.ibm.com>
---
MAINTAINERS | 1 +
tests/avocado/s390_topology.py | 196 +++++++++++++++++++++++++++++++++
2 files changed, 197 insertions(+)
create mode 100644 tests/avocado/s390_topology.py
diff --git a/MAINTAINERS b/MAINTAINERS
index fe5638e31d..41419840b0 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -1662,6 +1662,7 @@ F: hw/s390x/cpu-topology.c
F: target/s390x/kvm/cpu_topology.c
F: docs/devel/s390-cpu-topology.rst
F: docs/system/s390x/cpu-topology.rst
+F: tests/avocado/s390_topology.py
X86 Machines
------------
diff --git a/tests/avocado/s390_topology.py b/tests/avocado/s390_topology.py
new file mode 100644
index 0000000000..38e9cc4f16
--- /dev/null
+++ b/tests/avocado/s390_topology.py
@@ -0,0 +1,196 @@
+# Functional test that boots a Linux kernel and checks the console
+#
+# Copyright (c) 2023 IBM Corp.
+#
+# Author:
+# Pierre Morel <pmorel@linux.ibm.com>
+#
+# This work is licensed under the terms of the GNU GPL, version 2 or
+# later. See the COPYING file in the top-level directory.
+
+import os
+import shutil
+import time
+
+from avocado import skip
+from avocado import skipUnless
+from avocado import skipIf
+from avocado_qemu import QemuSystemTest
+from avocado_qemu import exec_command
+from avocado_qemu import exec_command_and_wait_for_pattern
+from avocado_qemu import interrupt_interactive_console_until_pattern
+from avocado_qemu import wait_for_console_pattern
+from avocado.utils import process
+from avocado.utils import archive
+
+
+class LinuxKernelTest(QemuSystemTest):
+ KERNEL_COMMON_COMMAND_LINE = 'printk.time=0 '
+
+ def wait_for_console_pattern(self, success_message, vm=None):
+ wait_for_console_pattern(self, success_message,
+ failure_message='Kernel panic - not syncing',
+ vm=vm)
+
+
+class S390CPUTopology(LinuxKernelTest):
+ """
+ S390x CPU topology consist of 4 topology layers, from bottom to top,
+ the cores, sockets, books and drawers and 2 modifiers attributes,
+ the entitlement and the dedication.
+ See: docs/system/s390x/cpu-topology.rst.
+
+ S390x CPU topology is setup in different ways:
+ - implicitely from the '-smp' argument by completing each topology
+ level one after the other begining with drawer 0, book 0 and socket 0.
+ - explicitely from the '-device' argument on the QEMU command line
+ - explicitely by hotplug of a new CPU using QMP or HMP
+ - it is modified by using QMP 'set-cpu-topology'
+
+ The S390x modifier attribute entitlement depends on the machine
+ polarization, which can be horizontal or vertical.
+ The polarization is changed on a request from the guest.
+ """
+ timeout = 90
+
+
+ def check_topology(self, c, s, b, d, e, t):
+ res = self.vm.qmp('query-cpus-fast')
+ line = res['return']
+ for x in line:
+ core = x['props']['core-id']
+ socket = x['props']['socket-id']
+ book = x['props']['book-id']
+ drawer = x['props']['drawer-id']
+ entitlement = x['entitlement']
+ dedicated = x['dedicated']
+ if core == c:
+ self.assertEqual(drawer, d)
+ self.assertEqual(book, b)
+ self.assertEqual(socket, s)
+ self.assertEqual(entitlement, e)
+ self.assertEqual(dedicated, t)
+
+ def kernel_init(self):
+ """
+ We need a kernel supporting the CPU topology.
+ We need a minimal root filesystem with a shell.
+ """
+ kernel_url = ('https://archives.fedoraproject.org/pub/archive'
+ '/fedora-secondary/releases/35/Server/s390x/os'
+ '/images/kernel.img')
+ kernel_hash = '0d1aaaf303f07cf0160c8c48e56fe638'
+ kernel_path = self.fetch_asset(kernel_url, algorithm='md5',
+ asset_hash=kernel_hash)
+
+ initrd_url = ('https://archives.fedoraproject.org/pub/archive'
+ '/fedora-secondary/releases/35/Server/s390x/os'
+ '/images/initrd.img')
+ initrd_hash = 'a122057d95725ac030e2ec51df46e172'
+ initrd_path_xz = self.fetch_asset(initrd_url, algorithm='md5',
+ asset_hash=initrd_hash)
+ initrd_path = os.path.join(self.workdir, 'initrd-raw.img')
+ archive.lzma_uncompress(initrd_path_xz, initrd_path)
+
+ self.vm.set_console()
+ kernel_command_line = (self.KERNEL_COMMON_COMMAND_LINE +
+ 'root=/dev/ram '
+ 'selinux=0 '
+ 'rdinit=/bin/sh')
+ self.vm.add_args('-nographic',
+ '-enable-kvm',
+ '-cpu', 'z14,ctop=on',
+ '-m', '512',
+ '-name', 'Some Guest Name',
+ '-uuid', '30de4fd9-b4d5-409e-86a5-09b387f70bfa',
+ '-kernel', kernel_path,
+ '-initrd', initrd_path,
+ '-append', kernel_command_line)
+
+ def test_single(self):
+ self.kernel_init()
+ self.vm.launch()
+ self.wait_for_console_pattern('no job control')
+ self.check_topology(0, 0, 0, 0, 'medium', False)
+
+ def test_default(self):
+ """
+ This test checks the implicite topology.
+
+ :avocado: tags=arch:s390x
+ :avocado: tags=machine:s390-ccw-virtio
+ """
+ self.kernel_init()
+ self.vm.add_args('-smp',
+ '13,drawers=2,books=2,sockets=3,cores=2,maxcpus=24')
+ self.vm.launch()
+ self.wait_for_console_pattern('no job control')
+ self.check_topology(0, 0, 0, 0, 'medium', False)
+ self.check_topology(1, 0, 0, 0, 'medium', False)
+ self.check_topology(2, 1, 0, 0, 'medium', False)
+ self.check_topology(3, 1, 0, 0, 'medium', False)
+ self.check_topology(4, 2, 0, 0, 'medium', False)
+ self.check_topology(5, 2, 0, 0, 'medium', False)
+ self.check_topology(6, 0, 1, 0, 'medium', False)
+ self.check_topology(7, 0, 1, 0, 'medium', False)
+ self.check_topology(8, 1, 1, 0, 'medium', False)
+ self.check_topology(9, 1, 1, 0, 'medium', False)
+ self.check_topology(10, 2, 1, 0, 'medium', False)
+ self.check_topology(11, 2, 1, 0, 'medium', False)
+ self.check_topology(12, 0, 0, 1, 'medium', False)
+
+ def test_move(self):
+ """
+ This test checks the topology modification by moving a CPU
+ to another socket: CPU 0 is moved from socket 0 to socket 2.
+
+ :avocado: tags=arch:s390x
+ :avocado: tags=machine:s390-ccw-virtio
+ """
+ self.kernel_init()
+ self.vm.add_args('-smp',
+ '1,drawers=2,books=2,sockets=3,cores=2,maxcpus=24')
+ self.vm.launch()
+ self.wait_for_console_pattern('no job control')
+
+ self.check_topology(0, 0, 0, 0, 'medium', False)
+ res = self.vm.qmp('set-cpu-topology',
+ {'core-id': 0, 'socket-id': 2, 'entitlement': 'low'})
+ self.assertEqual(res['return'], {})
+ self.check_topology(0, 2, 0, 0, 'low', False)
+
+ def test_hotplug(self):
+ """
+ This test verifies that a CPU defined with '-device' command line
+ argument finds its right place inside the topology.
+
+ :avocado: tags=arch:s390x
+ :avocado: tags=machine:s390-ccw-virtio
+ """
+ self.kernel_init()
+ self.vm.add_args('-smp',
+ '1,drawers=2,books=2,sockets=3,cores=2,maxcpus=24')
+ self.vm.add_args('-device', 'z14-s390x-cpu,core-id=10')
+ self.vm.launch()
+ self.wait_for_console_pattern('no job control')
+
+ self.check_topology(10, 2, 1, 0, 'medium', False)
+
+ def test_hotplug_full(self):
+ """
+ This test verifies that a hotplugged fully defined with '-device'
+ command line argument finds its right place inside the topology.
+
+ :avocado: tags=arch:s390x
+ :avocado: tags=machine:s390-ccw-virtio
+ """
+ self.kernel_init()
+ self.vm.add_args('-smp',
+ '1,drawers=2,books=2,sockets=3,cores=2,maxcpus=24')
+ self.vm.add_args('-device',
+ 'z14-s390x-cpu,'
+ 'core-id=1,socket-id=1,book-id=1,drawer-id=1')
+ self.vm.launch()
+ self.wait_for_console_pattern('no job control')
+ self.check_topology(1, 1, 1, 1, 'medium', False)
+
--
2.31.1
On 4/3/23 18:28, Pierre Morel wrote:
> Introduction of the s390x cpu topology core functions and
> basic tests.
>
> We test the corelation between the command line and
> the QMP results in query-cpus-fast for various CPU topology.
>
> Signed-off-by: Pierre Morel <pmorel@linux.ibm.com>
I gave the tests a run on a z LPAR. Nice job !
I hope we can maintain the avocado framework to the level of
expectations. I find it very useful for such test cases.
Thanks,
C.
> ---
> MAINTAINERS | 1 +
> tests/avocado/s390_topology.py | 196 +++++++++++++++++++++++++++++++++
> 2 files changed, 197 insertions(+)
> create mode 100644 tests/avocado/s390_topology.py
>
> diff --git a/MAINTAINERS b/MAINTAINERS
> index fe5638e31d..41419840b0 100644
> --- a/MAINTAINERS
> +++ b/MAINTAINERS
> @@ -1662,6 +1662,7 @@ F: hw/s390x/cpu-topology.c
> F: target/s390x/kvm/cpu_topology.c
> F: docs/devel/s390-cpu-topology.rst
> F: docs/system/s390x/cpu-topology.rst
> +F: tests/avocado/s390_topology.py
>
> X86 Machines
> ------------
> diff --git a/tests/avocado/s390_topology.py b/tests/avocado/s390_topology.py
> new file mode 100644
> index 0000000000..38e9cc4f16
> --- /dev/null
> +++ b/tests/avocado/s390_topology.py
> @@ -0,0 +1,196 @@
> +# Functional test that boots a Linux kernel and checks the console
> +#
> +# Copyright (c) 2023 IBM Corp.
> +#
> +# Author:
> +# Pierre Morel <pmorel@linux.ibm.com>
> +#
> +# This work is licensed under the terms of the GNU GPL, version 2 or
> +# later. See the COPYING file in the top-level directory.
> +
> +import os
> +import shutil
> +import time
> +
> +from avocado import skip
> +from avocado import skipUnless
> +from avocado import skipIf
> +from avocado_qemu import QemuSystemTest
> +from avocado_qemu import exec_command
> +from avocado_qemu import exec_command_and_wait_for_pattern
> +from avocado_qemu import interrupt_interactive_console_until_pattern
> +from avocado_qemu import wait_for_console_pattern
> +from avocado.utils import process
> +from avocado.utils import archive
> +
> +
> +class LinuxKernelTest(QemuSystemTest):
> + KERNEL_COMMON_COMMAND_LINE = 'printk.time=0 '
> +
> + def wait_for_console_pattern(self, success_message, vm=None):
> + wait_for_console_pattern(self, success_message,
> + failure_message='Kernel panic - not syncing',
> + vm=vm)
> +
> +
> +class S390CPUTopology(LinuxKernelTest):
> + """
> + S390x CPU topology consist of 4 topology layers, from bottom to top,
> + the cores, sockets, books and drawers and 2 modifiers attributes,
> + the entitlement and the dedication.
> + See: docs/system/s390x/cpu-topology.rst.
> +
> + S390x CPU topology is setup in different ways:
> + - implicitely from the '-smp' argument by completing each topology
> + level one after the other begining with drawer 0, book 0 and socket 0.
> + - explicitely from the '-device' argument on the QEMU command line
> + - explicitely by hotplug of a new CPU using QMP or HMP
> + - it is modified by using QMP 'set-cpu-topology'
> +
> + The S390x modifier attribute entitlement depends on the machine
> + polarization, which can be horizontal or vertical.
> + The polarization is changed on a request from the guest.
> + """
> + timeout = 90
> +
> +
> + def check_topology(self, c, s, b, d, e, t):
> + res = self.vm.qmp('query-cpus-fast')
> + line = res['return']
> + for x in line:
> + core = x['props']['core-id']
> + socket = x['props']['socket-id']
> + book = x['props']['book-id']
> + drawer = x['props']['drawer-id']
> + entitlement = x['entitlement']
> + dedicated = x['dedicated']
> + if core == c:
> + self.assertEqual(drawer, d)
> + self.assertEqual(book, b)
> + self.assertEqual(socket, s)
> + self.assertEqual(entitlement, e)
> + self.assertEqual(dedicated, t)
> +
> + def kernel_init(self):
> + """
> + We need a kernel supporting the CPU topology.
> + We need a minimal root filesystem with a shell.
> + """
> + kernel_url = ('https://archives.fedoraproject.org/pub/archive'
> + '/fedora-secondary/releases/35/Server/s390x/os'
> + '/images/kernel.img')
> + kernel_hash = '0d1aaaf303f07cf0160c8c48e56fe638'
> + kernel_path = self.fetch_asset(kernel_url, algorithm='md5',
> + asset_hash=kernel_hash)
> +
> + initrd_url = ('https://archives.fedoraproject.org/pub/archive'
> + '/fedora-secondary/releases/35/Server/s390x/os'
> + '/images/initrd.img')
> + initrd_hash = 'a122057d95725ac030e2ec51df46e172'
> + initrd_path_xz = self.fetch_asset(initrd_url, algorithm='md5',
> + asset_hash=initrd_hash)
> + initrd_path = os.path.join(self.workdir, 'initrd-raw.img')
> + archive.lzma_uncompress(initrd_path_xz, initrd_path)
> +
> + self.vm.set_console()
> + kernel_command_line = (self.KERNEL_COMMON_COMMAND_LINE +
> + 'root=/dev/ram '
> + 'selinux=0 '
> + 'rdinit=/bin/sh')
> + self.vm.add_args('-nographic',
> + '-enable-kvm',
> + '-cpu', 'z14,ctop=on',
> + '-m', '512',
> + '-name', 'Some Guest Name',
> + '-uuid', '30de4fd9-b4d5-409e-86a5-09b387f70bfa',
> + '-kernel', kernel_path,
> + '-initrd', initrd_path,
> + '-append', kernel_command_line)
> +
> + def test_single(self):
> + self.kernel_init()
> + self.vm.launch()
> + self.wait_for_console_pattern('no job control')
> + self.check_topology(0, 0, 0, 0, 'medium', False)
> +
> + def test_default(self):
> + """
> + This test checks the implicite topology.
> +
> + :avocado: tags=arch:s390x
> + :avocado: tags=machine:s390-ccw-virtio
> + """
> + self.kernel_init()
> + self.vm.add_args('-smp',
> + '13,drawers=2,books=2,sockets=3,cores=2,maxcpus=24')
> + self.vm.launch()
> + self.wait_for_console_pattern('no job control')
> + self.check_topology(0, 0, 0, 0, 'medium', False)
> + self.check_topology(1, 0, 0, 0, 'medium', False)
> + self.check_topology(2, 1, 0, 0, 'medium', False)
> + self.check_topology(3, 1, 0, 0, 'medium', False)
> + self.check_topology(4, 2, 0, 0, 'medium', False)
> + self.check_topology(5, 2, 0, 0, 'medium', False)
> + self.check_topology(6, 0, 1, 0, 'medium', False)
> + self.check_topology(7, 0, 1, 0, 'medium', False)
> + self.check_topology(8, 1, 1, 0, 'medium', False)
> + self.check_topology(9, 1, 1, 0, 'medium', False)
> + self.check_topology(10, 2, 1, 0, 'medium', False)
> + self.check_topology(11, 2, 1, 0, 'medium', False)
> + self.check_topology(12, 0, 0, 1, 'medium', False)
> +
> + def test_move(self):
> + """
> + This test checks the topology modification by moving a CPU
> + to another socket: CPU 0 is moved from socket 0 to socket 2.
> +
> + :avocado: tags=arch:s390x
> + :avocado: tags=machine:s390-ccw-virtio
> + """
> + self.kernel_init()
> + self.vm.add_args('-smp',
> + '1,drawers=2,books=2,sockets=3,cores=2,maxcpus=24')
> + self.vm.launch()
> + self.wait_for_console_pattern('no job control')
> +
> + self.check_topology(0, 0, 0, 0, 'medium', False)
> + res = self.vm.qmp('set-cpu-topology',
> + {'core-id': 0, 'socket-id': 2, 'entitlement': 'low'})
> + self.assertEqual(res['return'], {})
> + self.check_topology(0, 2, 0, 0, 'low', False)
> +
> + def test_hotplug(self):
> + """
> + This test verifies that a CPU defined with '-device' command line
> + argument finds its right place inside the topology.
> +
> + :avocado: tags=arch:s390x
> + :avocado: tags=machine:s390-ccw-virtio
> + """
> + self.kernel_init()
> + self.vm.add_args('-smp',
> + '1,drawers=2,books=2,sockets=3,cores=2,maxcpus=24')
> + self.vm.add_args('-device', 'z14-s390x-cpu,core-id=10')
> + self.vm.launch()
> + self.wait_for_console_pattern('no job control')
> +
> + self.check_topology(10, 2, 1, 0, 'medium', False)
> +
> + def test_hotplug_full(self):
> + """
> + This test verifies that a hotplugged fully defined with '-device'
> + command line argument finds its right place inside the topology.
> +
> + :avocado: tags=arch:s390x
> + :avocado: tags=machine:s390-ccw-virtio
> + """
> + self.kernel_init()
> + self.vm.add_args('-smp',
> + '1,drawers=2,books=2,sockets=3,cores=2,maxcpus=24')
> + self.vm.add_args('-device',
> + 'z14-s390x-cpu,'
> + 'core-id=1,socket-id=1,book-id=1,drawer-id=1')
> + self.vm.launch()
> + self.wait_for_console_pattern('no job control')
> + self.check_topology(1, 1, 1, 1, 'medium', False)
> +
On 4/4/23 11:21, Cédric Le Goater wrote:
> On 4/3/23 18:28, Pierre Morel wrote:
>> Introduction of the s390x cpu topology core functions and
>> basic tests.
>>
>> We test the corelation between the command line and
>> the QMP results in query-cpus-fast for various CPU topology.
>>
>> Signed-off-by: Pierre Morel <pmorel@linux.ibm.com>
>
> I gave the tests a run on a z LPAR. Nice job !
:) Thanks
Pierre
>
> I hope we can maintain the avocado framework to the level of
> expectations. I find it very useful for such test cases.
>
> Thanks,
>
> C.
>
>
>> ---
>> MAINTAINERS | 1 +
>> tests/avocado/s390_topology.py | 196 +++++++++++++++++++++++++++++++++
>> 2 files changed, 197 insertions(+)
>> create mode 100644 tests/avocado/s390_topology.py
>>
>> diff --git a/MAINTAINERS b/MAINTAINERS
>> index fe5638e31d..41419840b0 100644
>> --- a/MAINTAINERS
>> +++ b/MAINTAINERS
>> @@ -1662,6 +1662,7 @@ F: hw/s390x/cpu-topology.c
>> F: target/s390x/kvm/cpu_topology.c
>> F: docs/devel/s390-cpu-topology.rst
>> F: docs/system/s390x/cpu-topology.rst
>> +F: tests/avocado/s390_topology.py
>> X86 Machines
>> ------------
>> diff --git a/tests/avocado/s390_topology.py
>> b/tests/avocado/s390_topology.py
>> new file mode 100644
>> index 0000000000..38e9cc4f16
>> --- /dev/null
>> +++ b/tests/avocado/s390_topology.py
>> @@ -0,0 +1,196 @@
>> +# Functional test that boots a Linux kernel and checks the console
>> +#
>> +# Copyright (c) 2023 IBM Corp.
>> +#
>> +# Author:
>> +# Pierre Morel <pmorel@linux.ibm.com>
>> +#
>> +# This work is licensed under the terms of the GNU GPL, version 2 or
>> +# later. See the COPYING file in the top-level directory.
>> +
>> +import os
>> +import shutil
>> +import time
>> +
>> +from avocado import skip
>> +from avocado import skipUnless
>> +from avocado import skipIf
>> +from avocado_qemu import QemuSystemTest
>> +from avocado_qemu import exec_command
>> +from avocado_qemu import exec_command_and_wait_for_pattern
>> +from avocado_qemu import interrupt_interactive_console_until_pattern
>> +from avocado_qemu import wait_for_console_pattern
>> +from avocado.utils import process
>> +from avocado.utils import archive
>> +
>> +
>> +class LinuxKernelTest(QemuSystemTest):
>> + KERNEL_COMMON_COMMAND_LINE = 'printk.time=0 '
>> +
>> + def wait_for_console_pattern(self, success_message, vm=None):
>> + wait_for_console_pattern(self, success_message,
>> + failure_message='Kernel panic - not
>> syncing',
>> + vm=vm)
>> +
>> +
>> +class S390CPUTopology(LinuxKernelTest):
>> + """
>> + S390x CPU topology consist of 4 topology layers, from bottom to
>> top,
>> + the cores, sockets, books and drawers and 2 modifiers attributes,
>> + the entitlement and the dedication.
>> + See: docs/system/s390x/cpu-topology.rst.
>> +
>> + S390x CPU topology is setup in different ways:
>> + - implicitely from the '-smp' argument by completing each topology
>> + level one after the other begining with drawer 0, book 0 and
>> socket 0.
>> + - explicitely from the '-device' argument on the QEMU command line
>> + - explicitely by hotplug of a new CPU using QMP or HMP
>> + - it is modified by using QMP 'set-cpu-topology'
>> +
>> + The S390x modifier attribute entitlement depends on the machine
>> + polarization, which can be horizontal or vertical.
>> + The polarization is changed on a request from the guest.
>> + """
>> + timeout = 90
>> +
>> +
>> + def check_topology(self, c, s, b, d, e, t):
>> + res = self.vm.qmp('query-cpus-fast')
>> + line = res['return']
>> + for x in line:
>> + core = x['props']['core-id']
>> + socket = x['props']['socket-id']
>> + book = x['props']['book-id']
>> + drawer = x['props']['drawer-id']
>> + entitlement = x['entitlement']
>> + dedicated = x['dedicated']
>> + if core == c:
>> + self.assertEqual(drawer, d)
>> + self.assertEqual(book, b)
>> + self.assertEqual(socket, s)
>> + self.assertEqual(entitlement, e)
>> + self.assertEqual(dedicated, t)
>> +
>> + def kernel_init(self):
>> + """
>> + We need a kernel supporting the CPU topology.
>> + We need a minimal root filesystem with a shell.
>> + """
>> + kernel_url = ('https://archives.fedoraproject.org/pub/archive'
>> + '/fedora-secondary/releases/35/Server/s390x/os'
>> + '/images/kernel.img')
>> + kernel_hash = '0d1aaaf303f07cf0160c8c48e56fe638'
>> + kernel_path = self.fetch_asset(kernel_url, algorithm='md5',
>> + asset_hash=kernel_hash)
>> +
>> + initrd_url = ('https://archives.fedoraproject.org/pub/archive'
>> + '/fedora-secondary/releases/35/Server/s390x/os'
>> + '/images/initrd.img')
>> + initrd_hash = 'a122057d95725ac030e2ec51df46e172'
>> + initrd_path_xz = self.fetch_asset(initrd_url, algorithm='md5',
>> + asset_hash=initrd_hash)
>> + initrd_path = os.path.join(self.workdir, 'initrd-raw.img')
>> + archive.lzma_uncompress(initrd_path_xz, initrd_path)
>> +
>> + self.vm.set_console()
>> + kernel_command_line = (self.KERNEL_COMMON_COMMAND_LINE +
>> + 'root=/dev/ram '
>> + 'selinux=0 '
>> + 'rdinit=/bin/sh')
>> + self.vm.add_args('-nographic',
>> + '-enable-kvm',
>> + '-cpu', 'z14,ctop=on',
>> + '-m', '512',
>> + '-name', 'Some Guest Name',
>> + '-uuid',
>> '30de4fd9-b4d5-409e-86a5-09b387f70bfa',
>> + '-kernel', kernel_path,
>> + '-initrd', initrd_path,
>> + '-append', kernel_command_line)
>> +
>> + def test_single(self):
>> + self.kernel_init()
>> + self.vm.launch()
>> + self.wait_for_console_pattern('no job control')
>> + self.check_topology(0, 0, 0, 0, 'medium', False)
>> +
>> + def test_default(self):
>> + """
>> + This test checks the implicite topology.
>> +
>> + :avocado: tags=arch:s390x
>> + :avocado: tags=machine:s390-ccw-virtio
>> + """
>> + self.kernel_init()
>> + self.vm.add_args('-smp',
>> + '13,drawers=2,books=2,sockets=3,cores=2,maxcpus=24')
>> + self.vm.launch()
>> + self.wait_for_console_pattern('no job control')
>> + self.check_topology(0, 0, 0, 0, 'medium', False)
>> + self.check_topology(1, 0, 0, 0, 'medium', False)
>> + self.check_topology(2, 1, 0, 0, 'medium', False)
>> + self.check_topology(3, 1, 0, 0, 'medium', False)
>> + self.check_topology(4, 2, 0, 0, 'medium', False)
>> + self.check_topology(5, 2, 0, 0, 'medium', False)
>> + self.check_topology(6, 0, 1, 0, 'medium', False)
>> + self.check_topology(7, 0, 1, 0, 'medium', False)
>> + self.check_topology(8, 1, 1, 0, 'medium', False)
>> + self.check_topology(9, 1, 1, 0, 'medium', False)
>> + self.check_topology(10, 2, 1, 0, 'medium', False)
>> + self.check_topology(11, 2, 1, 0, 'medium', False)
>> + self.check_topology(12, 0, 0, 1, 'medium', False)
>> +
>> + def test_move(self):
>> + """
>> + This test checks the topology modification by moving a CPU
>> + to another socket: CPU 0 is moved from socket 0 to socket 2.
>> +
>> + :avocado: tags=arch:s390x
>> + :avocado: tags=machine:s390-ccw-virtio
>> + """
>> + self.kernel_init()
>> + self.vm.add_args('-smp',
>> + '1,drawers=2,books=2,sockets=3,cores=2,maxcpus=24')
>> + self.vm.launch()
>> + self.wait_for_console_pattern('no job control')
>> +
>> + self.check_topology(0, 0, 0, 0, 'medium', False)
>> + res = self.vm.qmp('set-cpu-topology',
>> + {'core-id': 0, 'socket-id': 2,
>> 'entitlement': 'low'})
>> + self.assertEqual(res['return'], {})
>> + self.check_topology(0, 2, 0, 0, 'low', False)
>> +
>> + def test_hotplug(self):
>> + """
>> + This test verifies that a CPU defined with '-device' command
>> line
>> + argument finds its right place inside the topology.
>> +
>> + :avocado: tags=arch:s390x
>> + :avocado: tags=machine:s390-ccw-virtio
>> + """
>> + self.kernel_init()
>> + self.vm.add_args('-smp',
>> + '1,drawers=2,books=2,sockets=3,cores=2,maxcpus=24')
>> + self.vm.add_args('-device', 'z14-s390x-cpu,core-id=10')
>> + self.vm.launch()
>> + self.wait_for_console_pattern('no job control')
>> +
>> + self.check_topology(10, 2, 1, 0, 'medium', False)
>> +
>> + def test_hotplug_full(self):
>> + """
>> + This test verifies that a hotplugged fully defined with
>> '-device'
>> + command line argument finds its right place inside the
>> topology.
>> +
>> + :avocado: tags=arch:s390x
>> + :avocado: tags=machine:s390-ccw-virtio
>> + """
>> + self.kernel_init()
>> + self.vm.add_args('-smp',
>> + '1,drawers=2,books=2,sockets=3,cores=2,maxcpus=24')
>> + self.vm.add_args('-device',
>> + 'z14-s390x-cpu,'
>> + 'core-id=1,socket-id=1,book-id=1,drawer-id=1')
>> + self.vm.launch()
>> + self.wait_for_console_pattern('no job control')
>> + self.check_topology(1, 1, 1, 1, 'medium', False)
>> +
>
On 4/4/23 11:21, Cédric Le Goater wrote: > On 4/3/23 18:28, Pierre Morel wrote: >> Introduction of the s390x cpu topology core functions and >> basic tests. >> >> We test the corelation between the command line and >> the QMP results in query-cpus-fast for various CPU topology. >> >> Signed-off-by: Pierre Morel <pmorel@linux.ibm.com> > > I gave the tests a run on a z LPAR. Nice job ! I forgot to add some timing output : $ build/tests/venv/bin/avocado --show=app run build/tests/avocado/s390_topology.py (01/12) build/tests/avocado/s390_topology.py:S390CPUTopology.test_single: PASS (4.78 s) (02/12) build/tests/avocado/s390_topology.py:S390CPUTopology.test_default: PASS (3.90 s) (03/12) build/tests/avocado/s390_topology.py:S390CPUTopology.test_move: PASS (3.82 s) (04/12) build/tests/avocado/s390_topology.py:S390CPUTopology.test_hotplug: PASS (3.84 s) (05/12) build/tests/avocado/s390_topology.py:S390CPUTopology.test_hotplug_full: PASS (3.94 s) (06/12) build/tests/avocado/s390_topology.py:S390CPUTopology.test_polarisation: PASS (4.59 s) (07/12) build/tests/avocado/s390_topology.py:S390CPUTopology.test_entitlement: PASS (4.65 s) (08/12) build/tests/avocado/s390_topology.py:S390CPUTopology.test_dedicated: PASS (4.65 s) (09/12) build/tests/avocado/s390_topology.py:S390CPUTopology.test_socket_full: PASS (4.25 s) (10/12) build/tests/avocado/s390_topology.py:S390CPUTopology.test_dedicated_error: PASS (4.46 s) (11/12) build/tests/avocado/s390_topology.py:S390CPUTopology.test_move_error: PASS (4.22 s) (12/12) build/tests/avocado/s390_topology.py:S390CPUTopology.test_query_polarization: PASS (4.63 s) C.
© 2016 - 2026 Red Hat, Inc.