Skip to content

Commit 2f8ea5f

Browse files
authored
Merge branch 'master' into ddi_extension_support
2 parents 5ad44ac + e3b6efd commit 2f8ea5f

7 files changed

Lines changed: 49 additions & 33 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

PRODUCT_GUID.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
11
1.23.0
2-
146652e2-0b5a-4461-b176-800135676a46
2+
146652e2-0b5a-4461-b176-800135676a46

scripts/templates/ldrddi.cpp.mako

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

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

103106
%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
@@ -58,11 +58,14 @@ namespace loader
5858

5959
uint32_t total_driver_handle_count = 0;
6060

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);
61+
{
62+
std::lock_guard<std::mutex> lock(loader::context->sortMutex);
63+
if (!loader::context->sortingInProgress.exchange(true) && !loader::context->instrumentationEnabled) {
64+
std::call_once(loader::context->coreDriverSortOnce, []() {
65+
loader::context->driverSorting(&loader::context->zeDrivers, nullptr, false);
66+
});
67+
loader::context->sortingInProgress.store(false);
68+
}
6669
}
6770

6871
for( auto& drv : loader::context->zeDrivers )
@@ -161,11 +164,14 @@ namespace loader
161164

162165
uint32_t total_driver_handle_count = 0;
163166

164-
if (!loader::context->sortingInProgress.exchange(true) && !loader::context->instrumentationEnabled) {
165-
std::call_once(loader::context->coreDriverSortOnce, [desc]() {
166-
loader::context->driverSorting(&loader::context->zeDrivers, desc, false);
167-
});
168-
loader::context->sortingInProgress.store(false);
167+
{
168+
std::lock_guard<std::mutex> lock(loader::context->sortMutex);
169+
if (!loader::context->sortingInProgress.exchange(true) && !loader::context->instrumentationEnabled) {
170+
std::call_once(loader::context->coreDriverSortOnce, [desc]() {
171+
loader::context->driverSorting(&loader::context->zeDrivers, desc, false);
172+
});
173+
loader::context->sortingInProgress.store(false);
174+
}
169175
}
170176

171177
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
@@ -62,11 +62,14 @@ namespace loader
6262

6363
uint32_t total_driver_handle_count = 0;
6464

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);
65+
{
66+
std::lock_guard<std::mutex> lock(loader::context->sortMutex);
67+
if (!loader::context->sortingInProgress.exchange(true) && !loader::context->instrumentationEnabled) {
68+
std::call_once(loader::context->sysmanDriverSortOnce, []() {
69+
loader::context->driverSorting(loader::context->sysmanInstanceDrivers, nullptr, true);
70+
});
71+
loader::context->sortingInProgress.store(false);
72+
}
7073
}
7174

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

0 commit comments

Comments
 (0)