amdgpu: use alloca and malloc in critical codepaths (v2)
And don't clear the memory when it's unnecessary. v2: use malloc for arrays that can be big Reviewed-by: Alex Deucher <alexander.deucher@amd.com>main
parent
908f34e70c
commit
34e1250e37
|
@ -27,6 +27,7 @@
|
||||||
|
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
#include <stdint.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
#include <fcntl.h>
|
#include <fcntl.h>
|
||||||
|
@ -639,9 +640,15 @@ int amdgpu_bo_list_create(amdgpu_device_handle dev,
|
||||||
unsigned i;
|
unsigned i;
|
||||||
int r;
|
int r;
|
||||||
|
|
||||||
list = calloc(number_of_resources, sizeof(struct drm_amdgpu_bo_list_entry));
|
if (!number_of_resources)
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
if (list == NULL)
|
/* overflow check for multiplication */
|
||||||
|
if (number_of_resources > UINT32_MAX / sizeof(struct drm_amdgpu_bo_list_entry))
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
|
list = malloc(number_of_resources * sizeof(struct drm_amdgpu_bo_list_entry));
|
||||||
|
if (!list)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
|
||||||
memset(&args, 0, sizeof(args));
|
memset(&args, 0, sizeof(args));
|
||||||
|
@ -660,15 +667,14 @@ int amdgpu_bo_list_create(amdgpu_device_handle dev,
|
||||||
|
|
||||||
r = drmCommandWriteRead(dev->fd, DRM_AMDGPU_BO_LIST,
|
r = drmCommandWriteRead(dev->fd, DRM_AMDGPU_BO_LIST,
|
||||||
&args, sizeof(args));
|
&args, sizeof(args));
|
||||||
|
free(list);
|
||||||
if (r)
|
if (r)
|
||||||
goto out;
|
return r;
|
||||||
|
|
||||||
*result = calloc(1, sizeof(struct amdgpu_bo_list));
|
*result = malloc(sizeof(struct amdgpu_bo_list));
|
||||||
(*result)->dev = dev;
|
(*result)->dev = dev;
|
||||||
(*result)->handle = args.out.list_handle;
|
(*result)->handle = args.out.list_handle;
|
||||||
out:
|
return 0;
|
||||||
free(list);
|
|
||||||
return r;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int amdgpu_bo_list_destroy(amdgpu_bo_list_handle list)
|
int amdgpu_bo_list_destroy(amdgpu_bo_list_handle list)
|
||||||
|
@ -699,11 +705,17 @@ int amdgpu_bo_list_update(amdgpu_bo_list_handle handle,
|
||||||
unsigned i;
|
unsigned i;
|
||||||
int r;
|
int r;
|
||||||
|
|
||||||
list = calloc(number_of_resources, sizeof(struct drm_amdgpu_bo_list_entry));
|
if (!number_of_resources)
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
|
/* overflow check for multiplication */
|
||||||
|
if (number_of_resources > UINT32_MAX / sizeof(struct drm_amdgpu_bo_list_entry))
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
|
list = malloc(number_of_resources * sizeof(struct drm_amdgpu_bo_list_entry));
|
||||||
if (list == NULL)
|
if (list == NULL)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
|
||||||
memset(&args, 0, sizeof(args));
|
|
||||||
args.in.operation = AMDGPU_BO_LIST_OP_UPDATE;
|
args.in.operation = AMDGPU_BO_LIST_OP_UPDATE;
|
||||||
args.in.list_handle = handle->handle;
|
args.in.list_handle = handle->handle;
|
||||||
args.in.bo_number = number_of_resources;
|
args.in.bo_number = number_of_resources;
|
||||||
|
|
|
@ -201,8 +201,8 @@ static int amdgpu_cs_submit_one(amdgpu_context_handle context,
|
||||||
sizeof(struct drm_amdgpu_cs_chunk) +
|
sizeof(struct drm_amdgpu_cs_chunk) +
|
||||||
sizeof(struct drm_amdgpu_cs_chunk_data));
|
sizeof(struct drm_amdgpu_cs_chunk_data));
|
||||||
|
|
||||||
chunk_array = calloc(1, size);
|
chunk_array = alloca(size);
|
||||||
if (NULL == chunk_array)
|
if (!chunk_array)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
|
||||||
chunks = (struct drm_amdgpu_cs_chunk *)(chunk_array + ibs_request->number_of_ibs + 1);
|
chunks = (struct drm_amdgpu_cs_chunk *)(chunk_array + ibs_request->number_of_ibs + 1);
|
||||||
|
@ -262,7 +262,6 @@ static int amdgpu_cs_submit_one(amdgpu_context_handle context,
|
||||||
|
|
||||||
error_unlock:
|
error_unlock:
|
||||||
pthread_mutex_unlock(&context->sequence_mutex);
|
pthread_mutex_unlock(&context->sequence_mutex);
|
||||||
free(chunk_array);
|
|
||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue