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
والد
b66764e4c6
کامیت
49d2175c74
@@ -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
|
||||
|
||||
مرجع در شماره جدید
Block a user