mirror of
https://github.com/torvalds/linux.git
synced 2024-12-29 14:21:47 +00:00
drm/amdgpu: Use kvmalloc for allocating UVD/VCE/VCN BO backup memory
The allocated size can be (at least?) as large as megabytes, and there's no need for it to be physically contiguous. May avoid spurious failures to initialize / suspend the corresponding block while there's memory pressure. Bugzilla: https://bugs.freedesktop.org/107432 Reviewed-by: Christian König <christian.koenig@amd.com> Signed-off-by: Michel Dänzer <michel.daenzer@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
This commit is contained in:
parent
dddc0557e3
commit
c9533d1bca
@ -302,7 +302,7 @@ int amdgpu_uvd_sw_fini(struct amdgpu_device *adev)
|
||||
for (j = 0; j < adev->uvd.num_uvd_inst; ++j) {
|
||||
if (adev->uvd.harvest_config & (1 << j))
|
||||
continue;
|
||||
kfree(adev->uvd.inst[j].saved_bo);
|
||||
kvfree(adev->uvd.inst[j].saved_bo);
|
||||
|
||||
amdgpu_bo_free_kernel(&adev->uvd.inst[j].vcpu_bo,
|
||||
&adev->uvd.inst[j].gpu_addr,
|
||||
@ -368,7 +368,7 @@ int amdgpu_uvd_suspend(struct amdgpu_device *adev)
|
||||
size = amdgpu_bo_size(adev->uvd.inst[j].vcpu_bo);
|
||||
ptr = adev->uvd.inst[j].cpu_addr;
|
||||
|
||||
adev->uvd.inst[j].saved_bo = kmalloc(size, GFP_KERNEL);
|
||||
adev->uvd.inst[j].saved_bo = kvmalloc(size, GFP_KERNEL);
|
||||
if (!adev->uvd.inst[j].saved_bo)
|
||||
return -ENOMEM;
|
||||
|
||||
@ -394,7 +394,7 @@ int amdgpu_uvd_resume(struct amdgpu_device *adev)
|
||||
|
||||
if (adev->uvd.inst[i].saved_bo != NULL) {
|
||||
memcpy_toio(ptr, adev->uvd.inst[i].saved_bo, size);
|
||||
kfree(adev->uvd.inst[i].saved_bo);
|
||||
kvfree(adev->uvd.inst[i].saved_bo);
|
||||
adev->uvd.inst[i].saved_bo = NULL;
|
||||
} else {
|
||||
const struct common_firmware_header *hdr;
|
||||
|
@ -130,7 +130,7 @@ int amdgpu_vcn_sw_fini(struct amdgpu_device *adev)
|
||||
{
|
||||
int i;
|
||||
|
||||
kfree(adev->vcn.saved_bo);
|
||||
kvfree(adev->vcn.saved_bo);
|
||||
|
||||
amdgpu_bo_free_kernel(&adev->vcn.vcpu_bo,
|
||||
&adev->vcn.gpu_addr,
|
||||
@ -161,7 +161,7 @@ int amdgpu_vcn_suspend(struct amdgpu_device *adev)
|
||||
size = amdgpu_bo_size(adev->vcn.vcpu_bo);
|
||||
ptr = adev->vcn.cpu_addr;
|
||||
|
||||
adev->vcn.saved_bo = kmalloc(size, GFP_KERNEL);
|
||||
adev->vcn.saved_bo = kvmalloc(size, GFP_KERNEL);
|
||||
if (!adev->vcn.saved_bo)
|
||||
return -ENOMEM;
|
||||
|
||||
@ -183,7 +183,7 @@ int amdgpu_vcn_resume(struct amdgpu_device *adev)
|
||||
|
||||
if (adev->vcn.saved_bo != NULL) {
|
||||
memcpy_toio(ptr, adev->vcn.saved_bo, size);
|
||||
kfree(adev->vcn.saved_bo);
|
||||
kvfree(adev->vcn.saved_bo);
|
||||
adev->vcn.saved_bo = NULL;
|
||||
} else {
|
||||
const struct common_firmware_header *hdr;
|
||||
|
@ -439,7 +439,7 @@ static int vce_v4_0_sw_init(void *handle)
|
||||
const struct common_firmware_header *hdr;
|
||||
unsigned size = amdgpu_bo_size(adev->vce.vcpu_bo);
|
||||
|
||||
adev->vce.saved_bo = kmalloc(size, GFP_KERNEL);
|
||||
adev->vce.saved_bo = kvmalloc(size, GFP_KERNEL);
|
||||
if (!adev->vce.saved_bo)
|
||||
return -ENOMEM;
|
||||
|
||||
@ -496,7 +496,7 @@ static int vce_v4_0_sw_fini(void *handle)
|
||||
amdgpu_virt_free_mm_table(adev);
|
||||
|
||||
if (adev->firmware.load_type == AMDGPU_FW_LOAD_PSP) {
|
||||
kfree(adev->vce.saved_bo);
|
||||
kvfree(adev->vce.saved_bo);
|
||||
adev->vce.saved_bo = NULL;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user