From 0d145b951a79c85d36ceeecd3f9ce9096c3c5bf5 Mon Sep 17 00:00:00 2001 From: Felix Kuehling Date: Thu, 29 Jun 2017 12:43:14 -0400 Subject: [PATCH] Make HSA_DISABLE_CACHE work on gfx900 Change-Id: I624390bfa70b2ff4cefd1bbdf8d960b7121f22bb Signed-off-by: Felix Kuehling [ROCm/ROCR-Runtime commit: c48ff6b4826f88233ca908f7ecad5a4faf629ff8] --- projects/rocr-runtime/src/fmm.c | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/projects/rocr-runtime/src/fmm.c b/projects/rocr-runtime/src/fmm.c index 4ee9d71278..6c5f23f379 100644 --- a/projects/rocr-runtime/src/fmm.c +++ b/projects/rocr-runtime/src/fmm.c @@ -44,7 +44,8 @@ .guard_pages = 1, \ .vm_ranges = NULL, \ .vm_objects = NULL, \ - .fmm_mutex = PTHREAD_MUTEX_INITIALIZER \ + .fmm_mutex = PTHREAD_MUTEX_INITIALIZER, \ + .is_coherent = false \ } struct vm_object { @@ -96,6 +97,7 @@ typedef struct { vm_area_t *vm_ranges; vm_object_t *vm_objects; pthread_mutex_t fmm_mutex; + bool is_coherent; } manageable_aperture_t; typedef struct { @@ -1028,6 +1030,9 @@ void *fmm_allocate_device(uint32_t gpu_id, uint64_t MemorySizeInBytes, HsaMemFla offset = GPUVM_APP_OFFSET; } + if (aperture->is_coherent) + ioc_flags |= KFD_IOC_ALLOC_MEM_FLAGS_COHERENT; + mem = __fmm_allocate_device(gpu_id, size, aperture, offset, &mmap_offset, ioc_flags, &vm_obj); @@ -1156,13 +1161,15 @@ static void *fmm_allocate_host_gpu(uint32_t node_id, uint64_t MemorySizeInBytes, size = MemorySizeInBytes; ioc_flags = 0; - if (flags.ui32.CoarseGrain) { + if (flags.ui32.CoarseGrain) aperture = &svm.dgpu_aperture; - } else { - aperture = &svm.dgpu_alt_aperture; /* coherent */ + else + aperture = &svm.dgpu_alt_aperture; /* always coherent */ + + if (aperture->is_coherent) ioc_flags |= KFD_IOC_ALLOC_MEM_FLAGS_COHERENT; - } ioc_flags |= fmm_translate_hsa_to_ioc_flags(flags); + if (flags.ui32.AQLQueueMemory) size = MemorySizeInBytes * 2; @@ -1548,7 +1555,9 @@ HSAKMT_STATUS fmm_init_process_apertures(unsigned int NumNodes) alt_size = (alt_size + 0xffff) & ~0xffffULL; svm.dgpu_alt_aperture.base = (void *)alt_base; svm.dgpu_alt_aperture.limit = (void *)(alt_base + alt_size - 1); + svm.dgpu_alt_aperture.is_coherent = true; svm.dgpu_aperture.base = VOID_PTR_ADD(svm.dgpu_alt_aperture.limit, 1); + svm.dgpu_aperture.is_coherent = !!disableCache; err = fmm_set_memory_policy(gpu_mem[gpu_mem_id].gpu_id, disableCache ? KFD_IOC_CACHE_POLICY_COHERENT :