Ver código fonte

drm/radeon: fix double free in radeon_gpu_reset

radeon_ring_restore is freeing the memory for the saved
ring data. We need to remember that, otherwise we try to
restore the ring data again on the next try. Additional
to that it shouldn't try the reset infinitely if we have
saved ring data.

Signed-off-by: Christian König <deathsimple@vodafone.de>
Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
Christian König 13 anos atrás
pai
commit
f54b350d89
1 arquivos alterados com 3 adições e 0 exclusões
  1. 3 0
      drivers/gpu/drm/radeon/radeon_device.c

+ 3 - 0
drivers/gpu/drm/radeon/radeon_device.c

@@ -1346,12 +1346,15 @@ retry:
 		for (i = 0; i < RADEON_NUM_RINGS; ++i) {
 		for (i = 0; i < RADEON_NUM_RINGS; ++i) {
 			radeon_ring_restore(rdev, &rdev->ring[i],
 			radeon_ring_restore(rdev, &rdev->ring[i],
 					    ring_sizes[i], ring_data[i]);
 					    ring_sizes[i], ring_data[i]);
+			ring_sizes[i] = 0;
+			ring_data[i] = NULL;
 		}
 		}
 
 
 		r = radeon_ib_ring_tests(rdev);
 		r = radeon_ib_ring_tests(rdev);
 		if (r) {
 		if (r) {
 			dev_err(rdev->dev, "ib ring test failed (%d).\n", r);
 			dev_err(rdev->dev, "ib ring test failed (%d).\n", r);
 			if (saved) {
 			if (saved) {
+				saved = false;
 				radeon_suspend(rdev);
 				radeon_suspend(rdev);
 				goto retry;
 				goto retry;
 			}
 			}