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;