Skip to content

Commit 5e4238d

Browse files
Revert "fix: respect arg size when setting kernel arg in OCL path"
This reverts commit c10ff0f. Signed-off-by: Compute-Runtime-Validation <[email protected]>
1 parent c02dc82 commit 5e4238d

File tree

5 files changed

+53
-98
lines changed

5 files changed

+53
-98
lines changed

opencl/source/kernel/kernel.cpp

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1714,16 +1714,17 @@ cl_int Kernel::setArgImmediate(uint32_t argIndex,
17141714
const auto &argAsVal = kernelInfo.kernelDescriptor.payloadMappings.explicitArgs[argIndex].as<ArgDescValue>();
17151715
for (const auto &element : argAsVal.elements) {
17161716
DEBUG_BREAK_IF(element.size <= 0);
1717-
if (static_cast<size_t>(element.sourceOffset + element.size) > argSize) {
1718-
return CL_INVALID_ARG_SIZE;
1719-
}
17201717

17211718
auto pDst = ptrOffset(crossThreadData, element.offset);
17221719
auto pSrc = ptrOffset(argVal, element.sourceOffset);
17231720

1724-
auto dstAvailableSpace = crossThreadDataEnd - pDst;
1721+
DEBUG_BREAK_IF(!(ptrOffset(pDst, element.size) <= crossThreadDataEnd));
17251722

1726-
memcpy_s(pDst, dstAvailableSpace, pSrc, element.size);
1723+
if (element.sourceOffset < argSize) {
1724+
size_t maxBytesToCopy = argSize - element.sourceOffset;
1725+
size_t bytesToCopy = std::min(static_cast<size_t>(element.size), maxBytesToCopy);
1726+
memcpy_s(pDst, element.size, pSrc, bytesToCopy);
1727+
}
17271728
}
17281729

17291730
retVal = CL_SUCCESS;

opencl/test/unit_test/api/api_tests_wrapper3.cpp

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,6 @@
3333
#include "opencl/test/unit_test/api/cl_set_context_destructor_callback.inl"
3434
#include "opencl/test/unit_test/api/cl_set_event_callback_tests.inl"
3535
#include "opencl/test/unit_test/api/cl_set_kernel_arg_svm_pointer_tests.inl"
36-
#include "opencl/test/unit_test/api/cl_set_kernel_arg_tests.inl"
3736
#include "opencl/test/unit_test/api/cl_set_kernel_exec_info_tests.inl"
3837
#include "opencl/test/unit_test/api/cl_set_mem_object_destructor_callback_tests.inl"
3938
#include "opencl/test/unit_test/api/cl_set_performance_configuration_tests.inl"

opencl/test/unit_test/api/cl_set_kernel_arg_tests.inl

Lines changed: 0 additions & 79 deletions
This file was deleted.

opencl/test/unit_test/kernel/clone_kernel_tests.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -485,9 +485,9 @@ TEST_F(CloneKernelTest, givenArgSvmAllocWhenCloningKernelThenKernelInfoIsCorrect
485485
}
486486

487487
TEST_F(CloneKernelTest, givenArgImmediateWhenCloningKernelThenKernelInfoIsCorrect) {
488-
using TypeParam = unsigned long;
489-
pKernelInfo->addArgImmediate(0, sizeof(TypeParam), 0x20);
488+
pKernelInfo->addArgImmediate(0, sizeof(void *), 0x20);
490489

490+
using TypeParam = unsigned long;
491491
auto value = (TypeParam)0xAA55AA55UL;
492492

493493
retVal = pSourceMultiDeviceKernel->setArg(0, sizeof(TypeParam), &value);

opencl/test/unit_test/kernel/kernel_immediate_arg_tests.cpp

Lines changed: 45 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -221,7 +221,8 @@ TYPED_TEST(KernelArgImmediateTest, givenTooLargePatchSizeWhenSettingArgThenDontR
221221

222222
const auto memoryBeyondLimitBefore = *reinterpret_cast<TypeParam *>(memoryBeyondLimitAddress);
223223

224-
auto retVal = pKernel->setArg(0, sizeof(memory), memory);
224+
this->pKernelInfo->argAsVal(0).elements[0].size = sizeof(TypeParam) + 1;
225+
auto retVal = pKernel->setArg(0, sizeof(TypeParam), &memory[0]);
225226

226227
const auto memoryBeyondLimitAfter = *reinterpret_cast<TypeParam *>(memoryBeyondLimitAddress);
227228
EXPECT_EQ(memoryBeyondLimitBefore, memoryBeyondLimitAfter);
@@ -256,6 +257,43 @@ TYPED_TEST(KernelArgImmediateTest, givenNotTooLargePatchSizeWhenSettingArgThenDo
256257
}
257258
}
258259

260+
TYPED_TEST(KernelArgImmediateTest, givenMulitplePatchesAndFirstPatchSizeTooLargeWhenSettingArgThenDontReadMemoryBeyondLimit) {
261+
if (sizeof(TypeParam) == 1)
262+
return; // multiple patch chars don't make sense
263+
264+
for (auto &rootDeviceIndex : this->context->getRootDeviceIndices()) {
265+
auto pKernel = this->pMultiDeviceKernel->getKernel(rootDeviceIndex);
266+
TypeParam memory[2];
267+
std::memset(&memory[0], 0xaa, sizeof(TypeParam));
268+
std::memset(&memory[1], 0xbb, sizeof(TypeParam));
269+
270+
auto &elements = this->pKernelInfo->argAsVal(3).elements;
271+
const auto destinationMemoryAddress1 = pKernel->getCrossThreadData() +
272+
elements[2].offset;
273+
const auto destinationMemoryAddress2 = pKernel->getCrossThreadData() +
274+
elements[1].offset;
275+
const auto memoryBeyondLimitAddress1 = destinationMemoryAddress1 + sizeof(TypeParam);
276+
const auto memoryBeyondLimitAddress2 = destinationMemoryAddress2 + sizeof(TypeParam) / 2;
277+
278+
const std::vector<unsigned char> memoryBeyondLimitBefore1(memoryBeyondLimitAddress1, memoryBeyondLimitAddress1 + sizeof(TypeParam));
279+
const std::vector<unsigned char> memoryBeyondLimitBefore2(memoryBeyondLimitAddress2, memoryBeyondLimitAddress2 + sizeof(TypeParam) / 2);
280+
281+
elements[2].sourceOffset = 0;
282+
elements[1].sourceOffset = sizeof(TypeParam) / 2;
283+
elements[2].size = sizeof(TypeParam);
284+
elements[1].size = sizeof(TypeParam) / 2;
285+
auto retVal = pKernel->setArg(3, sizeof(TypeParam), &memory[0]);
286+
287+
EXPECT_EQ(0, std::memcmp(memoryBeyondLimitBefore1.data(), memoryBeyondLimitAddress1, sizeof(TypeParam)));
288+
EXPECT_EQ(0, std::memcmp(memoryBeyondLimitBefore2.data(), memoryBeyondLimitAddress2, sizeof(TypeParam) / 2));
289+
290+
EXPECT_EQ(0, std::memcmp(&memory[0], destinationMemoryAddress1, sizeof(TypeParam)));
291+
EXPECT_EQ(0, std::memcmp(&memory[0], destinationMemoryAddress2, sizeof(TypeParam) / 2));
292+
293+
EXPECT_EQ(CL_SUCCESS, retVal);
294+
}
295+
}
296+
259297
TYPED_TEST(KernelArgImmediateTest, givenMulitplePatchesAndSecondPatchSizeTooLargeWhenSettingArgThenDontReadMemoryBeyondLimit) {
260298
if (sizeof(TypeParam) == 1)
261299
return; // multiple patch chars don't make sense
@@ -272,17 +310,17 @@ TYPED_TEST(KernelArgImmediateTest, givenMulitplePatchesAndSecondPatchSizeTooLarg
272310
const auto destinationMemoryAddress2 = pKernel->getCrossThreadData() +
273311
elements[1].offset;
274312
const auto memoryBeyondLimitAddress1 = destinationMemoryAddress1 + sizeof(TypeParam) / 2;
275-
const auto memoryBeyondLimitAddress2 = destinationMemoryAddress2 + sizeof(TypeParam);
313+
const auto memoryBeyondLimitAddress2 = destinationMemoryAddress2 + sizeof(TypeParam) / 2;
276314

277315
const std::vector<unsigned char> memoryBeyondLimitBefore1(memoryBeyondLimitAddress1, memoryBeyondLimitAddress1 + sizeof(TypeParam) / 2);
278-
const std::vector<unsigned char> memoryBeyondLimitBefore2(memoryBeyondLimitAddress2, memoryBeyondLimitAddress2 + sizeof(TypeParam));
316+
const std::vector<unsigned char> memoryBeyondLimitBefore2(memoryBeyondLimitAddress2, memoryBeyondLimitAddress2 + sizeof(TypeParam) / 2);
279317

280318
elements[0].size = 0;
281319
elements[2].sourceOffset = 0;
282320
elements[1].sourceOffset = sizeof(TypeParam) / 2;
283321
elements[2].size = sizeof(TypeParam) / 2;
284322
elements[1].size = sizeof(TypeParam);
285-
auto retVal = pKernel->setArg(3, sizeof(memory), memory);
323+
auto retVal = pKernel->setArg(3, sizeof(TypeParam), &memory[0]);
286324

287325
EXPECT_EQ(0, std::memcmp(memoryBeyondLimitBefore1.data(), memoryBeyondLimitAddress1, sizeof(TypeParam) / 2));
288326
EXPECT_EQ(0, std::memcmp(memoryBeyondLimitBefore2.data(), memoryBeyondLimitAddress2, sizeof(TypeParam) / 2));
@@ -295,9 +333,6 @@ TYPED_TEST(KernelArgImmediateTest, givenMulitplePatchesAndSecondPatchSizeTooLarg
295333
}
296334

297335
TYPED_TEST(KernelArgImmediateTest, givenMultiplePatchesAndOneSourceOffsetBeyondArgumentWhenSettingArgThenDontCopyThisPatch) {
298-
if (sizeof(TypeParam) == 1u) {
299-
GTEST_SKIP();
300-
}
301336
for (auto &rootDeviceIndex : this->context->getRootDeviceIndices()) {
302337
auto pKernel = this->pMultiDeviceKernel->getKernel(rootDeviceIndex);
303338
TypeParam memory[2];
@@ -310,23 +345,22 @@ TYPED_TEST(KernelArgImmediateTest, givenMultiplePatchesAndOneSourceOffsetBeyondA
310345
const auto destinationMemoryAddress2 = pKernel->getCrossThreadData() +
311346
elements[2].offset;
312347
const auto memoryBeyondLimitAddress1 = destinationMemoryAddress1 + sizeof(TypeParam);
313-
const auto memoryBeyondLimitAddress2 = destinationMemoryAddress2 + 1;
348+
const auto memoryBeyondLimitAddress2 = destinationMemoryAddress2;
314349

315350
const std::vector<unsigned char> memoryBeyondLimitBefore1(memoryBeyondLimitAddress1, memoryBeyondLimitAddress1 + sizeof(TypeParam));
316-
const std::vector<unsigned char> memoryBeyondLimitBefore2(memoryBeyondLimitAddress2, memoryBeyondLimitAddress2 + sizeof(TypeParam) - 1);
351+
const std::vector<unsigned char> memoryBeyondLimitBefore2(memoryBeyondLimitAddress2, memoryBeyondLimitAddress2 + sizeof(TypeParam));
317352

318353
elements[0].size = 0;
319354
elements[1].sourceOffset = 0;
320355
elements[1].size = sizeof(TypeParam);
321356
elements[2].sourceOffset = sizeof(TypeParam);
322357
elements[2].size = 1;
323-
auto retVal = pKernel->setArg(3, sizeof(memory), memory);
358+
auto retVal = pKernel->setArg(3, sizeof(TypeParam), &memory[0]);
324359

325360
EXPECT_EQ(0, std::memcmp(memoryBeyondLimitBefore1.data(), memoryBeyondLimitAddress1, memoryBeyondLimitBefore1.size()));
326361
EXPECT_EQ(0, std::memcmp(memoryBeyondLimitBefore2.data(), memoryBeyondLimitAddress2, memoryBeyondLimitBefore2.size()));
327362

328363
EXPECT_EQ(0, std::memcmp(&memory[0], destinationMemoryAddress1, sizeof(TypeParam)));
329-
EXPECT_EQ(0, std::memcmp(&memory[1], destinationMemoryAddress2, 1));
330364

331365
EXPECT_EQ(CL_SUCCESS, retVal);
332366
}

0 commit comments

Comments
 (0)