libvirt: Add ppc to supported arch for NUMA

This patch includes the ppc64/ppc64le architectures to the list
of host architectures that support NUMA via the libvirt driver.

This change is for the PowerPC based servers that use the libvirt
driver. This also introduces the minimum libvirt version needed
for PowerPC to support NUMA from Nova.

Also note, that in order to retain the unit test that excluded
PPC from the NUMA supported architectures, an arbitrary choice
of architecture is made (S390) - that is not a part of the list
that supports NUMA.

Change-Id: I51dd3e160153b40072a04095e9bf3f15abd74252
Closes-Bug: #1516578
This commit is contained in:
Sudipta Biswas 2015-11-16 19:06:24 +05:30 committed by Sean Dague
parent 415b221e33
commit 1a2443ce67
3 changed files with 41 additions and 8 deletions

View File

@ -1584,6 +1584,19 @@ class LibvirtConnTestCase(test.NoDBTestCase):
exception.NUMATopologyUnsupported,
None)
def test_get_guest_config_numa_old_version_libvirt_ppc(self):
self.flags(virt_type='kvm', group='libvirt')
self._test_get_guest_config_numa_unsupported(
versionutils.convert_version_to_int(
libvirt_driver.MIN_LIBVIRT_NUMA_VERSION_PPC) - 1,
versionutils.convert_version_to_int(
libvirt_driver.MIN_QEMU_NUMA_HUGEPAGE_VERSION),
host.HV_DRIVER_QEMU,
arch.PPC64LE,
exception.NUMATopologyUnsupported,
None)
def test_get_guest_config_numa_bad_version_libvirt(self):
self.flags(virt_type='kvm', group='libvirt')
@ -1633,13 +1646,12 @@ class LibvirtConnTestCase(test.NoDBTestCase):
versionutils.convert_version_to_int(
libvirt_driver.MIN_QEMU_NUMA_HUGEPAGE_VERSION),
host.HV_DRIVER_QEMU,
arch.PPC64,
arch.S390,
exception.NUMATopologyUnsupported,
None)
def test_get_guest_config_numa_xen(self):
self.flags(virt_type='xen', group='libvirt')
self._test_get_guest_config_numa_unsupported(
versionutils.convert_version_to_int(
libvirt_driver.MIN_LIBVIRT_NUMA_VERSION),

View File

@ -381,6 +381,8 @@ MIN_QEMU_DISCARD_VERSION = (1, 6, 0)
# this the scheduler cannot make guaranteed decisions, as the
# guest placement may not match what was requested
MIN_LIBVIRT_NUMA_VERSION = (1, 2, 7)
# PowerPC based hosts that support NUMA using libvirt
MIN_LIBVIRT_NUMA_VERSION_PPC = (1, 2, 19)
# Versions of libvirt with known NUMA topology issues
# See bug #1449028
BAD_LIBVIRT_NUMA_VERSIONS = [(1, 2, 9, 2)]
@ -4912,13 +4914,18 @@ class LibvirtDriver(driver.ComputeDriver):
self._bad_libvirt_numa_version_warn = True
return False
supported_archs = [arch.I686, arch.X86_64]
support_matrix = {(arch.I686, arch.X86_64): MIN_LIBVIRT_NUMA_VERSION,
(arch.PPC64,
arch.PPC64LE): MIN_LIBVIRT_NUMA_VERSION_PPC}
caps = self._host.get_capabilities()
return ((caps.host.cpu.arch in supported_archs) and
self._host.has_min_version(MIN_LIBVIRT_NUMA_VERSION,
MIN_QEMU_NUMA_HUGEPAGE_VERSION,
host.HV_DRIVER_QEMU))
is_supported = False
for archs, libvirt_ver in support_matrix.items():
if ((caps.host.cpu.arch in archs) and
self._host.has_min_version(libvirt_ver,
MIN_QEMU_NUMA_HUGEPAGE_VERSION,
host.HV_DRIVER_QEMU)):
is_supported = True
return is_supported
def _has_hugepage_support(self):
# This means that the host can support multiple values for the size

View File

@ -0,0 +1,14 @@
---
features:
- |
Enables NUMA topology reporting on PowerPC architecture
from the libvirt driver in Nova but with a caveat as mentioned below.
NUMA cell affinity and dedicated cpu pinning
code assumes that the host operating system is exposed to threads.
PowerPC based hosts use core based scheduling for processes.
Due to this, the cores on the PowerPC architecture are treated as
threads. Since cores are always less than or equal
to the threads on a system, this leads to non-optimal resource usage
while pinning. This feature is supported from libvirt version 1.2.19
for PowerPC.