@@ -342,7 +342,7 @@ amdgpu_devcoredump_format(char *buffer, size_t count, struct amdgpu_coredump_inf
342342 struct amdgpu_ip_block * ip_block ;
343343 struct amdgpu_ring * ring ;
344344 int ver , i , j ;
345- u32 ring_idx , off ;
345+ u32 ring_idx ;
346346 bool sizing_pass ;
347347
348348 sizing_pass = buffer == NULL ;
@@ -442,7 +442,6 @@ amdgpu_devcoredump_format(char *buffer, size_t count, struct amdgpu_coredump_inf
442442 for (i = 0 ; i < coredump -> num_rings ; i ++ ) {
443443 ring_idx = coredump -> rings [i ].ring_index ;
444444 ring = coredump -> adev -> rings [ring_idx ];
445- off = coredump -> rings [i ].offset ;
446445
447446 drm_printf (& p , "ring name: %s\n" , ring -> name );
448447 drm_printf (& p , "Rptr: 0x%llx Wptr: 0x%llx RB mask: %x\n" ,
@@ -451,12 +450,18 @@ amdgpu_devcoredump_format(char *buffer, size_t count, struct amdgpu_coredump_inf
451450 ring -> buf_mask );
452451 drm_printf (& p , "Ring size in dwords: %d\n" ,
453452 ring -> ring_size / 4 );
453+
454+ if (!coredump -> rings [i ].ring_dw ) {
455+ drm_printf (& p , "Ring contents unavailable\n" );
456+ continue ;
457+ }
458+
454459 drm_printf (& p , "Ring contents\n" );
455460 drm_printf (& p , "Offset \t Value\n" );
456461
457462 for (j = 0 ; j < ring -> ring_size ; j += 4 )
458463 drm_printf (& p , "0x%x \t 0x%x\n" , j ,
459- coredump -> rings_dw [ off + j / 4 ]);
464+ coredump -> rings [ i ]. ring_dw [ j / 4 ]);
460465 }
461466 }
462467
@@ -497,10 +502,12 @@ amdgpu_devcoredump_read(char *buffer, loff_t offset, size_t count,
497502static void amdgpu_devcoredump_free (void * data )
498503{
499504 struct amdgpu_coredump_info * coredump = data ;
505+ u32 i ;
500506
501507 kvfree (coredump -> formatted );
508+ for (i = 0 ; i < coredump -> num_rings ; i ++ )
509+ kvfree (coredump -> rings [i ].ring_dw );
502510 kvfree (coredump -> rings );
503- kvfree (coredump -> rings_dw );
504511 kvfree (data );
505512}
506513
@@ -542,9 +549,9 @@ void amdgpu_coredump(struct amdgpu_device *adev, bool skip_vram_check,
542549 struct amdgpu_coredump_info * coredump ;
543550 size_t size = sizeof (* coredump );
544551 struct drm_sched_job * s_job ;
545- u64 total_ring_size , ring_count ;
552+ u64 ring_count ;
546553 struct amdgpu_ring * ring ;
547- int i , off , idx ;
554+ int i , idx ;
548555
549556 /* No need to generate a new coredump if there's one in progress already. */
550557 if (work_busy (& adev -> coredump_work ))
@@ -553,7 +560,7 @@ void amdgpu_coredump(struct amdgpu_device *adev, bool skip_vram_check,
553560 if (job && job -> pasid )
554561 size += sizeof (struct amdgpu_coredump_ib_info ) * job -> num_ibs ;
555562
556- coredump = kzalloc (size , GFP_NOWAIT );
563+ coredump = kvzalloc (size , GFP_NOWAIT );
557564 if (!coredump )
558565 return ;
559566
@@ -584,7 +591,6 @@ void amdgpu_coredump(struct amdgpu_device *adev, bool skip_vram_check,
584591
585592 /* Dump ring content if memory allocation succeeds. */
586593 ring_count = 0 ;
587- total_ring_size = 0 ;
588594 for (i = 0 ; i < adev -> num_rings ; i ++ ) {
589595 ring = adev -> rings [i ];
590596
@@ -593,34 +599,34 @@ void amdgpu_coredump(struct amdgpu_device *adev, bool skip_vram_check,
593599 coredump -> ring != ring )
594600 continue ;
595601
596- total_ring_size += ring -> ring_size ;
597602 ring_count ++ ;
598603 }
599- coredump -> rings_dw = kzalloc (total_ring_size , GFP_NOWAIT );
600- coredump -> rings = kcalloc (ring_count , sizeof (struct amdgpu_coredump_ring ), GFP_NOWAIT );
601- if (coredump -> rings && coredump -> rings_dw ) {
602- for (i = 0 , off = 0 , idx = 0 ; i < adev -> num_rings && idx < ring_count ; i ++ ) {
604+ if (ring_count )
605+ coredump -> rings = kvcalloc (ring_count ,
606+ sizeof (struct amdgpu_coredump_ring ),
607+ GFP_NOWAIT );
608+ if (coredump -> rings ) {
609+ for (i = 0 , idx = 0 ; i < adev -> num_rings && idx < ring_count ; i ++ ) {
610+ struct amdgpu_coredump_ring * cdump_ring ;
611+
603612 ring = adev -> rings [i ];
604613
605614 if (atomic_read (& ring -> fence_drv .last_seq ) == ring -> fence_drv .sync_seq &&
606615 coredump -> ring != ring )
607616 continue ;
608617
609- coredump -> rings [idx ].ring_index = ring -> idx ;
610- coredump -> rings [idx ].rptr = amdgpu_ring_get_rptr (ring );
611- coredump -> rings [idx ].wptr = amdgpu_ring_get_wptr (ring );
612- coredump -> rings [idx ].offset = off ;
618+ cdump_ring = & coredump -> rings [idx ];
619+
620+ cdump_ring -> ring_dw = kvzalloc (ring -> ring_size , GFP_NOWAIT );
621+ if (cdump_ring -> ring_dw )
622+ memcpy (cdump_ring -> ring_dw , ring -> ring , ring -> ring_size );
613623
614- memcpy (& coredump -> rings_dw [off ], ring -> ring , ring -> ring_size );
615- off += ring -> ring_size / 4 ;
624+ cdump_ring -> ring_index = ring -> idx ;
625+ cdump_ring -> rptr = amdgpu_ring_get_rptr (ring );
626+ cdump_ring -> wptr = amdgpu_ring_get_wptr (ring );
616627 idx ++ ;
617628 }
618629 coredump -> num_rings = idx ;
619- } else {
620- kvfree (coredump -> rings_dw );
621- kvfree (coredump -> rings );
622- coredump -> rings_dw = NULL ;
623- coredump -> rings = NULL ;
624630 }
625631
626632 coredump -> adev = adev ;
0 commit comments