Skip to content

Commit 354190c

Browse files
authored
Add additional check for optional tables during init (#407)
Signed-off-by: Neil R. Spruit <neil.r.spruit@intel.com>
1 parent 0e8487f commit 354190c

File tree

8 files changed

+207
-132
lines changed

8 files changed

+207
-132
lines changed

CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
# Level zero loader changelog
2+
## v1.26.3
3+
* fix handling of optional DDI tables missing or incorrect
24
## v1.26.2
35
* fix: fix Driver Search Paths for all Linux Distros
46
## v1.26.1

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.26.2)
16+
project(level-zero VERSION 1.26.3)
1717
include(GNUInstallDirs)
1818

1919
find_package(Git)

PRODUCT_GUID.txt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
1-
1.26.2
2-
cf85b8de-e9c1-4d88-9f18-7164098e1c1e
1+
1.26.3
2+
d1ed32f4-2b7d-4718-9f86-69cbae2c1836

scripts/templates/ldrddi.cpp.mako

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,14 +22,42 @@ using namespace loader_driver_ddi;
2222

2323
namespace loader
2424
{
25+
///////////////////////////////////////////////////////////////////////////////
26+
/// @brief Initialize all DDI tables for a driver by calling *FromDriver functions
27+
///
28+
/// @details This function can fail in the following scenarios:
29+
/// - driver->initStatus is already set to a failure code (from a previous
30+
/// required DDI initialization failure). Each *FromDriver call first checks
31+
/// driver->initStatus and returns it immediately if it's already a failure.
32+
/// - A required DDI table's getTable call into the driver returns a failure,
33+
/// which updates driver->initStatus and is propagated back
34+
///
35+
/// Note: If GET_FUNCTION_PTR returns null (function not found in driver),
36+
/// it only fails if driver->initStatus was already a failure. Otherwise,
37+
/// driver->initStatus is returned (which would be SUCCESS).
38+
///
39+
/// Note: Optional DDI tables (when namespace != "zer") are ignored if they
40+
/// fail, and this function continues to attempt loading remaining tables.
41+
/// Only required DDI table failures cause this function to fail and return
42+
/// immediately.
43+
///
44+
/// @returns
45+
/// - ::ZE_RESULT_SUCCESS if all required DDI tables loaded successfully
46+
/// - ::ZE_RESULT_ERROR_* if any required DDI table failed to load
2547
__${x}dlllocal ze_result_t ${X}_APICALL
2648
${n}loaderInitDriverDDITables(loader::driver_t *driver) {
2749
ze_result_t result = ZE_RESULT_SUCCESS;
2850
%for tbl in th.get_pfntables(specs, meta, n, tags):
51+
%if tbl['optional'] == True and namespace != "zer":
52+
// Optional DDI Table, ignore failure if a driver implements the ddi table, but returns an error.
53+
${tbl['export']['name']}FromDriver(driver);
54+
result = ZE_RESULT_SUCCESS;
55+
%else:
2956
result = ${tbl['export']['name']}FromDriver(driver);
3057
if (result != ZE_RESULT_SUCCESS) {
3158
return result;
3259
}
60+
%endif
3361
%endfor
3462
return result;
3563
}
@@ -556,7 +584,7 @@ ${tbl['export']['name']}FromDriver(loader::driver_t *driver)
556584
%else:
557585
return driver->initStatus;
558586
%endif
559-
%if tbl['experimental'] is False and namespace != "zer": #//Experimental Tables may not be implemented in driver
587+
%if tbl['experimental'] is False and namespace != "zer" and tbl['optional'] != True: #//Experimental Tables may not be implemented in driver
560588
auto getTableResult = getTable( loader::context->ddi_init_version, &driver->dditable.${n}.${tbl['name']});
561589
if(getTableResult == ZE_RESULT_SUCCESS) {
562590
loader::context->configured_version = loader::context->ddi_init_version;

source/loader/ze_ldrddi.cpp

Lines changed: 63 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -13,45 +13,61 @@ using namespace loader_driver_ddi;
1313

1414
namespace loader
1515
{
16+
///////////////////////////////////////////////////////////////////////////////
17+
/// @brief Initialize all DDI tables for a driver by calling *FromDriver functions
18+
///
19+
/// @details This function can fail in the following scenarios:
20+
/// - driver->initStatus is already set to a failure code (from a previous
21+
/// required DDI initialization failure). Each *FromDriver call first checks
22+
/// driver->initStatus and returns it immediately if it's already a failure.
23+
/// - A required DDI table's getTable call into the driver returns a failure,
24+
/// which updates driver->initStatus and is propagated back
25+
///
26+
/// Note: If GET_FUNCTION_PTR returns null (function not found in driver),
27+
/// it only fails if driver->initStatus was already a failure. Otherwise,
28+
/// driver->initStatus is returned (which would be SUCCESS).
29+
///
30+
/// Note: Optional DDI tables (when namespace != "zer") are ignored if they
31+
/// fail, and this function continues to attempt loading remaining tables.
32+
/// Only required DDI table failures cause this function to fail and return
33+
/// immediately.
34+
///
35+
/// @returns
36+
/// - ::ZE_RESULT_SUCCESS if all required DDI tables loaded successfully
37+
/// - ::ZE_RESULT_ERROR_* if any required DDI table failed to load
1638
__zedlllocal ze_result_t ZE_APICALL
1739
zeloaderInitDriverDDITables(loader::driver_t *driver) {
1840
ze_result_t result = ZE_RESULT_SUCCESS;
1941
result = zeGetGlobalProcAddrTableFromDriver(driver);
2042
if (result != ZE_RESULT_SUCCESS) {
2143
return result;
2244
}
23-
result = zeGetRTASBuilderProcAddrTableFromDriver(driver);
24-
if (result != ZE_RESULT_SUCCESS) {
25-
return result;
26-
}
27-
result = zeGetRTASBuilderExpProcAddrTableFromDriver(driver);
28-
if (result != ZE_RESULT_SUCCESS) {
29-
return result;
30-
}
31-
result = zeGetRTASParallelOperationProcAddrTableFromDriver(driver);
32-
if (result != ZE_RESULT_SUCCESS) {
33-
return result;
34-
}
35-
result = zeGetRTASParallelOperationExpProcAddrTableFromDriver(driver);
36-
if (result != ZE_RESULT_SUCCESS) {
37-
return result;
38-
}
45+
// Optional DDI Table, ignore failure if a driver implements the ddi table, but returns an error.
46+
zeGetRTASBuilderProcAddrTableFromDriver(driver);
47+
result = ZE_RESULT_SUCCESS;
48+
// Optional DDI Table, ignore failure if a driver implements the ddi table, but returns an error.
49+
zeGetRTASBuilderExpProcAddrTableFromDriver(driver);
50+
result = ZE_RESULT_SUCCESS;
51+
// Optional DDI Table, ignore failure if a driver implements the ddi table, but returns an error.
52+
zeGetRTASParallelOperationProcAddrTableFromDriver(driver);
53+
result = ZE_RESULT_SUCCESS;
54+
// Optional DDI Table, ignore failure if a driver implements the ddi table, but returns an error.
55+
zeGetRTASParallelOperationExpProcAddrTableFromDriver(driver);
56+
result = ZE_RESULT_SUCCESS;
3957
result = zeGetDriverProcAddrTableFromDriver(driver);
4058
if (result != ZE_RESULT_SUCCESS) {
4159
return result;
4260
}
43-
result = zeGetDriverExpProcAddrTableFromDriver(driver);
44-
if (result != ZE_RESULT_SUCCESS) {
45-
return result;
46-
}
61+
// Optional DDI Table, ignore failure if a driver implements the ddi table, but returns an error.
62+
zeGetDriverExpProcAddrTableFromDriver(driver);
63+
result = ZE_RESULT_SUCCESS;
4764
result = zeGetDeviceProcAddrTableFromDriver(driver);
4865
if (result != ZE_RESULT_SUCCESS) {
4966
return result;
5067
}
51-
result = zeGetDeviceExpProcAddrTableFromDriver(driver);
52-
if (result != ZE_RESULT_SUCCESS) {
53-
return result;
54-
}
68+
// Optional DDI Table, ignore failure if a driver implements the ddi table, but returns an error.
69+
zeGetDeviceExpProcAddrTableFromDriver(driver);
70+
result = ZE_RESULT_SUCCESS;
5571
result = zeGetContextProcAddrTableFromDriver(driver);
5672
if (result != ZE_RESULT_SUCCESS) {
5773
return result;
@@ -64,18 +80,16 @@ namespace loader
6480
if (result != ZE_RESULT_SUCCESS) {
6581
return result;
6682
}
67-
result = zeGetCommandListExpProcAddrTableFromDriver(driver);
68-
if (result != ZE_RESULT_SUCCESS) {
69-
return result;
70-
}
83+
// Optional DDI Table, ignore failure if a driver implements the ddi table, but returns an error.
84+
zeGetCommandListExpProcAddrTableFromDriver(driver);
85+
result = ZE_RESULT_SUCCESS;
7186
result = zeGetEventProcAddrTableFromDriver(driver);
7287
if (result != ZE_RESULT_SUCCESS) {
7388
return result;
7489
}
75-
result = zeGetEventExpProcAddrTableFromDriver(driver);
76-
if (result != ZE_RESULT_SUCCESS) {
77-
return result;
78-
}
90+
// Optional DDI Table, ignore failure if a driver implements the ddi table, but returns an error.
91+
zeGetEventExpProcAddrTableFromDriver(driver);
92+
result = ZE_RESULT_SUCCESS;
7993
result = zeGetEventPoolProcAddrTableFromDriver(driver);
8094
if (result != ZE_RESULT_SUCCESS) {
8195
return result;
@@ -88,26 +102,23 @@ namespace loader
88102
if (result != ZE_RESULT_SUCCESS) {
89103
return result;
90104
}
91-
result = zeGetImageExpProcAddrTableFromDriver(driver);
92-
if (result != ZE_RESULT_SUCCESS) {
93-
return result;
94-
}
105+
// Optional DDI Table, ignore failure if a driver implements the ddi table, but returns an error.
106+
zeGetImageExpProcAddrTableFromDriver(driver);
107+
result = ZE_RESULT_SUCCESS;
95108
result = zeGetKernelProcAddrTableFromDriver(driver);
96109
if (result != ZE_RESULT_SUCCESS) {
97110
return result;
98111
}
99-
result = zeGetKernelExpProcAddrTableFromDriver(driver);
100-
if (result != ZE_RESULT_SUCCESS) {
101-
return result;
102-
}
112+
// Optional DDI Table, ignore failure if a driver implements the ddi table, but returns an error.
113+
zeGetKernelExpProcAddrTableFromDriver(driver);
114+
result = ZE_RESULT_SUCCESS;
103115
result = zeGetMemProcAddrTableFromDriver(driver);
104116
if (result != ZE_RESULT_SUCCESS) {
105117
return result;
106118
}
107-
result = zeGetMemExpProcAddrTableFromDriver(driver);
108-
if (result != ZE_RESULT_SUCCESS) {
109-
return result;
110-
}
119+
// Optional DDI Table, ignore failure if a driver implements the ddi table, but returns an error.
120+
zeGetMemExpProcAddrTableFromDriver(driver);
121+
result = ZE_RESULT_SUCCESS;
111122
result = zeGetModuleProcAddrTableFromDriver(driver);
112123
if (result != ZE_RESULT_SUCCESS) {
113124
return result;
@@ -128,14 +139,12 @@ namespace loader
128139
if (result != ZE_RESULT_SUCCESS) {
129140
return result;
130141
}
131-
result = zeGetFabricEdgeExpProcAddrTableFromDriver(driver);
132-
if (result != ZE_RESULT_SUCCESS) {
133-
return result;
134-
}
135-
result = zeGetFabricVertexExpProcAddrTableFromDriver(driver);
136-
if (result != ZE_RESULT_SUCCESS) {
137-
return result;
138-
}
142+
// Optional DDI Table, ignore failure if a driver implements the ddi table, but returns an error.
143+
zeGetFabricEdgeExpProcAddrTableFromDriver(driver);
144+
result = ZE_RESULT_SUCCESS;
145+
// Optional DDI Table, ignore failure if a driver implements the ddi table, but returns an error.
146+
zeGetFabricVertexExpProcAddrTableFromDriver(driver);
147+
result = ZE_RESULT_SUCCESS;
139148
return result;
140149
}
141150
///////////////////////////////////////////////////////////////////////////////
@@ -7819,11 +7828,7 @@ zeGetRTASBuilderProcAddrTableFromDriver(loader::driver_t *driver)
78197828
GET_FUNCTION_PTR( driver->handle, "zeGetRTASBuilderProcAddrTable") );
78207829
if(!getTable)
78217830
return driver->initStatus;
7822-
auto getTableResult = getTable( loader::context->ddi_init_version, &driver->dditable.ze.RTASBuilder);
7823-
if(getTableResult == ZE_RESULT_SUCCESS) {
7824-
loader::context->configured_version = loader::context->ddi_init_version;
7825-
} else
7826-
driver->initStatus = getTableResult;
7831+
result = getTable( loader::context->ddi_init_version, &driver->dditable.ze.RTASBuilder);
78277832
return result;
78287833
}
78297834
///////////////////////////////////////////////////////////////////////////////
@@ -7867,11 +7872,7 @@ zeGetRTASParallelOperationProcAddrTableFromDriver(loader::driver_t *driver)
78677872
GET_FUNCTION_PTR( driver->handle, "zeGetRTASParallelOperationProcAddrTable") );
78687873
if(!getTable)
78697874
return driver->initStatus;
7870-
auto getTableResult = getTable( loader::context->ddi_init_version, &driver->dditable.ze.RTASParallelOperation);
7871-
if(getTableResult == ZE_RESULT_SUCCESS) {
7872-
loader::context->configured_version = loader::context->ddi_init_version;
7873-
} else
7874-
driver->initStatus = getTableResult;
7875+
result = getTable( loader::context->ddi_init_version, &driver->dditable.ze.RTASParallelOperation);
78757876
return result;
78767877
}
78777878
///////////////////////////////////////////////////////////////////////////////

source/loader/zer_ldrddi.cpp

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,28 @@ using namespace loader_driver_ddi;
1313

1414
namespace loader
1515
{
16+
///////////////////////////////////////////////////////////////////////////////
17+
/// @brief Initialize all DDI tables for a driver by calling *FromDriver functions
18+
///
19+
/// @details This function can fail in the following scenarios:
20+
/// - driver->initStatus is already set to a failure code (from a previous
21+
/// required DDI initialization failure). Each *FromDriver call first checks
22+
/// driver->initStatus and returns it immediately if it's already a failure.
23+
/// - A required DDI table's getTable call into the driver returns a failure,
24+
/// which updates driver->initStatus and is propagated back
25+
///
26+
/// Note: If GET_FUNCTION_PTR returns null (function not found in driver),
27+
/// it only fails if driver->initStatus was already a failure. Otherwise,
28+
/// driver->initStatus is returned (which would be SUCCESS).
29+
///
30+
/// Note: Optional DDI tables (when namespace != "zer") are ignored if they
31+
/// fail, and this function continues to attempt loading remaining tables.
32+
/// Only required DDI table failures cause this function to fail and return
33+
/// immediately.
34+
///
35+
/// @returns
36+
/// - ::ZE_RESULT_SUCCESS if all required DDI tables loaded successfully
37+
/// - ::ZE_RESULT_ERROR_* if any required DDI table failed to load
1638
__zedlllocal ze_result_t ZE_APICALL
1739
zerloaderInitDriverDDITables(loader::driver_t *driver) {
1840
ze_result_t result = ZE_RESULT_SUCCESS;

0 commit comments

Comments
 (0)