Skip to content

Commit ce300de

Browse files
Merge pull request #970 from shirishaganta1/offset
OpTestKernelDump.py: Test crashkernel with memory offset parameter.
2 parents 3e43f8d + 95ecae2 commit ce300de

3 files changed

Lines changed: 81 additions & 2 deletions

File tree

common/OpTestInstallUtil.py

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -405,6 +405,22 @@ def check_kernel_cmdline(self, args="", remove_args=""):
405405
(Err.command, Err.output)))
406406
return req_args.strip(), req_remove_args.strip()
407407

408+
def update_or_replace_arg(self, cmdline, new_arg):
409+
key = new_arg.split("=")[0]
410+
parts = cmdline.split()
411+
updated = []
412+
replaced = False
413+
for part in parts:
414+
if part.startswith(key + "="):
415+
if not replaced:
416+
updated.append(new_arg)
417+
replaced = True
418+
else:
419+
updated.append(part)
420+
if not replaced:
421+
updated.append(new_arg)
422+
return " ".join(updated)
423+
408424
def update_kernel_cmdline(self, distro, args="", remove_args="", reboot=True,
409425
reboot_cmd=False, timeout=0):
410426
"""
@@ -442,7 +458,8 @@ def update_kernel_cmdline(self, distro, args="", remove_args="", reboot=True,
442458
output = con.run_command(cmd, timeout=60)[0].replace("\"", "")
443459
output = output.split("GRUB_CMDLINE_LINUX_DEFAULT=")[-1].strip()
444460
if req_args:
445-
output += " %s" % req_args
461+
for arg in req_args.split():
462+
output = self.update_or_replace_arg(output, arg)
446463
if req_remove_args:
447464
for each_arg in req_remove_args.split():
448465
output = output.replace(each_arg, "")

common/OpTestSSH.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -160,7 +160,9 @@ def run_command_direct(self, command, timeout=60, expect_disconnect=False):
160160

161161
# Check exit status
162162
if exit_status != 0:
163-
log.warning(f"Command exited with status {exit_status}")
163+
raise CommandFailed(command,
164+
'\n'.join(error_lines),
165+
exit_status)
164166
# For HMC commands, some non-zero exits are acceptable
165167
# Return output anyway and let caller decide
166168

testcases/OpTestKernelDump.py

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2742,6 +2742,65 @@ def runTest(self):
27422742
(name, data['time'], time_diff, data['vmcore_size_mb'], size_diff))
27432743

27442744

2745+
class KernelCrash_CrashkernelOffset(OptestKernelDump):
2746+
'''
2747+
Test crashkernel with memory offset parameter.
2748+
Appends offset to existing crashkernel value and triggers crash.
2749+
Example: crashkernel=512M becomes crashkernel=512M@256M
2750+
'''
2751+
2752+
def runTest(self):
2753+
self.setup_test()
2754+
conf = OpTestConfiguration.conf
2755+
# Get test offset (default 256M)
2756+
try:
2757+
self.test_offset = conf.args.test_offset
2758+
except AttributeError:
2759+
self.test_offset = '256M'
2760+
log.info(f"========== Testing crashkernel with offset @{self.test_offset} ==========")
2761+
cmdline = self.c.run_command("cat /proc/cmdline")
2762+
cmdline_str = ' '.join(cmdline)
2763+
2764+
match = re.search(r'crashkernel=([^\s@]+)', cmdline_str)
2765+
if not match:
2766+
self.skipTest("No crashkernel parameter found")
2767+
2768+
current_value = match.group(1)
2769+
log.info(f"Current crashkernel value: {current_value}")
2770+
old_param = f"crashkernel={current_value}"
2771+
# Create new parameter with offset
2772+
new_param = f"crashkernel={current_value}@{self.test_offset}"
2773+
log.info(f"New crashkernel parameter: {new_param}")
2774+
self.reset_kdump_bootloaded_if_needed()
2775+
# Update using OpTestInstallUtil (will replace old crashkernel)
2776+
obj = OpTestInstallUtil.InstallUtil()
2777+
if not obj.update_kernel_cmdline(self.distro,
2778+
args=new_param,
2779+
reboot=True,
2780+
reboot_cmd=True):
2781+
self.fail("Failed to update crashkernel with offset")
2782+
# Verify crashkernel with offset
2783+
cmdline = self.c.run_command("cat /proc/cmdline")
2784+
cmdline_str = ' '.join(cmdline)
2785+
2786+
if f"@{self.test_offset}" not in cmdline_str:
2787+
self.fail(f"Crashkernel offset @{self.test_offset} not found in kernel cmdline")
2788+
2789+
log.info(f"Verified: crashkernel with offset @{self.test_offset}")
2790+
log.info("========== Triggering crash ==========")
2791+
boot_type = self.kernel_crash()
2792+
self.verify_dump_file(boot_type)
2793+
log.info(f"========== SUCCESS: Crashkernel offset @{self.test_offset} test passed ==========")
2794+
old_param = f"crashkernel={current_value}"
2795+
log.info(f"old crashkernel parameter: {old_param}")
2796+
obj = OpTestInstallUtil.InstallUtil()
2797+
if not obj.update_kernel_cmdline(self.distro,
2798+
args=old_param,
2799+
remove_args=new_param,
2800+
reboot=True,
2801+
reboot_cmd=True):
2802+
self.fail("KernelArgTest failed to update kernel args")
2803+
27452804
def crash_suite():
27462805
s = unittest.TestSuite()
27472806
s.addTest(OpTestWatchdog())
@@ -2781,5 +2840,6 @@ def crash_suite():
27812840
s.addTest(OPALCrash_MPIPL())
27822841
s.addTest(PstoreCheck())
27832842
s.addTest(MeasureMakedumpTime())
2843+
s.addTest(KernelCrash_CrashkernelOffset())
27842844

27852845
return s

0 commit comments

Comments
 (0)