Skip to content

Commit 4b34a1b

Browse files
committed
Add additional check for optional tables during init
Signed-off-by: Neil R. Spruit <[email protected]>
1 parent 0e8487f commit 4b34a1b

File tree

8 files changed

+308
-144
lines changed

8 files changed

+308
-144
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: 34 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;
@@ -569,6 +597,11 @@ ${tbl['export']['name']}FromDriver(loader::driver_t *driver)
569597
}
570598
%endif
571599
%endif
600+
%elif tbl['optional'] == True:
601+
auto getTableResult = getTable( loader::context->ddi_init_version, &driver->dditable.${n}.${tbl['name']});
602+
if(getTableResult == ZE_RESULT_SUCCESS) {
603+
loader::context->configured_version = loader::context->ddi_init_version;
604+
}
572605
%else:
573606
result = getTable( loader::context->ddi_init_version, &driver->dditable.${n}.${tbl['name']});
574607
%endif

source/loader/ze_ldrddi.cpp

Lines changed: 107 additions & 67 deletions
Large diffs are not rendered by default.

source/loader/zer_ldrddi.cpp

Lines changed: 26 additions & 1 deletion
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;
@@ -142,7 +164,10 @@ zerGetGlobalProcAddrTableFromDriver(loader::driver_t *driver)
142164
GET_FUNCTION_PTR( driver->handle, "zerGetGlobalProcAddrTable") );
143165
if(!getTable)
144166
return driver->initStatus;
145-
result = getTable( loader::context->ddi_init_version, &driver->dditable.zer.Global);
167+
auto getTableResult = getTable( loader::context->ddi_init_version, &driver->dditable.zer.Global);
168+
if(getTableResult == ZE_RESULT_SUCCESS) {
169+
loader::context->configured_version = loader::context->ddi_init_version;
170+
}
146171
return result;
147172
}
148173
///////////////////////////////////////////////////////////////////////////////

source/loader/zes_ldrddi.cpp

