From 2d80a002010840322d57f46c7de650f32be99624 Mon Sep 17 00:00:00 2001 From: Philip Yang Date: Tue, 29 Jun 2021 16:57:16 -0400 Subject: [PATCH] kfdtest: add KFDSVMRangeTest MigrateFileBackedRangeTest To test if SVM support address mmap on file backed memory. Change-Id: I227cc0b44d167c4fa2e63257e13a481aefa4f750 Signed-off-by: Philip Yang [ROCm/ROCR-Runtime commit: d91f92669b7a4c6f9cf0dc84d30800424ce6604a] --- .../tests/kfdtest/src/KFDSVMRangeTest.cpp | 60 +++++++++++++++++++ 1 file changed, 60 insertions(+) diff --git a/projects/rocr-runtime/tests/kfdtest/src/KFDSVMRangeTest.cpp b/projects/rocr-runtime/tests/kfdtest/src/KFDSVMRangeTest.cpp index ecec01d4ac..6c7e3fd2af 100644 --- a/projects/rocr-runtime/tests/kfdtest/src/KFDSVMRangeTest.cpp +++ b/projects/rocr-runtime/tests/kfdtest/src/KFDSVMRangeTest.cpp @@ -1197,3 +1197,63 @@ TEST_F(KFDSVMRangeTest, MultiThreadMigrationTest) { TEST_END } + +/* + * Test SVM support file backed range + * + * Create temp file, mmap to alloc memory backed on file. + * Create file backed svm range, to map to GPU for xnack on or off + * Use sdma to write data to memory, should write to file + * Close file, and then check if file data is updated correctly + */ +TEST_F(KFDSVMRangeTest, MigrateFileBackedRangeTest) { + TEST_REQUIRE_ENV_CAPABILITIES(ENVCAPS_64BITLINUX); + TEST_START(TESTPROFILE_RUNALL); + + if (!SVMAPISupported()) + return; + + int defaultGPUNode = m_NodeInfo.HsaDefaultGPUNode(); + ASSERT_GE(defaultGPUNode, 0) << "failed to get default GPU Node"; + + if (m_FamilyId < FAMILY_AI) { + LOG() << std::hex << "Skipping test: No svm range support for family ID 0x" << m_FamilyId << "." << std::endl; + return; + } + + char tmpfname[] = "/tmp/kfdtest-XXXXXX"; + int fd = mkostemp(tmpfname, 0600); + ASSERT_NE(-1, fd); + + size_t size = PAGE_SIZE; + char buf[size] = {0x30}; + + ASSERT_EQ(size, write(fd, buf, size)); + + void *MmapedFile = mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); + ASSERT_NE(nullptr, MmapedFile); + + HsaSVMRange filebackedRange(MmapedFile, size, defaultGPUNode, defaultGPUNode); + + SDMAQueue sdmaQueue; + EXPECT_SUCCESS(sdmaQueue.Create(defaultGPUNode)); + + sdmaQueue.PlaceAndSubmitPacket(SDMAFillDataPacket(sdmaQueue.GetFamilyId(), + MmapedFile, 0x33333333, size)); + sdmaQueue.Wait4PacketConsumption(); + + EXPECT_SUCCESS(sdmaQueue.Destroy()); + munmap(MmapedFile, size); + EXPECT_SUCCESS(close(fd)); + + fd = open(tmpfname, O_RDONLY); + ASSERT_NE(-1, fd); + + ASSERT_EQ(size, read(fd, buf, size)); + EXPECT_EQ(0x33, buf[0]); + + EXPECT_SUCCESS(close(fd)); + EXPECT_SUCCESS(remove(tmpfname)); + + TEST_END +}