aboutsummaryrefslogtreecommitdiff
path: root/tests/functional/test_x86_64_hotplug_cpu.py
blob: 7b9200ac2e8de3af34ef90b62c038e9b5619c8c2 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
#!/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()