Skip to content

Commit c32a78c

Browse files
authored
Merge pull request #2190 from igchor/global_offset_fix
[L0] fix out-of-bounds access in setKernelGlobalOffset
2 parents 3db3a5e + 6f37095 commit c32a78c

File tree

5 files changed

+16
-50
lines changed

5 files changed

+16
-50
lines changed

source/adapters/level_zero/command_buffer.cpp

Lines changed: 2 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -627,32 +627,6 @@ urCommandBufferFinalizeExp(ur_exp_command_buffer_handle_t CommandBuffer) {
627627
return UR_RESULT_SUCCESS;
628628
}
629629

630-
/**
631-
* Sets the global offset for a kernel command that will be appended to the
632-
* command buffer.
633-
* @param[in] CommandBuffer The CommandBuffer where the command will be
634-
* appended.
635-
* @param[in] Kernel The handle to the kernel that will be appended.
636-
* @param[in] GlobalWorkOffset The global offset value.
637-
* @return UR_RESULT_SUCCESS or an error code on failure
638-
*/
639-
ur_result_t setKernelGlobalOffset(ur_exp_command_buffer_handle_t CommandBuffer,
640-
ur_kernel_handle_t Kernel,
641-
const size_t *GlobalWorkOffset) {
642-
643-
if (!CommandBuffer->Context->getPlatform()
644-
->ZeDriverGlobalOffsetExtensionFound) {
645-
logger::debug("No global offset extension found on this driver");
646-
return UR_RESULT_ERROR_INVALID_VALUE;
647-
}
648-
649-
ZE2UR_CALL(zeKernelSetGlobalOffsetExp,
650-
(Kernel->ZeKernel, GlobalWorkOffset[0], GlobalWorkOffset[1],
651-
GlobalWorkOffset[2]));
652-
653-
return UR_RESULT_SUCCESS;
654-
}
655-
656630
/**
657631
* Sets the kernel arguments for a kernel command that will be appended to the
658632
* command buffer.
@@ -754,7 +728,8 @@ ur_result_t urCommandBufferAppendKernelLaunchExp(
754728
Kernel->Mutex, Kernel->Program->Mutex, CommandBuffer->Mutex);
755729

756730
if (GlobalWorkOffset != NULL) {
757-
UR_CALL(setKernelGlobalOffset(CommandBuffer, Kernel, GlobalWorkOffset));
731+
UR_CALL(setKernelGlobalOffset(CommandBuffer->Context, Kernel->ZeKernel,
732+
WorkDim, GlobalWorkOffset));
758733
}
759734

760735
// If there are any pending arguments set them now.

source/adapters/level_zero/helpers/kernel_helpers.cpp

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -67,16 +67,17 @@ ur_result_t getSuggestedLocalWorkSize(ur_device_handle_t hDevice,
6767
}
6868

6969
ur_result_t setKernelGlobalOffset(ur_context_handle_t Context,
70-
ze_kernel_handle_t Kernel,
70+
ze_kernel_handle_t Kernel, uint32_t WorkDim,
7171
const size_t *GlobalWorkOffset) {
7272
if (!Context->getPlatform()->ZeDriverGlobalOffsetExtensionFound) {
7373
logger::debug("No global offset extension found on this driver");
7474
return UR_RESULT_ERROR_INVALID_VALUE;
7575
}
7676

77-
ZE2UR_CALL(
78-
zeKernelSetGlobalOffsetExp,
79-
(Kernel, GlobalWorkOffset[0], GlobalWorkOffset[1], GlobalWorkOffset[2]));
77+
auto OffsetX = GlobalWorkOffset[0];
78+
auto OffsetY = WorkDim > 1 ? GlobalWorkOffset[1] : 0;
79+
auto OffsetZ = WorkDim > 2 ? GlobalWorkOffset[2] : 0;
80+
ZE2UR_CALL(zeKernelSetGlobalOffsetExp, (Kernel, OffsetX, OffsetY, OffsetZ));
8081

8182
return UR_RESULT_SUCCESS;
8283
}

source/adapters/level_zero/helpers/kernel_helpers.hpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,11 +36,12 @@ ur_result_t calculateKernelWorkDimensions(
3636
* command buffer.
3737
* @param[in] Context Context associated with the queue.
3838
* @param[in] Kernel The handle to the kernel that will be appended.
39-
* @param[in] GlobalWorkOffset The global offset value.
39+
* @param[in] WorkDim The number of work dimensions.
40+
* @param[in] GlobalWorkOffset Array of size WorkDim.
4041
* @return UR_RESULT_SUCCESS or an error code on failure
4142
*/
4243
ur_result_t setKernelGlobalOffset(ur_context_handle_t Context,
43-
ze_kernel_handle_t Kernel,
44+
ze_kernel_handle_t Kernel, uint32_t WorkDim,
4445
const size_t *GlobalWorkOffset);
4546

