⬢ DragonFlyBSD Kernel Audit
DF-3861 / fix.diff
← back to finding ↓ download raw
--- a/sys/dev/drm/amd/amdgpu/amdgpu_device.c
+++ b/sys/dev/drm/amd/amdgpu/amdgpu_device.c
@@ -2749,7 +2749,16 @@
 	}
 	adev->accel_working = false;
 #ifdef __DragonFly__
-	adev->fictitious_range_registered = false;
+	/* DF-3861: release the fictitious VRAM range registered in
+	 * amdgpu_device_init (mirrors radeon_device_fini), otherwise every
+	 * driver load consumes one of the 8 slots of the drm_vm.c shim
+	 * and leaks the vm_page array forever.
+	 */
+	if (adev->fictitious_range_registered) {
+		vm_phys_fictitious_unreg_range(adev->gmc.aper_base,
+		    adev->gmc.aper_base + adev->gmc.visible_vram_size);
+		adev->fictitious_range_registered = false;
+	}
 #endif
 	cancel_delayed_work_sync(&adev->late_init_work);
 	/* free i2c buses */