From b9e007b729f328789092336cf0b1e08d5f02fa86 Mon Sep 17 00:00:00 2001 From: "Neil R. Spruit" Date: Tue, 3 Jun 2025 16:41:19 -0700 Subject: [PATCH 1/2] Block all calls to get drivers until after init has completed to avoid race during sorting Signed-off-by: Neil R. Spruit --- CHANGELOG.md | 3 +++ CMakeLists.txt | 2 +- PRODUCT_GUID.txt | 4 ++-- scripts/templates/ldrddi.cpp.mako | 3 +++ source/loader/ze_ldrddi.cpp | 27 ++++++++++++++++----------- source/loader/ze_loader_internal.h | 1 + source/loader/zes_ldrddi.cpp | 13 ++++++++----- 7 files changed, 34 insertions(+), 19 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index aab11a01..0baad0e2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,8 @@ # Level zero loader changelog + +## v1.21.10 +* Block all calls to get until after init has completed to avoid race during sorting. ## v1.21.9 * Fix init checks when sorting legacy drivers * Fix MSVC Link optimization flags diff --git a/CMakeLists.txt b/CMakeLists.txt index b2114c34..39f4fd7f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -13,7 +13,7 @@ if(MSVC AND (MSVC_VERSION LESS 1900)) endif() # This project follows semantic versioning (https://semver.org/) -project(level-zero VERSION 1.21.9) +project(level-zero VERSION 1.21.10) include(GNUInstallDirs) diff --git a/PRODUCT_GUID.txt b/PRODUCT_GUID.txt index 85c64204..852e6593 100644 --- a/PRODUCT_GUID.txt +++ b/PRODUCT_GUID.txt @@ -1,2 +1,2 @@ -1.21.9 -01037281-c9ef-43cf-bc65-f72fb3438788 \ No newline at end of file +1.21.10 +98f4ce5b-d498-4ec9-b025-2e509c4ebecc \ No newline at end of file diff --git a/scripts/templates/ldrddi.cpp.mako b/scripts/templates/ldrddi.cpp.mako index 9381c3c2..5fa7f1a1 100644 --- a/scripts/templates/ldrddi.cpp.mako +++ b/scripts/templates/ldrddi.cpp.mako @@ -79,6 +79,8 @@ namespace loader %elif re.match(r"\w+DriverGet$", th.make_func_name(n, tags, obj)) or re.match(r"\w+InitDrivers$", th.make_func_name(n, tags, obj)): uint32_t total_driver_handle_count = 0; + { + std::lock_guard lock(loader::context->sortMutex); if (!loader::context->sortingInProgress.exchange(true) && !loader::context->instrumentationEnabled) { %if namespace != "zes": %if not re.match(r"\w+InitDrivers$", th.make_func_name(n, tags, obj)): @@ -97,6 +99,7 @@ namespace loader %endif loader::context->sortingInProgress.store(false); } + } %if namespace != "zes": for( auto& drv : loader::context->zeDrivers ) diff --git a/source/loader/ze_ldrddi.cpp b/source/loader/ze_ldrddi.cpp index 8d080a5c..a9f64c0c 100644 --- a/source/loader/ze_ldrddi.cpp +++ b/source/loader/ze_ldrddi.cpp @@ -56,11 +56,14 @@ namespace loader uint32_t total_driver_handle_count = 0; - if (!loader::context->sortingInProgress.exchange(true) && !loader::context->instrumentationEnabled) { - std::call_once(loader::context->coreDriverSortOnce, []() { - loader::context->driverSorting(&loader::context->zeDrivers, nullptr, false); - }); - loader::context->sortingInProgress.store(false); + { + std::lock_guard lock(loader::context->sortMutex); + if (!loader::context->sortingInProgress.exchange(true) && !loader::context->instrumentationEnabled) { + std::call_once(loader::context->coreDriverSortOnce, []() { + loader::context->driverSorting(&loader::context->zeDrivers, nullptr, false); + }); + loader::context->sortingInProgress.store(false); + } } for( auto& drv : loader::context->zeDrivers ) @@ -138,12 +141,14 @@ namespace loader ze_result_t result = ZE_RESULT_SUCCESS; uint32_t total_driver_handle_count = 0; - - if (!loader::context->sortingInProgress.exchange(true) && !loader::context->instrumentationEnabled) { - std::call_once(loader::context->coreDriverSortOnce, [desc]() { - loader::context->driverSorting(&loader::context->zeDrivers, desc, false); - }); - loader::context->sortingInProgress.store(false); + { + std::lock_guard lock(loader::context->sortMutex); + if (!loader::context->sortingInProgress.exchange(true) && !loader::context->instrumentationEnabled) { + std::call_once(loader::context->coreDriverSortOnce, [desc]() { + loader::context->driverSorting(&loader::context->zeDrivers, desc, false); + }); + loader::context->sortingInProgress.store(false); + } } for( auto& drv : loader::context->zeDrivers ) diff --git a/source/loader/ze_loader_internal.h b/source/loader/ze_loader_internal.h index 295a33a2..1de27195 100644 --- a/source/loader/ze_loader_internal.h +++ b/source/loader/ze_loader_internal.h @@ -155,6 +155,7 @@ namespace loader std::once_flag coreDriverSortOnce; std::once_flag sysmanDriverSortOnce; std::atomic sortingInProgress = {false}; + std::mutex sortMutex; bool instrumentationEnabled = false; dditable_t tracing_dditable = {}; std::shared_ptr zel_logger; diff --git a/source/loader/zes_ldrddi.cpp b/source/loader/zes_ldrddi.cpp index 0edb0846..0785c5c5 100644 --- a/source/loader/zes_ldrddi.cpp +++ b/source/loader/zes_ldrddi.cpp @@ -60,11 +60,14 @@ namespace loader uint32_t total_driver_handle_count = 0; - if (!loader::context->sortingInProgress.exchange(true) && !loader::context->instrumentationEnabled) { - std::call_once(loader::context->sysmanDriverSortOnce, []() { - loader::context->driverSorting(loader::context->sysmanInstanceDrivers, nullptr, true); - }); - loader::context->sortingInProgress.store(false); + { + std::lock_guard lock(loader::context->sortMutex); + if (!loader::context->sortingInProgress.exchange(true) && !loader::context->instrumentationEnabled) { + std::call_once(loader::context->sysmanDriverSortOnce, []() { + loader::context->driverSorting(loader::context->sysmanInstanceDrivers, nullptr, true); + }); + loader::context->sortingInProgress.store(false); + } } for( auto& drv : *loader::context->sysmanInstanceDrivers ) From f146b2fb4f7fe8d8835257fb15e0a730ea695fff Mon Sep 17 00:00:00 2001 From: "Neil R. Spruit" Date: Tue, 3 Jun 2025 16:48:28 -0700 Subject: [PATCH 2/2] Fix CI to run on release branches Signed-off-by: Neil R. Spruit --- .github/workflows/build-msi-package.yml | 4 +-- .github/workflows/build-multi-static.yml | 4 +-- .github/workflows/build-multi.yml | 4 +-- .github/workflows/build-quick-static.yml | 4 +-- .github/workflows/build-quick.yml | 4 +-- scripts/templates/ldrddi.cpp.mako | 40 ++++++++++----------- scripts/templates/ze_loader_internal.h.mako | 1 + 7 files changed, 31 insertions(+), 30 deletions(-) diff --git a/.github/workflows/build-msi-package.yml b/.github/workflows/build-msi-package.yml index 66cb6cf7..5997c9c6 100644 --- a/.github/workflows/build-msi-package.yml +++ b/.github/workflows/build-msi-package.yml @@ -1,8 +1,8 @@ on: push: - branches: [ master ] + branches: [ master,release_branch* ] pull_request: - branches: [ master ] + branches: [ master,release_branch* ] workflow_dispatch: permissions: read-all diff --git a/.github/workflows/build-multi-static.yml b/.github/workflows/build-multi-static.yml index c510c5cd..6a95e140 100644 --- a/.github/workflows/build-multi-static.yml +++ b/.github/workflows/build-multi-static.yml @@ -1,8 +1,8 @@ on: push: - branches: [ master ] + branches: [ master,release_branch* ] pull_request: - branches: [ master ] + branches: [ master,release_branch* ] workflow_dispatch: permissions: read-all diff --git a/.github/workflows/build-multi.yml b/.github/workflows/build-multi.yml index 0921e8ad..e3bb075d 100644 --- a/.github/workflows/build-multi.yml +++ b/.github/workflows/build-multi.yml @@ -1,8 +1,8 @@ on: push: - branches: [ master ] + branches: [ master,release_branch* ] pull_request: - branches: [ master ] + branches: [ master,release_branch* ] workflow_dispatch: permissions: read-all diff --git a/.github/workflows/build-quick-static.yml b/.github/workflows/build-quick-static.yml index 24a99d96..85f0302b 100644 --- a/.github/workflows/build-quick-static.yml +++ b/.github/workflows/build-quick-static.yml @@ -1,8 +1,8 @@ on: push: - branches: [ master ] + branches: [ master,release_branch* ] pull_request: - branches: [ master ] + branches: [ master,release_branch* ] workflow_dispatch: permissions: read-all diff --git a/.github/workflows/build-quick.yml b/.github/workflows/build-quick.yml index 8ffeba83..fbdb2c02 100644 --- a/.github/workflows/build-quick.yml +++ b/.github/workflows/build-quick.yml @@ -1,8 +1,8 @@ on: push: - branches: [ master ] + branches: [ master,release_branch* ] pull_request: - branches: [ master ] + branches: [ master,release_branch* ] workflow_dispatch: permissions: read-all diff --git a/scripts/templates/ldrddi.cpp.mako b/scripts/templates/ldrddi.cpp.mako index 5fa7f1a1..c507a123 100644 --- a/scripts/templates/ldrddi.cpp.mako +++ b/scripts/templates/ldrddi.cpp.mako @@ -79,27 +79,27 @@ namespace loader %elif re.match(r"\w+DriverGet$", th.make_func_name(n, tags, obj)) or re.match(r"\w+InitDrivers$", th.make_func_name(n, tags, obj)): uint32_t total_driver_handle_count = 0; - { - std::lock_guard lock(loader::context->sortMutex); - if (!loader::context->sortingInProgress.exchange(true) && !loader::context->instrumentationEnabled) { - %if namespace != "zes": - %if not re.match(r"\w+InitDrivers$", th.make_func_name(n, tags, obj)): - std::call_once(loader::context->coreDriverSortOnce, []() { - loader::context->driverSorting(&loader::context->zeDrivers, nullptr, false); - }); - %else: - std::call_once(loader::context->coreDriverSortOnce, [desc]() { - loader::context->driverSorting(&loader::context->zeDrivers, desc, false); - }); - %endif - %else: - std::call_once(loader::context->sysmanDriverSortOnce, []() { - loader::context->driverSorting(loader::context->sysmanInstanceDrivers, nullptr, true); - }); - %endif - loader::context->sortingInProgress.store(false); + { + std::lock_guard lock(loader::context->sortMutex); + if (!loader::context->sortingInProgress.exchange(true) && !loader::context->instrumentationEnabled) { + %if namespace != "zes": + %if not re.match(r"\w+InitDrivers$", th.make_func_name(n, tags, obj)): + std::call_once(loader::context->coreDriverSortOnce, []() { + loader::context->driverSorting(&loader::context->zeDrivers, nullptr, false); + }); + %else: + std::call_once(loader::context->coreDriverSortOnce, [desc]() { + loader::context->driverSorting(&loader::context->zeDrivers, desc, false); + }); + %endif + %else: + std::call_once(loader::context->sysmanDriverSortOnce, []() { + loader::context->driverSorting(loader::context->sysmanInstanceDrivers, nullptr, true); + }); + %endif + loader::context->sortingInProgress.store(false); + } } - } %if namespace != "zes": for( auto& drv : loader::context->zeDrivers ) diff --git a/scripts/templates/ze_loader_internal.h.mako b/scripts/templates/ze_loader_internal.h.mako index 9937b814..b86c1c9a 100644 --- a/scripts/templates/ze_loader_internal.h.mako +++ b/scripts/templates/ze_loader_internal.h.mako @@ -121,6 +121,7 @@ namespace loader std::once_flag coreDriverSortOnce; std::once_flag sysmanDriverSortOnce; std::atomic sortingInProgress = {false}; + std::mutex sortMutex; bool instrumentationEnabled = false; dditable_t tracing_dditable = {}; std::shared_ptr zel_logger;