kfdtest: Set XNACK mode according HSA_XNACK env setting

According env setting HSA_XNACK=1 or 0, set XNACK mode ON or OFF to run
KFDSVMRangeTest and KFDSVMEvictTest. If HSA_XNACK is not defined, use
system boot-time XNACK mode setting.

Restore to the original XNACK mode when test finished.

Change-Id: Ia896a1b0a90854646c8a79acca38a7d46098efde
Signed-off-by: Philip Yang <Philip.Yang@amd.com>


[ROCm/ROCR-Runtime commit: 23ec6e880e]
Этот коммит содержится в:
Philip Yang
2022-04-04 20:16:59 -04:00
родитель 94a27af7ad
Коммит 949f8fc7aa
4 изменённых файлов: 64 добавлений и 4 удалений
+34
Просмотреть файл
@@ -73,6 +73,7 @@ class KFDBaseComponentTest : public testing::Test {
unsigned int m_numSdmaQueuesPerEngine;
HsaMemFlags m_MemoryFlags;
HsaNodeInfo m_NodeInfo;
HSAint32 m_xnack;
// @brief Executed before every test that uses KFDBaseComponentTest class and sets all common settings for the tests.
virtual void SetUp();
@@ -86,6 +87,39 @@ class KFDBaseComponentTest : public testing::Test {
LOG() << "SVM API not supported" << std::endl;
return supported;
}
void SVMSetXNACKMode() {
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);
ret = hsaKmtSetXNACKMode(xnack_on);
if (ret != HSAKMT_STATUS_SUCCESS)
LOG() << "Failed " << ret << " to set XNACK mode " << xnack_on << std::endl;
}
void SVMRestoreXNACKMode() {
if (!SVMAPISupported())
return;
if (m_xnack == -1)
return;
hsaKmtSetXNACKMode(m_xnack);
}
};
extern KFDBaseComponentTest* g_baseTest;
+20
Просмотреть файл
@@ -35,6 +35,26 @@
#define ALLOCATE_BUF_SIZE_MB (64)
#define ALLOCATE_RETRY_TIMES (3)
void KFDSVMEvictTest::SetUp() {
ROUTINE_START
KFDLocalMemoryTest::SetUp();
SVMSetXNACKMode();
ROUTINE_END
}
void KFDSVMEvictTest::TearDown() {
ROUTINE_START
SVMRestoreXNACKMode();
KFDLocalMemoryTest::TearDown();
ROUTINE_END
}
HSAint32 KFDSVMEvictTest::GetBufferCounter(HSAuint64 vramSize, HSAuint64 vramBufSize) {
HSAuint64 vramBufSizeInPages = vramBufSize >> PAGE_SHIFT;
HSAuint64 sysMemSize = GetSysMemSize();
+4
Просмотреть файл
@@ -49,6 +49,10 @@ class KFDSVMEvictTest : public KFDLocalMemoryTest {
} catch (...) {}
}
protected:
virtual void SetUp();
virtual void TearDown();
protected:
std::string CreateShader();
void AllocBuffers(HSAuint32 defaultGPUNode, HSAuint32 count, HSAuint64 vramBufSize,
+6 -4
Просмотреть файл
@@ -36,6 +36,8 @@ void KFDSVMRangeTest::SetUp() {
m_pIsaGen = IsaGenerator::Create(m_FamilyId);
SVMSetXNACKMode();
ROUTINE_END
}
@@ -46,6 +48,8 @@ void KFDSVMRangeTest::TearDown() {
delete m_pIsaGen;
m_pIsaGen = NULL;
SVMRestoreXNACKMode();
KFDBaseComponentTest::TearDown();
ROUTINE_END
@@ -1287,10 +1291,8 @@ TEST_F(KFDSVMRangeTest, ReadOnlyRangeTest) {
*/
int pid = fork();
if (pid == 0) {
if (hsaKmtOpenKFD() != HSAKMT_STATUS_SUCCESS) {
WARN() << "KFD open failed in child process" << std::endl;
exit(1);
}
TearDown();
SetUp();
} else {
int childStatus;