Skip to content

Commit 04c0e50

Browse files
Merge pull request #772 from shirishaganta1/osconfig-v3
Added testcase to assign hugepages
2 parents 6e8f1f2 + ede70ee commit 04c0e50

File tree

2 files changed

+145
-11
lines changed

2 files changed

+145
-11
lines changed

common/OpTestHMC.py

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -539,6 +539,25 @@ def get_lmb_size(self):
539539
'''
540540
return self.run_command("lshwres -r mem -m %s --level sys -F mem_region_size" % self.mg_system)
541541

542+
def configure_16gb_hugepage(self, num_hugepages):
543+
'''
544+
Configures managed system with 16gb hugepages passed as argument
545+
546+
:param num_hugepages: number of 16gb hugepages to configure on managed system
547+
'''
548+
self.run_command("chhwres -m %s -r mem -o s -a requested_num_sys_huge_pages=%s" %
549+
(self.mg_system, num_hugepages))
550+
time.sleep(2)
551+
552+
def get_16gb_hugepage_size(self):
553+
'''
554+
Get current number of 16gb hugepages of managed system
555+
556+
:returns: current number of 16gb hugepages of managed system
557+
'''
558+
return self.run_command("lshwres -r mem -m %s --level sys -F configurable_num_sys_huge_pages" %
559+
self.mg_system)
560+
542561
def get_lpar_state(self, vios=False, remote_hmc=None):
543562
'''
544563
Get current state of LPAR

testcases/MachineConfig.py

Lines changed: 126 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333

3434
import OpTestConfiguration
3535
import OpTestLogger
36+
from common import OpTestInstallUtil
3637
from common.OpTestSystem import OpSystemState
3738

3839
log = OpTestLogger.optest_logger_glob.get_logger(__name__)
@@ -45,7 +46,6 @@ def setUp(self):
4546

4647
conf = OpTestConfiguration.conf
4748
self.cv_SYSTEM = conf.system()
48-
self.cv_SYSTEM.goto_state(OpSystemState.OFF)
4949
self.bmc_type = conf.args.bmc_type
5050
self.machine_config = json.loads(conf.args.machine_config)
5151
if self.bmc_type == "FSP_PHYP" or self.bmc_type == "EBMC_PHYP" :
@@ -65,6 +65,7 @@ def runTest(self):
6565
status=LparConfig(self.cv_HMC,self.system_name,self.lpar_name,self.lpar_prof,self.machine_config['lpar']).LparSetup()
6666
if status:
6767
self.fail(status)
68+
6869
if self.machine_config.__contains__('cec'):
6970
if not self.cv_HMC.lpar_vios:
7071
self.skipTest("Please pass lpar_vios in config file.")
@@ -80,8 +81,22 @@ def runTest(self):
8081
self.fail(status)
8182
else:
8283
self.skipTest("Not implemented for other CEC settings")
83-
else:
84-
self.skipTest("Not Supported Config")
84+
85+
if self.machine_config.__contains__('os'):
86+
config_value = self.machine_config['os']
87+
valid_size = ['2M', '1G', '16M', '16G']
88+
if 'hugepage' in config_value:
89+
hugepage_size = re.findall(
90+
"hugepage=[0-9]+[A-Z]", str(self.machine_config))[0].split('=')[1]
91+
if str(hugepage_size) not in valid_size:
92+
self.skipTest("%s is not valid hugepage size, "
93+
"valid hugepage sizes are 1G, 2M, 16M, 16G" % hugepage_size)
94+
status = OsConfig(self.cv_HMC, self.system_name, self.lpar_name,
95+
self.lpar_prof, self.machine_config['os']).OsHugepageSetup()
96+
if status:
97+
self.fail(status)
98+
else:
99+
self.skipTest("Not implemented for other OS settings")
85100

86101

87102
class LparConfig():
@@ -100,8 +115,9 @@ def __init__(self, cv_HMC=None, system_name= None,
100115
self.lpar_name = lpar_name
101116
self.lpar_prof = lpar_prof
102117
self.machine_config=machin_config
103-
104-
118+
conf = OpTestConfiguration.conf
119+
self.cv_SYSTEM = conf.system()
120+
self.cv_SYSTEM.goto_state(OpSystemState.OFF)
105121

106122
def LparSetup(self):
107123
'''
@@ -114,7 +130,7 @@ def LparSetup(self):
114130
desired_proc_units=2.0
115131
overcommit_ratio=3
116132
'''
117-
133+
proc_mode = None
118134
if "cpu=shared" in self.machine_config:
119135
conf = OpTestConfiguration.conf
120136
try: self.sharing_mode = conf.args.sharing_mode
@@ -255,10 +271,11 @@ def LparSetup(self):
255271
(self.system_name, self.lpar_name, self.lpar_prof))
256272
time.sleep(5)
257273
curr_proc_mode = self.cv_HMC.get_proc_mode()
258-
if proc_mode in curr_proc_mode:
259-
log.info("System booted with %s mode" % proc_mode)
260-
else:
261-
return "Failed to boot in %s mode" % proc_mode
274+
if proc_mode:
275+
if proc_mode in curr_proc_mode:
276+
log.info("System booted with %s mode" % proc_mode)
277+
else:
278+
return "Failed to boot in %s mode" % proc_mode
262279

