drm/amdgpu: Use kvmalloc for allocating UVD/VCE/VCN BO backup memory
authorMichel Dänzer <michel.daenzer@amd.com>
Fri, 3 Aug 2018 15:24:32 +0000 (17:24 +0200)
committerAlex Deucher <alexander.deucher@amd.com>
Thu, 16 Aug 2018 17:59:11 +0000 (12:59 -0500)
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>
drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c
drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.c
drivers/gpu/drm/amd/amdgpu/vce_v4_0.c

index 433a741d07626cd9ee187b280e686b28d56a38da..e5a6db6beab7acfa364fedac5d0ac538458a4570 100644 (file)
@@ -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;
index 290d5583135bd2b6cb30c777a058d48df496bd8a..fd654a4406db964da6611f6c2d3d9db1fb283519 100644 (file)
@@ -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;
index 6faeb17fc71c4d0ad58cf4d4f9637df216fbe0d0..2e4d1b5f62431fed6f8a05b0b14e229ae21f060a 100644 (file)
@@ -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;
        }