Lines changed: 65 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -13,29 +13,48 @@ 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
zesloaderInitDriverDDITables(loader::driver_t *driver) {
1840
ze_result_t result = ZE_RESULT_SUCCESS;
19-
result = zesGetGlobalProcAddrTableFromDriver(driver);
20-
if (result != ZE_RESULT_SUCCESS) {
21-
return result;
22-
}
41+
// Optional DDI Table, ignore failure if a driver implements the ddi table, but returns an error.
42+
zesGetGlobalProcAddrTableFromDriver(driver);
43+
result = ZE_RESULT_SUCCESS;
2344
result = zesGetDeviceProcAddrTableFromDriver(driver);
2445
if (result != ZE_RESULT_SUCCESS) {
2546
return result;
2647
}
27-
result = zesGetDeviceExpProcAddrTableFromDriver(driver);
28-
if (result != ZE_RESULT_SUCCESS) {
29-
return result;
30-
}
48+
// Optional DDI Table, ignore failure if a driver implements the ddi table, but returns an error.
49+
zesGetDeviceExpProcAddrTableFromDriver(driver);
50+
result = ZE_RESULT_SUCCESS;
3151
result = zesGetDriverProcAddrTableFromDriver(driver);
3252
if (result != ZE_RESULT_SUCCESS) {
3353
return result;
3454
}
35-
result = zesGetDriverExpProcAddrTableFromDriver(driver);
36-
if (result != ZE_RESULT_SUCCESS) {
37-
return result;
38-
}
55+
// Optional DDI Table, ignore failure if a driver implements the ddi table, but returns an error.
56+
zesGetDriverExpProcAddrTableFromDriver(driver);
57+
result = ZE_RESULT_SUCCESS;
3958
result = zesGetDiagnosticsProcAddrTableFromDriver(driver);
4059
if (result != ZE_RESULT_SUCCESS) {
4160
return result;
@@ -56,10 +75,9 @@ namespace loader
5675
if (result != ZE_RESULT_SUCCESS) {
5776
return result;
5877
}
59-
result = zesGetFirmwareExpProcAddrTableFromDriver(driver);
60-
if (result != ZE_RESULT_SUCCESS) {
61-
return result;
62-
}
78+
// Optional DDI Table, ignore failure if a driver implements the ddi table, but returns an error.
79+
zesGetFirmwareExpProcAddrTableFromDriver(driver);
80+
result = ZE_RESULT_SUCCESS;
6381
result = zesGetFrequencyProcAddrTableFromDriver(driver);
6482
if (result != ZE_RESULT_SUCCESS) {
6583
return result;
@@ -72,10 +90,9 @@ namespace loader
7290
if (result != ZE_RESULT_SUCCESS) {
7391
return result;
7492
}
75-
result = zesGetOverclockProcAddrTableFromDriver(driver);
76-
if (result != ZE_RESULT_SUCCESS) {
77-
return result;
78-
}
93+
// Optional DDI Table, ignore failure if a driver implements the ddi table, but returns an error.
94+
zesGetOverclockProcAddrTableFromDriver(driver);
95+
result = ZE_RESULT_SUCCESS;
7996
result = zesGetPerformanceFactorProcAddrTableFromDriver(driver);
8097
if (result != ZE_RESULT_SUCCESS) {
8198
return result;
@@ -92,10 +109,9 @@ namespace loader
92109
if (result != ZE_RESULT_SUCCESS) {
93110
return result;
94111
}
95-
result = zesGetRasExpProcAddrTableFromDriver(driver);
96-
if (result != ZE_RESULT_SUCCESS) {
97-
return result;
98-
}
112+
// Optional DDI Table, ignore failure if a driver implements the ddi table, but returns an error.
113+
zesGetRasExpProcAddrTableFromDriver(driver);
114+
result = ZE_RESULT_SUCCESS;
99115
result = zesGetSchedulerProcAddrTableFromDriver(driver);
100116
if (result != ZE_RESULT_SUCCESS) {
101117
return result;
@@ -108,10 +124,9 @@ namespace loader
108124
if (result != ZE_RESULT_SUCCESS) {
109125
return result;
110126
}
111-
result = zesGetVFManagementExpProcAddrTableFromDriver(driver);
112-
if (result != ZE_RESULT_SUCCESS) {
113-
return result;
114-
}
127+
// Optional DDI Table, ignore failure if a driver implements the ddi table, but returns an error.
128+
zesGetVFManagementExpProcAddrTableFromDriver(driver);
129+
result = ZE_RESULT_SUCCESS;
115130
return result;
116131
}
117132
///////////////////////////////////////////////////////////////////////////////
@@ -5059,8 +5074,7 @@ zesGetGlobalProcAddrTableFromDriver(loader::driver_t *driver)
50595074
auto getTableResult = getTable( loader::context->ddi_init_version, &driver->dditable.zes.Global);
50605075
if(getTableResult == ZE_RESULT_SUCCESS) {
50615076
loader::context->configured_version = loader::context->ddi_init_version;
5062-
} else
5063-
driver->initStatus = getTableResult;
5077+
}
50645078
return result;
50655079
}
50665080
///////////////////////////////////////////////////////////////////////////////
@@ -5108,7 +5122,10 @@ zesGetDeviceExpProcAddrTableFromDriver(loader::driver_t *driver)
51085122
GET_FUNCTION_PTR( driver->handle, "zesGetDeviceExpProcAddrTable") );
51095123
if(!getTable)
51105124
return driver->initStatus;
5111-
result = getTable( loader::context->ddi_init_version, &driver->dditable.zes.DeviceExp);
5125+
auto getTableResult = getTable( loader::context->ddi_init_version, &driver->dditable.zes.DeviceExp);
5126+
if(getTableResult == ZE_RESULT_SUCCESS) {
5127+
loader::context->configured_version = loader::context->ddi_init_version;
5128+
}
51125129
return result;
51135130
}
51145131
///////////////////////////////////////////////////////////////////////////////
@@ -5156,7 +5173,10 @@ zesGetDriverExpProcAddrTableFromDriver(loader::driver_t *driver)
51565173
GET_FUNCTION_PTR( driver->handle, "zesGetDriverExpProcAddrTable") );
51575174
if(!getTable)
51585175
return driver->initStatus;
5159-
result = getTable( loader::context->ddi_init_version, &driver->dditable.zes.DriverExp);
5176+
auto getTableResult = getTable( loader::context->ddi_init_version, &driver->dditable.zes.DriverExp);
5177+
if(getTableResult == ZE_RESULT_SUCCESS) {
5178+
loader::context->configured_version = loader::context->ddi_init_version;
5179+
}
51605180
return result;
51615181
}
51625182
///////////////////////////////////////////////////////////////////////////////
@@ -5308,7 +5328,10 @@ zesGetFirmwareExpProcAddrTableFromDriver(loader::driver_t *driver)
53085328
GET_FUNCTION_PTR( driver->handle, "zesGetFirmwareExpProcAddrTable") );
53095329
if(!getTable)
53105330
return driver->initStatus;
5311-
result = getTable( loader::context->ddi_init_version, &driver->dditable.zes.FirmwareExp);
5331+
auto getTableResult = getTable( loader::context->ddi_init_version, &driver->dditable.zes.FirmwareExp);
5332+
if(getTableResult == ZE_RESULT_SUCCESS) {
5333+
loader::context->configured_version = loader::context->ddi_init_version;
5334+
}
53125335
return result;
53135336
}
53145337
///////////////////////////////////////////////////////////////////////////////
@@ -5414,8 +5437,7 @@ zesGetOverclockProcAddrTableFromDriver(loader::driver_t *driver)
54145437
auto getTableResult = getTable( loader::context->ddi_init_version, &driver->dditable.zes.Overclock);
54155438
if(getTableResult == ZE_RESULT_SUCCESS) {
54165439
loader::context->configured_version = loader::context->ddi_init_version;
5417-
} else
5418-
driver->initStatus = getTableResult;
5440+
}
54195441
return result;
54205442
}
54215443
///////////////////////////////////////////////////////////////////////////////
@@ -5541,7 +5563,10 @@ zesGetRasExpProcAddrTableFromDriver(loader::driver_t *driver)
55415563
GET_FUNCTION_PTR( driver->handle, "zesGetRasExpProcAddrTable") );
55425564
if(!getTable)
55435565
return driver->initStatus;
5544-
result = getTable( loader::context->ddi_init_version, &driver->dditable.zes.RasExp);
5566+
auto getTableResult = getTable( loader::context->ddi_init_version, &driver->dditable.zes.RasExp);
5567+
if(getTableResult == ZE_RESULT_SUCCESS) {
5568+
loader::context->configured_version = loader::context->ddi_init_version;
5569+
}
55455570
return result;
55465571
}
55475572
///////////////////////////////////////////////////////////////////////////////
@@ -5641,7 +5666,10 @@ zesGetVFManagementExpProcAddrTableFromDriver(loader::driver_t *driver)
56415666
GET_FUNCTION_PTR( driver->handle, "zesGetVFManagementExpProcAddrTable") );
56425667
if(!getTable)
56435668
return driver->initStatus;
5644-
result = getTable( loader::context->ddi_init_version, &driver->dditable.zes.VFManagementExp);
5669+
auto getTableResult = getTable( loader::context->ddi_init_version, &driver->dditable.zes.VFManagementExp);
5670+
if(getTableResult == ZE_RESULT_SUCCESS) {
5671+
loader::context->configured_version = loader::context->ddi_init_version;
5672+
}
56455673
return result;
56465674
}
56475675
///////////////////////////////////////////////////////////////////////////////

0 commit comments

Comments
 (0)