Skip to content

Commit e0df1d0

Browse files
authored
Fix init checks when sorting legacy drivers (#317)
Signed-off-by: Neil R. Spruit <[email protected]>
1 parent a510259 commit e0df1d0

File tree

11 files changed

+58
-2
lines changed

11 files changed

+58
-2
lines changed

scripts/templates/ldrddi.cpp.mako

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,9 @@ namespace loader
6767
drv.initStatus = drv.dditable.${n}.${th.get_table_name(n, tags, obj)}.${th.make_pfn_name(n, tags, obj)}( ${", ".join(th.make_param_lines(n, tags, obj, format=["name"]))} );
6868
if(drv.initStatus == ZE_RESULT_SUCCESS)
6969
atLeastOneDriverValid = true;
70+
%if re.match(r"Init", obj['name']) and namespace == "ze":
71+
drv.legacyInitAttempted = true;
72+
%endif
7073
%endif
7174
}
7275

scripts/templates/nullddi.cpp.mako

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -134,7 +134,11 @@ ${tbl['export']['name']}(
134134
pDdiTable->pfnInit = driver::zeInit;
135135

136136
auto missing_api = getenv_string( "ZEL_TEST_MISSING_API" );
137-
if (std::strcmp(missing_api.c_str(), "zeInitDrivers") == 0) {
137+
auto missing_api_driver_id = getenv_string( "ZEL_TEST_MISSING_API_DRIVER_ID" );
138+
std::string zeInitDriversWithNullDriverId = "zeInitDrivers:" + std::to_string(ZEL_NULL_DRIVER_ID);
139+
if (std::strcmp(missing_api_driver_id.c_str(), zeInitDriversWithNullDriverId.c_str()) == 0) {
140+
pDdiTable->pfnInitDrivers = nullptr;
141+
} else if (std::strcmp(missing_api.c_str(), "zeInitDrivers") == 0) {
138142
pDdiTable->pfnInitDrivers = nullptr;
139143
} else {
140144
pDdiTable->pfnInitDrivers = driver::zeInitDrivers;

scripts/templates/ze_loader_internal.h.mako

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,7 @@ namespace loader
6565
zel_driver_type_t driverType = ZEL_DRIVER_TYPE_FORCE_UINT32;
6666
ze_driver_properties_t properties;
6767
bool pciOrderingRequested = false;
68+
bool legacyInitAttempted = false;
6869
};
6970

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

source/drivers/null/CMakeLists.txt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,10 @@ target_include_directories(ze_null_test2
6565
${CMAKE_CURRENT_SOURCE_DIR}
6666
)
6767

68+
target_compile_definitions(ze_null_test1 PUBLIC ZEL_NULL_DRIVER_ID=1)
69+
target_compile_definitions(ze_null_test2 PUBLIC ZEL_NULL_DRIVER_ID=2)
70+
target_compile_definitions(ze_null PUBLIC ZEL_NULL_DRIVER_ID=1)
71+
6872
if(INSTALL_NULL_DRIVER)
6973
install(TARGETS ze_null_test1
7074
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} COMPONENT level-zero-devel

source/drivers/null/ze_null.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,10 @@
1515
#include "zes_ddi.h"
1616
#include "ze_util.h"
1717

18+
#ifndef ZEL_NULL_DRIVER_ID
19+
#define ZEL_NULL_DRIVER_ID 1
20+
#endif
21+
1822
namespace driver
1923
{
2024
///////////////////////////////////////////////////////////////////////////////

source/drivers/null/ze_nullddi.cpp

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5282,7 +5282,11 @@ zeGetGlobalProcAddrTable(
52825282
pDdiTable->pfnInit = driver::zeInit;
52835283

52845284
auto missing_api = getenv_string( "ZEL_TEST_MISSING_API" );
5285-
if (std::strcmp(missing_api.c_str(), "zeInitDrivers") == 0) {
5285+
auto missing_api_driver_id = getenv_string( "ZEL_TEST_MISSING_API_DRIVER_ID" );
5286+
std::string zeInitDriversWithNullDriverId = "zeInitDrivers:" + std::to_string(ZEL_NULL_DRIVER_ID);
5287+
if (std::strcmp(missing_api_driver_id.c_str(), zeInitDriversWithNullDriverId.c_str()) == 0) {
5288+
pDdiTable->pfnInitDrivers = nullptr;
5289+
} else if (std::strcmp(missing_api.c_str(), "zeInitDrivers") == 0) {
52865290
pDdiTable->pfnInitDrivers = nullptr;
52875291
} else {
52885292
pDdiTable->pfnInitDrivers = driver::zeInitDrivers;

source/loader/ze_ldrddi.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ namespace loader
2929
drv.initStatus = drv.dditable.ze.Global.pfnInit( flags );
3030
if(drv.initStatus == ZE_RESULT_SUCCESS)
3131
atLeastOneDriverValid = true;
32+
drv.legacyInitAttempted = true;
3233
}
3334

3435
if(!atLeastOneDriverValid)

source/loader/ze_loader.cpp

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,13 @@ namespace loader
100100
std::vector<ze_driver_handle_t> driverHandles;
101101
ze_result_t res = ZE_RESULT_SUCCESS;
102102
if (desc && driver.dditable.ze.Global.pfnInitDrivers) {
103+
if (driver.initDriversStatus != ZE_RESULT_SUCCESS) {
104+
if (debugTraceEnabled) {
105+
std::string message = "driverSorting " + driver.name + " failed, zeInitDrivers returned ";
106+
debug_trace_message(message, loader::to_string(driver.initDriversStatus));
107+
}
108+
continue;
109+
}
103110
if (debugTraceEnabled) {
104111
std::string message = "driverSorting " + driver.name + " using zeInitDrivers(" + loader::to_string(&permissiveDesc) + ")";
105112
debug_trace_message(message, "");
@@ -126,6 +133,13 @@ namespace loader
126133
continue;
127134
}
128135
} else if (driver.dditable.ze.Driver.pfnGet) {
136+
if (driver.initStatus != ZE_RESULT_SUCCESS || !driver.legacyInitAttempted) {
137+
if (debugTraceEnabled) {
138+
std::string message = "driverSorting " + driver.name + " failed, zeInit returned ";
139+
debug_trace_message(message, loader::to_string(driver.initStatus));
140+
}
141+
continue;
142+
}
129143
if (debugTraceEnabled) {
130144
std::string message = "driverSorting " + driver.name + " using zeDriverGet";
131145
debug_trace_message(message, "");

source/loader/ze_loader_internal.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@ namespace loader
5656
zel_driver_type_t driverType = ZEL_DRIVER_TYPE_FORCE_UINT32;
5757
ze_driver_properties_t properties;
5858
bool pciOrderingRequested = false;
59+
bool legacyInitAttempted = false;
5960
};
6061

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

test/CMakeLists.txt

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,13 @@ else()
5252
set_property(TEST tests_multi_driver_missing_initDrivers PROPERTY ENVIRONMENT "ZE_ENABLE_LOADER_DEBUG_TRACE=1;ZE_ENABLE_ALT_DRIVERS=${CMAKE_BINARY_DIR}/lib/libze_null_test1.so,${CMAKE_BINARY_DIR}/lib/libze_null_test2.so")
5353
endif()
5454

55+
add_test(NAME tests_multi_driver_one_driver_missing_initDrivers COMMAND tests --gtest_filter=*GivenLevelZeroLoaderPresentWithMultipleDriversMissingInitDriversInOneDriverWhenCallingZeInitDriversThenExpectSuccessForZeInitDrivers)
56+
if (MSVC)
57+
set_property(TEST tests_multi_driver_one_driver_missing_initDrivers PROPERTY ENVIRONMENT "ZE_ENABLE_LOADER_DEBUG_TRACE=1;ZE_ENABLE_ALT_DRIVERS=${CMAKE_BINARY_DIR}/bin/$<CONFIG>/ze_null_test1.dll,${CMAKE_BINARY_DIR}/bin/$<CONFIG>/ze_null_test2.dll")
58+
else()
59+
set_property(TEST tests_multi_driver_one_driver_missing_initDrivers PROPERTY ENVIRONMENT "ZE_ENABLE_LOADER_DEBUG_TRACE=1;ZE_ENABLE_ALT_DRIVERS=${CMAKE_BINARY_DIR}/lib/libze_null_test1.so,${CMAKE_BINARY_DIR}/lib/libze_null_test2.so")
60+
endif()
61+
5562
add_test(NAME tests_multi_driver_missing_initDrivers_sort_after_error COMMAND tests --gtest_filter=*GivenLevelZeroLoaderPresentWithMultipleDriversMissingInitDriversWhenCallingZeInitDriversThenExpectSuccessForZeInitWithDriverGetAfterInitDrivers)
5663
if (MSVC)
5764
set_property(TEST tests_multi_driver_missing_initDrivers_sort_after_error APPEND PROPERTY ENVIRONMENT "ZE_ENABLE_LOADER_DEBUG_TRACE=1;ZE_ENABLE_ALT_DRIVERS=${CMAKE_BINARY_DIR}/bin/$<CONFIG>/ze_null_test1.dll,${CMAKE_BINARY_DIR}/bin/$<CONFIG>/ze_null_test2.dll")

0 commit comments

Comments
 (0)