Merge "Mark sibling CPUs as 'used' for cpu_thread_policy = 'isolated'"

This commit is contained in:
Jenkins 2016-12-20 09:28:10 +00:00 committed by Gerrit Code Review
commit 7e1f1f68eb
3 changed files with 73 additions and 0 deletions

View File

@ -96,6 +96,12 @@ class NUMACell(base.NovaObject):
self.pinned_cpus -= cpus
def pin_cpus_with_siblings(self, cpus):
# NOTE(snikitin): Empty siblings list means that HyperThreading is
# disabled on the NUMA cell and we must pin CPUs like normal CPUs.
if not self.siblings:
self.pin_cpus(cpus)
return
pin_siblings = set()
for sib in self.siblings:
if cpus & sib:
@ -103,6 +109,12 @@ class NUMACell(base.NovaObject):
self.pin_cpus(pin_siblings)
def unpin_cpus_with_siblings(self, cpus):
# NOTE(snikitin): Empty siblings list means that HyperThreading is
# disabled on the NUMA cell and we must unpin CPUs like normal CPUs.
if not self.siblings:
self.unpin_cpus(cpus)
return
pin_siblings = set()
for sib in self.siblings:
if cpus & sib:

View File

@ -124,6 +124,25 @@ class _TestNUMA(object):
numacell.unpin_cpus_with_siblings(set([4]))
self.assertEqual(set([1, 2, 3, 4]), numacell.free_cpus)
def test_pinning_with_siblings_with_empty_siblings_list(self):
numacell = objects.NUMACell(id=0, cpuset=set([1, 2, 3, 4]), memory=512,
cpu_usage=0, memory_usage=256,
pinned_cpus=set([]),
siblings=[],
mempages=[])
numacell.pin_cpus_with_siblings(set([1, 2]))
self.assertEqual(set([1, 2]), numacell.pinned_cpus)
numacell.unpin_cpus_with_siblings(set([1]))
self.assertEqual(set([2]), numacell.pinned_cpus)
self.assertRaises(exception.CPUUnpinningInvalid,
numacell.unpin_cpus_with_siblings,
set([1]))
self.assertRaises(exception.CPUPinningInvalid,
numacell.pin_cpus_with_siblings,
set([2]))
self.assertEqual(set([2]), numacell.pinned_cpus)
def test_pages_topology_wipe(self):
pages_topology = objects.NUMAPagesTopology(
size_kb=2048, total=1024, used=512)

View File

@ -2765,6 +2765,48 @@ class CPUPinningTestCase(test.NoDBTestCase, _CPUPinningTestCaseBase):
self.assertEqual(set([]), new_cell.cells[0].pinned_cpus)
self.assertEqual(new_cell.cells[0].cpu_usage, 0)
def test_host_usage_from_instances_isolated_without_siblings(self):
host_pin = objects.NUMATopology(
cells=[objects.NUMACell(id=0, cpuset=set([0, 1, 2, 3]),
memory=4096, cpu_usage=0,
memory_usage=0,
siblings=[],
mempages=[], pinned_cpus=set([]))])
inst_pin = objects.InstanceNUMATopology(
cells=[objects.InstanceNUMACell(
cpuset=set([0, 1, 2]), memory=2048, id=0,
cpu_pinning={0: 0, 1: 1, 2: 2},
cpu_policy=fields.CPUAllocationPolicy.DEDICATED,
cpu_thread_policy=fields.CPUThreadAllocationPolicy.ISOLATE
)])
new_cell = hw.numa_usage_from_instances(host_pin, [inst_pin])
self.assertEqual(inst_pin.cells[0].cpuset,
new_cell.cells[0].pinned_cpus)
self.assertEqual(new_cell.cells[0].cpu_usage, 3)
def test_host_usage_from_instances_isolated_without_siblings_free(self):
host_pin = objects.NUMATopology(
cells=[objects.NUMACell(id=0, cpuset=set([0, 1, 2, 3]),
memory=4096, cpu_usage=4,
memory_usage=0,
siblings=[],
mempages=[],
pinned_cpus=set([0, 1, 2, 3]))])
inst_pin = objects.InstanceNUMATopology(
cells=[objects.InstanceNUMACell(
cpuset=set([0, 1, 3]), memory=2048, id=0,
cpu_pinning={0: 0, 1: 1, 2: 2},
cpu_policy=fields.CPUAllocationPolicy.DEDICATED,
cpu_thread_policy=fields.CPUThreadAllocationPolicy.ISOLATE
)])
new_cell = hw.numa_usage_from_instances(host_pin,
[inst_pin],
free=True)
self.assertEqual(set([3]), new_cell.cells[0].pinned_cpus)
self.assertEqual(new_cell.cells[0].cpu_usage, 1)
class CPURealtimeTestCase(test.NoDBTestCase):
def test_success_flavor(self):