From 6d5e40b3bd759401e1fb6c3810ef1a2ddbbf2563 Mon Sep 17 00:00:00 2001 From: "Alessandro de Oliveira Faria (A.K.A. CABELO)" Date: Thu, 30 Jul 2026 00:55:32 -0300 Subject: [PATCH 1/2] fix(npu): prevent ResourceCleaner timeout overflow on libstdc++ --- umd/level_zero_driver/source/context.cpp | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/umd/level_zero_driver/source/context.cpp b/umd/level_zero_driver/source/context.cpp index a4d29fe..17c77d8 100644 --- a/umd/level_zero_driver/source/context.cpp +++ b/umd/level_zero_driver/source/context.cpp @@ -258,12 +258,20 @@ ResourceCleaner::ResourceCleaner(Context *ctx, std::chrono::milliseconds timeout , thread( [this](Context *ctx) { std::unique_lock lock(mutex); - auto timeout = std::chrono::time_point::max(); - while (action != Action::BREAK) { - if (cv.wait_until(lock, timeout) == std::cv_status::timeout) { + const auto noTimeout = + std::chrono::time_point::max(); + auto timeout = noTimeout; + while (action != Action::BREAK) { + if (timeout == noTimeout) { + cv.wait(lock); + } else if (cv.wait_until(lock, timeout) == + std::cv_status::timeout) { ctx->releaseMemory(); - timeout = std::chrono::time_point::max(); - } else if (action == Action::PRUNE_AFTER_TIMEOUT) { + timeout = noTimeout; + continue; + } + + if (action == Action::PRUNE_AFTER_TIMEOUT) { timeout = std::chrono::steady_clock::now() + idleTimeout; } } From 6481783e49ec4d28d41e1dbe4ccd550a0abd58a6 Mon Sep 17 00:00:00 2001 From: "Alessandro de Oliveira Faria (A.K.A. CABELO)" Date: Fri, 31 Jul 2026 13:58:47 -0300 Subject: [PATCH 2/2] Fix the indent --- umd/level_zero_driver/source/context.cpp | 24 +++++++++++------------- 1 file changed, 11 insertions(+), 13 deletions(-) diff --git a/umd/level_zero_driver/source/context.cpp b/umd/level_zero_driver/source/context.cpp index 17c77d8..4025590 100644 --- a/umd/level_zero_driver/source/context.cpp +++ b/umd/level_zero_driver/source/context.cpp @@ -261,20 +261,18 @@ ResourceCleaner::ResourceCleaner(Context *ctx, std::chrono::milliseconds timeout const auto noTimeout = std::chrono::time_point::max(); auto timeout = noTimeout; - while (action != Action::BREAK) { - if (timeout == noTimeout) { - cv.wait(lock); - } else if (cv.wait_until(lock, timeout) == - std::cv_status::timeout) { - ctx->releaseMemory(); - timeout = noTimeout; - continue; + while (action != Action::BREAK) { + if (timeout == noTimeout) { + cv.wait(lock); + } else if (cv.wait_until(lock, timeout) == std::cv_status::timeout) { + ctx->releaseMemory(); + timeout = noTimeout; + continue; + } + if (action == Action::PRUNE_AFTER_TIMEOUT) { + timeout = std::chrono::steady_clock::now() + idleTimeout; + } } - - if (action == Action::PRUNE_AFTER_TIMEOUT) { - timeout = std::chrono::steady_clock::now() + idleTimeout; - } - } }, ctx) {}