[PATCH] drm/amdgpu: fix double free vcn ip_dump

Jesse.zhang@amd.com jesse.zhang at amd.com
Mon Nov 11 06:30:11 UTC 2024


[   90.441868] ------------[ cut here ]------------
[   90.441873] kernel BUG at mm/slub.c:553!
[   90.441885] Oops: invalid opcode: 0000 [#1] PREEMPT SMP NOPTI
[   90.441892] CPU: 0 PID: 1523 Comm: amd_pci_unplug Tainted: G            E      6.10.0+ #47
[   90.441900] Hardware name: AMD Splinter/Splinter-PHX2, BIOS TS41102C_925 01/05/2024
[   90.441907] RIP: 0010:__slab_free+0x1ce/0x320
[   90.441916] Code: f7 c3 00 02 00 00 0f 84 6c ff ff ff fb 0f 1f 44 00 00 e9 61 ff ff ff 41 f7 46 08 87 04 00 00 0f 85 d6 fe ff ff e9 ca fe ff ff <0f> 0b 49 3b 5c 24 28 75 bd 48 8b 44 24 28 49 89 4c 24 28 ba 01 00
[   90.441927] RSP: 0018:ffffb9c801cefcb0 EFLAGS: 00010246
[   90.441934] RAX: ffff8cdb481dcf00 RBX: 0000000000200012 RCX: ffff8cdb481dce00
[   90.441940] RDX: ffff8cdb481dce00 RSI: ffffe3f904207700 RDI: ffff8cdb40042a00
[   90.441945] RBP: ffffb9c801cefd50 R08: 0000000000000001 R09: ffffffffc149f632
[   90.441950] R10: ffff8cdb481dce00 R11: ffff8ce26e621e18 R12: ffffe3f904207700
[   90.441956] R13: ffff8cdb481dce00 R14: ffff8cdb40042a00 R15: ffff8cdb481dce00
[   90.441962] FS:  00007f0a4f3fec40(0000) GS:ffff8ce26e600000(0000) knlGS:0000000000000000
[   90.441968] CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
[   90.441974] CR2: 000055bf74ba8930 CR3: 0000000108f48000 CR4: 0000000000750ef0
[   90.441979] PKRU: 55555554
[   90.441983] Call Trace:
[   90.441987]  <TASK>
[   90.441991]  ? show_regs+0x6b/0x80
[   90.441999]  ? __die_body+0x24/0x70
[   90.442005]  ? die+0x42/0x70
[   90.442011]  ? do_trap+0xda/0xf0
[   90.442018]  ? do_error_trap+0x76/0xa0
[   90.442023]  ? __slab_free+0x1ce/0x320
[   90.442030]  ? exc_invalid_op+0x57/0x80
[   90.442036]  ? __slab_free+0x1ce/0x320
[   90.442042]  ? asm_exc_invalid_op+0x1f/0x30
[   90.442053]  ? vcn_v4_0_sw_fini+0xc2/0x110 [amdgpu]
[   90.442308]  ? __slab_free+0x1ce/0x320
[   90.442316]  ? release_firmware.part.0+0x2e/0x50
[   90.442323]  ? srso_alias_return_thunk+0x5/0xfbef5
[   90.442332]  ? srso_alias_return_thunk+0x5/0xfbef5
[   90.442338]  ? vcn_v4_0_sw_fini+0xc2/0x110 [amdgpu]
[   90.442496]  kfree+0x23e/0x2f0
[   90.442502]  vcn_v4_0_sw_fini+0xc2/0x110 [amdgpu]
[   90.442653]  amdgpu_device_fini_sw+0x133/0x700 [amdgpu]
[   90.442835]  amdgpu_driver_release_kms+0x1a/0x30 [amdgpu]
[   90.442981]  drm_dev_release+0x2d/0x50 [drm]
[   90.443003]  drm_minor_release+0x3d/0x60 [drm]
[   90.443026]  drm_release+0x90/0xd0 [drm]
[   90.443052]  __fput+0xfa/0x2f0
[   90.443059]  __fput_sync+0x1e/0x30
[   90.443064]  __x64_sys_close+0x42/0x90
[   90.443071]  x64_sys_call+0x18f6/0x20d0
[   90.443076]  do_syscall_64+0x6f/0x110
[   90.443083]  ? do_syscall_64+0x7b/0x110
[   90.443089]  entry_SYSCALL_64_after_hwframe+0x76/0x7e
[   90.443096] RIP: 0033:0x7f0a51514f67
[   90.443102] Code: ff e8 0d 16 02 00 66 2e 0f 1f 84 00 00 00 00 00 0f 1f 00 f3 0f 1e fa 64 8b 04 25 18 00 00 00 85 c0 75 10 b8 03 00 00 00 0f 05 <48> 3d 00 f0 ff ff 77 41 c3 48 83 ec 18 89 7c 24 0c e8 73 ba f7 ff
[   90.443113] RSP: 002b:00007ffec29b16e8 EFLAGS: 00000246 ORIG_RAX: 0000000000000003
[   90.443121] RAX: ffffffffffffffda RBX: 0000000000000000 RCX: 00007f0a51514f67
[   90.443127] RDX: 0000000000000001 RSI: 00007f0a51776485 RDI: 0000000000000003
[   90.443132] RBP: 00007ffec29b1770 R08: 000055f942381170 R09: 0000000000000000
[   90.443138] R10: 0000000000000000 R11: 0000000000000246 R12: 0000000000000000
[   90.443143] R13: 000055f90a2a41c0 R14: 0000000000000000 R15: 0000000000000001
[   90.443152]  </TASK>

Set ip_dump to null after releasing vcn ip_dump.

Signed-off-by: Jesse Zhang <jesse.zhang at amd.com>
---
 drivers/gpu/drm/amd/amdgpu/vcn_v2_0.c   | 5 ++++-
 drivers/gpu/drm/amd/amdgpu/vcn_v3_0.c   | 5 ++++-
 drivers/gpu/drm/amd/amdgpu/vcn_v4_0.c   | 5 ++++-
 drivers/gpu/drm/amd/amdgpu/vcn_v4_0_3.c | 5 ++++-
 drivers/gpu/drm/amd/amdgpu/vcn_v4_0_5.c | 5 ++++-
 drivers/gpu/drm/amd/amdgpu/vcn_v5_0_0.c | 5 ++++-
 6 files changed, 24 insertions(+), 6 deletions(-)

diff --git a/drivers/gpu/drm/amd/amdgpu/vcn_v2_0.c b/drivers/gpu/drm/amd/amdgpu/vcn_v2_0.c
index a327c3bf84f2..b23b55539b43 100644
--- a/drivers/gpu/drm/amd/amdgpu/vcn_v2_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/vcn_v2_0.c
@@ -263,7 +263,10 @@ static int vcn_v2_0_sw_fini(struct amdgpu_ip_block *ip_block)
 
 	r = amdgpu_vcn_sw_fini(adev, inst);
 
-	kfree(adev->vcn.ip_dump);
+	if (adev->vcn.ip_dump) {
+		kfree(adev->vcn.ip_dump);
+		adev->vcn.ip_dump = NULL;
+	}
 
 	return r;
 }
