--- 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 */