Skip to content

Commit

Permalink
vm_start_destroy_repeatedly: Add Hugepage Variant
Browse files Browse the repository at this point in the history
Add variant to vm_start_destroy_repeatedly.py for
handling a vm with hugepages

Signed-off-by: Slancaster1 <[email protected]>
  • Loading branch information
Slancaster1 authored and root committed Sep 3, 2024
1 parent 595840c commit 3d246a2
Show file tree
Hide file tree
Showing 2 changed files with 84 additions and 4 deletions.
8 changes: 8 additions & 0 deletions libvirt/tests/cfg/vm_start_destroy_repeatedly.cfg
Original file line number Diff line number Diff line change
Expand Up @@ -3,3 +3,11 @@
num_cycles = 3000
start_vm = no
test_timeout = 288000
check_hugepage_status = False
variants:
- hugepage:
num_cycles = 100
check_hugepage_status = True
mb_params = {'hugepages': {}, 'source_type': 'memfd', 'access_mode': 'shared'}
vm_attrs = {'memory': 8388608, 'memory_unit': 'KiB'"}
- @default:
80 changes: 76 additions & 4 deletions libvirt/tests/src/vm_start_destroy_repeatedly.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
import logging
from virttest import virsh
from virttest import utils_misc
from virttest import xml_utils
from virttest.staging import utils_memory
from virttest.libvirt_xml import vm_xml


def power_cycle_vm(test, vm, vm_name, login_timeout, startup_wait, resume_wait):
Expand Down Expand Up @@ -37,6 +40,61 @@ def power_cycle_vm(test, vm, vm_name, login_timeout, startup_wait, resume_wait):
test.fail("Failed to shutdown VM")


def setup_hugepage(vm, params):
vm_attrs = eval(params.get("vm_attrs", "{}"))
memory_amount = int(vm_attrs["memory"])

#Reserve memory for hugepages
hugepage_size = utils_memory.get_huge_page_size()
hugepage_nr = int(memory_amount) / hugepage_size
utils_memory.set_num_huge_pages(hugepage_nr)
logging.info("Set number of hugepages to {}".format(hugepage_nr))

#Prepare VM XML
vmxml = vm_xml.VMXML.new_from_inactive_dumpxml(vm.name)
backup_xml = vmxml.copy()

#Remove old memory tags
vmxml.xmltreefile.remove_by_xpath("/memory")
vmxml.xmltreefile.remove_by_xpath("/currentMemory")

#Add in new memory tags
xmltreefile = vmxml.__dict_get__('xml')
xml_utils.ElementTree.SubElement(xmltreefile.getroot(), "memory").text = str(memory_amount)
xml_utils.ElementTree.SubElement(xmltreefile.getroot(), "currentMemory").text = str(memory_amount)

#Include memory backing
mb_xml = vm_xml.VMMemBackingXML()
mb_params = eval(params.get("mb_params", "{}"))
mb_xml.setup_attrs(**mb_params)
vmxml.setup_attrs(**vm_attrs)
vmxml.mb = mb_xml

#The relevant bug only appears if disk cache='none'
disk_nodes = xmltreefile.find("devices").findall("disk")
qcow_disk = [disk for disk in disk_nodes if disk.find("driver").get("type") == "qcow2"][0]
if qcow_disk.find("driver").get("cache") != "none":
qcow_disk.find("driver").set("cache", "none")

vmxml.xmltreefile.write()
vmxml.sync()
logging.info("New XML for Hugepage testing: {}".format(vmxml))

return hugepage_nr, backup_xml


def check_hugepage_status(test, hugepage_nr):
if hugepage_nr != utils_memory.get_num_huge_pages():
test.fail("Total number of hugepages does not match. Expected: {}. Actual: {}"
.format(hugepage_nr, utils_memory.get_num_huge_pages()))
if hugepage_nr != utils_memory.get_num_huge_pages_free():
test.fail("Number of free huge pages does not match. Expected: {}. Actual: {}"
.format(hugepage_nr, utils_memory.get_num_huge_pages_free()))
if utils_memory.get_num_huge_pages_rsvd() != 0:
test.fail("Huge pages still reserved. Expected: 0. Actual: {}"
.format(utils_memory.get_num_huge_pages_rsvd()))


def run(test, params, env):
"""
Test qemu-kvm startup reliability
Expand All @@ -52,10 +110,24 @@ def run(test, params, env):
login_timeout = float(params.get("login_timeout", 240)) # Controls vm.wait_for_login() timeout
startup_wait = float(params.get("startup_wait", 240)) # Controls wait time for virsh.start()
resume_wait = float(params.get("resume_wait", 240)) # Controls wait for virsh.resume()
hugepage_check = bool(params.get("check_hugepage_status", False))
vm_memory = int(params.get("vm_memory", 8388608))

backup_xml = None
hugepage_nr = None
if hugepage_check:
hugepage_nr, backup_xml = setup_hugepage(vm, params)
logging.info("hugepage_nr: {}".format(hugepage_nr))

try:
for i in range(num_cycles):
logging.info("Starting vm '%s' -- attempt #%d", vm_name, i+1)

for i in range(num_cycles):
logging.info("Starting vm '%s' -- attempt #%d", vm_name, i+1)
power_cycle_vm(test, vm, vm_name, login_timeout, startup_wait, resume_wait)

power_cycle_vm(test, vm, vm_name, login_timeout, startup_wait, resume_wait)
logging.info("Completed vm '%s' power cycle #%d", vm_name, i+1)
finally:
if hugepage_check:
backup_xml.sync()

logging.info("Completed vm '%s' power cycle #%d", vm_name, i+1)
check_hugepage_status(test, hugepage_nr)

0 comments on commit 3d246a2

Please sign in to comment.