263280

264281
class RestoreLAPRConfig(MachineConfig):
@@ -308,4 +325,102 @@ def CecSetup_lmb(self):
308325
return "Failed to boot with LMB %s" % self.lmb_size
309326
self.cv_HMC.run_command("chsysstate -r lpar -m %s -o on -n %s -f %s" %
310327
(self.system_name, self.lpar_name, self.lpar_prof))
311-
time.sleep(5)
328+
time.sleep(5)
329+
330+
331+
class OsConfig():
332+
'''
333+
This Class assign huge page in the system based on MMU either Radix or hash and validate
334+
MMU is Radix : 2M or 1 GB Huge page
335+
MMU HASH : 16M or 16GB
336+
pass hgpgsize to machine_config in config file
337+
'''
338+
339+
def __init__(self, cv_HMC=None, system_name=None,
340+
lpar_name=None, lpar_prof=None, machine_config=None):
341+
self.cv_HMC = cv_HMC
342+
self.system_name = system_name
343+
self.lpar_name = lpar_name
344+
self.lpar_prof = lpar_prof
345+
self.machine_config = machine_config
346+
conf = OpTestConfiguration.conf
347+
self.cv_SYSTEM = conf.system()
348+
self.cv_HOST = conf.host()
349+
self.c = self.cv_HMC.get_host_console()
350+
self.mmulist = self.c.run_command("tail /proc/cpuinfo | grep MMU")
351+
self.mmu = str(self.mmulist[0]).split(':')[1].strip()
352+
self.obj = OpTestInstallUtil.InstallUtil()
353+
self.os_level = self.cv_HOST.host_get_OS_Level()
354+
355+
356+
def OsHugepageSetup(self):
357+
358+
filename_part1 = "cat /sys/kernel/mm/hugepages/hugepages-"
359+
filename_part2 = "kB/nr_hugepages"
360+
if "hugepage=16G" in self.machine_config:
361+
self.size_hgpg = "16G"
362+
self.num_hgpg = self.cv_HMC.get_16gb_hugepage_size()
363+
self.no_hgpg = int(self.num_hgpg[0])
364+
if self.no_hgpg != 0:
365+
self.configure_os_16gb_hugepage()
366+
con = self.cv_SYSTEM.cv_HOST.get_ssh_connection()
367+
assign_hp = con.run_command("%s%s%s" % (
368+
filename_part1, "16777216", filename_part2))[0]
369+
else:
370+
return "16gb hugepages are not configured in CEC"
371+
else:
372+
exist_cfg = self.cv_HMC.get_lpar_cfg()
373+
self.des_mem = int(exist_cfg.get('desired_mem'))
374+
self.percentile = int(self.des_mem * 0.1)
375+
if 'Radix' in self.mmu:
376+
if "hugepage=16M" in self.machine_config:
377+
self.fail("16M is not supported in Radix")
378+
elif "hugepage=2M" in self.machine_config:
379+
self.size_hgpg = "2M"
380+
self.no_hgpg = int(self.percentile / 2)
381+
elif "hugepage=1G" in self.machine_config:
382+
self.size_hgpg = "1G"
383+
self.no_hgpg = int(self.percentile / 1024)
384+
385+
elif 'Hash' in self.mmu and "hugepage=16M" in self.machine_config:
386+
self.size_hgpg = "16M"
387+
self.no_hgpg = int(self.percentile / 16)
388+
self.obj.update_kernel_cmdline(self.os_level,
389+
"hugepagesz=%s hugepages=%s" % (
390+
self.size_hgpg, self.no_hgpg),
391+
"",
392+
reboot=True,
393+
reboot_cmd=True)
394+
con = self.cv_SYSTEM.cv_HOST.get_ssh_connection()
395+
if self.size_hgpg == "2M":
396+
assign_hp = con.run_command("%s%s%s" % (
397+
filename_part1, "2048", filename_part2))[0]
398+
elif self.size_hgpg == "1G":
399+
assign_hp = con.run_command("%s%s%s" % (
400+
filename_part1, "1048576", filename_part2))[0]
401+
elif self.size_hgpg == "16M":
402+
assign_hp = con.run_command("%s%s%s" % (
403+
filename_part1, "16384", filename_part2))[0]
404+
if str(self.no_hgpg) != assign_hp:
405+
msg = "Expected %s: But found %s" % (self.no_hgpg, assign_hp)
406+
return msg
407+
else:
408+
log.info("%s Hugepage validation successful!" % self.size_hgpg)
409+
410+
411+
def configure_os_16gb_hugepage(self):
412+
if 'Radix' in self.mmu:
413+
self.obj.update_kernel_cmdline(self.os_level,
414+
"default_hugepagesz=16G hugepagesz=16G hugepages=%s disable_radix=1" % int(
415+
self.num_hgpg[0]),
416+
"",
417+
reboot=True,
418+
reboot_cmd=True)
419+
420+
elif 'Hash' in self.mmu:
421+
self.obj.update_kernel_cmdline(self.os_level,
422+
"default_hugepagesz=16G hugepagesz=16G hugepages=%s" % int(
423+
self.num_hgpg[0]),
424+
"",
425+
reboot=True,
426+
reboot_cmd=True)

0 commit comments

Comments
 (0)