From 8bbcfca082e918595ce3f668264a630991ae9c88 Mon Sep 17 00:00:00 2001 From: Kent Russell Date: Tue, 16 May 2023 09:13:00 -0400 Subject: [PATCH] kfdtest: Test XNACK on and off for SVM tests Add parameterization for KFDSVM tests so that we test with both XNACK enabled and XNACK disabled. This will be overridden by HSA_XNACK, if set Change-Id: Ie96eb61c03115f947e08cfa076ac459f7440f5d8 [ROCm/ROCR-Runtime commit: 478a68d49c106941990d6707cc3bad4abb2fb028] --- .../kfdtest/src/KFDBaseComponentTest.hpp | 27 +++++++--- .../tests/kfdtest/src/KFDSVMEvictTest.cpp | 7 +-- .../tests/kfdtest/src/KFDSVMEvictTest.hpp | 3 +- .../tests/kfdtest/src/KFDSVMRangeTest.cpp | 52 ++++++++++--------- .../tests/kfdtest/src/KFDSVMRangeTest.hpp | 3 +- 5 files changed, 54 insertions(+), 38 deletions(-) diff --git a/projects/rocr-runtime/tests/kfdtest/src/KFDBaseComponentTest.hpp b/projects/rocr-runtime/tests/kfdtest/src/KFDBaseComponentTest.hpp index 8f714d54b3..22d5bcd12d 100644 --- a/projects/rocr-runtime/tests/kfdtest/src/KFDBaseComponentTest.hpp +++ b/projects/rocr-runtime/tests/kfdtest/src/KFDBaseComponentTest.hpp @@ -92,27 +92,38 @@ class KFDBaseComponentTest : public testing::Test { return supported; } - void SVMSetXNACKMode() { + // Set xnack_override to -1 if parameter is not passed in, to avoid unnecessary code churn + void SVMSetXNACKMode(int xnack_override = -1) { if (!SVMAPISupported()) return; m_xnack = -1; - - char *hsa_xnack = getenv("HSA_XNACK"); - if (!hsa_xnack) - return; - HSAKMT_STATUS ret = hsaKmtGetXNACKMode(&m_xnack); if (ret != HSAKMT_STATUS_SUCCESS) { LOG() << "Failed " << ret << " to get XNACK mode" << std::endl; return; } - // XNACK OFF if defined HSA_XNACK=0 - HSAint32 xnack_on = strncmp(hsa_xnack, "0", 1); + HSAint32 xnack_on = -1; + char *hsa_xnack = getenv("HSA_XNACK"); + + // HSA_XNACK takes priority over kfdtest parameters + if (hsa_xnack) + xnack_on = strncmp(hsa_xnack, "0", 1); + else if (xnack_override > -1) + xnack_on = xnack_override; + else + return; + + // No need to set XNACK if it's already the current value + if (xnack_on == m_xnack) + return; + ret = hsaKmtSetXNACKMode(xnack_on); if (ret != HSAKMT_STATUS_SUCCESS) LOG() << "Failed " << ret << " to set XNACK mode " << xnack_on << std::endl; + else + LOG() << "Setting XNACK mode to " << xnack_on << std::endl; } void SVMRestoreXNACKMode() { diff --git a/projects/rocr-runtime/tests/kfdtest/src/KFDSVMEvictTest.cpp b/projects/rocr-runtime/tests/kfdtest/src/KFDSVMEvictTest.cpp index 75eae28f82..e9ae0ca867 100644 --- a/projects/rocr-runtime/tests/kfdtest/src/KFDSVMEvictTest.cpp +++ b/projects/rocr-runtime/tests/kfdtest/src/KFDSVMEvictTest.cpp @@ -41,7 +41,7 @@ void KFDSVMEvictTest::SetUp() { KFDLocalMemoryTest::SetUp(); - SVMSetXNACKMode(); + SVMSetXNACKMode(GetParam()); ROUTINE_END } @@ -217,7 +217,7 @@ void KFDSVMEvictTest::WaitChildProcesses() { * - Synchronization between the processes, so they know for sure when * they are done allocating memory */ -TEST_F(KFDSVMEvictTest, BasicTest) { +TEST_P(KFDSVMEvictTest, BasicTest) { TEST_REQUIRE_ENV_CAPABILITIES(ENVCAPS_64BITLINUX); TEST_START(TESTPROFILE_RUNALL); @@ -282,7 +282,7 @@ TEST_F(KFDSVMEvictTest, BasicTest) { * - notify shader to quit * - check result buffer with specific value to confirm all wavefronts quit normally */ -TEST_F(KFDSVMEvictTest, QueueTest) { +TEST_P(KFDSVMEvictTest, QueueTest) { TEST_REQUIRE_ENV_CAPABILITIES(ENVCAPS_64BITLINUX); TEST_START(TESTPROFILE_RUNALL) @@ -383,3 +383,4 @@ TEST_F(KFDSVMEvictTest, QueueTest) { TEST_END } +INSTANTIATE_TEST_CASE_P(, KFDSVMEvictTest,::testing::Values(0, 1)); diff --git a/projects/rocr-runtime/tests/kfdtest/src/KFDSVMEvictTest.hpp b/projects/rocr-runtime/tests/kfdtest/src/KFDSVMEvictTest.hpp index 7e772105ae..16b2a71f31 100644 --- a/projects/rocr-runtime/tests/kfdtest/src/KFDSVMEvictTest.hpp +++ b/projects/rocr-runtime/tests/kfdtest/src/KFDSVMEvictTest.hpp @@ -31,7 +31,8 @@ // @class KFDEvictTest // Test eviction and restore procedure using two processes -class KFDSVMEvictTest : public KFDLocalMemoryTest { +class KFDSVMEvictTest : public KFDLocalMemoryTest, + public ::testing::WithParamInterface { public: KFDSVMEvictTest(void): m_ChildStatus(HSAKMT_STATUS_ERROR), m_IsParent(true) {} diff --git a/projects/rocr-runtime/tests/kfdtest/src/KFDSVMRangeTest.cpp b/projects/rocr-runtime/tests/kfdtest/src/KFDSVMRangeTest.cpp index ba502da94c..86ec70f0fb 100644 --- a/projects/rocr-runtime/tests/kfdtest/src/KFDSVMRangeTest.cpp +++ b/projects/rocr-runtime/tests/kfdtest/src/KFDSVMRangeTest.cpp @@ -35,7 +35,7 @@ void KFDSVMRangeTest::SetUp() { KFDBaseComponentTest::SetUp(); - SVMSetXNACKMode(); + SVMSetXNACKMode(GetParam()); ROUTINE_END } @@ -50,7 +50,7 @@ void KFDSVMRangeTest::TearDown() { ROUTINE_END } -TEST_F(KFDSVMRangeTest, BasicSystemMemTest) { +TEST_P(KFDSVMRangeTest, BasicSystemMemTest) { TEST_REQUIRE_ENV_CAPABILITIES(ENVCAPS_64BITLINUX); TEST_START(TESTPROFILE_RUNALL); @@ -93,7 +93,7 @@ TEST_F(KFDSVMRangeTest, BasicSystemMemTest) { TEST_END } -TEST_F(KFDSVMRangeTest, SetGetAttributesTest) { +TEST_P(KFDSVMRangeTest, SetGetAttributesTest) { TEST_REQUIRE_ENV_CAPABILITIES(ENVCAPS_64BITLINUX); TEST_START(TESTPROFILE_RUNALL) @@ -167,7 +167,7 @@ TEST_F(KFDSVMRangeTest, SetGetAttributesTest) { TEST_END } -TEST_F(KFDSVMRangeTest, XNACKModeTest) { +TEST_P(KFDSVMRangeTest, XNACKModeTest) { TEST_REQUIRE_ENV_CAPABILITIES(ENVCAPS_64BITLINUX); TEST_START(TESTPROFILE_RUNALL); @@ -204,7 +204,7 @@ TEST_F(KFDSVMRangeTest, XNACKModeTest) { TEST_END } -TEST_F(KFDSVMRangeTest, InvalidRangeTest) { +TEST_P(KFDSVMRangeTest, InvalidRangeTest) { TEST_START(TESTPROFILE_RUNALL) if (!SVMAPISupported()) @@ -303,7 +303,7 @@ void KFDSVMRangeTest::SplitRangeTest(int defaultGPUNode, int prefetch_location) delete sysBuffer; } -TEST_F(KFDSVMRangeTest, SplitSystemRangeTest) { +TEST_P(KFDSVMRangeTest, SplitSystemRangeTest) { const HsaNodeProperties *pNodeProperties = m_NodeInfo.HsaDefaultGPUNodeProperties(); TEST_START(TESTPROFILE_RUNALL) @@ -323,7 +323,7 @@ TEST_F(KFDSVMRangeTest, SplitSystemRangeTest) { TEST_END } -TEST_F(KFDSVMRangeTest, EvictSystemRangeTest) { +TEST_P(KFDSVMRangeTest, EvictSystemRangeTest) { const HsaNodeProperties *pNodeProperties = m_NodeInfo.HsaDefaultGPUNodeProperties(); TEST_START(TESTPROFILE_RUNALL) @@ -426,7 +426,7 @@ TEST_F(KFDSVMRangeTest, EvictSystemRangeTest) { TEST_END } -TEST_F(KFDSVMRangeTest, PartialUnmapSysMemTest) { +TEST_P(KFDSVMRangeTest, PartialUnmapSysMemTest) { TEST_REQUIRE_ENV_CAPABILITIES(ENVCAPS_64BITLINUX); TEST_START(TESTPROFILE_RUNALL); @@ -478,7 +478,7 @@ TEST_F(KFDSVMRangeTest, PartialUnmapSysMemTest) { TEST_END } -TEST_F(KFDSVMRangeTest, BasicVramTest) { +TEST_P(KFDSVMRangeTest, BasicVramTest) { TEST_REQUIRE_ENV_CAPABILITIES(ENVCAPS_64BITLINUX); TEST_START(TESTPROFILE_RUNALL); @@ -526,7 +526,7 @@ TEST_F(KFDSVMRangeTest, BasicVramTest) { TEST_END } -TEST_F(KFDSVMRangeTest, SplitVramRangeTest) { +TEST_P(KFDSVMRangeTest, SplitVramRangeTest) { TEST_START(TESTPROFILE_RUNALL) if (!SVMAPISupported()) @@ -544,7 +544,7 @@ TEST_F(KFDSVMRangeTest, SplitVramRangeTest) { TEST_END } -TEST_F(KFDSVMRangeTest, PrefetchTest) { +TEST_P(KFDSVMRangeTest, PrefetchTest) { TEST_START(TESTPROFILE_RUNALL); if (!SVMAPISupported()) @@ -582,7 +582,7 @@ TEST_F(KFDSVMRangeTest, PrefetchTest) { TEST_END } -TEST_F(KFDSVMRangeTest, MigrateTest) { +TEST_P(KFDSVMRangeTest, MigrateTest) { TEST_REQUIRE_ENV_CAPABILITIES(ENVCAPS_64BITLINUX); TEST_START(TESTPROFILE_RUNALL); @@ -671,7 +671,7 @@ TEST_F(KFDSVMRangeTest, MigrateTest) { * 4. Use GPU sdma to fill the range in system memory * 5. Check if data is correct in system memory */ -TEST_F(KFDSVMRangeTest, MigrateAccessInPlaceTest) { +TEST_P(KFDSVMRangeTest, MigrateAccessInPlaceTest) { TEST_REQUIRE_ENV_CAPABILITIES(ENVCAPS_64BITLINUX); TEST_START(TESTPROFILE_RUNALL); @@ -735,7 +735,7 @@ TEST_F(KFDSVMRangeTest, MigrateAccessInPlaceTest) { * [ 292.730010] amdgpu:svm_migrate_to_ram:744: CPU page fault address 0x7f22597f1000 * [ 292.730931] amdgpu:svm_migrate_to_ram:744: CPU page fault address 0x7f22597f2000 */ -TEST_F(KFDSVMRangeTest, MigrateGranularityTest) { +TEST_P(KFDSVMRangeTest, MigrateGranularityTest) { TEST_REQUIRE_ENV_CAPABILITIES(ENVCAPS_64BITLINUX); TEST_START(TESTPROFILE_RUNALL); @@ -789,7 +789,7 @@ TEST_F(KFDSVMRangeTest, MigrateGranularityTest) { TEST_END } -TEST_F(KFDSVMRangeTest, MigrateLargeBufTest) { +TEST_P(KFDSVMRangeTest, MigrateLargeBufTest) { TEST_REQUIRE_ENV_CAPABILITIES(ENVCAPS_64BITLINUX); TEST_START(TESTPROFILE_RUNALL); @@ -877,7 +877,7 @@ TEST_F(KFDSVMRangeTest, MigrateLargeBufTest) { TEST_END } -TEST_F(KFDSVMRangeTest, MigratePolicyTest) { +TEST_P(KFDSVMRangeTest, MigratePolicyTest) { TEST_REQUIRE_ENV_CAPABILITIES(ENVCAPS_64BITLINUX); TEST_START(TESTPROFILE_RUNALL); @@ -983,7 +983,7 @@ TEST_F(KFDSVMRangeTest, MigratePolicyTest) { * * Test will skip if only one GPU found */ -TEST_F(KFDSVMRangeTest, MultiGPUMigrationTest) { +TEST_P(KFDSVMRangeTest, MultiGPUMigrationTest) { TEST_REQUIRE_ENV_CAPABILITIES(ENVCAPS_64BITLINUX); TEST_START(TESTPROFILE_RUNALL); @@ -1067,7 +1067,7 @@ TEST_F(KFDSVMRangeTest, MultiGPUMigrationTest) { * * Test will skip if only one GPU found */ -TEST_F(KFDSVMRangeTest, MultiGPUAccessInPlaceTest) { +TEST_P(KFDSVMRangeTest, MultiGPUAccessInPlaceTest) { TEST_REQUIRE_ENV_CAPABILITIES(ENVCAPS_64BITLINUX); TEST_START(TESTPROFILE_RUNALL); @@ -1167,7 +1167,7 @@ unsigned int GpuReadThread(void* p) { return 0; } -TEST_F(KFDSVMRangeTest, MultiThreadMigrationTest) { +TEST_P(KFDSVMRangeTest, MultiThreadMigrationTest) { TEST_REQUIRE_ENV_CAPABILITIES(ENVCAPS_64BITLINUX); TEST_START(TESTPROFILE_RUNALL); @@ -1228,7 +1228,7 @@ TEST_F(KFDSVMRangeTest, MultiThreadMigrationTest) { * 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_P(KFDSVMRangeTest, MigrateFileBackedRangeTest) { TEST_REQUIRE_ENV_CAPABILITIES(ENVCAPS_64BITLINUX); TEST_START(TESTPROFILE_RUNALL); @@ -1287,7 +1287,7 @@ TEST_F(KFDSVMRangeTest, MigrateFileBackedRangeTest) { * Map read only range to GPU, test sdma can read the range * write to range should trigger GPU vm fault for both xnack on and off */ -TEST_F(KFDSVMRangeTest, ReadOnlyRangeTest) { +TEST_P(KFDSVMRangeTest, ReadOnlyRangeTest) { TEST_REQUIRE_ENV_CAPABILITIES(ENVCAPS_64BITLINUX); TEST_START(TESTPROFILE_RUNALL); @@ -1448,7 +1448,7 @@ unsigned int ReadSMIEventThread(void* p) { return 0; } -TEST_F(KFDSVMRangeTest, HMMProfilingEvent) { +TEST_P(KFDSVMRangeTest, HMMProfilingEvent) { TEST_REQUIRE_ENV_CAPABILITIES(ENVCAPS_64BITLINUX); TEST_START(TESTPROFILE_RUNALL); @@ -1498,7 +1498,7 @@ TEST_F(KFDSVMRangeTest, HMMProfilingEvent) { * KFD should support VRAM overcommitment by evicting SVM ranges to system memory to alloc * VRAM for new ranges. */ -TEST_F(KFDSVMRangeTest, VramOvercommitTest) { +TEST_P(KFDSVMRangeTest, VramOvercommitTest) { TEST_REQUIRE_ENV_CAPABILITIES(ENVCAPS_64BITLINUX); TEST_START(TESTPROFILE_RUNALL); @@ -1558,7 +1558,7 @@ TEST_F(KFDSVMRangeTest, VramOvercommitTest) { * by spliting giant range into smaller ranges, evicting SVM ranges to system memory to * alloc VRAM for overcommitment ranges. */ -TEST_F(KFDSVMRangeTest, VramOvercommitGiantRangeTest) { +TEST_P(KFDSVMRangeTest, VramOvercommitGiantRangeTest) { TEST_REQUIRE_ENV_CAPABILITIES(ENVCAPS_64BITLINUX); TEST_START(TESTPROFILE_RUNALL); @@ -1608,7 +1608,7 @@ TEST_F(KFDSVMRangeTest, VramOvercommitGiantRangeTest) { * use sdma to memset the rest 2 pages, each page has different value 0x1, 0x2, 0x3, 0x4 * then check if all page have the specific value after migrating 4 pages to system memory. */ -TEST_F(KFDSVMRangeTest, PrefaultPartialRangeTest) { +TEST_P(KFDSVMRangeTest, PrefaultPartialRangeTest) { TEST_REQUIRE_ENV_CAPABILITIES(ENVCAPS_64BITLINUX); TEST_START(TESTPROFILE_RUNALL); @@ -1653,3 +1653,5 @@ TEST_F(KFDSVMRangeTest, PrefaultPartialRangeTest) { munmap(pBuf, BufSize); TEST_END } + +INSTANTIATE_TEST_CASE_P(, KFDSVMRangeTest,::testing::Values(0, 1)); diff --git a/projects/rocr-runtime/tests/kfdtest/src/KFDSVMRangeTest.hpp b/projects/rocr-runtime/tests/kfdtest/src/KFDSVMRangeTest.hpp index 03a245dba3..0f0d8a0f4d 100644 --- a/projects/rocr-runtime/tests/kfdtest/src/KFDSVMRangeTest.hpp +++ b/projects/rocr-runtime/tests/kfdtest/src/KFDSVMRangeTest.hpp @@ -28,7 +28,8 @@ #include "KFDBaseComponentTest.hpp" -class KFDSVMRangeTest : public KFDBaseComponentTest { +class KFDSVMRangeTest : public KFDBaseComponentTest, + public ::testing::WithParamInterface { public: KFDSVMRangeTest() {} ~KFDSVMRangeTest() {}