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/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..c507a123 100644 --- a/scripts/templates/ldrddi.cpp.mako +++ b/scripts/templates/ldrddi.cpp.mako @@ -79,23 +79,26 @@ 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; - 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": 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; 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 )