Skip to content

Commit b9e007b

Browse files
committed
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 b9e007b

7 files changed

Lines changed: 34 additions & 19 deletions

File tree

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: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,8 @@ 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+
{
83+
std::lock_guard<std::mutex> lock(loader::context->sortMutex);
8284
if (!loader::context->sortingInProgress.exchange(true) && !loader::context->instrumentationEnabled) {
8385
%if namespace != "zes":
8486
%if not re.match(r"\w+InitDrivers$", th.make_func_name(n, tags, obj)):
@@ -97,6 +99,7 @@ namespace loader
9799
%endif
98100
loader::context->sortingInProgress.store(false);
99101
}
102+
}
100103

101104
%if namespace != "zes":
102105
for( auto& drv : loader::context->zeDrivers )

source/loader/ze_ldrddi.cpp

Lines changed: 16 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -56,11 +56,14 @@ namespace loader
5656

5757
uint32_t total_driver_handle_count = 0;
5858

59-
if (!loader::context->sortingInProgress.exchange(true) && !loader::context->instrumentationEnabled) {
60-
std::call_once(loader::context->coreDriverSortOnce, []() {
61-
loader::context->driverSorting(&loader::context->zeDrivers, nullptr, false);
62-
});
63-
loader::context->sortingInProgress.store(false);
59+
{
60+
std::lock_guard<std::mutex> lock(loader::context->sortMutex);
61+
if (!loader::context->sortingInProgress.exchange(true) && !loader::context->instrumentationEnabled) {
62+
std::call_once(loader::context->coreDriverSortOnce, []() {
63+
loader::context->driverSorting(&loader::context->zeDrivers, nullptr, false);
64+
});
65+
loader::context->sortingInProgress.store(false);
66+
}
6467
}
6568

6669
for( auto& drv : loader::context->zeDrivers )
@@ -138,12 +141,14 @@ namespace loader
138141
ze_result_t result = ZE_RESULT_SUCCESS;
139142

140143
uint32_t total_driver_handle_count = 0;
141-
142-
if (!loader::context->sortingInProgress.exchange(true) && !loader::context->instrumentationEnabled) {
143-
std::call_once(loader::context->coreDriverSortOnce, [desc]() {
144-
loader::context->driverSorting(&loader::context->zeDrivers, desc, false);
145-
});
146-
loader::context->sortingInProgress.store(false);
144+
{
145+
std::lock_guard<std::mutex> lock(loader::context->sortMutex);
146+
if (!loader::context->sortingInProgress.exchange(true) && !loader::context->instrumentationEnabled) {
147+
std::call_once(loader::context->coreDriverSortOnce, [desc]() {
148+
loader::context->driverSorting(&loader::context->zeDrivers, desc, false);
149+
});
150+
loader::context->sortingInProgress.store(false);
151+
}
147152
}
148153

149154
for( auto& drv : loader::context->zeDrivers )

source/loader/ze_loader_internal.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -155,6 +155,7 @@ namespace loader
155155
std::once_flag coreDriverSortOnce;
156156
std::once_flag sysmanDriverSortOnce;
157157
std::atomic<bool> sortingInProgress = {false};
158+
std::mutex sortMutex;
158159
bool instrumentationEnabled = false;
159160
dditable_t tracing_dditable = {};
160161
std::shared_ptr<Logger> zel_logger;

source/loader/zes_ldrddi.cpp

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -60,11 +60,14 @@ namespace loader
6060

6161
uint32_t total_driver_handle_count = 0;
6262

63-
if (!loader::context->sortingInProgress.exchange(true) && !loader::context->instrumentationEnabled) {
64-
std::call_once(loader::context->sysmanDriverSortOnce, []() {
65-
loader::context->driverSorting(loader::context->sysmanInstanceDrivers, nullptr, true);
66-
});
67-
loader::context->sortingInProgress.store(false);
63+
{
64+
std::lock_guard<std::mutex> lock(loader::context->sortMutex);
65+
if (!loader::context->sortingInProgress.exchange(true) && !loader::context->instrumentationEnabled) {
66+
std::call_once(loader::context->sysmanDriverSortOnce, []() {
67+
loader::context->driverSorting(loader::context->sysmanInstanceDrivers, nullptr, true);
68+
});
69+
loader::context->sortingInProgress.store(false);
70+
}
6871
}
6972

7073
for( auto& drv : *loader::context->sysmanInstanceDrivers )

0 commit comments

Comments
 (0)