qemu/tests/functional/test_x86_64_hotplug_cpu.py
Thomas Huth f69705f300 tests/functional/test_x86_64_hotplug_cpu: Fix race condition during unplug
When unplugging the CPU, the test tries to check for a successful
unplug by changing to the /sys/devices/system/cpu/cpu1 directory
to see whether that fails. However, the "cd" could be faster than
the unplug operation in the kernel, so there is a race condition
and the test sometimes fails here.
Fix it by trying to change the directory in a loop until the the
CPU has really been unplugged.
While we're at it, also add a "cd .." before unplugging to make
the console output a little bit less confusing (since the path
is echoed in the shell prompt).

Reported-by: Stefan Hajnoczi <stefanha@gmail.com>
Message-ID: <20250107115245.52755-1-thuth@redhat.com>
Signed-off-by: Thomas Huth <thuth@redhat.com>
2025-01-07 15:02:46 +01:00

71 lines
2.7 KiB
Python
Executable file

#!/usr/bin/env python3
#
# Functional test that hotplugs a CPU and checks it on a Linux guest
#
# Copyright (c) 2021 Red Hat, Inc.
#
# Author:
# Cleber Rosa <crosa@redhat.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.
from qemu_test import LinuxKernelTest, Asset, exec_command_and_wait_for_pattern
class HotPlugCPU(LinuxKernelTest):
ASSET_KERNEL = Asset(
('https://archives.fedoraproject.org/pub/archive/fedora/linux/releases'
'/31/Server/x86_64/os/images/pxeboot/vmlinuz'),
'd4738d03dbbe083ca610d0821d0a8f1488bebbdccef54ce33e3adb35fda00129')
ASSET_INITRD = Asset(
('https://archives.fedoraproject.org/pub/archive/fedora/linux/releases'
'/31/Server/x86_64/os/images/pxeboot/initrd.img'),
'277cd6c7adf77c7e63d73bbb2cded8ef9e2d3a2f100000e92ff1f8396513cd8b')
def test_hotplug(self):
self.require_accelerator('kvm')
self.vm.add_args('-accel', 'kvm')
self.vm.add_args('-cpu', 'Haswell')
self.vm.add_args('-smp', '1,sockets=1,cores=2,threads=1,maxcpus=2')
self.vm.add_args('-m', '1G')
self.vm.add_args('-append', 'console=ttyS0 rd.rescue')
self.launch_kernel(self.ASSET_KERNEL.fetch(),
self.ASSET_INITRD.fetch(),
wait_for='Entering emergency mode.')
prompt = '# '
self.wait_for_console_pattern(prompt)
exec_command_and_wait_for_pattern(self,
'cd /sys/devices/system/cpu/cpu0',
'cpu0#')
exec_command_and_wait_for_pattern(self,
'cd /sys/devices/system/cpu/cpu1',
'No such file or directory')
self.vm.cmd('device_add',
driver='Haswell-x86_64-cpu',
id='c1',
socket_id=0,
core_id=1,
thread_id=0)
self.wait_for_console_pattern('CPU1 has been hot-added')
exec_command_and_wait_for_pattern(self,
'cd /sys/devices/system/cpu/cpu1',
'cpu1#')
exec_command_and_wait_for_pattern(self, 'cd ..', prompt)
self.vm.cmd('device_del', id='c1')
exec_command_and_wait_for_pattern(self,
'while cd /sys/devices/system/cpu/cpu1 ;'
' do sleep 0.2 ; done',
'No such file or directory')
if __name__ == '__main__':
LinuxKernelTest.main()