Skip to content

Commit 5771e1a

Browse files
committed
Fix handling of unsupported feature during loader initialization
Signed-off-by: Neil R. Spruit <neil.r.spruit@intel.com>
1 parent 2df32f9 commit 5771e1a

File tree

9 files changed

+51
-42
lines changed

9 files changed

+51
-42
lines changed

scripts/templates/ldrddi.cpp.mako

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -210,7 +210,8 @@ namespace loader
210210
{
211211
for( uint32_t i = 0; i < library_driver_handle_count; ++i ) {
212212
uint32_t driver_index = total_driver_handle_count + i;
213-
drv.zerDriverHandle = phDrivers[ driver_index ];
213+
if (drv.zerddiInitResult == ZE_RESULT_SUCCESS)
214+
drv.zerDriverHandle = phDrivers[ driver_index ];
214215
%if namespace != "zes":
215216
if (drv.driverDDIHandleSupportQueried == false) {
216217
uint32_t extensionCount = 0;

scripts/templates/ldrddi_driver_ddi.cpp.mako

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,10 @@ namespace loader_driver_ddi
105105
%if ret_type == 'ze_result_t':
106106
return ${X}_RESULT_ERROR_UNINITIALIZED;
107107
%else:
108+
if (loader::context->zeDrivers.front().zerddiInitResult == ZE_RESULT_ERROR_UNSUPPORTED_FEATURE) {
109+
error_state::setErrorDesc("ERROR UNSUPPORTED FEATURE");
110+
return ${failure_return};
111+
}
108112
error_state::setErrorDesc("ERROR UNINITIALIZED");
109113
return ${failure_return};
110114
%endif

scripts/templates/ze_loader_internal.h.mako

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,10 @@ namespace loader
7171
ze_driver_handle_t zerDriverHandle = nullptr;
7272
ze_api_version_t versionRequested = ZE_API_VERSION_CURRENT;
7373
bool ddiInitialized = false;
74+
ze_result_t zeddiInitResult = ZE_RESULT_ERROR_UNINITIALIZED;
75+
ze_result_t zetddiInitResult = ZE_RESULT_ERROR_UNINITIALIZED;
76+
ze_result_t zesddiInitResult = ZE_RESULT_ERROR_UNINITIALIZED;
77+
ze_result_t zerddiInitResult = ZE_RESULT_ERROR_UNINITIALIZED;
7478
};
7579

7680
using driver_vector_t = std::vector< driver_t >;

source/loader/ze_ldrddi.cpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -235,7 +235,8 @@ namespace loader
235235
{
236236
for( uint32_t i = 0; i < library_driver_handle_count; ++i ) {
237237
uint32_t driver_index = total_driver_handle_count + i;
238-
drv.zerDriverHandle = phDrivers[ driver_index ];
238+
if (drv.zerddiInitResult == ZE_RESULT_SUCCESS)
239+
drv.zerDriverHandle = phDrivers[ driver_index ];
239240
if (drv.driverDDIHandleSupportQueried == false) {
240241
uint32_t extensionCount = 0;
241242
ze_result_t res = drv.dditable.ze.Driver.pfnGetExtensionProperties(phDrivers[ driver_index ], &extensionCount, nullptr);
@@ -392,7 +393,8 @@ namespace loader
392393
{
393394
for( uint32_t i = 0; i < library_driver_handle_count; ++i ) {
394395
uint32_t driver_index = total_driver_handle_count + i;
395-
drv.zerDriverHandle = phDrivers[ driver_index ];
396+
if (drv.zerddiInitResult == ZE_RESULT_SUCCESS)
397+
drv.zerDriverHandle = phDrivers[ driver_index ];
396398
if (drv.driverDDIHandleSupportQueried == false) {
397399
uint32_t extensionCount = 0;
398400
ze_result_t res = drv.dditable.ze.Driver.pfnGetExtensionProperties(phDrivers[ driver_index ], &extensionCount, nullptr);

source/loader/ze_loader.cpp

Lines changed: 18 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -324,16 +324,18 @@ namespace loader
324324
continue;
325325
}
326326
} else {
327+
res = ZE_RESULT_ERROR_UNINITIALIZED;
327328
if (debugTraceEnabled) {
328-
std::string message = "driverSorting " + driver.name + " zeDriverGet and zeInitDrivers not supported, skipping driver";
329+
std::string message = "driverSorting " + driver.name + " zeDriverGet and zeInitDrivers not supported, skipping driver with error ";
329330
debug_trace_message(message, loader::to_string(res));
330331
}
331332
continue;
332333
}
333334

334335
for (auto handle : driverHandles) {
335336
uint32_t extensionCount = 0;
336-
driver.zerDriverHandle = handle;
337+
if (driver.zerddiInitResult == ZE_RESULT_SUCCESS)
338+
driver.zerDriverHandle = handle;
337339
ze_result_t res = driver.dditable.ze.Driver.pfnGetExtensionProperties(handle, &extensionCount, nullptr);
338340
if (res != ZE_RESULT_SUCCESS) {
339341
if (loader::context->debugTraceEnabled) {
@@ -544,31 +546,40 @@ namespace loader
544546
std::string message = "init driver " + driver.name + " failed, zeloaderInitDriverDDITables returned ";
545547
debug_trace_message(message, loader::to_string(res));
546548
}
547-
return res;
549+
driver.zeddiInitResult = res;
550+
} else {
551+
driver.zeddiInitResult = ZE_RESULT_SUCCESS;
548552
}
549553
res = loader::zesloaderInitDriverDDITables(&driver);
550554
if (res != ZE_RESULT_SUCCESS) {
551555
if (debugTraceEnabled) {
552556
std::string message = "init driver " + driver.name + " failed, zesloaderInitDriverDDITables returned ";
553557
debug_trace_message(message, loader::to_string(res));
554558
}
555-
return res;
559+
driver.zesddiInitResult = res;
560+
} else {
561+
driver.zesddiInitResult = ZE_RESULT_SUCCESS;
556562
}
557563
res = loader::zetloaderInitDriverDDITables(&driver);
558564
if (res != ZE_RESULT_SUCCESS) {
559565
if (debugTraceEnabled) {
560566
std::string message = "init driver " + driver.name + " failed, zetloaderInitDriverDDITables returned ";
561567
debug_trace_message(message, loader::to_string(res));
562568
}
563-
return res;
569+
driver.zetddiInitResult = res;
570+
} else {
571+
driver.zetddiInitResult = ZE_RESULT_SUCCESS;
564572
}
565573
res = loader::zerloaderInitDriverDDITables(&driver);
566574
if (res != ZE_RESULT_SUCCESS) {
567575
if (debugTraceEnabled) {
568576
std::string message = "init driver " + driver.name + " failed, zerloaderInitDriverDDITables returned ";
569577
debug_trace_message(message, loader::to_string(res));
570578
}
571-
return res;
579+
driver.zerddiInitResult = res;
580+
driver.zerDriverHandle = nullptr;
581+
} else {
582+
driver.zerddiInitResult = ZE_RESULT_SUCCESS;
572583
}
573584
driver.ddiInitialized = true;
574585
}
@@ -676,29 +687,6 @@ namespace loader
676687
allDrivers.emplace_back();
677688
allDrivers.rbegin()->handle = nullptr;
678689
allDrivers.rbegin()->name = name;
679-
// auto handle = LOAD_DRIVER_LIBRARY( name.c_str() );
680-
// if( NULL != handle )
681-
// {
682-
// if (debugTraceEnabled) {
683-
// std::string message = "Loading Driver " + name + " succeeded";
684-
// #if !defined(_WIN32) && !defined(ANDROID)
685-
// // TODO: implement same message for windows, move dlinfo to ze_util.h as a macro
686-
// struct link_map *dlinfo_map;
687-
// if (dlinfo(handle, RTLD_DI_LINKMAP, &dlinfo_map) == 0) {
688-
// message += " from: " + std::string(dlinfo_map->l_name);
689-
// }
690-
// #endif
691-
// debug_trace_message(message, "");
692-
// }
693-
// allDrivers.emplace_back();
694-
// allDrivers.rbegin()->handle = handle;
695-
// allDrivers.rbegin()->name = name;
696-
// } else if (debugTraceEnabled) {
697-
// GET_LIBRARY_ERROR(loadLibraryErrorValue);
698-
// std::string errorMessage = "Load Library of " + name + " failed with ";
699-
// debug_trace_message(errorMessage, loadLibraryErrorValue);
700-
// loadLibraryErrorValue.clear();
701-
// }
702690
}
703691
if(allDrivers.size()==0){
704692
if (debugTraceEnabled) {
@@ -777,7 +765,7 @@ namespace loader
777765
driverEnvironmentQueried = true;
778766

779767
// Set default driver handle and DDI table to the first driver in the list before sorting.
780-
loader::context->defaultZerDriverHandle = &loader::context->zeDrivers.front().zerDriverHandle;
768+
loader::context->defaultZerDriverHandle = loader::context->zeDrivers.front().zerDriverHandle;
781769
loader::defaultZerDdiTable = &loader::context->zeDrivers.front().dditable.zer;
782770

783771
zel_logger->log_info("zeInit succeeded");

source/loader/ze_loader_internal.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,10 @@ namespace loader
6262
ze_driver_handle_t zerDriverHandle = nullptr;
6363
ze_api_version_t versionRequested = ZE_API_VERSION_CURRENT;
6464
bool ddiInitialized = false;
65+
ze_result_t zeddiInitResult = ZE_RESULT_ERROR_UNINITIALIZED;
66+
ze_result_t zetddiInitResult = ZE_RESULT_ERROR_UNINITIALIZED;
67+
ze_result_t zesddiInitResult = ZE_RESULT_ERROR_UNINITIALIZED;
68+
ze_result_t zerddiInitResult = ZE_RESULT_ERROR_UNINITIALIZED;
6569
};
6670

6771
using driver_vector_t = std::vector< driver_t >;

source/loader/zer_ldrddi.cpp

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -142,14 +142,7 @@ zerGetGlobalProcAddrTableFromDriver(loader::driver_t *driver)
142142
GET_FUNCTION_PTR( driver->handle, "zerGetGlobalProcAddrTable") );
143143
if(!getTable)
144144
return driver->initStatus;
145-
auto getTableResult = getTable( loader::context->ddi_init_version, &driver->dditable.zer.Global);
146-
if(getTableResult == ZE_RESULT_SUCCESS) {
147-
loader::context->configured_version = loader::context->ddi_init_version;
148-
} else
149-
driver->initStatus = getTableResult;
150-
if (driver->dditable.ze.Global.pfnInitDrivers) {
151-
loader::context->initDriversSupport = true;
152-
}
145+
result = getTable( loader::context->ddi_init_version, &driver->dditable.zer.Global);
153146
return result;
154147
}
155148
///////////////////////////////////////////////////////////////////////////////

source/loader/zer_ldrddi_driver_ddi.cpp

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,10 @@ namespace loader_driver_ddi
6363

6464
// Check if the default driver supports DDI Handles
6565
if (loader::context->defaultZerDriverHandle == nullptr) {
66+
if (loader::context->zeDrivers.front().zerddiInitResult == ZE_RESULT_ERROR_UNSUPPORTED_FEATURE) {
67+
error_state::setErrorDesc("ERROR UNSUPPORTED FEATURE");
68+
return UINT32_MAX;
69+
}
6670
error_state::setErrorDesc("ERROR UNINITIALIZED");
6771
return UINT32_MAX;
6872
}
@@ -102,6 +106,10 @@ namespace loader_driver_ddi
102106

103107
// Check if the default driver supports DDI Handles
104108
if (loader::context->defaultZerDriverHandle == nullptr) {
109+
if (loader::context->zeDrivers.front().zerddiInitResult == ZE_RESULT_ERROR_UNSUPPORTED_FEATURE) {
110+
error_state::setErrorDesc("ERROR UNSUPPORTED FEATURE");
111+
return nullptr;
112+
}
105113
error_state::setErrorDesc("ERROR UNINITIALIZED");
106114
return nullptr;
107115
}
@@ -141,6 +149,10 @@ namespace loader_driver_ddi
141149

142150
// Check if the default driver supports DDI Handles
143151
if (loader::context->defaultZerDriverHandle == nullptr) {
152+
if (loader::context->zeDrivers.front().zerddiInitResult == ZE_RESULT_ERROR_UNSUPPORTED_FEATURE) {
153+
error_state::setErrorDesc("ERROR UNSUPPORTED FEATURE");
154+
return nullptr;
155+
}
144156
error_state::setErrorDesc("ERROR UNINITIALIZED");
145157
return nullptr;
146158
}

source/loader/zes_ldrddi.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -213,7 +213,8 @@ namespace loader
213213
{
214214
for( uint32_t i = 0; i < library_driver_handle_count; ++i ) {
215215
uint32_t driver_index = total_driver_handle_count + i;
216-
drv.zerDriverHandle = phDrivers[ driver_index ];
216+
if (drv.zerddiInitResult == ZE_RESULT_SUCCESS)
217+
drv.zerDriverHandle = phDrivers[ driver_index ];
217218
phDrivers[ driver_index ] = reinterpret_cast<zes_driver_handle_t>(
218219
context->zes_driver_factory.getInstance( phDrivers[ driver_index ], &drv.dditable ) );
219220
}

0 commit comments

Comments
 (0)