diff --git a/drivers/gpu/drm/amd/amdgpu/vcn_v3_0.c b/drivers/gpu/drm/amd/amdgpu/vcn_v3_0.c
index b78c6da0a3cd..df3855e7b5c1 100644
--- a/drivers/gpu/drm/amd/amdgpu/vcn_v3_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/vcn_v3_0.c
@@ -331,7 +331,10 @@ static int vcn_v3_0_sw_fini(struct amdgpu_ip_block *ip_block)
 
 	r = amdgpu_vcn_sw_fini(adev, inst);
 
-	kfree(adev->vcn.ip_dump);
+	if (adev->vcn.ip_dump) {
+		kfree(adev->vcn.ip_dump);
+		adev->vcn.ip_dump = NULL;
+	}
 	return r;
 }
 
diff --git a/drivers/gpu/drm/amd/amdgpu/vcn_v4_0.c b/drivers/gpu/drm/amd/amdgpu/vcn_v4_0.c
index 5c3b718ebdfa..d8b46f440ba5 100644
--- a/drivers/gpu/drm/amd/amdgpu/vcn_v4_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/vcn_v4_0.c
@@ -295,7 +295,10 @@ static int vcn_v4_0_sw_fini(struct amdgpu_ip_block *ip_block)
 	amdgpu_vcn_sysfs_reset_mask_fini(adev);
 	r = amdgpu_vcn_sw_fini(adev, inst);
 
