Skip to content

Commit b32de12

Browse files
mateuszpnnrspruit
authored andcommitted
update leak checker for experimental function
Signed-off-by: Mateusz P. Nowak <mateusz.p.nowak@intel.com>
1 parent 7ae9d18 commit b32de12

6 files changed

Lines changed: 139 additions & 2 deletions

File tree

source/layers/validation/checkers/basic_leak/zel_basic_leak_checker.cpp

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ namespace validation_layer
5151
{{"zeKernelCreate"}, {"zeKernelDestroy"}},
5252
{{"zeEventPoolCreate"}, {"zeEventPoolDestroy"}},
5353
{{"zeCommandListCreateImmediate", "zeCommandListCreate"}, {"zeCommandListDestroy"}},
54-
{{"zeEventCreate"}, {"zeEventDestroy"}},
54+
{{"zeEventCreate", "zexCounterBasedEventCreate2"}, {"zeEventDestroy"}},
5555
{{"zeFenceCreate"}, {"zeFenceDestroy"}},
5656
{{"zeImageCreate", "zeImageViewCreateExt"}, {"zeImageDestroy"}},
5757
{{"zeSamplerCreate"}, {"zeSamplerDestroy"}},
@@ -177,6 +177,13 @@ namespace validation_layer
177177
return result;
178178
}
179179

180+
ze_result_t basic_leakChecker::ZEbasic_leakChecker::zexCounterBasedEventCreate2Epilogue(ze_context_handle_t, ze_device_handle_t, const void *, ze_event_handle_t *, ze_result_t result) {
181+
if (result == ZE_RESULT_SUCCESS) {
182+
countFunctionCall("zexCounterBasedEventCreate2");
183+
}
184+
return result;
185+
}
186+
180187
ze_result_t basic_leakChecker::ZEbasic_leakChecker::zeFenceCreateEpilogue(ze_command_queue_handle_t, const ze_fence_desc_t *, ze_fence_handle_t*, ze_result_t result) {
181188
if (result == ZE_RESULT_SUCCESS) {
182189
countFunctionCall("zeFenceCreate");

source/layers/validation/checkers/basic_leak/zel_basic_leak_checker.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,8 @@ namespace validation_layer
8080
ze_result_t zeMemAllocSharedEpilogue(ze_context_handle_t, const ze_device_mem_alloc_desc_t *, const ze_host_mem_alloc_desc_t *, size_t, size_t, ze_device_handle_t, void **, ze_result_t result) override;
8181
ze_result_t zeMemFreeEpilogue(ze_context_handle_t, void *, ze_result_t result) override;
8282
ze_result_t zeMemFreeExtEpilogue(ze_context_handle_t, const ze_memory_free_ext_desc_t*, void *, ze_result_t result) override;
83+
// Experimental function for Intel counter-based events
84+
ze_result_t zexCounterBasedEventCreate2Epilogue(ze_context_handle_t, ze_device_handle_t, const void *, ze_event_handle_t *, ze_result_t result) override;
8385
private:
8486
void countFunctionCall(const std::string &functionName);
8587
std::unordered_map<std::string, std::atomic<int64_t>> counts;

source/layers/validation/common/ze_entry_points.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -423,6 +423,9 @@ class ZEValidationEntryPoints {
423423
virtual ze_result_t zeCommandListUpdateMutableCommandWaitEventsExpEpilogue( ze_command_list_handle_t hCommandList, uint64_t commandId, uint32_t numWaitEvents, ze_event_handle_t* phWaitEvents , ze_result_t result) {return ZE_RESULT_SUCCESS;}
424424
virtual ze_result_t zeCommandListUpdateMutableCommandKernelsExpPrologue( ze_command_list_handle_t hCommandList, uint32_t numKernels, uint64_t* pCommandId, ze_kernel_handle_t* phKernels ) {return ZE_RESULT_SUCCESS;}
425425
virtual ze_result_t zeCommandListUpdateMutableCommandKernelsExpEpilogue( ze_command_list_handle_t hCommandList, uint32_t numKernels, uint64_t* pCommandId, ze_kernel_handle_t* phKernels , ze_result_t result) {return ZE_RESULT_SUCCESS;}
426-
virtual ~ZEValidationEntryPoints() {}
426+
// Experimental Intel extension for counter-based events
427+
virtual ze_result_t zexCounterBasedEventCreate2Prologue( ze_context_handle_t hContext, ze_device_handle_t hDevice, const void* desc, ze_event_handle_t* phEvent ) {return ZE_RESULT_SUCCESS;}
428+
virtual ze_result_t zexCounterBasedEventCreate2Epilogue( ze_context_handle_t hContext, ze_device_handle_t hDevice, const void* desc, ze_event_handle_t* phEvent , ze_result_t result) {return ZE_RESULT_SUCCESS;}
429+
virtual ~ZEValidationEntryPoints() {}
427430
};
428431
}

source/layers/validation/handle_lifetime_tracking/ze_handle_lifetime.cpp

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3494,4 +3494,19 @@ namespace validation_layer
34943494
}
34953495
return ZE_RESULT_SUCCESS;
34963496
}
3497+
ze_result_t ZEHandleLifetimeValidation::zexCounterBasedEventCreate2Prologue(
3498+
ze_context_handle_t hContext, ///< [in] handle of the context object
3499+
ze_device_handle_t hDevice, ///< [in] handle of the device
3500+
const void *desc, ///< [in] pointer to counter-based event descriptor
3501+
ze_event_handle_t *phEvent ///< [out] pointer to handle of event object created
3502+
)
3503+
{
3504+
if (!context.handleLifetime->isHandleValid(hContext)) {
3505+
return ZE_RESULT_ERROR_INVALID_NULL_HANDLE;
3506+
}
3507+
if (!context.handleLifetime->isHandleValid(hDevice)) {
3508+
return ZE_RESULT_ERROR_INVALID_NULL_HANDLE;
3509+
}
3510+
return ZE_RESULT_SUCCESS;
3511+
}
34973512
}

