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:
Sahid Orentino Ferdjaoui 2014-12-03 07:03:29 -05:00
parent b0c65f5312
commit 90bd22610a
3 changed files with 39 additions and 0 deletions

View File

@ -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.")

View File

@ -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

View File

@ -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):