objects: add method to verify requested hugepages
Introduces a new method can_fit_hugepages to numa cell object Work-Item: Enhance libvirt driver to configure guests based on the flavour parameter for page sizes Partial-Implement: blueprint virt-driver-large-pages Change-Id: I600840a96b13c1de4f2f409069f452e18e1c1c52
This commit is contained in:
parent
b0c65f5312
commit
90bd22610a
|
@ -1818,3 +1818,7 @@ class MemoryPageSizeInvalid(Invalid):
|
|||
|
||||
class MemoryPageSizeForbidden(Invalid):
|
||||
msg_fmt = _("Page size %(pagesize)s forbidden against '%(against)s'")
|
||||
|
||||
|
||||
class MemoryPageSizeNotSupported(Invalid):
|
||||
msg_fmt = _("Page size %(pagesize)s is not supported by the host.")
|
||||
|
|
|
@ -14,6 +14,7 @@
|
|||
|
||||
from oslo.serialization import jsonutils
|
||||
|
||||
from nova import exception
|
||||
from nova.objects import base
|
||||
from nova.objects import fields
|
||||
from nova.virt import hardware
|
||||
|
@ -73,6 +74,21 @@ class NUMACell(base.NovaObject):
|
|||
cpu_usage=cpu_usage, memory_usage=memory_usage,
|
||||
mempages=[])
|
||||
|
||||
def can_fit_hugepages(self, pagesize, memory):
|
||||
"""Returns whether memory can fit into hugepages size
|
||||
|
||||
:param pagesize: a page size in KibB
|
||||
:param memory: a memory size asked to fit in KiB
|
||||
|
||||
:returns: whether memory can fit in hugepages
|
||||
:raises: MemoryPageSizeNotSupported if page size not supported
|
||||
"""
|
||||
for pages in self.mempages:
|
||||
if pages.size_kb == pagesize:
|
||||
return (memory <= pages.free_kb and
|
||||
(memory % pages.size_kb) == 0)
|
||||
raise exception.MemoryPageSizeNotSupported(pagesize=pagesize)
|
||||
|
||||
|
||||
class NUMAPagesTopology(base.NovaObject):
|
||||
# Version 1.0: Initial version
|
||||
|
|
|
@ -11,6 +11,7 @@
|
|||
# under the License.
|
||||
|
||||
|
||||
from nova import exception
|
||||
from nova import objects
|
||||
from nova.tests.unit.objects import test_objects
|
||||
|
||||
|
@ -57,6 +58,24 @@ class _TestNUMA(object):
|
|||
self.assertEqual(512, pages_topology.free)
|
||||
self.assertEqual(1048576, pages_topology.free_kb)
|
||||
|
||||
def test_can_fit_hugepages(self):
|
||||
cell = objects.NUMACell(
|
||||
id=0, cpuset=set([1, 2]), memory=1024,
|
||||
mempages=[
|
||||
objects.NUMAPagesTopology(
|
||||
size_kb=4, total=1548736, used=0),
|
||||
objects.NUMAPagesTopology(
|
||||
size_kb=2048, total=513, used=0)]) # 1,002G
|
||||
|
||||
pagesize = 2048
|
||||
|
||||
self.assertTrue(cell.can_fit_hugepages(pagesize, 2 ** 20))
|
||||
self.assertFalse(cell.can_fit_hugepages(pagesize, 2 ** 21))
|
||||
self.assertFalse(cell.can_fit_hugepages(pagesize, 2 ** 19 + 1))
|
||||
self.assertRaises(
|
||||
exception.MemoryPageSizeNotSupported,
|
||||
cell.can_fit_hugepages, 12345, 2 ** 20)
|
||||
|
||||
|
||||
class TestNUMA(test_objects._LocalTest,
|
||||
_TestNUMA):
|
||||
|
|
Loading…
Reference in New Issue