libhsakmt: Add PROT_NONE CPU mapping for scratch mappings

This is needed to allow gdb to access the memory.

Change-Id: I96c084b714e952d7b7000f0dd41e1c530fdd092f
Signed-off-by: Felix Kuehling <Felix.Kuehling@amd.com>


[ROCm/ROCR-Runtime commit: e5062c4383]
このコミットが含まれているのは:
Felix Kuehling
2020-05-02 15:46:58 -04:00
コミット 38ab5ed98e
+18 -3
ファイルの表示
@@ -2603,6 +2603,7 @@ static int _fmm_map_to_gpu_scratch(uint32_t gpu_id, manageable_aperture_t *apert
bool is_debugger = 0;
void *mmap_ret = NULL;
uint64_t mmap_offset = 0;
int map_fd;
vm_object_t *obj;
/* Retrieve gpu_mem id according to gpu_id */
@@ -2622,18 +2623,27 @@ static int _fmm_map_to_gpu_scratch(uint32_t gpu_id, manageable_aperture_t *apert
/* allocate object within the scratch backing aperture */
if (!ret && !is_debugger) {
obj = fmm_allocate_memory_object(
gpu_id, address, size, aperture, NULL,
gpu_id, address, size, aperture, &mmap_offset,
KFD_IOC_ALLOC_MEM_FLAGS_VRAM |
KFD_IOC_ALLOC_MEM_FLAGS_WRITABLE);
if (!obj)
return -1;
} else {
int map_fd = mmap_offset >= (1ULL<<40) ? kfd_fd :
/* Create a CPU mapping for the debugger */
map_fd = mmap_offset >= (1ULL<<40) ? kfd_fd :
gpu_mem[gpu_mem_id].drm_render_fd;
mmap_ret = mmap(address, size, PROT_NONE,
MAP_PRIVATE | MAP_FIXED, map_fd, mmap_offset);
if (mmap_ret == MAP_FAILED) {
__fmm_release(obj, aperture);
return -1;
}
} else {
obj = fmm_allocate_memory_object(
gpu_id, address, size, aperture, &mmap_offset,
KFD_IOC_ALLOC_MEM_FLAGS_GTT |
KFD_IOC_ALLOC_MEM_FLAGS_WRITABLE);
map_fd = mmap_offset >= (1ULL<<40) ? kfd_fd :
gpu_mem[gpu_mem_id].drm_render_fd;
mmap_ret = mmap(address, size,
PROT_READ | PROT_WRITE,
MAP_SHARED | MAP_FIXED, map_fd, mmap_offset);
@@ -2841,6 +2851,11 @@ static int _fmm_unmap_from_gpu_scratch(uint32_t gpu_id,
args.n_success = 0;
ret = kmtIoctl(kfd_fd, AMDKFD_IOC_UNMAP_MEMORY_FROM_GPU, &args);
/* unmap from CPU while keeping the address space reserved */
mmap(address, object->size, PROT_NONE,
MAP_ANONYMOUS | MAP_NORESERVE | MAP_PRIVATE | MAP_FIXED,
-1, 0);
remove_device_ids_from_mapped_array(object,
(uint32_t *)args.device_ids_array_ptr,
args.n_success * sizeof(uint32_t));