drm/amdkfd: Use kvmalloc instead of kmalloc for VCRAT
authorKent Russell <kent.russell@amd.com>
Fri, 18 Sep 2020 18:47:47 +0000 (14:47 -0400)
committerAlex Deucher <alexander.deucher@amd.com>
Tue, 22 Sep 2020 16:27:03 +0000 (12:27 -0400)
Since we're dynamically allocating the CPU VCRAT, use kvmalloc in case
the allocation size is huge.

Signed-off-by: Kent Russell <kent.russell@amd.com>
Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/amdkfd/kfd_crat.c

index f76aa56..d298152 100644 (file)
@@ -797,7 +797,8 @@ int kfd_create_crat_image_acpi(void **crat_image, size_t *size)
                return -ENODATA;
        }
 
-       pcrat_image = kmemdup(crat_table, crat_table->length, GFP_KERNEL);
+       pcrat_image = kvmalloc(crat_table->length, GFP_KERNEL);
+       memcpy(pcrat_image, crat_table, crat_table->length);
        if (!pcrat_image)
                return -ENOMEM;
 
@@ -1383,7 +1384,7 @@ int kfd_create_crat_image_virtual(void **crat_image, size_t *size,
                        num_nodes * (sizeof(struct crat_subtype_computeunit) +
                        sizeof(struct crat_subtype_memory) +
                        (num_nodes - 1) * sizeof(struct crat_subtype_iolink));
-               pcrat_image = kmalloc(dyn_size, GFP_KERNEL);
+               pcrat_image = kvmalloc(dyn_size, GFP_KERNEL);
                if (!pcrat_image)
                        return -ENOMEM;
                *size = dyn_size;
@@ -1393,7 +1394,7 @@ int kfd_create_crat_image_virtual(void **crat_image, size_t *size,
        case COMPUTE_UNIT_GPU:
                if (!kdev)
                        return -EINVAL;
-               pcrat_image = kmalloc(VCRAT_SIZE_FOR_GPU, GFP_KERNEL);
+               pcrat_image = kvmalloc(VCRAT_SIZE_FOR_GPU, GFP_KERNEL);
                if (!pcrat_image)
                        return -ENOMEM;
                *size = VCRAT_SIZE_FOR_GPU;
@@ -1412,7 +1413,7 @@ int kfd_create_crat_image_virtual(void **crat_image, size_t *size,
        if (!ret)
                *crat_image = pcrat_image;
        else
-               kfree(pcrat_image);
+               kvfree(pcrat_image);
 
        return ret;
 }