Skip to content

Commit 3942873

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 de1e9f4 commit 3942873

7 files changed

Lines changed: 33 additions & 19 deletions

File tree

CHANGELOG.md

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

3+
## v1.22.4
4+
* Block all calls to get until after init has completed to avoid race during sorting.
35
## v1.22.3
46
* Fix sysman-only initialization to block loader context retrieval when versions are incompatible
57
* Add ability to register a TeardownCallback to notify release of L0 resources

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.22.3)
16+
project(level-zero VERSION 1.22.4)
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.22.3
2-
b3491b8d-9942-47bf-be47-8741f9614566
1+
1.22.4
2+
55e69860-8ae7-4f60-8ad9-728c1ed2a2e7

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
@@ -158,6 +158,7 @@ namespace loader
158158
std::once_flag coreDriverSortOnce;
159159
std::once_flag sysmanDriverSortOnce;
160160
std::atomic<bool> sortingInProgress = {false};
161+
std::mutex sortMutex;
161162
bool instrumentationEnabled = false;
162163
dditable_t tracing_dditable = {};
163164
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)