debug suport for queue error.

1/ Revised debug event handler to handle different events.
2/ Added queue error handler using the callback in queue create, which will print out wave info when queue in error state.
3/ Preempt queue instead of destory queue when queue error state.

Change-Id: Ib727d208de9caf1c72c76d42268483b24aaebde8
This commit is contained in:
Qingchuan Shi
2018-04-04 15:47:03 -04:00
کامیت شده توسط Qingchuan Shi
والد b66764e4c6
کامیت 49d2175c74
7فایلهای تغییر یافته به همراه94 افزوده شده و 86 حذف شده
@@ -1050,38 +1050,40 @@ bool Runtime::VMFaultHandler(hsa_signal_value_t val, void* arg) {
hsa_status_t custom_handler_status = HSA_STATUS_ERROR;
// If custom handler is registered, pack the fault info and call the handler
if (runtime_singleton_->vm_fault_handler_custom_ != nullptr) {
hsa_amd_gpu_memory_fault_info_t* fault_info = new hsa_amd_gpu_memory_fault_info_t;
if (runtime_singleton_->GetCustomSystemEventHandler()) {
hsa_amd_gpu_memory_fault_info_t fault_info;
// Find the faulty agent
auto it = runtime_singleton_->agents_by_node_.find(fault.NodeId);
assert(it != runtime_singleton_->agents_by_node_.end() && "Can't find faulty agent.");
Agent* faulty_agent = it->second.front();
fault_info->agent = Agent::Convert(faulty_agent);
fault_info.agent = Agent::Convert(faulty_agent);
fault_info->virtual_address = fault.VirtualAddress;
fault_info->fault_reason_mask = 0x00000000;
fault_info.virtual_address = fault.VirtualAddress;
fault_info.fault_reason_mask = 0x00000000;
if (fault.Failure.NotPresent == 1) {
fault_info->fault_reason_mask = fault_info->fault_reason_mask | 0x00000001;
fault_info.fault_reason_mask = fault_info.fault_reason_mask | 0x00000001;
}
if (fault.Failure.ReadOnly == 1) {
fault_info->fault_reason_mask = fault_info->fault_reason_mask | 0x00000010;
fault_info.fault_reason_mask = fault_info.fault_reason_mask | 0x00000010;
}
if (fault.Failure.NoExecute == 1) {
fault_info->fault_reason_mask = fault_info->fault_reason_mask | 0x00000100;
fault_info.fault_reason_mask = fault_info.fault_reason_mask | 0x00000100;
}
if (fault.Failure.GpuAccess == 1) {
fault_info->fault_reason_mask = fault_info->fault_reason_mask | 0x00001000;
fault_info.fault_reason_mask = fault_info.fault_reason_mask | 0x00001000;
}
if (fault.Failure.ECC == 1) {
fault_info->fault_reason_mask = fault_info->fault_reason_mask | 0x00010000;
fault_info.fault_reason_mask = fault_info.fault_reason_mask | 0x00010000;
}
if (fault.Failure.Imprecise == 1) {
fault_info->fault_reason_mask = fault_info->fault_reason_mask | 0x00100000;
fault_info.fault_reason_mask = fault_info.fault_reason_mask | 0x00100000;
}
custom_handler_status = runtime_singleton_->vm_fault_handler_custom_(fault_info,
runtime_singleton_->vm_fault_handler_user_data_);
hsa_amd_event_t memory_fault_event;
memory_fault_event.event_type = GPU_MEMORY_FAULT_EVENT;
memory_fault_event.memory_fault = fault_info;
custom_handler_status = runtime_singleton_->GetCustomSystemEventHandler()(
&memory_fault_event, runtime_singleton_->GetCustomSystemEventData());
}
// No custom VM fault handler registered or it failed.
@@ -1176,7 +1178,7 @@ Runtime::Runtime()
sys_clock_freq_(0),
vm_fault_event_(nullptr),
vm_fault_signal_(nullptr),
vm_fault_handler_custom_(nullptr),
system_event_handler_user_data_(nullptr),
ref_count_(0) {
start_svm_address_ = 0;
#if defined(HSA_LARGE_MODEL)
@@ -1446,15 +1448,15 @@ void Runtime::AsyncEvents::Clear() {
arg_.clear();
}
hsa_status_t Runtime::SetCustomVMFaultHandler(
hsa_status_t (*callback)(const void* event_specific_data, void* data),
void* data) {
if (vm_fault_handler_custom_ != nullptr) {
hsa_status_t Runtime::SetCustomSystemEventHandler(hsa_amd_system_event_callback_t callback,
void* data) {
if (system_event_handler_) {
return HSA_STATUS_ERROR;
} else {
vm_fault_handler_custom_ = callback;
vm_fault_handler_user_data_ = data;
system_event_handler_ = callback;
system_event_handler_user_data_ = data;
return HSA_STATUS_SUCCESS;
}
}
} // namespace core