Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 8 additions & 2 deletions projects/clr/rocclr/device/devhostcall.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -374,7 +374,8 @@ extern amd::Monitor listenerLock;
static bool listenerTerminating = false;
#ifdef USE_NEW_HOSTCALL_IMPL
constexpr static uint32_t kYieldSpins = 128;
constexpr static uint64_t kSignalTimeout = K * K;
constexpr static uint64_t kSignalTimeoutFloor = K * K;
constexpr static uint64_t kSignalTimeoutCeil = K * K * 16;
#else // !USE_NEW_HOSTCALL_IMPL
constexpr static uint64_t kTimeoutFloor = K * K * 4;
constexpr static uint64_t kTimeoutCeil = K * K * 16;
Expand All @@ -398,6 +399,7 @@ void HostcallListener::consumePackets() {
uint64_t signal_value = SIGNAL_INIT;
kHostThreadActive.state = Init::State::kInit;
uint32_t yield_spins = 0;
uint64_t timeout = kSignalTimeoutFloor;

while (true) {
if (kHostThreadActive.state == Init::State::kDestroy) {
Expand All @@ -419,6 +421,7 @@ void HostcallListener::consumePackets() {
}

if (result != ProcessResult::kIdleFull) {
timeout = kSignalTimeoutFloor;
if (++yield_spins >= kYieldSpins) {
yield_spins = 0;
amd::Os::yield();
Expand All @@ -428,9 +431,12 @@ void HostcallListener::consumePackets() {

yield_spins = 0;
uint64_t new_value =
doorbell_->Wait(signal_value, device::Signal::Condition::Ne, kSignalTimeout);
doorbell_->Wait(signal_value, device::Signal::Condition::Ne, timeout);
if (new_value != signal_value) {
signal_value = new_value;
timeout = kSignalTimeoutFloor;
} else {
Comment thread
b-sumner marked this conversation as resolved.
Resolved
timeout = std::min(kSignalTimeoutCeil, timeout << 1);
}
if (signal_value == SIGNAL_DONE) {
return;
Expand Down
Loading