Correctly return number of IPC handles in zexMemGetIpcHandles

Signed-off-by: Jaime Arteaga <jaime.a.arteaga.molina@intel.com>
This commit is contained in:
Jaime Arteaga
2022-07-07 07:37:56 +00:00
committed by Compute-Runtime-Automation
parent e1ba6d825a
commit 235e167565
2 changed files with 35 additions and 2 deletions

View File

@@ -436,12 +436,17 @@ ze_result_t ContextImp::getIpcMemHandles(const void *ptr,
if (allocData) {
auto alloc = allocData->gpuAllocations.getDefaultGraphicsAllocation();
uint32_t numHandles = alloc->getNumHandles();
if (pIpcHandles == nullptr) {
UNRECOVERABLE_IF(numIpcHandles == nullptr);
if (*numIpcHandles == 0 || *numIpcHandles > numHandles) {
*numIpcHandles = numHandles;
}
if (pIpcHandles == nullptr) {
return ZE_RESULT_SUCCESS;
}
for (uint32_t i = 0; i < numHandles; i++) {
for (uint32_t i = 0; i < *numIpcHandles; i++) {
int handle = static_cast<int>(allocData->gpuAllocations.getDefaultGraphicsAllocation()->peekInternalHandle(this->driverHandle->getMemoryManager(), i));
memcpy_s(reinterpret_cast<void *>(pIpcHandles[i].data),
sizeof(ze_ipc_mem_handle_t),

View File

@@ -74,6 +74,34 @@ TEST_F(MemoryExportImportImplicitScalingTest,
EXPECT_EQ(ZE_RESULT_SUCCESS, result);
}
TEST_F(MemoryExportImportImplicitScalingTest,
givenCallToGetIpcHandleWithDeviceAllocationThenNumIpcHandlesIsUpdatedAlways) {
size_t size = 10;
size_t alignment = 1u;
void *ptr = nullptr;
ze_device_mem_alloc_desc_t deviceDesc = {};
ze_result_t result = context->allocDeviceMem(device->toHandle(),
&deviceDesc,
size, alignment, &ptr);
EXPECT_EQ(ZE_RESULT_SUCCESS, result);
EXPECT_NE(nullptr, ptr);
uint32_t numIpcHandles = 0;
result = context->getIpcMemHandles(ptr, &numIpcHandles, nullptr);
EXPECT_EQ(ZE_RESULT_SUCCESS, result);
EXPECT_EQ(numIpcHandles, 2u);
numIpcHandles *= 4;
std::vector<ze_ipc_mem_handle_t> ipcHandles(numIpcHandles);
result = context->getIpcMemHandles(ptr, &numIpcHandles, ipcHandles.data());
EXPECT_EQ(ZE_RESULT_SUCCESS, result);
EXPECT_EQ(numIpcHandles, 2u);
result = context->freeMem(ptr);
EXPECT_EQ(ZE_RESULT_SUCCESS, result);
}
TEST_F(MemoryExportImportImplicitScalingTest,
whenCallingOpenIpcHandlesWithIpcHandleThenDeviceAllocationIsReturned) {
size_t size = 10;