diff --git a/libhsakmt/tests/kfdtest/include/amdp2ptest.h b/libhsakmt/tests/kfdtest/include/amdp2ptest.h index b465e24790..239e7e98d0 100644 --- a/libhsakmt/tests/kfdtest/include/amdp2ptest.h +++ b/libhsakmt/tests/kfdtest/include/amdp2ptest.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2015-2018 Advanced Micro Devices, Inc. All Rights Reserved. + * Copyright 2015-2024 Advanced Micro Devices, Inc. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), @@ -13,12 +13,11 @@ * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR * OTHER DEALINGS IN THE SOFTWARE. - * */ #ifndef AMDP2PTEST_H_ #define AMDP2PTEST_H_ @@ -44,6 +43,11 @@ struct AMDRDMA_IOCTL_GET_PAGES_PARAM { /* Input parameters */ uint64_t addr; uint64_t length; + uint64_t is_local; /* 1 if this is the pointer to local + allocation */ + + /* Output parameters */ + uint64_t cpu_ptr; }; @@ -53,12 +57,6 @@ struct AMDRDMA_IOCTL_PUT_PAGES_PARAM { uint64_t length; }; -struct AMDRDMA_IOCTL_IS_GPU_ADDRESS_PARAM { - /* Input parameters */ - uint64_t addr; - uint64_t ret_value; -}; - #define AMD2P2PTEST_IOCTL_GET_PAGE_SIZE \ _IOWR(AMDP2PTEST_IOCTL_MAGIC, 1, struct AMDRDMA_IOCTL_GET_PAGE_SIZE_PARAM *) @@ -69,8 +67,5 @@ _IOWR(AMDP2PTEST_IOCTL_MAGIC, 2, struct AMDRDMA_IOCTL_GET_PAGES_PARAM *) #define AMD2P2PTEST_IOCTL_PUT_PAGES \ _IOW(AMDP2PTEST_IOCTL_MAGIC, 3, struct AMDRDMA_IOCTL_PUT_PAGES_PARAM *) -#define AMD2P2PTEST_IOCTL_IS_GPU_ADDRESS \ -_IOW(AMDP2PTEST_IOCTL_MAGIC, 4, struct AMDRDMA_IOCTL_IS_GPU_ADDRESS *) - #endif /* AMDP2PTEST_H */ diff --git a/libhsakmt/tests/kfdtest/src/RDMATest.cpp b/libhsakmt/tests/kfdtest/src/RDMATest.cpp index d44d69895e..1931ea1741 100644 --- a/libhsakmt/tests/kfdtest/src/RDMATest.cpp +++ b/libhsakmt/tests/kfdtest/src/RDMATest.cpp @@ -112,3 +112,92 @@ TEST_F(RDMATest, GPUDirect) { TEST_END } + +TEST_F(RDMATest, ContiguousVRAMAllocation) { + TEST_REQUIRE_ENV_CAPABILITIES(ENVCAPS_64BITLINUX); + TEST_START(TESTPROFILE_RUNALL); + + HSAuint64 AlternateVAGPU; + + PM4Queue queue; + unsigned long BufferSize = 4UL << 30; + + int defaultGPUNode = m_NodeInfo.HsaDefaultGPUNode(); + ASSERT_GE(defaultGPUNode, 0) << "failed to get default GPU Node"; + + HsaMemoryBuffer isaBuffer(PAGE_SIZE, defaultGPUNode); + HsaMemoryBuffer srcSysBuffer(PAGE_SIZE, defaultGPUNode, false); + void *LocalBuffer; + HsaMemFlags memFlags = {0}; + int ret; + + memFlags.ui32.NonPaged = 1; + memFlags.ui32.Contiguous = 1; + ret = hsaKmtAllocMemory(defaultGPUNode, BufferSize, memFlags, &LocalBuffer); + if (ret == HSAKMT_STATUS_NOT_SUPPORTED) { + LOG() << "KFD does not support contiguous memory, skipping the test" << std::endl; + return; + } + + ASSERT_SUCCESS(hsaKmtMapMemoryToGPU(srcSysBuffer.As(), + srcSysBuffer.Size(), + &AlternateVAGPU)); + ASSERT_SUCCESS(hsaKmtMapMemoryToGPU(LocalBuffer, BufferSize, &AlternateVAGPU)); + + /* Fill up srcSysBuffer */ + srcSysBuffer.Fill(0xfe); + + /* Put 'copy dword' command to ISA buffer */ + ASSERT_SUCCESS(m_pAsm->RunAssembleBuf(CopyDwordIsa, isaBuffer.As())); + + ASSERT_SUCCESS(queue.Create(defaultGPUNode)); + Dispatch dispatch(isaBuffer); + + /* Submit the command to GPU so GPU will copy from system memory + * (srcSysBuffer) to local memory(LocalBuffer) + */ + dispatch.SetArgs(srcSysBuffer.As(), LocalBuffer); + dispatch.Submit(queue); + dispatch.Sync(g_TestTimeOut); // GPU executed the command + + EXPECT_SUCCESS(queue.Destroy()); + + LocalMemoryAccess Rdma; + void *gpuAddr; + + Rdma.Open(); + if (Rdma.fd < 0) { + LOG() << "amdp2ptest.ko driver not loaded, skipping RDMA getpages" << std::endl; + goto exit; + } + + /* GetPages asks the test driver to convert GPU virtual memory to DMA/ + * Physical memory and save it in the list. rdma_mmap maps the memory to + * user space memory. + */ + ret = Rdma.GetPages((uint64_t)LocalBuffer, BufferSize); + ASSERT_EQ(ret, 0) << "Failed to get pages"; + + gpuAddr = Rdma.MMap((uint64_t)LocalBuffer, BufferSize); + ASSERT_GE((int64_t)gpuAddr, 0) << "Failed to map RDMA address."; + + printf("contiguous VRAM address %p size 0x%lx bytes\n", LocalBuffer, BufferSize); + printf("Pause to dump page table to check if allocation is contiguous\n"); + printf("Press Enter key to continue\n"); + getchar(); + + /* Read the memory to confirm that application can read the local memory + * correctly from the mapped address. + */ + EXPECT_EQ(memcmp(gpuAddr, srcSysBuffer.As(), 4), 0); + + Rdma.UnMap(gpuAddr, PAGE_SIZE); + Rdma.Close(); + +exit: + EXPECT_SUCCESS(hsaKmtUnmapMemoryToGPU(srcSysBuffer.As())); + EXPECT_SUCCESS(hsaKmtUnmapMemoryToGPU(LocalBuffer)); + EXPECT_SUCCESS(hsaKmtFreeMemory(LocalBuffer, BufferSize)); + + TEST_END +} diff --git a/libhsakmt/tests/kfdtest/src/RDMAUtil.cpp b/libhsakmt/tests/kfdtest/src/RDMAUtil.cpp index 20246f9003..3a95f0e65c 100644 --- a/libhsakmt/tests/kfdtest/src/RDMAUtil.cpp +++ b/libhsakmt/tests/kfdtest/src/RDMAUtil.cpp @@ -60,7 +60,7 @@ void *LocalMemoryAccess::MMap(uint64_t offset, size_t size) { if (fd <= 0) return NULL; - gpuAddr = mmap(NULL, size, PROT_READ, MAP_PRIVATE, fd, offset); + gpuAddr = mmap(NULL, size, PROT_READ, MAP_SHARED, fd, offset); return gpuAddr; }