Revert "Cleanup fmm.c"
This reverts commit b4c89c1ea7.
This change caused a regression ()
Revert temporarily
Change-Id: Ic3829264151e37d1f8c6927c6f464006234ba17f
Signed-off-by: Oak Zeng <Oak.Zeng@amd.com>
このコミットが含まれているのは:
@@ -264,8 +264,6 @@ static vm_object_t *vm_create_and_init_object(void *start, uint64_t size,
|
||||
object->next = object->prev = NULL;
|
||||
object->registered_device_id_array_size = 0;
|
||||
object->mapped_device_id_array_size = 0;
|
||||
object->registered_device_id_array = NULL;
|
||||
object->mapped_device_id_array = NULL;
|
||||
object->registered_node_id_array = NULL;
|
||||
object->mapped_node_id_array = NULL;
|
||||
object->registration_count = 0;
|
||||
@@ -305,19 +303,32 @@ static void vm_remove_object(manageable_aperture_t *app, vm_object_t *object)
|
||||
vm_object_t *prev;
|
||||
|
||||
/* Free allocations inside the object */
|
||||
if (object->registered_device_id_array)
|
||||
if (object->registered_device_id_array_size > 0) {
|
||||
if (object->mapped_device_id_array ==
|
||||
object->registered_device_id_array) {
|
||||
object->mapped_device_id_array_size = 0;
|
||||
object->mapped_device_id_array = NULL;
|
||||
object->mapped_node_id_array = NULL;
|
||||
}
|
||||
free(object->registered_device_id_array);
|
||||
|
||||
if (object->mapped_device_id_array)
|
||||
object->registered_device_id_array_size = 0;
|
||||
}
|
||||
if (object->mapped_device_id_array &&
|
||||
object->mapped_device_id_array_size > 0 &&
|
||||
object->mapped_device_id_array != all_gpu_id_array &&
|
||||
object->mapped_device_id_array != object->registered_device_id_array) {
|
||||
free(object->mapped_device_id_array);
|
||||
|
||||
object->mapped_device_id_array_size = 0;
|
||||
}
|
||||
if (object->metadata)
|
||||
free(object->metadata);
|
||||
|
||||
if (object->registered_node_id_array)
|
||||
free(object->registered_node_id_array);
|
||||
object->registered_node_id_array = NULL;
|
||||
if (object->mapped_node_id_array)
|
||||
free(object->mapped_node_id_array);
|
||||
object->mapped_node_id_array = NULL;
|
||||
|
||||
next = object->next;
|
||||
prev = object->prev;
|
||||
@@ -1708,67 +1719,6 @@ HSAKMT_STATUS fmm_get_aperture_base_and_limit(aperture_type_e aperture_type, HSA
|
||||
return err;
|
||||
}
|
||||
|
||||
static bool id_in_array(uint32_t id, uint32_t *ids_array,
|
||||
uint32_t ids_array_size)
|
||||
{
|
||||
uint32_t i;
|
||||
|
||||
for (i = 0; i < ids_array_size/sizeof(uint32_t); i++) {
|
||||
if (id == ids_array[i])
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/* Helper function to remove ids_array from
|
||||
* obj->mapped_device_id_array
|
||||
*/
|
||||
static void remove_device_ids_from_mapped_array(vm_object_t *obj,
|
||||
uint32_t *ids_array, uint32_t ids_array_size)
|
||||
{
|
||||
uint32_t i = 0, j = 0;
|
||||
|
||||
for (i = 0; i < obj->mapped_device_id_array_size/
|
||||
sizeof(uint32_t); i++) {
|
||||
if (!id_in_array(obj->mapped_device_id_array[i],
|
||||
ids_array, ids_array_size))
|
||||
obj->mapped_device_id_array[j++] =
|
||||
obj->mapped_device_id_array[i];
|
||||
}
|
||||
|
||||
obj->mapped_device_id_array_size = j*sizeof(uint32_t);
|
||||
if (!j) {
|
||||
if (obj->mapped_device_id_array)
|
||||
free(obj->mapped_device_id_array);
|
||||
|
||||
obj->mapped_device_id_array = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
/* Helper function to add ids_array to
|
||||
* obj->mapped_device_id_array
|
||||
*/
|
||||
static void add_device_ids_to_mapped_array(vm_object_t *obj,
|
||||
uint32_t *ids_array, uint32_t ids_array_size)
|
||||
{
|
||||
uint32_t new_array_size;
|
||||
|
||||
/* Remove any potential duplicated ids */
|
||||
remove_device_ids_from_mapped_array(obj, ids_array, ids_array_size);
|
||||
new_array_size = obj->mapped_device_id_array_size
|
||||
+ ids_array_size;
|
||||
|
||||
obj->mapped_device_id_array = (uint32_t *)realloc(
|
||||
obj->mapped_device_id_array, new_array_size);
|
||||
|
||||
memcpy(&obj->mapped_device_id_array
|
||||
[obj->mapped_device_id_array_size/sizeof(uint32_t)],
|
||||
ids_array, ids_array_size);
|
||||
|
||||
obj->mapped_device_id_array_size = new_array_size;
|
||||
}
|
||||
|
||||
|
||||
/* If nodes_to_map is not NULL, map the nodes specified; otherwise map all. */
|
||||
static int _fmm_map_to_gpu_gtt(manageable_aperture_t *aperture,
|
||||
void *address, uint64_t size, vm_object_t *obj,
|
||||
@@ -1776,6 +1726,7 @@ static int _fmm_map_to_gpu_gtt(manageable_aperture_t *aperture,
|
||||
{
|
||||
struct kfd_ioctl_map_memory_to_gpu_args args;
|
||||
vm_object_t *object;
|
||||
void *temp_mapped_id_array = NULL;
|
||||
|
||||
if (!obj)
|
||||
pthread_mutex_lock(&aperture->fmm_mutex);
|
||||
@@ -1813,15 +1764,26 @@ static int _fmm_map_to_gpu_gtt(manageable_aperture_t *aperture,
|
||||
args.device_ids_array_size = all_gpu_id_array_size;
|
||||
}
|
||||
|
||||
temp_mapped_id_array = (uint32_t *)malloc(args.device_ids_array_size);
|
||||
if (!temp_mapped_id_array)
|
||||
goto err_object_not_found;
|
||||
|
||||
if (kmtIoctl(kfd_fd, AMDKFD_IOC_MAP_MEMORY_TO_GPU, &args))
|
||||
goto err_map_ioctl_failed;
|
||||
|
||||
add_device_ids_to_mapped_array(object,
|
||||
(uint32_t *)args.device_ids_array_ptr,
|
||||
args.device_ids_array_size);
|
||||
print_device_id_array((uint32_t *)object->mapped_device_id_array,
|
||||
object->mapped_device_id_array_size);
|
||||
print_device_id_array((void *)args.device_ids_array_ptr,
|
||||
args.device_ids_array_size);
|
||||
|
||||
if (object->mapped_device_id_array &&
|
||||
object->mapped_device_id_array_size > 0 &&
|
||||
object->mapped_device_id_array != all_gpu_id_array &&
|
||||
object->mapped_device_id_array != object->registered_device_id_array)
|
||||
free(object->mapped_device_id_array);
|
||||
|
||||
memcpy(temp_mapped_id_array, (void *)args.device_ids_array_ptr,
|
||||
args.device_ids_array_size);
|
||||
object->mapped_device_id_array = temp_mapped_id_array;
|
||||
object->mapped_device_id_array_size = args.device_ids_array_size;
|
||||
object->mapping_count = 1;
|
||||
/* Mapping changed and lifecycle of object->mapped_node_id_array
|
||||
* terminates here. Free it and allocate on next query
|
||||
@@ -1838,6 +1800,7 @@ exit_ok:
|
||||
return 0;
|
||||
|
||||
err_map_ioctl_failed:
|
||||
free(temp_mapped_id_array);
|
||||
err_object_not_found:
|
||||
if (!obj)
|
||||
pthread_mutex_unlock(&aperture->fmm_mutex);
|
||||
@@ -1908,6 +1871,7 @@ static int _fmm_map_to_gpu(uint32_t gpu_id, manageable_aperture_t *aperture,
|
||||
{
|
||||
struct kfd_ioctl_map_memory_to_gpu_args args;
|
||||
vm_object_t *object;
|
||||
void *temp_mapped_id_array = NULL;
|
||||
|
||||
/* Check that address space was previously reserved */
|
||||
if (!vm_find(aperture, address))
|
||||
@@ -1931,13 +1895,24 @@ static int _fmm_map_to_gpu(uint32_t gpu_id, manageable_aperture_t *aperture,
|
||||
args.device_ids_array_size = all_gpu_id_array_size;
|
||||
}
|
||||
|
||||
temp_mapped_id_array = (uint32_t *)malloc(args.device_ids_array_size);
|
||||
if (!temp_mapped_id_array)
|
||||
goto err_object_not_found;
|
||||
|
||||
if (kmtIoctl(kfd_fd, AMDKFD_IOC_MAP_MEMORY_TO_GPU, &args))
|
||||
goto err_map_ioctl_failed;
|
||||
|
||||
if (object->mapped_device_id_array &&
|
||||
object->mapped_device_id_array_size > 0 &&
|
||||
object->mapped_device_id_array != all_gpu_id_array &&
|
||||
object->mapped_device_id_array != object->registered_device_id_array)
|
||||
free(object->mapped_device_id_array);
|
||||
|
||||
memcpy(temp_mapped_id_array, (void *)args.device_ids_array_ptr,
|
||||
args.device_ids_array_size);
|
||||
object->mapped_device_id_array = temp_mapped_id_array;
|
||||
object->mapped_device_id_array_size = args.device_ids_array_size;
|
||||
|
||||
add_device_ids_to_mapped_array(object,
|
||||
(uint32_t *)args.device_ids_array_ptr,
|
||||
args.device_ids_array_size);
|
||||
/* Mapping changed and lifecycle of object->mapped_node_id_array
|
||||
* terminates here. Free it and allocate on next query
|
||||
*/
|
||||
@@ -2121,10 +2096,15 @@ static int _fmm_unmap_from_gpu(manageable_aperture_t *aperture, void *address,
|
||||
if (ret != 0)
|
||||
goto out;
|
||||
|
||||
remove_device_ids_from_mapped_array(object,
|
||||
(uint32_t *)args.device_ids_array_ptr,
|
||||
args.device_ids_array_size);
|
||||
/* Clearing all mapped nodes list */
|
||||
if (object->mapped_device_id_array &&
|
||||
object->mapped_device_id_array_size > 0 &&
|
||||
object->mapped_device_id_array != all_gpu_id_array &&
|
||||
object->mapped_device_id_array != object->registered_device_id_array)
|
||||
free(object->mapped_device_id_array);
|
||||
|
||||
object->mapped_device_id_array = NULL;
|
||||
object->mapped_device_id_array_size = 0;
|
||||
if (object->mapped_node_id_array)
|
||||
free(object->mapped_node_id_array);
|
||||
object->mapped_node_id_array = NULL;
|
||||
@@ -2172,10 +2152,15 @@ static int _fmm_unmap_from_gpu_scratch(uint32_t gpu_id,
|
||||
args.device_ids_array_size = object->mapped_device_id_array_size;
|
||||
kmtIoctl(kfd_fd, AMDKFD_IOC_UNMAP_MEMORY_FROM_GPU, &args);
|
||||
|
||||
remove_device_ids_from_mapped_array(object,
|
||||
(uint32_t *)args.device_ids_array_ptr,
|
||||
args.device_ids_array_size);
|
||||
/* Clearing all mapped nodes list */
|
||||
if (object->mapped_device_id_array &&
|
||||
object->mapped_device_id_array_size > 0 &&
|
||||
object->mapped_device_id_array != all_gpu_id_array &&
|
||||
object->mapped_device_id_array != object->registered_device_id_array)
|
||||
free(object->mapped_device_id_array);
|
||||
|
||||
object->mapped_device_id_array = NULL;
|
||||
object->mapped_device_id_array_size = 0;
|
||||
if (object->mapped_node_id_array)
|
||||
free(object->mapped_node_id_array);
|
||||
object->mapped_node_id_array = NULL;
|
||||
@@ -2923,17 +2908,14 @@ HSAKMT_STATUS fmm_deregister_memory(void *address)
|
||||
return HSAKMT_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
if (!object->registered_device_id_array ||
|
||||
object->registered_device_id_array_size <= 0) {
|
||||
if (object->registered_device_id_array_size <= 0) {
|
||||
pthread_mutex_unlock(&aperture->fmm_mutex);
|
||||
return HSAKMT_STATUS_MEMORY_NOT_REGISTERED;
|
||||
}
|
||||
|
||||
if (object->registered_device_id_array) {
|
||||
free(object->registered_device_id_array);
|
||||
object->registered_device_id_array = NULL;
|
||||
object->registered_device_id_array_size = 0;
|
||||
}
|
||||
free(object->registered_device_id_array);
|
||||
object->registered_device_id_array = NULL;
|
||||
object->registered_device_id_array_size = 0;
|
||||
if (object->registered_node_id_array)
|
||||
free(object->registered_node_id_array);
|
||||
object->registered_node_id_array = NULL;
|
||||
@@ -2955,8 +2937,8 @@ HSAKMT_STATUS fmm_map_to_gpu_nodes(void *address, uint64_t size,
|
||||
{
|
||||
manageable_aperture_t *aperture;
|
||||
vm_object_t *object = NULL;
|
||||
uint32_t i;
|
||||
bool userptr = false;
|
||||
uint32_t i, j, temp_node;
|
||||
bool found, userptr = false;
|
||||
uint32_t *registered_node_id_array, registered_node_id_array_size;
|
||||
HSAKMT_STATUS ret = HSAKMT_STATUS_ERROR;
|
||||
int retcode = 0;
|
||||
@@ -3007,8 +2989,15 @@ HSAKMT_STATUS fmm_map_to_gpu_nodes(void *address, uint64_t size,
|
||||
registered_node_id_array_size = object->registered_device_id_array_size;
|
||||
}
|
||||
for (i = 0 ; i < num_of_nodes; i++) {
|
||||
if (!id_in_array(nodes_to_map[i], registered_node_id_array,
|
||||
registered_node_id_array_size)) {
|
||||
temp_node = nodes_to_map[i];
|
||||
found = false;
|
||||
for (j = 0 ; j < registered_node_id_array_size / sizeof(uint32_t); j++) {
|
||||
if (temp_node == registered_node_id_array[j]) {
|
||||
found = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (!found) {
|
||||
pthread_mutex_unlock(&aperture->fmm_mutex);
|
||||
return HSAKMT_STATUS_ERROR;
|
||||
}
|
||||
@@ -3020,10 +3009,16 @@ HSAKMT_STATUS fmm_map_to_gpu_nodes(void *address, uint64_t size,
|
||||
uint32_t temp_node_id_array_size = 0;
|
||||
|
||||
for (i = 0 ; i < object->mapped_device_id_array_size / sizeof(uint32_t); i++) {
|
||||
if (!id_in_array(object->mapped_device_id_array[i],
|
||||
nodes_to_map, num_of_nodes))
|
||||
temp_node_id_array[temp_node_id_array_size++] =
|
||||
object->mapped_device_id_array[i];
|
||||
temp_node = object->mapped_device_id_array[i];
|
||||
found = false;
|
||||
for (j = 0 ; j < num_of_nodes; j++) {
|
||||
if (temp_node == nodes_to_map[j]) {
|
||||
found = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (!found)
|
||||
temp_node_id_array[temp_node_id_array_size++] = temp_node;
|
||||
}
|
||||
temp_node_id_array_size *= sizeof(uint32_t);
|
||||
|
||||
@@ -3039,24 +3034,8 @@ HSAKMT_STATUS fmm_map_to_gpu_nodes(void *address, uint64_t size,
|
||||
}
|
||||
}
|
||||
|
||||
/* Remove already mapped nodes from nodes_to_map
|
||||
* to generate the final map list
|
||||
*/
|
||||
uint32_t map_node_id_array[num_of_nodes];
|
||||
uint32_t map_node_id_array_size = 0;
|
||||
|
||||
for (i = 0; i < num_of_nodes; i++) {
|
||||
if (!id_in_array(nodes_to_map[i],
|
||||
object->mapped_device_id_array,
|
||||
object->mapped_device_id_array_size))
|
||||
map_node_id_array[map_node_id_array_size++] =
|
||||
nodes_to_map[i];
|
||||
}
|
||||
|
||||
if (map_node_id_array_size)
|
||||
retcode = _fmm_map_to_gpu_gtt(aperture, address, size, object,
|
||||
map_node_id_array,
|
||||
map_node_id_array_size * sizeof(uint32_t));
|
||||
retcode = _fmm_map_to_gpu_gtt(aperture, address, size, object,
|
||||
nodes_to_map, num_of_nodes * sizeof(uint32_t));
|
||||
|
||||
pthread_mutex_unlock(&aperture->fmm_mutex);
|
||||
|
||||
|
||||
新しいイシューから参照
ユーザーをブロックする