From 1ff5cb33b237ed12ff8ec7613fded3f3b52ada48 Mon Sep 17 00:00:00 2001 From: Jonathan Kim Date: Tue, 13 Aug 2019 10:47:51 -0400 Subject: [PATCH] add new queue bit test on clear event enable thunk query api to report if queue is newly created test new queue bit test on clear events. also fixup cleanup to disable debug trap. Change-Id: I3ebe2d85da66f28b8c82f0e68461ee7d32ec0b0d Signed-off-by: Jonathan Kim Reviewed-by: Philip Cox Reviewed-by: Felix Kuehling --- include/hsakmt.h | 3 +- include/linux/kfd_ioctl.h | 3 +- src/debug.c | 6 ++-- tests/kfdtest/src/KFDDBGTest.cpp | 61 +++++++++++++++++++++----------- 4 files changed, 49 insertions(+), 24 deletions(-) diff --git a/include/hsakmt.h b/include/hsakmt.h index 7c62ee69f1..49d255a868 100644 --- a/include/hsakmt.h +++ b/include/hsakmt.h @@ -822,7 +822,8 @@ hsaKmtQueryDebugEvent( HSAuint32 *QueueId, // IN/OUT bool ClearEvents, // IN HSA_DEBUG_EVENT_TYPE *EventsReceived, // OUT - bool *IsSuspended // OUT + bool *IsSuspended, // OUT + bool *IsNew //OUT ); /** diff --git a/include/linux/kfd_ioctl.h b/include/linux/kfd_ioctl.h index 7a1185c823..89a18cda15 100644 --- a/include/linux/kfd_ioctl.h +++ b/include/linux/kfd_ioctl.h @@ -191,9 +191,10 @@ struct kfd_ioctl_dbg_wave_control_args { #define KFD_DBG_EV_STATUS_TRAP 1 #define KFD_DBG_EV_STATUS_VMFAULT 2 #define KFD_DBG_EV_STATUS_SUSPENDED 4 +#define KFD_DBG_EV_STATUS_NEW_QUEUE 8 #define KFD_DBG_EV_FLAG_CLEAR_STATUS 1 -#define KFD_INVALID_QUEUEID 0xFFFFFFFFFFFFFFFFULL +#define KFD_INVALID_QUEUEID 0xffffffff /* KFD_IOC_DBG_TRAP_ENABLE: * ptr: unused diff --git a/src/debug.c b/src/debug.c index ac7e3c641d..f111d7ff75 100644 --- a/src/debug.c +++ b/src/debug.c @@ -564,7 +564,8 @@ hsaKmtQueryDebugEvent( HSAuint32 *QueueId, // IN/OUT bool ClearEvents, // IN HSA_DEBUG_EVENT_TYPE *EventsReceived, // OUT - bool *IsSuspended // OUT + bool *IsSuspended, // OUT + bool *IsNew // OUT ) { HSAKMT_STATUS result; @@ -589,7 +590,8 @@ hsaKmtQueryDebugEvent( *QueueId = argout.data1; *EventsReceived = argout.data3 & (KFD_DBG_EV_STATUS_TRAP | KFD_DBG_EV_STATUS_VMFAULT); - *IsSuspended = (argout.data3 & KFD_DBG_EV_STATUS_SUSPENDED) >> 2; + *IsSuspended = argout.data3 & KFD_DBG_EV_STATUS_SUSPENDED; + *IsNew = argout.data3 & KFD_DBG_EV_STATUS_NEW_QUEUE; return result; } diff --git a/tests/kfdtest/src/KFDDBGTest.cpp b/tests/kfdtest/src/KFDDBGTest.cpp index 3fd83c2e52..edd0993474 100644 --- a/tests/kfdtest/src/KFDDBGTest.cpp +++ b/tests/kfdtest/src/KFDDBGTest.cpp @@ -434,12 +434,14 @@ TEST_F(KFDDBGTest, BasicDebuggerQueryQueueStatus) { HSA_QUEUEID queueIds[1] = { qResources->QueueId}; HSA_DEBUG_EVENT_TYPE EventReceived; bool IsSuspended = false; + bool IsNew = false; ASSERT_SUCCESS(hsaKmtQueryDebugEvent(defaultGPUNode, INVALID_PID, &qid, false, &EventReceived, - &IsSuspended)); + &IsSuspended, &IsNew)); ASSERT_NE(qid, invalidQid); ASSERT_EQ(IsSuspended, false); + ASSERT_EQ(IsNew, true); ASSERT_EQ(EventReceived, HSA_DEBUG_EVENT_TYPE_TRAP); // suspend queue, query suspended queue and clear pending event @@ -451,16 +453,17 @@ TEST_F(KFDDBGTest, BasicDebuggerQueryQueueStatus) { ASSERT_SUCCESS(hsaKmtQueryDebugEvent(defaultGPUNode, INVALID_PID, &qid, true, &EventReceived, - &IsSuspended)); + &IsSuspended, &IsNew)); ASSERT_EQ(IsSuspended, true); ASSERT_SUCCESS(hsaKmtQueueResume(INVALID_PID, 1, queueIds, 0)); ASSERT_SUCCESS(hsaKmtQueryDebugEvent(defaultGPUNode, INVALID_PID, &qid, false, &EventReceived, - &IsSuspended)); + &IsSuspended, &IsNew)); ASSERT_EQ(IsSuspended, false); + ASSERT_EQ(IsNew, false); ASSERT_EQ(EventReceived, HSA_DEBUG_EVENT_TYPE_NONE); dispatch->Sync(); @@ -482,7 +485,8 @@ static void ExitVMFaultQueryChild(std::string errMsg, HSAint32 pollFd, PM4Queue *queue1, PM4Queue *queue2, - HsaEvent *event) { + HsaEvent *event, + int gpuNode) { if (queue1) queue1->Destroy(); @@ -500,6 +504,14 @@ static void ExitVMFaultQueryChild(std::string errMsg, if (pollFd >= 0) close(pollFd); + if (gpuNode >= 0) { + int ret = hsaKmtDisableDebugTrap(gpuNode); + if (ret) { + exitStatus = 1; + errMsg = "debug trap failed to disable"; + } + } + if (!errMsg.empty()) WARN() << errMsg << std::endl; @@ -525,7 +537,7 @@ TEST_F(KFDDBGTest, BasicDebuggerQueryVMFaultQueueStatus) { ret = hsaKmtOpenKFD(); if (ret != HSAKMT_STATUS_SUCCESS) ExitVMFaultQueryChild("KFD open failed", - 1, -1, NULL, NULL, NULL); + 1, -1, NULL, NULL, NULL, -1); // enable debug trap and check poll fd creation ret = hsaKmtEnableDebugTrapWithPollFd(defaultGPUNode, @@ -534,7 +546,7 @@ TEST_F(KFDDBGTest, BasicDebuggerQueryVMFaultQueueStatus) { if (ret != HSAKMT_STATUS_SUCCESS || PollFd <= 0) ExitVMFaultQueryChild("enable debug trap with poll fd failed", - 1, -1, NULL, NULL, NULL); + 1, -1, NULL, NULL, NULL, defaultGPUNode); // create shader, vmfault and trap bufs then enable 2nd level trap HsaMemoryBuffer vmFaultBuf(PAGE_SIZE, defaultGPUNode, true, false, @@ -560,7 +572,8 @@ TEST_F(KFDDBGTest, BasicDebuggerQueryVMFaultQueueStatus) { if (ret != HSAKMT_STATUS_SUCCESS) ExitVMFaultQueryChild("setting trap handler failed", - 1, PollFd, NULL, NULL, NULL); + 1, PollFd, NULL, NULL, NULL, + defaultGPUNode); // compile and dispatch shader m_pIsaGen->CompileShader(jump_to_trap_gfx9, "jump_to_trap", @@ -571,11 +584,13 @@ TEST_F(KFDDBGTest, BasicDebuggerQueryVMFaultQueueStatus) { HSAuint32 qid1; if (queue1.Create(defaultGPUNode) != HSAKMT_STATUS_SUCCESS) ExitVMFaultQueryChild("queue 1 creation failed", - 1, PollFd, NULL, NULL, NULL); + 1, PollFd, NULL, NULL, NULL, + defaultGPUNode); if (queue2.Create(defaultGPUNode) != HSAKMT_STATUS_SUCCESS) ExitVMFaultQueryChild("queue 2 creation failed", - 1, PollFd, &queue1, NULL, NULL); + 1, PollFd, &queue1, NULL, NULL, + defaultGPUNode); unsigned int* iter = iterBuf.As(); unsigned int* result = resBuf.As(); @@ -593,7 +608,8 @@ TEST_F(KFDDBGTest, BasicDebuggerQueryVMFaultQueueStatus) { fds[0].events = POLLIN | POLLRDNORM; if (poll(fds, 1, 5000) <= 0) ExitVMFaultQueryChild("poll wake on pending trap event failed", - 1, PollFd, &queue1, &queue2, NULL); + 1, PollFd, &queue1, &queue2, NULL, + defaultGPUNode); int kMaxSize = 4096; char fifoBuf[kMaxSize]; @@ -601,23 +617,27 @@ TEST_F(KFDDBGTest, BasicDebuggerQueryVMFaultQueueStatus) { || strchr(fifoBuf, 't') == NULL; if (childStatus) ExitVMFaultQueryChild("read on pending trap event failed", - 1, PollFd, &queue1, &queue2, NULL); + 1, PollFd, &queue1, &queue2, NULL, + defaultGPUNode); memset(fifoBuf, 0, sizeof(fifoBuf)); HSA_DEBUG_EVENT_TYPE EventReceived; bool IsSuspended; + bool IsNew; HSAuint32 invalidQid = 0xffffffff; qid1 = invalidQid; ret = hsaKmtQueryDebugEvent(defaultGPUNode, INVALID_PID, &qid1, - false, &EventReceived, &IsSuspended); + false, &EventReceived, &IsSuspended, + &IsNew); childStatus = ret != HSAKMT_STATUS_SUCCESS || EventReceived != HSA_DEBUG_EVENT_TYPE_TRAP; if (childStatus) ExitVMFaultQueryChild("query on pending trap event failed", - 1, PollFd, &queue1, &queue2, NULL); + 1, PollFd, &queue1, &queue2, NULL, + defaultGPUNode); // create and wait on pending vmfault event HsaEvent *vmFaultEvent; @@ -630,7 +650,8 @@ TEST_F(KFDDBGTest, BasicDebuggerQueryVMFaultQueueStatus) { &vmFaultEvent); if (ret != HSAKMT_STATUS_SUCCESS) ExitVMFaultQueryChild("create vmfault event failed", - 1, PollFd, &queue1, &queue2, NULL); + 1, PollFd, &queue1, &queue2, NULL, + defaultGPUNode); Dispatch dispatch2(vmFaultBuf, false); dispatch2.SetArgs( @@ -643,13 +664,13 @@ TEST_F(KFDDBGTest, BasicDebuggerQueryVMFaultQueueStatus) { if (ret != HSAKMT_STATUS_SUCCESS) ExitVMFaultQueryChild("wait on vmfault event failed", 1, PollFd, &queue1, &queue2, - vmFaultEvent); + vmFaultEvent, defaultGPUNode); // poll, read and query on pending vmfault event if (poll(fds, 1, 5000) <= 0) ExitVMFaultQueryChild("poll wake on vmfault event failed", 1, PollFd, &queue1, &queue2, - vmFaultEvent); + vmFaultEvent, defaultGPUNode); childStatus = read(PollFd, fifoBuf, kMaxSize) == -1 || strchr(fifoBuf, 'v') == NULL @@ -658,11 +679,11 @@ TEST_F(KFDDBGTest, BasicDebuggerQueryVMFaultQueueStatus) { if (childStatus) ExitVMFaultQueryChild("read on vmfault event failed", 1, PollFd, &queue1, &queue2, - vmFaultEvent); + vmFaultEvent, defaultGPUNode); ret = hsaKmtQueryDebugEvent(defaultGPUNode, INVALID_PID, &qid1, true, &EventReceived, - &IsSuspended); + &IsSuspended, &IsNew); childStatus = ret != HSAKMT_STATUS_SUCCESS || EventReceived != @@ -670,10 +691,10 @@ TEST_F(KFDDBGTest, BasicDebuggerQueryVMFaultQueueStatus) { if (childStatus) ExitVMFaultQueryChild("query on vmfault event failed", 1, PollFd, &queue1, &queue2, - vmFaultEvent); + vmFaultEvent, defaultGPUNode); ExitVMFaultQueryChild("", 0, PollFd, &queue1, &queue2, - vmFaultEvent); + vmFaultEvent, defaultGPUNode); } else { int childStatus;