Skip to content

Commit 2c9039d

Browse files
authored
Block all calls to get drivers until after init has completed to avoid race during sorting (#344)
* Block all calls to get drivers until after init has completed to avoid race during sorting Signed-off-by: Neil R. Spruit <neil.r.spruit@intel.com>
1 parent 74997ed commit 2c9039d

13 files changed

+62
-46
lines changed

.github/workflows/build-msi-package.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
on:
22
push:
3-
branches: [ master ]
3+
branches: [ master,release_branch* ]
44
pull_request:
5-
branches: [ master ]
5+
branches: [ master,release_branch* ]
66
workflow_dispatch:
77

88
permissions: read-all

.github/workflows/build-multi-static.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
on:
22
push:
3-
branches: [ master ]
3+
branches: [ master,release_branch* ]
44
pull_request:
5-
branches: [ master ]
5+
branches: [ master,release_branch* ]
66
workflow_dispatch:
77

88
permissions: read-all

.github/workflows/build-multi.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
on:
22
push:
3-
branches: [ master ]
3+
branches: [ master,release_branch* ]
44
pull_request:
5-
branches: [ master ]
5+
branches: [ master,release_branch* ]
66
workflow_dispatch:
77

88
permissions: read-all

.github/workflows/build-quick-static.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
on:
22
push:
3-
branches: [ master ]
3+
branches: [ master,release_branch* ]
44
pull_request:
5-
branches: [ master ]
5+
branches: [ master,release_branch* ]
66
workflow_dispatch:
77

88
permissions: read-all

.github/workflows/build-quick.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
on:
22
push:
3-
branches: [ master ]
3+
branches: [ master,release_branch* ]
44
pull_request:
5-
branches: [ master ]
5+
branches: [ master,release_branch* ]
66
workflow_dispatch:
77

88
permissions: read-all

CHANGELOG.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
# Level zero loader changelog
22

3+
4+
## v1.21.10
5+
* Block all calls to get until after init has completed to avoid race during sorting.
36
## v1.21.9
47
* Fix init checks when sorting legacy drivers
58
* Fix MSVC Link optimization flags

CMakeLists.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ if(MSVC AND (MSVC_VERSION LESS 1900))
1313
endif()
1414

1515
# This project follows semantic versioning (https://semver.org/)
16-
project(level-zero VERSION 1.21.9)
16+
project(level-zero VERSION 1.21.10)
1717

1818
include(GNUInstallDirs)
1919

PRODUCT_GUID.txt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
1-
1.21.9
2-
01037281-c9ef-43cf-bc65-f72fb3438788
1+
1.21.10
2+
98f4ce5b-d498-4ec9-b025-2e509c4ebecc

scripts/templates/ldrddi.cpp.mako

Lines changed: 20 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -79,23 +79,26 @@ namespace loader
7979
%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)):
8080
uint32_t total_driver_handle_count = 0;
8181

82-
if (!loader::context->sortingInProgress.exchange(true) && !loader::context->instrumentationEnabled) {
83-
%if namespace != "zes":
84-
%if not re.match(r"\w+InitDrivers$", th.make_func_name(n, tags, obj)):
85-
std::call_once(loader::context->coreDriverSortOnce, []() {
86-
loader::context->driverSorting(&loader::context->zeDrivers, nullptr, false);
87-
});
88-
%else:
89-
std::call_once(loader::context->coreDriverSortOnce, [desc]() {
90-
loader::context->driverSorting(&loader::context->zeDrivers, desc, false);
91-
});
92-
%endif
93-
%else:
94-
std::call_once(loader::context->sysmanDriverSortOnce, []() {
95-
loader::context->driverSorting(loader::context->sysmanInstanceDrivers, nullptr, true);
96-
});
97-
%endif
98-
loader::context->sortingInProgress.store(false);
82+
{
83+
std::lock_guard<std::mutex> lock(loader::context->sortMutex);
84+
if (!loader::context->sortingInProgress.exchange(true) && !loader::context->instrumentationEnabled) {
85+
%if namespace != "zes":
86+
%if not re.match(r"\w+InitDrivers$", th.make_func_name(n, tags, obj)):
87+
std::call_once(loader::context->coreDriverSortOnce, []() {
88+
loader::context->driverSorting(&loader::context->zeDrivers, nullptr, false);
89+
});
90+
%else:
91+
std::call_once(loader::context->coreDriverSortOnce, [desc]() {
92+
loader::context->driverSorting(&loader::context->zeDrivers, desc, false);
93+
});
94+
%endif
95+
%else:
96+
std::call_once(loader::context->sysmanDriverSortOnce, []() {
97+
loader::context->driverSorting(loader::context->sysmanInstanceDrivers, nullptr, true);
98+
});
99+
%endif
100+
loader::context->sortingInProgress.store(false);
101+
}
99102
}
100103

101104
%if namespace != "zes":

scripts/templates/ze_loader_internal.h.mako

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,7 @@ namespace loader
121121
std::once_flag coreDriverSortOnce;
122122
std::once_flag sysmanDriverSortOnce;
123123
std::atomic<bool> sortingInProgress = {false};
124+
std::mutex sortMutex;
124125
bool instrumentationEnabled = false;
125126
dditable_t tracing_dditable = {};
126127
std::shared_ptr<Logger> zel_logger;

0 commit comments

Comments
 (0)