Skip to content

Commit e3b6efd

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

File tree

8 files changed

+51
-35
lines changed

8 files changed

+51
-35
lines changed

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: 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
@@ -122,6 +122,7 @@ namespace loader
122122
std::once_flag coreDriverSortOnce;
123123
std::once_flag sysmanDriverSortOnce;
124124
std::atomic<bool> sortingInProgress = {false};
125+
std::mutex sortMutex;
125126
bool instrumentationEnabled = false;
126127
dditable_t tracing_dditable = {};
127128
std::shared_ptr<Logger> zel_logger;

source/loader/ze_ldrddi.cpp

Lines changed: 16 additions & 10 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 )
@@ -139,11 +142,14 @@ namespace loader
139142

140143
uint32_t total_driver_handle_count = 0;
141144

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);
145+
{
146+
std::lock_guard<std::mutex> lock(loader::context->sortMutex);
147+
if (!loader::context->sortingInProgress.exchange(true) && !loader::context->instrumentationEnabled) {
148+
std::call_once(loader::context->coreDriverSortOnce, [desc]() {
149+
loader::context->driverSorting(&loader::context->zeDrivers, desc, false);
150+
});
151+
loader::context->sortingInProgress.store(false);
152+
}
147153
}
148154

149155
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)