Changes for RDMA with VMM (#801)
* rocr: Add support for VMM and RDMA Add extra CPU mapping so that kernel-mode drivers can look up the memory mapping by virtual address. * Update projects/rocr-runtime/runtime/hsa-runtime/core/runtime/runtime.cpp Co-authored-by: Yiannis Papadopoulos <102817138+ypapadop-amd@users.noreply.github.com> * Update projects/rocr-runtime/runtime/hsa-runtime/core/inc/runtime.h Co-authored-by: Yiannis Papadopoulos <102817138+ypapadop-amd@users.noreply.github.com> * rocr: Honor uncache flag in memory_lock_to_pool() Also, combined several flag options used in apis into a single integer. Signed-off-by: Chris Freehill <cfreehil@amd.com> * rocr: Fix hsa_amd_pointer_info on CPU agents Fix hsa_amd_pointer_info query returning allowd on VMM pointers for CPU agents when CPU mapping was mapped with PROT_NONE. --------- Signed-off-by: Chris Freehill <cfreehil@amd.com> Co-authored-by: Yiannis Papadopoulos <102817138+ypapadop-amd@users.noreply.github.com> Co-authored-by: Chris Freehill <cfreehil@amd.com> Co-authored-by: cfreeamd <166262151+cfreeamd@users.noreply.github.com>
This commit is contained in:
@@ -1061,9 +1061,7 @@ static HsaMemFlags fmm_translate_ioc_to_hsa_flags(uint32_t ioc_flags)
|
||||
}
|
||||
|
||||
static HSAKMT_STATUS fmm_register_mem_svm_api(void *address,
|
||||
uint64_t size,
|
||||
bool coarse_grain,
|
||||
bool ext_coherent)
|
||||
uint64_t size, HsaMemFlags flags)
|
||||
{
|
||||
struct kfd_ioctl_svm_args *args;
|
||||
size_t s_attr;
|
||||
@@ -1080,10 +1078,11 @@ static HSAKMT_STATUS fmm_register_mem_svm_api(void *address,
|
||||
args->size = aligned_size;
|
||||
args->op = KFD_IOCTL_SVM_OP_SET_ATTR;
|
||||
args->nattr = 2;
|
||||
args->attrs[0].type = coarse_grain ?
|
||||
args->attrs[0].type = flags.ui32.CoarseGrain ?
|
||||
HSA_SVM_ATTR_CLR_FLAGS : HSA_SVM_ATTR_SET_FLAGS;
|
||||
args->attrs[0].value = HSA_SVM_FLAG_COHERENT;
|
||||
args->attrs[1].type = ext_coherent ? HSA_SVM_ATTR_SET_FLAGS : HSA_SVM_ATTR_CLR_FLAGS ;
|
||||
args->attrs[1].type = flags.ui32.ExtendedCoherent ?
|
||||
HSA_SVM_ATTR_SET_FLAGS : HSA_SVM_ATTR_CLR_FLAGS;
|
||||
args->attrs[1].value = HSA_SVM_FLAG_EXT_COHERENT;
|
||||
pr_debug("Registering to SVM %p size: %ld\n", (void*)aligned_addr,
|
||||
aligned_size);
|
||||
@@ -3748,8 +3747,7 @@ bool hsakmt_fmm_get_handle(void *address, uint64_t *handle, uint64_t *size_offse
|
||||
static HSAKMT_STATUS fmm_register_user_memory(void *addr,
|
||||
HSAuint64 size,
|
||||
vm_object_t **obj_ret,
|
||||
bool coarse_grain,
|
||||
bool ext_coherent)
|
||||
HsaMemFlags flags)
|
||||
{
|
||||
manageable_aperture_t *aperture = svm.dgpu_aperture;
|
||||
HSAuint32 page_offset = (HSAuint64)addr & (PAGE_SIZE-1);
|
||||
@@ -3774,8 +3772,8 @@ static HSAKMT_STATUS fmm_register_user_memory(void *addr,
|
||||
&aligned_addr, KFD_IOC_ALLOC_MEM_FLAGS_USERPTR |
|
||||
KFD_IOC_ALLOC_MEM_FLAGS_WRITABLE |
|
||||
KFD_IOC_ALLOC_MEM_FLAGS_EXECUTABLE |
|
||||
(coarse_grain ? 0 : KFD_IOC_ALLOC_MEM_FLAGS_COHERENT) |
|
||||
(ext_coherent ? KFD_IOC_ALLOC_MEM_FLAGS_EXT_COHERENT : 0),
|
||||
(flags.ui32.CoarseGrain ? 0 : KFD_IOC_ALLOC_MEM_FLAGS_COHERENT) |
|
||||
(flags.ui32.ExtendedCoherent ? KFD_IOC_ALLOC_MEM_FLAGS_EXT_COHERENT : 0),
|
||||
0,
|
||||
&obj);
|
||||
if (!svm_addr)
|
||||
@@ -3813,8 +3811,7 @@ static HSAKMT_STATUS fmm_register_user_memory(void *addr,
|
||||
HSAKMT_STATUS hsakmt_fmm_register_memory(void *address, uint64_t size_in_bytes,
|
||||
uint32_t *gpu_id_array,
|
||||
uint32_t gpu_id_array_size,
|
||||
bool coarse_grain,
|
||||
bool ext_coherent)
|
||||
HsaMemFlags flags)
|
||||
{
|
||||
manageable_aperture_t *aperture = NULL;
|
||||
vm_object_t *object = NULL;
|
||||
@@ -3823,7 +3820,7 @@ HSAKMT_STATUS hsakmt_fmm_register_memory(void *address, uint64_t size_in_bytes,
|
||||
if (gpu_id_array_size > 0 && !gpu_id_array)
|
||||
return HSAKMT_STATUS_INVALID_PARAMETER;
|
||||
|
||||
if (coarse_grain && ext_coherent)
|
||||
if (flags.ui32.CoarseGrain && flags.ui32.ExtendedCoherent)
|
||||
return HSAKMT_STATUS_INVALID_PARAMETER;
|
||||
|
||||
object = vm_find_object(address, size_in_bytes, &aperture);
|
||||
@@ -3834,19 +3831,12 @@ HSAKMT_STATUS hsakmt_fmm_register_memory(void *address, uint64_t size_in_bytes,
|
||||
|
||||
/* Register a new user ptr */
|
||||
if (hsakmt_is_svm_api_supported) {
|
||||
ret = fmm_register_mem_svm_api(address,
|
||||
size_in_bytes,
|
||||
coarse_grain,
|
||||
ext_coherent);
|
||||
ret = fmm_register_mem_svm_api(address, size_in_bytes, flags);
|
||||
if (ret == HSAKMT_STATUS_SUCCESS)
|
||||
return ret;
|
||||
pr_debug("SVM failed, falling back to old registration\n");
|
||||
}
|
||||
ret = fmm_register_user_memory(address,
|
||||
size_in_bytes,
|
||||
&object,
|
||||
coarse_grain,
|
||||
ext_coherent);
|
||||
ret = fmm_register_user_memory(address, size_in_bytes, &object, flags);
|
||||
|
||||
if (ret != HSAKMT_STATUS_SUCCESS)
|
||||
return ret;
|
||||
|
||||
@@ -75,8 +75,7 @@ HSAKMT_STATUS hsakmt_fmm_get_aperture_base_and_limit(aperture_type_e aperture_ty
|
||||
HSAKMT_STATUS hsakmt_fmm_register_memory(void *address, uint64_t size_in_bytes,
|
||||
uint32_t *gpu_id_array,
|
||||
uint32_t gpu_id_array_size,
|
||||
bool coarse_grain,
|
||||
bool ext_coherent);
|
||||
HsaMemFlags flags);
|
||||
HSAKMT_STATUS hsakmt_fmm_register_graphics_handle(HSAuint64 GraphicsResourceHandle,
|
||||
HsaGraphicsResourceInfo *GraphicsResourceInfo,
|
||||
uint32_t *gpu_id_array,
|
||||
|
||||
@@ -268,8 +268,11 @@ HSAKMT_STATUS HSAKMTAPI hsaKmtRegisterMemory(void *MemoryAddress,
|
||||
/* TODO: support mixed APU and dGPU configurations */
|
||||
return HSAKMT_STATUS_SUCCESS;
|
||||
|
||||
HsaMemFlags flags;
|
||||
flags.ui32.CoarseGrain = 1;
|
||||
flags.ui32.ExtendedCoherent = 0;
|
||||
return hsakmt_fmm_register_memory(MemoryAddress, MemorySizeInBytes,
|
||||
NULL, 0, true, false);
|
||||
NULL, 0, flags);
|
||||
}
|
||||
|
||||
HSAKMT_STATUS HSAKMTAPI hsaKmtRegisterMemoryToNodes(void *MemoryAddress,
|
||||
@@ -292,10 +295,14 @@ HSAKMT_STATUS HSAKMTAPI hsaKmtRegisterMemoryToNodes(void *MemoryAddress,
|
||||
NumberOfNodes, NodeArray);
|
||||
|
||||
if (ret == HSAKMT_STATUS_SUCCESS) {
|
||||
HsaMemFlags flags;
|
||||
flags.ui32.CoarseGrain = 1;
|
||||
flags.ui32.ExtendedCoherent = 0;
|
||||
|
||||
ret = hsakmt_fmm_register_memory(MemoryAddress, MemorySizeInBytes,
|
||||
gpu_id_array,
|
||||
NumberOfNodes*sizeof(uint32_t),
|
||||
true, false);
|
||||
flags);
|
||||
if (ret != HSAKMT_STATUS_SUCCESS)
|
||||
free(gpu_id_array);
|
||||
}
|
||||
@@ -325,7 +332,7 @@ HSAKMT_STATUS HSAKMTAPI hsaKmtRegisterMemoryWithFlags(void *MemoryAddress,
|
||||
return HSAKMT_STATUS_NOT_SUPPORTED;
|
||||
|
||||
ret = hsakmt_fmm_register_memory(MemoryAddress, MemorySizeInBytes,
|
||||
NULL, 0, MemFlags.ui32.CoarseGrain, MemFlags.ui32.ExtendedCoherent);
|
||||
NULL, 0, MemFlags);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user