@@ -17,7 +17,7 @@ use core::sync::atomic::{AtomicBool, AtomicU64, Ordering};
1717use core:: time:: Duration ;
1818
1919use kernel:: {
20- c_str,
20+ c_str, devcoredump ,
2121 error:: code:: * ,
2222 macros:: versions,
2323 prelude:: * ,
@@ -26,7 +26,7 @@ use kernel::{
2626 lock:: { mutex:: MutexBackend , Guard } ,
2727 Arc , Mutex , UniqueArc ,
2828 } ,
29- time:: { clock, Now } ,
29+ time:: { clock, msecs_to_jiffies , Now } ,
3030 types:: ForeignOwnable ,
3131} ;
3232
@@ -36,8 +36,7 @@ use crate::driver::{AsahiDevRef, AsahiDevice, AsahiDriver};
3636use crate :: fw:: channels:: { ChannelErrorType , PipeType } ;
3737use crate :: fw:: types:: { U32 , U64 } ;
3838use crate :: {
39- alloc, buffer, channel, crashdump, event, fw, gem, hw, initdata, mem, mmu, queue, regs,
40- workqueue,
39+ alloc, buffer, channel, event, fw, gem, hw, initdata, mem, mmu, queue, regs, workqueue,
4140} ;
4241
4342const DEBUG_CLASS : DebugFlags = DebugFlags :: Gpu ;
@@ -336,8 +335,9 @@ impl rtkit::Operations for GpuManager::ver {
336335
337336 data. crashed . store ( true , Ordering :: Relaxed ) ;
338337
338+ #[ cfg( CONFIG_DEV_COREDUMP ) ]
339339 if let Err ( e) = data. generate_crashdump ( crashlog) {
340- dev_err ! ( dev. as_ref( ) , "Could not dump kernel VM pages : {:?}\n " , e) ;
340+ dev_err ! ( dev. as_ref( ) , "Could not generate crashdump : {:?}\n " , e) ;
341341 }
342342
343343 if debug_enabled ( DebugFlags :: OopsOnGpuCrash ) {
@@ -1123,19 +1123,28 @@ impl GpuManager::ver {
11231123 Ok ( ( ) )
11241124 }
11251125
1126+ #[ cfg( CONFIG_DEV_COREDUMP ) ]
11261127 fn generate_crashdump ( & self , crashlog : Option < & [ u8 ] > ) -> Result {
11271128 // Lock the allocators, to block kernel/FW memory mutations (mostly)
11281129 let kalloc = self . alloc ( ) ;
11291130 let pages = self . uat . dump_kernel_pages ( ) ?;
11301131 core:: mem:: drop ( kalloc) ;
11311132
1132- let mut crashdump = crashdump:: CrashDumpBuilder :: new ( pages) ?;
1133+ let mut crashdump = crate :: crashdump:: CrashDumpBuilder :: new ( pages) ?;
11331134 let initdata_addr = self . initdata . gpu_va ( ) . get ( ) ;
11341135 crashdump. add_agx_info ( self . cfg , & self . dyncfg , initdata_addr) ?;
11351136 if let Some ( crashlog) = crashlog {
11361137 crashdump. add_crashlog ( crashlog) ?;
11371138 }
1138- let crashdump = crashdump. finalize ( ) ;
1139+ let crashdump = KBox :: new ( crashdump. finalize ( ) ?, GFP_KERNEL ) ?;
1140+
1141+ devcoredump:: dev_coredump (
1142+ self . dev . as_ref ( ) ,
1143+ & crate :: THIS_MODULE ,
1144+ crashdump,
1145+ GFP_KERNEL ,
1146+ msecs_to_jiffies ( 60 * 60 * 1000 ) ,
1147+ ) ;
11391148
11401149 Ok ( ( ) )
11411150 }
0 commit comments