Merge "libvirt: call get_capabilities() with all CPUs online"
This commit is contained in:
commit
8fb5a76872
@ -895,6 +895,16 @@ class LibvirtConnTestCase(test.NoDBTestCase,
|
|||||||
)
|
)
|
||||||
mock_supports.assert_called_once_with()
|
mock_supports.assert_called_once_with()
|
||||||
|
|
||||||
|
@mock.patch.object(hardware, 'get_cpu_dedicated_set',
|
||||||
|
return_value=set([0, 42, 1337]))
|
||||||
|
@mock.patch.object(libvirt_driver.LibvirtDriver,
|
||||||
|
'_register_all_undefined_instance_details')
|
||||||
|
def test_init_host_topology(self, mock_get_cpu_dedicated_set, _):
|
||||||
|
driver = libvirt_driver.LibvirtDriver(fake.FakeVirtAPI(), False)
|
||||||
|
with mock.patch.object(driver.cpu_api, 'power_up') as mock_power_up:
|
||||||
|
driver.init_host('goat')
|
||||||
|
mock_power_up.assert_called_with(set([0, 42, 1337]))
|
||||||
|
|
||||||
@mock.patch.object(
|
@mock.patch.object(
|
||||||
libvirt_driver.LibvirtDriver,
|
libvirt_driver.LibvirtDriver,
|
||||||
'_register_all_undefined_instance_details',
|
'_register_all_undefined_instance_details',
|
||||||
|
@ -91,7 +91,7 @@ class API(object):
|
|||||||
"""
|
"""
|
||||||
return Core(i)
|
return Core(i)
|
||||||
|
|
||||||
def _power_up(self, cpus: ty.Set[int]) -> None:
|
def power_up(self, cpus: ty.Set[int]) -> None:
|
||||||
if not CONF.libvirt.cpu_power_management:
|
if not CONF.libvirt.cpu_power_management:
|
||||||
return
|
return
|
||||||
cpu_dedicated_set = hardware.get_cpu_dedicated_set_nozero() or set()
|
cpu_dedicated_set = hardware.get_cpu_dedicated_set_nozero() or set()
|
||||||
@ -111,7 +111,7 @@ class API(object):
|
|||||||
return
|
return
|
||||||
pcpus = instance.numa_topology.cpu_pinning.union(
|
pcpus = instance.numa_topology.cpu_pinning.union(
|
||||||
instance.numa_topology.cpuset_reserved)
|
instance.numa_topology.cpuset_reserved)
|
||||||
self._power_up(pcpus)
|
self.power_up(pcpus)
|
||||||
|
|
||||||
def power_up_for_migration(
|
def power_up_for_migration(
|
||||||
self, dst_numa_info: objects.LibvirtLiveMigrateNUMAInfo
|
self, dst_numa_info: objects.LibvirtLiveMigrateNUMAInfo
|
||||||
@ -121,7 +121,7 @@ class API(object):
|
|||||||
pcpus = dst_numa_info.emulator_pins
|
pcpus = dst_numa_info.emulator_pins
|
||||||
for pins in dst_numa_info.cpu_pins.values():
|
for pins in dst_numa_info.cpu_pins.values():
|
||||||
pcpus = pcpus.union(pins)
|
pcpus = pcpus.union(pins)
|
||||||
self._power_up(pcpus)
|
self.power_up(pcpus)
|
||||||
|
|
||||||
def _power_down(self, cpus: ty.Set[int]) -> None:
|
def _power_down(self, cpus: ty.Set[int]) -> None:
|
||||||
if not CONF.libvirt.cpu_power_management:
|
if not CONF.libvirt.cpu_power_management:
|
||||||
|
@ -751,12 +751,31 @@ class LibvirtDriver(driver.ComputeDriver):
|
|||||||
{'enabled': enabled, 'reason': reason})
|
{'enabled': enabled, 'reason': reason})
|
||||||
self._set_host_enabled(enabled, reason)
|
self._set_host_enabled(enabled, reason)
|
||||||
|
|
||||||
|
def _init_host_topology(self):
|
||||||
|
"""To work around a bug in libvirt that reports offline CPUs as always
|
||||||
|
being on socket 0 regardless of their real socket, power up all
|
||||||
|
dedicated CPUs (the only ones whose socket we actually care about),
|
||||||
|
then call get_capabilities() to initialize the topology with the
|
||||||
|
correct socket values. get_capabilities()'s implementation will reuse
|
||||||
|
these initial socket value, and avoid clobbering them with 0 for
|
||||||
|
offline CPUs.
|
||||||
|
"""
|
||||||
|
cpus = hardware.get_cpu_dedicated_set()
|
||||||
|
if cpus:
|
||||||
|
self.cpu_api.power_up(cpus)
|
||||||
|
self._host.get_capabilities()
|
||||||
|
|
||||||
def init_host(self, host):
|
def init_host(self, host):
|
||||||
self._host.initialize()
|
self._host.initialize()
|
||||||
|
|
||||||
self._update_host_specific_capabilities()
|
# NOTE(artom) Do this first to make sure our first call to
|
||||||
|
# get_capabilities() happens with all dedicated CPUs online and caches
|
||||||
|
# their correct socket ID. Unused dedicated CPUs will be powered down
|
||||||
|
# further down in this method.
|
||||||
self._check_cpu_set_configuration()
|
self._check_cpu_set_configuration()
|
||||||
|
self._init_host_topology()
|
||||||
|
|
||||||
|
self._update_host_specific_capabilities()
|
||||||
|
|
||||||
self._do_quality_warnings()
|
self._do_quality_warnings()
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user