Skip to content

Commit e8c0fc4

Browse files
committed
Implement getLastNativeError for L0 provider
1 parent 8f242a5 commit e8c0fc4

File tree

1 file changed

+38
-21
lines changed

1 file changed

+38
-21
lines changed

src/provider/provider_level_zero.c

Lines changed: 38 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,25 @@ typedef struct ze_ops_t {
6363
static ze_ops_t g_ze_ops;
6464
static UTIL_ONCE_FLAG ze_is_initialized = UTIL_ONCE_FLAG_INIT;
6565
static bool Init_ze_global_state_failed;
66+
static __TLS ze_result_t TLS_last_native_error;
67+
68+
static void store_last_native_error(int32_t native_error) {
69+
TLS_last_native_error = native_error;
70+
}
71+
72+
umf_result_t ze2umf_result(ze_result_t result) {
73+
switch (result) {
74+
case ZE_RESULT_SUCCESS:
75+
return UMF_RESULT_SUCCESS;
76+
case ZE_RESULT_ERROR_OUT_OF_HOST_MEMORY:
77+
return UMF_RESULT_ERROR_OUT_OF_HOST_MEMORY;
78+
case ZE_RESULT_ERROR_INVALID_ARGUMENT:
79+
return UMF_RESULT_ERROR_INVALID_ARGUMENT;
80+
default:
81+
store_last_native_error(result);
82+
return UMF_RESULT_ERROR_MEMORY_PROVIDER_SPECIFIC;
83+
}
84+
}
6685

6786
static void init_ze_global_state(void) {
6887
#ifdef _WIN32
@@ -130,11 +149,12 @@ umf_result_t ze_memory_provider_initialize(void *params, void **provider) {
130149
ze_provider->device = ze_params->level_zero_device_handle;
131150
ze_provider->memory_type = (ze_memory_type_t)ze_params->memory_type;
132151

133-
ze_result_t ret = g_ze_ops.zeDeviceGetProperties(
134-
ze_provider->device, &ze_provider->device_properties);
135-
if (ret != ZE_RESULT_SUCCESS) {
152+
umf_result_t ret = ze2umf_result(g_ze_ops.zeDeviceGetProperties(
153+
ze_provider->device, &ze_provider->device_properties));
154+
155+
if (ret != UMF_RESULT_SUCCESS) {
136156
umf_ba_global_free(ze_provider);
137-
return UMF_RESULT_ERROR_MEMORY_PROVIDER_SPECIFIC;
157+
return ret;
138158
}
139159

140160
*provider = ze_provider;
@@ -211,22 +231,23 @@ static umf_result_t ze_memory_provider_alloc(void *provider, size_t size,
211231
break;
212232
}
213233
default:
214-
return UMF_RESULT_ERROR_MEMORY_PROVIDER_SPECIFIC;
234+
return UMF_RESULT_ERROR_INVALID_ARGUMENT;
235+
}
236+
237+
if (ze_result != ZE_RESULT_SUCCESS) {
238+
return ze2umf_result(ze_result);
215239
}
216240

217241
for (uint32_t i = 0; i < ze_provider->resident_device_count; i++) {
218242
ze_result = g_ze_ops.zeContextMakeMemoryResident(
219243
ze_provider->context, ze_provider->resident_device_handles[i],
220244
*resultPtr, size);
221245
if (ze_result != ZE_RESULT_SUCCESS) {
222-
break;
246+
return ze2umf_result(ze_result);
223247
}
224248
}
225249

226-
// TODO add error reporting
227-
return (ze_result == ZE_RESULT_SUCCESS)
228-
? UMF_RESULT_SUCCESS
229-
: UMF_RESULT_ERROR_MEMORY_PROVIDER_SPECIFIC;
250+
return ze2umf_result(ze_result);
230251
}
231252

232253
static umf_result_t ze_memory_provider_free(void *provider, void *ptr,
@@ -236,11 +257,7 @@ static umf_result_t ze_memory_provider_free(void *provider, void *ptr,
236257
assert(provider);
237258
ze_memory_provider_t *ze_provider = (ze_memory_provider_t *)provider;
238259
ze_result_t ze_result = g_ze_ops.zeMemFree(ze_provider->context, ptr);
239-
240-
// TODO add error reporting
241-
return (ze_result == ZE_RESULT_SUCCESS)
242-
? UMF_RESULT_SUCCESS
243-
: UMF_RESULT_ERROR_MEMORY_PROVIDER_SPECIFIC;
260+
return ze2umf_result(ze_result);
244261
}
245262

246263
void ze_memory_provider_get_last_native_error(void *provider,
@@ -249,9 +266,9 @@ void ze_memory_provider_get_last_native_error(void *provider,
249266
(void)provider;
250267
(void)ppMessage;
251268

252-
// TODO
253269
assert(pError);
254-
*pError = 0;
270+
271+
*pError = TLS_last_native_error;
255272
}
256273

257274
static umf_result_t ze_memory_provider_get_min_page_size(void *provider,
@@ -356,7 +373,7 @@ static umf_result_t ze_memory_provider_get_ipc_handle(void *provider,
356373
&ze_ipc_data->ze_handle);
357374
if (ze_result != ZE_RESULT_SUCCESS) {
358375
LOG_ERR("zeMemGetIpcHandle() failed.");
359-
return UMF_RESULT_ERROR_MEMORY_PROVIDER_SPECIFIC;
376+
return ze2umf_result(ze_result);
360377
}
361378

362379
ze_ipc_data->pid = utils_getpid();
@@ -384,7 +401,7 @@ static umf_result_t ze_memory_provider_put_ipc_handle(void *provider,
384401
ze_ipc_data->ze_handle);
385402
if (ze_result != ZE_RESULT_SUCCESS) {
386403
LOG_ERR("zeMemPutIpcHandle() failed.");
387-
return UMF_RESULT_ERROR_MEMORY_PROVIDER_SPECIFIC;
404+
return ze2umf_result(ze_result);
388405
}
389406
return UMF_RESULT_SUCCESS;
390407
}
@@ -421,7 +438,7 @@ static umf_result_t ze_memory_provider_open_ipc_handle(void *provider,
421438
}
422439
if (ze_result != ZE_RESULT_SUCCESS) {
423440
LOG_ERR("zeMemOpenIpcHandle() failed.");
424-
return UMF_RESULT_ERROR_MEMORY_PROVIDER_SPECIFIC;
441+
return ze2umf_result(ze_result);
425442
}
426443

427444
return UMF_RESULT_SUCCESS;
@@ -439,7 +456,7 @@ ze_memory_provider_close_ipc_handle(void *provider, void *ptr, size_t size) {
439456
ze_result = g_ze_ops.zeMemCloseIpcHandle(ze_provider->context, ptr);
440457
if (ze_result != ZE_RESULT_SUCCESS) {
441458
LOG_ERR("zeMemCloseIpcHandle() failed.");
442-
return UMF_RESULT_ERROR_MEMORY_PROVIDER_SPECIFIC;
459+
return ze2umf_result(ze_result);
443460
}
444461

445462
return UMF_RESULT_SUCCESS;

0 commit comments

Comments
 (0)