@@ -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+
27452804def 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