-	kfree(adev->vcn.ip_dump);
+	if (adev->vcn.ip_dump) {
+		kfree(adev->vcn.ip_dump);
+		adev->vcn.ip_dump = NULL;
+	}
 
 	return r;
 }
diff --git a/drivers/gpu/drm/amd/amdgpu/vcn_v4_0_3.c b/drivers/gpu/drm/amd/amdgpu/vcn_v4_0_3.c
index aa06b2fdeb7a..c71793431433 100644
--- a/drivers/gpu/drm/amd/amdgpu/vcn_v4_0_3.c
+++ b/drivers/gpu/drm/amd/amdgpu/vcn_v4_0_3.c
@@ -257,7 +257,10 @@ static int vcn_v4_0_3_sw_fini(struct amdgpu_ip_block *ip_block)
 	amdgpu_vcn_sysfs_reset_mask_fini(adev);
 	r = amdgpu_vcn_sw_fini(adev, inst);
 
-	kfree(adev->vcn.ip_dump);
+	if (adev->vcn.ip_dump) {
+		kfree(adev->vcn.ip_dump);
+		adev->vcn.ip_dump = NULL;
+	}
 
 	return r;
 }
diff --git a/drivers/gpu/drm/amd/amdgpu/vcn_v4_0_5.c b/drivers/gpu/drm/amd/amdgpu/vcn_v4_0_5.c
index 4e7da56a9f34..4c4b8a711b99 100644
--- a/drivers/gpu/drm/amd/amdgpu/vcn_v4_0_5.c
+++ b/drivers/gpu/drm/amd/amdgpu/vcn_v4_0_5.c
@@ -252,7 +252,10 @@ static int vcn_v4_0_5_sw_fini(struct amdgpu_ip_block *ip_block)
 
 	r = amdgpu_vcn_sw_fini(adev, inst);
 
-	kfree(adev->vcn.ip_dump);
+	if (adev->vcn.ip_dump) {
+		kfree(adev->vcn.ip_dump);
+		adev->vcn.ip_dump = NULL;
+	}
 
 	return r;
 }
diff --git a/drivers/gpu/drm/amd/amdgpu/vcn_v5_0_0.c b/drivers/gpu/drm/amd/amdgpu/vcn_v5_0_0.c
index a72de204f130..71f2cb75e91f 100644
--- a/drivers/gpu/drm/amd/amdgpu/vcn_v5_0_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/vcn_v5_0_0.c
@@ -226,7 +226,10 @@ static int vcn_v5_0_0_sw_fini(struct amdgpu_ip_block *ip_block)
 	amdgpu_vcn_sysfs_reset_mask_fini(adev);
 	r = amdgpu_vcn_sw_fini(adev, inst);
 
-	kfree(adev->vcn.ip_dump);
+	if (adev->vcn.ip_dump) {
+		kfree(adev->vcn.ip_dump);
+		adev->vcn.ip_dump = NULL;
+	}
 
 	return r;
 }
-- 
2.25.1



More information about the amd-gfx mailing list