4647
/**

source/adapters/level_zero/kernel.cpp

Lines changed: 4 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -96,14 +96,8 @@ ur_result_t urEnqueueKernelLaunch(
9696
std::scoped_lock<ur_shared_mutex, ur_shared_mutex, ur_shared_mutex> Lock(
9797
Queue->Mutex, Kernel->Mutex, Kernel->Program->Mutex);
9898
if (GlobalWorkOffset != NULL) {
99-
if (!Queue->Device->Platform->ZeDriverGlobalOffsetExtensionFound) {
100-
logger::error("No global offset extension found on this driver");
101-
return UR_RESULT_ERROR_INVALID_VALUE;
102-
}
103-
104-
ZE2UR_CALL(zeKernelSetGlobalOffsetExp,
105-
(ZeKernel, GlobalWorkOffset[0], GlobalWorkOffset[1],
106-
GlobalWorkOffset[2]));
99+
UR_CALL(setKernelGlobalOffset(Queue->Context, ZeKernel, WorkDim,
100+
GlobalWorkOffset));
107101
}
108102

109103
// If there are any pending arguments set them now.
@@ -257,14 +251,8 @@ ur_result_t urEnqueueCooperativeKernelLaunchExp(
257251
std::scoped_lock<ur_shared_mutex, ur_shared_mutex, ur_shared_mutex> Lock(
258252
Queue->Mutex, Kernel->Mutex, Kernel->Program->Mutex);
259253
if (GlobalWorkOffset != NULL) {
260-
if (!Queue->Device->Platform->ZeDriverGlobalOffsetExtensionFound) {
261-
logger::error("No global offset extension found on this driver");
262-
return UR_RESULT_ERROR_INVALID_VALUE;
263-
}
264-
265-
ZE2UR_CALL(zeKernelSetGlobalOffsetExp,
266-
(ZeKernel, GlobalWorkOffset[0], GlobalWorkOffset[1],
267-
GlobalWorkOffset[2]));
254+
UR_CALL(setKernelGlobalOffset(Queue->Context, ZeKernel, WorkDim,
255+
GlobalWorkOffset));
268256
}
269257

270258
// If there are any pending arguments set them now.

source/adapters/level_zero/v2/queue_immediate_in_order.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -252,7 +252,8 @@ ur_result_t ur_queue_immediate_in_order_t::enqueueKernelLaunch(
252252
hKernel->Mutex, hKernel->getProgramHandle()->Mutex, this->Mutex);
253253

254254
if (pGlobalWorkOffset != NULL) {
255-
UR_CALL(setKernelGlobalOffset(hContext, hZeKernel, pGlobalWorkOffset));
255+
UR_CALL(
256+
setKernelGlobalOffset(hContext, hZeKernel, workDim, pGlobalWorkOffset));
256257
}
257258

258259
ze_group_count_t zeThreadGroupDimensions{1, 1, 1};

0 commit comments

Comments
 (0)