source/layers/validation/handle_lifetime_tracking/ze_handle_lifetime.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -219,6 +219,8 @@ namespace validation_layer
219219
ze_result_t zeCommandListUpdateMutableCommandSignalEventExpPrologue( ze_command_list_handle_t hCommandList, uint64_t commandId, ze_event_handle_t hSignalEvent ) override;
220220
ze_result_t zeCommandListUpdateMutableCommandWaitEventsExpPrologue( ze_command_list_handle_t hCommandList, uint64_t commandId, uint32_t numWaitEvents, ze_event_handle_t* phWaitEvents ) override;
221221
ze_result_t zeCommandListUpdateMutableCommandKernelsExpPrologue( ze_command_list_handle_t hCommandList, uint32_t numKernels, uint64_t* pCommandId, ze_kernel_handle_t* phKernels ) override;
222+
// Experimental function for Intel counter-based events
223+
ze_result_t zexCounterBasedEventCreate2Prologue(ze_context_handle_t hContext, ze_device_handle_t hDevice, const void *desc, ze_event_handle_t *phEvent) override;
222224
};
223225

224226
}

source/layers/validation/ze_valddi.cpp

Lines changed: 108 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,15 @@
1313

1414
namespace validation_layer
1515
{
16+
// Forward declaration for Intel experimental extension
17+
// This is needed because zeDriverGetExtensionFunctionAddress needs to reference zexCounterBasedEventCreate2
18+
__zedlllocal ze_result_t ZE_APICALL zexCounterBasedEventCreate2(
19+
ze_context_handle_t hContext,
20+
ze_device_handle_t hDevice,
21+
const void *desc,
22+
ze_event_handle_t *phEvent
23+
);
24+
1625
static ze_result_t logAndPropagateResult(const char* fname, ze_result_t result) {
1726
if (result != ZE_RESULT_SUCCESS) {
1827
context.logger->log_trace("Error (" + loader::to_string(result) + ") in " + std::string(fname));
@@ -382,6 +391,15 @@ namespace validation_layer
382391

383392
auto driver_result = pfnGetExtensionFunctionAddress( hDriver, name, ppFunctionAddress );
384393

394+
// For Intel experimental extensions, we need to return our validation layer function
395+
// instead of the raw driver function so that validation/leak tracking works
396+
if (driver_result == ZE_RESULT_SUCCESS && ppFunctionAddress && name) {
397+
if (strcmp(name, "zexCounterBasedEventCreate2") == 0) {
398+
// Return our validation layer intercept function instead of the raw driver function
399+
*ppFunctionAddress = (void*)zexCounterBasedEventCreate2;
400+
}
401+
}
402+
385403
for (size_t i = 0; i < numValHandlers; i++) {
386404
auto result = context.validationHandlers[i]->zeValidation->zeDriverGetExtensionFunctionAddressEpilogue( hDriver, name, ppFunctionAddress ,driver_result);
387405
if(result!=ZE_RESULT_SUCCESS) return logAndPropagateResult("zeDriverGetExtensionFunctionAddress", result);
@@ -9411,7 +9429,97 @@ namespace validation_layer
94119429

94129430
return logAndPropagateResult("zeCommandListUpdateMutableCommandKernelsExp", driver_result);
94139431
}
9432+
///////////////////////////////////////////////////////////////////////////////
9433+
/// @brief Intercept function for zexCounterBasedEventCreate2
9434+
__zedlllocal ze_result_t ZE_APICALL zexCounterBasedEventCreate2(
9435+
ze_context_handle_t hContext, ///< [in] handle of the context object
9436+
ze_device_handle_t hDevice, ///< [in] handle of the device
9437+
const void *desc, ///< [in] pointer to counter-based event descriptor
9438+
ze_event_handle_t *phEvent ///< [out] pointer to handle of event object created
9439+
) {
9440+
context.logger->log_trace(
9441+
"zexCounterBasedEventCreate2(hContext, hDevice, desc, phEvent)");
94149442

9443+
// Note: This is an experimental function that may not have a DDI table entry.
9444+
// For now, we'll return unsupported feature as this function should be
9445+
// accessed through zeDriverGetExtensionFunctionAddress mechanism, but we
9446+
// still want to track it in the validation layers for leak checking purposes.
9447+
9448+
auto numValHandlers = context.validationHandlers.size();
9449+
for (size_t i = 0; i < numValHandlers; i++) {
9450+
auto result = context.validationHandlers[i]
9451+
->zeValidation->zexCounterBasedEventCreate2Prologue(
9452+
hContext, hDevice, desc, phEvent);
9453+
if (result != ZE_RESULT_SUCCESS)
9454+
return logAndPropagateResult("zexCounterBasedEventCreate2", result);
9455+
}
9456+
9457+
if (context.enableThreadingValidation) {
9458+
// Unimplemented
9459+
}
9460+
9461+
if (context.enableHandleLifetime) {
9462+
auto result = context.handleLifetime->zeHandleLifetime
9463+
.zexCounterBasedEventCreate2Prologue(hContext, hDevice,
9464+
desc, phEvent);
9465+
if (result != ZE_RESULT_SUCCESS)
9466+
return logAndPropagateResult("zexCounterBasedEventCreate2", result);
9467+
}
9468+
9469+
// This is an experimental function that must be accessed through the extension mechanism
9470+
// We need to get the function pointer through zeDriverGetExtensionFunctionAddress
9471+
ze_result_t driver_result = ZE_RESULT_ERROR_UNSUPPORTED_FEATURE;
9472+
9473+
// Get the real Intel experimental function through the extension mechanism
9474+
auto pfnGetExtensionFunctionAddress = context.zeDdiTable.Driver.pfnGetExtensionFunctionAddress;
9475+
9476+
if (pfnGetExtensionFunctionAddress) {
9477+
// Get the driver handle - use the first available driver
9478+
ze_driver_handle_t hDriver = nullptr;
9479+
9480+
if (context.zeDdiTable.Driver.pfnGet) {
9481+
uint32_t driverCount = 1;
9482+
ze_driver_handle_t drivers[1] = {nullptr};
9483+
auto result = context.zeDdiTable.Driver.pfnGet(&driverCount, drivers);
9484+
if (result == ZE_RESULT_SUCCESS && driverCount > 0) {
9485+
hDriver = drivers[0];
9486+
}
9487+
}
9488+
9489+
if (hDriver) {
9490+
// Get the real Intel experimental function
9491+
typedef ze_result_t (*zexCounterBasedEventCreate2_t)(ze_context_handle_t, ze_device_handle_t, const void*, ze_event_handle_t*);
9492+
zexCounterBasedEventCreate2_t pfnRealFunction = nullptr;
9493+
9494+
auto ext_result = pfnGetExtensionFunctionAddress(hDriver, "zexCounterBasedEventCreate2", (void**)&pfnRealFunction);
9495+
9496+
if (ext_result == ZE_RESULT_SUCCESS && pfnRealFunction) {
9497+
// Call the real Intel experimental function
9498+
driver_result = pfnRealFunction(hContext, hDevice, desc, phEvent);
9499+
} else {
9500+
// Extension not available in this driver
9501+
driver_result = ZE_RESULT_ERROR_UNSUPPORTED_FEATURE;
9502+
}
9503+
}
9504+
}
9505+
9506+
for (size_t i = 0; i < numValHandlers; i++) {
9507+
auto result = context.validationHandlers[i]
9508+
->zeValidation->zexCounterBasedEventCreate2Epilogue(
9509+
hContext, hDevice, desc, phEvent, driver_result);
9510+
if (result != ZE_RESULT_SUCCESS)
9511+
return logAndPropagateResult("zexCounterBasedEventCreate2", result);
9512+
}
9513+
9514+
if (driver_result == ZE_RESULT_SUCCESS && context.enableHandleLifetime) {
9515+
if (phEvent) {
9516+
context.handleLifetime->addHandle(*phEvent);
9517+
// Note: counter-based events may not have a traditional event pool
9518+
// dependency
9519+
}
9520+
}
9521+
return logAndPropagateResult("zexCounterBasedEventCreate2", driver_result);
9522+
}
94159523
} // namespace validation_layer
94169524

94179525
#if defined(__cplusplus)

0 commit comments

Comments
 (0)