Remove possible infinite loops related to pNext

Two code parts contained invalid logic related to traversing
opaque list of pNexts. This has been fixed.

Signed-off-by: Patryk Wrobel <patryk.wrobel@intel.com>
This commit is contained in:
Patryk Wrobel 2022-12-06 10:40:39 +00:00 committed by Compute-Runtime-Automation
parent d75eccc026
commit 5793e200e4
3 changed files with 31 additions and 2 deletions

View File

@ -643,7 +643,7 @@ ze_result_t DeviceImp::getKernelProperties(ze_device_module_properties_t *pKerne
void *pNext = pKernelProperties->pNext;
while (pNext) {
ze_base_desc_t *extendedProperties = reinterpret_cast<ze_base_desc_t *>(pKernelProperties->pNext);
ze_base_desc_t *extendedProperties = reinterpret_cast<ze_base_desc_t *>(pNext);
if (extendedProperties->stype == ZE_STRUCTURE_TYPE_FLOAT_ATOMIC_EXT_PROPERTIES) {
ze_float_atomic_ext_properties_t *floatProperties =
reinterpret_cast<ze_float_atomic_ext_properties_t *>(extendedProperties);

View File

@ -730,7 +730,7 @@ ze_result_t KernelImp::getProperties(ze_kernel_properties_t *pKernelProperties)
void *pNext = pKernelProperties->pNext;
while (pNext) {
ze_base_desc_t *extendedProperties = reinterpret_cast<ze_base_desc_t *>(pKernelProperties->pNext);
ze_base_desc_t *extendedProperties = reinterpret_cast<ze_base_desc_t *>(pNext);
if (extendedProperties->stype == ZE_STRUCTURE_TYPE_KERNEL_PREFERRED_GROUP_SIZE_PROPERTIES) {
ze_kernel_preferred_group_size_properties_t *preferredGroupSizeProperties =
reinterpret_cast<ze_kernel_preferred_group_size_properties_t *>(extendedProperties);

View File

@ -823,6 +823,35 @@ TEST_F(DeviceHostPointerTest, givenHostPointerNotAcceptedByKernelAndHostPointerC
delete[] buffer;
}
TEST_F(DeviceTest, givenMoreThanOneExtendedPropertiesStructuresWhenKernelPropertiesCalledThenSuccessIsReturnedAndPropertiesAreSet) {
ze_scheduling_hint_exp_properties_t schedulingHintProperties = {};
schedulingHintProperties.stype = ZE_STRUCTURE_TYPE_SCHEDULING_HINT_EXP_PROPERTIES;
schedulingHintProperties.schedulingHintFlags = ZE_SCHEDULING_HINT_EXP_FLAG_FORCE_UINT32;
schedulingHintProperties.pNext = nullptr;
ze_float_atomic_ext_properties_t floatAtomicExtendedProperties = {};
floatAtomicExtendedProperties.stype = ZE_STRUCTURE_TYPE_FLOAT_ATOMIC_EXT_PROPERTIES;
floatAtomicExtendedProperties.pNext = &schedulingHintProperties;
const ze_device_fp_flags_t maxValue{std::numeric_limits<uint32_t>::max()};
floatAtomicExtendedProperties.fp16Flags = maxValue;
floatAtomicExtendedProperties.fp32Flags = maxValue;
floatAtomicExtendedProperties.fp64Flags = maxValue;
ze_device_module_properties_t kernelProperties = {};
kernelProperties.stype = ZE_STRUCTURE_TYPE_DEVICE_MODULE_PROPERTIES;
kernelProperties.pNext = &floatAtomicExtendedProperties;
ze_result_t res = device->getKernelProperties(&kernelProperties);
EXPECT_EQ(res, ZE_RESULT_SUCCESS);
EXPECT_NE(maxValue, floatAtomicExtendedProperties.fp16Flags);
EXPECT_NE(maxValue, floatAtomicExtendedProperties.fp32Flags);
EXPECT_NE(maxValue, floatAtomicExtendedProperties.fp64Flags);
EXPECT_NE(ZE_SCHEDULING_HINT_EXP_FLAG_FORCE_UINT32, schedulingHintProperties.schedulingHintFlags);
}
TEST_F(DeviceTest, givenKernelExtendedPropertiesStructureWhenKernelPropertiesCalledThenSuccessIsReturnedAndPropertiesAreSet) {
ze_device_module_properties_t kernelProperties = {};