Skip to content

Commit b5f698e

Browse files
feature: add umonitor and umwait synchronization function
Related-To: NEO-9737 Signed-off-by: Zbigniew Zdanowicz <[email protected]>
1 parent b266f1f commit b5f698e

File tree

12 files changed

+211
-47
lines changed

12 files changed

+211
-47
lines changed

level_zero/core/test/unit_tests/fixtures/event_fixture.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (C) 2023 Intel Corporation
2+
* Copyright (C) 2023-2024 Intel Corporation
33
*
44
* SPDX-License-Identifier: MIT
55
*
@@ -20,6 +20,8 @@ template struct EventImp<uint64_t>;
2020
namespace ult {
2121

2222
void EventFixtureImpl::setUpImpl(int32_t eventPoolHostFlag, int32_t eventPoolTimestampFlag) {
23+
NEO::debugManager.flags.EnableWaitpkg.set(0);
24+
2325
DeviceFixture::setUp();
2426

2527
ze_event_pool_flags_t eventPoolFlags = 0;

level_zero/core/test/unit_tests/sources/fence/test_fence.cpp

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,13 @@
11
/*
2-
* Copyright (C) 2020-2023 Intel Corporation
2+
* Copyright (C) 2020-2024 Intel Corporation
33
*
44
* SPDX-License-Identifier: MIT
55
*
66
*/
77

88
#include "shared/source/built_ins/sip.h"
99
#include "shared/source/helpers/completion_stamp.h"
10+
#include "shared/source/utilities/wait_util.h"
1011
#include "shared/test/common/mocks/mock_command_stream_receiver.h"
1112
#include "shared/test/common/mocks/mock_csr.h"
1213
#include "shared/test/common/mocks/mock_device.h"
@@ -239,6 +240,9 @@ TEST_F(FenceSynchronizeTest, givenInfiniteTimeoutWhenWaitingForFenceCompletionTh
239240
constexpr uint32_t activePartitions = 2;
240241
constexpr uint32_t postSyncOffset = 16;
241242

243+
VariableBackup<bool> backupWaitpkgUse(&NEO::WaitUtils::waitpkgUse, false);
244+
VariableBackup<uint32_t> backupWaitCount(&NEO::WaitUtils::waitCount, 1);
245+
242246
const auto csr = std::make_unique<MockCommandStreamReceiver>(*neoDevice->getExecutionEnvironment(), 0, neoDevice->getDeviceBitfield());
243247
ASSERT_NE(nullptr, csr->getTagAddress());
244248
csr->immWritePostSyncWriteOffset = postSyncOffset;

opencl/test/unit_test/api/cl_enqueue_unmap_mem_object_tests.inl

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,13 @@
11
/*
2-
* Copyright (C) 2018-2023 Intel Corporation
2+
* Copyright (C) 2018-2024 Intel Corporation
33
*
44
* SPDX-License-Identifier: MIT
55
*
66
*/
77

8+
#include "shared/source/utilities/wait_util.h"
9+
#include "shared/test/common/helpers/variable_backup.h"
10+
811
#include "opencl/source/command_queue/command_queue.h"
912
#include "opencl/source/sharings/sharing.h"
1013
#include "opencl/test/unit_test/api/cl_api_tests.h"
@@ -79,6 +82,8 @@ TEST_F(ClEnqueueUnmapMemObjTests, givenInvalidAddressWhenUnmappingOnCpuThenRetur
7982
TEST_F(ClEnqueueUnmapMemObjTests, givenZeroCopyWithoutCoherencyAllowedWhenMapAndUnmapThenFlushCachelines) {
8083
DebugManagerStateRestore restorer;
8184
debugManager.flags.AllowZeroCopyWithoutCoherency.set(1);
85+
VariableBackup<bool> backupWaitpkgUse(&WaitUtils::waitpkgUse, false);
86+
VariableBackup<uint32_t> backupWaitCount(&WaitUtils::waitCount, 1);
8287

8388
auto buffer = std::unique_ptr<Buffer>(BufferHelper<BufferAllocHostPtr<>>::create(pContext));
8489
EXPECT_TRUE(buffer->mappingOnCpuAllowed());

opencl/test/unit_test/command_stream/command_stream_receiver_flush_task_4_tests.cpp

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,13 @@
11
/*
2-
* Copyright (C) 2018-2023 Intel Corporation
2+
* Copyright (C) 2018-2024 Intel Corporation
33
*
44
* SPDX-License-Identifier: MIT
55
*
66
*/
77

88
#include "shared/source/command_stream/wait_status.h"
99
#include "shared/source/helpers/timestamp_packet.h"
10+
#include "shared/source/utilities/wait_util.h"
1011
#include "shared/test/common/libult/ult_command_stream_receiver.h"
1112
#include "shared/test/common/mocks/mock_command_stream_receiver.h"
1213
#include "shared/test/common/mocks/mock_timestamp_container.h"
@@ -802,6 +803,8 @@ extern TaskCountType pauseValue;
802803
HWTEST_F(CommandStreamReceiverFlushTaskTests, givenTagValueNotMeetingTaskCountToWaitWhenTagValueSwitchesThenWaitFunctionReturnsTrue) {
803804
VariableBackup<volatile TagAddressType *> backupPauseAddress(&CpuIntrinsicsTests::pauseAddress);
804805
VariableBackup<TaskCountType> backupPauseValue(&CpuIntrinsicsTests::pauseValue);
806+
VariableBackup<bool> backupWaitpkgUse(&WaitUtils::waitpkgUse, false);
807+
VariableBackup<uint32_t> backupWaitCount(&WaitUtils::waitCount, 1);
805808

806809
auto mockCsr = new MockCsrHw2<FamilyType>(*pDevice->executionEnvironment, pDevice->getRootDeviceIndex(), pDevice->getDeviceBitfield());
807810
pDevice->resetCommandStreamReceiver(mockCsr);
@@ -820,6 +823,8 @@ HWTEST_F(CommandStreamReceiverFlushTaskTests, givenTagValueNotMeetingTaskCountTo
820823
HWTEST_F(CommandStreamReceiverFlushTaskTests, givenTagValueNotMeetingTaskCountToWaitAndIndefinitelyPollWhenWaitForCompletionThenDoNotCallWaitUtils) {
821824
VariableBackup<volatile TagAddressType *> backupPauseAddress(&CpuIntrinsicsTests::pauseAddress);
822825
VariableBackup<TaskCountType> backupPauseValue(&CpuIntrinsicsTests::pauseValue);
826+
VariableBackup<bool> backupWaitpkgUse(&WaitUtils::waitpkgUse, false);
827+
VariableBackup<uint32_t> backupWaitCount(&WaitUtils::waitCount, 1);
823828

824829
auto mockCsr = new MockCsrHw2<FamilyType>(*pDevice->executionEnvironment, pDevice->getRootDeviceIndex(), pDevice->getDeviceBitfield());
825830
pDevice->resetCommandStreamReceiver(mockCsr);

opencl/test/unit_test/helpers/timestamp_packet_1_tests.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
#include "shared/source/helpers/gfx_core_helper.h"
99
#include "shared/source/helpers/timestamp_packet.h"
1010
#include "shared/source/utilities/tag_allocator.h"
11+
#include "shared/source/utilities/wait_util.h"
1112
#include "shared/test/common/cmd_parse/hw_parse.h"
1213
#include "shared/test/common/helpers/dispatch_flags_helper.h"
1314
#include "shared/test/common/mocks/mock_csr.h"
@@ -1071,6 +1072,9 @@ extern std::function<void()> setupPauseAddress;
10711072
} // namespace CpuIntrinsicsTests
10721073

10731074
HWTEST_F(TimestampPacketTests, givenEnableTimestampWaitForQueuesWhenFinishThenCallWaitUtils) {
1075+
VariableBackup<bool> backupWaitpkgUse(&WaitUtils::waitpkgUse, false);
1076+
VariableBackup<uint32_t> backupWaitCount(&WaitUtils::waitCount, 1);
1077+
10741078
DebugManagerStateRestore restorer;
10751079
debugManager.flags.UpdateTaskCountFromWait.set(3);
10761080
debugManager.flags.EnableTimestampWaitForQueues.set(1);

shared/source/utilities/wait_util.cpp

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (C) 2021-2023 Intel Corporation
2+
* Copyright (C) 2021-2024 Intel Corporation
33
*
44
* SPDX-License-Identifier: MIT
55
*
@@ -18,8 +18,8 @@ constexpr uint64_t defaultCounterValue = 10000;
1818
constexpr uint32_t defaultControlValue = 0;
1919
constexpr bool defaultEnableWaitPkg = false;
2020

21-
uint64_t counterValue = defaultCounterValue;
22-
uint32_t controlValue = defaultControlValue;
21+
uint64_t waitpkgCounterValue = defaultCounterValue;
22+
uint32_t waitpkgControlValue = defaultControlValue;
2323

2424
uint32_t waitCount = defaultWaitCount;
2525

@@ -45,11 +45,11 @@ void init() {
4545

4646
int64_t overrideWaitPkgCounter = debugManager.flags.WaitpkgCounterValue.get();
4747
if (overrideWaitPkgCounter != -1) {
48-
counterValue = static_cast<uint64_t>(overrideWaitPkgCounter);
48+
waitpkgCounterValue = static_cast<uint64_t>(overrideWaitPkgCounter);
4949
}
5050
int32_t overrideWaitPkgControl = debugManager.flags.WaitpkgControlValue.get();
5151
if (overrideWaitPkgControl != -1) {
52-
controlValue = static_cast<uint32_t>(overrideWaitPkgControl);
52+
waitpkgControlValue = static_cast<uint32_t>(overrideWaitPkgControl);
5353
}
5454

5555
int32_t overrideWaitCount = debugManager.flags.WaitLoopCount.get();

shared/source/utilities/wait_util.h

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (C) 2021-2023 Intel Corporation
2+
* Copyright (C) 2021-2024 Intel Corporation
33
*
44
* SPDX-License-Identifier: MIT
55
*
@@ -19,12 +19,21 @@ namespace WaitUtils {
1919

2020
constexpr uint32_t defaultWaitCount = 1u;
2121

22-
extern uint64_t counterValue;
23-
extern uint32_t controlValue;
22+
extern uint64_t waitpkgCounterValue;
23+
extern uint32_t waitpkgControlValue;
2424
extern uint32_t waitCount;
2525
extern bool waitpkgSupport;
2626
extern bool waitpkgUse;
2727

28+
inline bool monitorWait(volatile void const *monitorAddress, uint64_t counterModifier) {
29+
uint64_t currentCounter = CpuIntrinsics::rdtsc();
30+
currentCounter += (waitpkgCounterValue + counterModifier);
31+
32+
CpuIntrinsics::umonitor(const_cast<void *>(monitorAddress));
33+
bool result = CpuIntrinsics::umwait(waitpkgControlValue, currentCounter) == 0;
34+
return result;
35+
}
36+
2837
template <typename T>
2938
inline bool waitFunctionWithPredicate(volatile T const *pollAddress, T expectedValue, std::function<bool(T, T)> predicate) {
3039
for (uint32_t i = 0; i < waitCount; i++) {
@@ -34,6 +43,13 @@ inline bool waitFunctionWithPredicate(volatile T const *pollAddress, T expectedV
3443
if (predicate(*pollAddress, expectedValue)) {
3544
return true;
3645
}
46+
if (waitpkgUse) {
47+
if (monitorWait(pollAddress, 0)) {
48+
if (predicate(*pollAddress, expectedValue)) {
49+
return true;
50+
}
51+
}
52+
}
3753
}
3854
std::this_thread::yield();
3955
return false;

shared/test/common/utilities/cpuintrinsics.cpp

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (C) 2020-2023 Intel Corporation
2+
* Copyright (C) 2020-2024 Intel Corporation
33
*
44
* SPDX-License-Identifier: MIT
55
*
@@ -37,7 +37,7 @@ uint64_t rdtscRetValue = 0;
3737
unsigned char umwaitRetValue = 0;
3838

3939
std::function<void()> setupPauseAddress;
40-
std::function<unsigned char()> controlUmwait;
40+
std::function<void()> controlUmwait;
4141
} // namespace CpuIntrinsicsTests
4242

4343
namespace NEO {
@@ -73,7 +73,8 @@ unsigned char umwait(unsigned int ctrl, uint64_t counter) {
7373
CpuIntrinsicsTests::lastUmwaitCounter = counter;
7474
CpuIntrinsicsTests::umwaitCounter++;
7575
if (CpuIntrinsicsTests::controlUmwait) {
76-
return CpuIntrinsicsTests::controlUmwait();
76+
CpuIntrinsicsTests::controlUmwait();
77+
return CpuIntrinsicsTests::umwaitRetValue;
7778
} else {
7879
return CpuIntrinsicsTests::umwaitRetValue;
7980
}

shared/test/unit_test/command_stream/command_stream_receiver_tests.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1763,6 +1763,9 @@ extern uint32_t pauseOffset;
17631763
} // namespace CpuIntrinsicsTests
17641764

17651765
TEST(CommandStreamReceiverSimpleTest, givenMultipleActivePartitionsWhenWaitingForTaskCountForCleaningTemporaryAllocationsThenExpectAllPartitionTaskCountsAreChecked) {
1766+
DebugManagerStateRestore restorer;
1767+
debugManager.flags.EnableWaitpkg.set(0);
1768+
17661769
MockExecutionEnvironment executionEnvironment;
17671770
executionEnvironment.prepareRootDeviceEnvironments(1);
17681771
executionEnvironment.initializeMemoryManager();
@@ -1807,6 +1810,9 @@ TEST(CommandStreamReceiverSimpleTest, givenMultipleActivePartitionsWhenWaitingFo
18071810
}
18081811

18091812
TEST(CommandStreamReceiverSimpleTest, givenEmptyTemporaryAllocationListWhenWaitingForTaskCountForCleaningTemporaryAllocationsThenDoNotWait) {
1813+
DebugManagerStateRestore restorer;
1814+
debugManager.flags.EnableWaitpkg.set(0);
1815+
18101816
MockExecutionEnvironment executionEnvironment;
18111817
executionEnvironment.prepareRootDeviceEnvironments(1);
18121818
executionEnvironment.initializeMemoryManager();

shared/test/unit_test/direct_submission/linux/drm_direct_submission_tests.cpp

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (C) 2020-2023 Intel Corporation
2+
* Copyright (C) 2020-2024 Intel Corporation
33
*
44
* SPDX-License-Identifier: MIT
55
*
@@ -14,6 +14,7 @@
1414
#include "shared/source/os_interface/linux/drm_gem_close_worker.h"
1515
#include "shared/source/os_interface/linux/os_context_linux.h"
1616
#include "shared/source/os_interface/linux/sys_calls.h"
17+
#include "shared/source/utilities/wait_util.h"
1718
#include "shared/test/common/cmd_parse/hw_parse.h"
1819
#include "shared/test/common/helpers/debug_manager_state_restore.h"
1920
#include "shared/test/common/helpers/engine_descriptor_helper.h"
@@ -794,6 +795,9 @@ HWTEST_F(DrmDirectSubmissionTest, givenDirectSubmissionNewResourceTlbFlushZeroAn
794795
HWCMDTEST_F(IGFX_XE_HP_CORE, DrmDirectSubmissionTest, givenMultipleActiveTilesWhenWaitingForTagUpdateThenQueryAllActiveTiles) {
795796
using Dispatcher = RenderDispatcher<FamilyType>;
796797

798+
VariableBackup<bool> backupWaitpkgUse(&WaitUtils::waitpkgUse, false);
799+
VariableBackup<uint32_t> backupWaitCount(&WaitUtils::waitCount, 1);
800+
797801
MockDrmDirectSubmission<FamilyType, Dispatcher> directSubmission(*device->getDefaultEngine().commandStreamReceiver);
798802

799803
uint32_t offset = directSubmission.immWritePostSyncOffset;

shared/test/unit_test/utilities/wait_util_tests.cpp

Lines changed: 20 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (C) 2021-2023 Intel Corporation
2+
* Copyright (C) 2021-2024 Intel Corporation
33
*
44
* SPDX-License-Identifier: MIT
55
*
@@ -18,7 +18,21 @@ namespace CpuIntrinsicsTests {
1818
extern std::atomic<uint32_t> pauseCounter;
1919
} // namespace CpuIntrinsicsTests
2020

21-
TEST(WaitTest, givenDefaultSettingsWhenNoPollAddressProvidedThenPauseDefaultTimeAndReturnFalse) {
21+
struct WaitPredicateOnlyFixture {
22+
void setUp() {
23+
debugManager.flags.EnableWaitpkg.set(0);
24+
backupWaitCount = std::make_unique<VariableBackup<uint32_t>>(&WaitUtils::waitCount);
25+
}
26+
27+
void tearDown() {}
28+
29+
DebugManagerStateRestore restore;
30+
std::unique_ptr<VariableBackup<uint32_t>> backupWaitCount;
31+
};
32+
33+
using WaitPredicateOnlyTest = Test<WaitPredicateOnlyFixture>;
34+
35+
TEST_F(WaitPredicateOnlyTest, givenDefaultSettingsWhenNoPollAddressProvidedThenPauseDefaultTimeAndReturnFalse) {
2236
EXPECT_EQ(1u, WaitUtils::defaultWaitCount);
2337

2438
WaitUtils::init();
@@ -30,10 +44,7 @@ TEST(WaitTest, givenDefaultSettingsWhenNoPollAddressProvidedThenPauseDefaultTime
3044
EXPECT_EQ(oldCount + WaitUtils::waitCount, CpuIntrinsicsTests::pauseCounter);
3145
}
3246

33-
TEST(WaitTest, givenDebugFlagOverridesWhenNoPollAddressProvidedThenPauseDefaultTimeAndReturnFalse) {
34-
DebugManagerStateRestore restore;
35-
VariableBackup<uint32_t> backupWaitCount(&WaitUtils::waitCount);
36-
47+
TEST_F(WaitPredicateOnlyTest, givenDebugFlagOverridesWhenNoPollAddressProvidedThenPauseDefaultTimeAndReturnFalse) {
3748
uint32_t count = 10u;
3849
debugManager.flags.WaitLoopCount.set(count);
3950

@@ -46,7 +57,7 @@ TEST(WaitTest, givenDebugFlagOverridesWhenNoPollAddressProvidedThenPauseDefaultT
4657
EXPECT_EQ(oldCount + count, CpuIntrinsicsTests::pauseCounter);
4758
}
4859

49-
TEST(WaitTest, givenDefaultSettingsWhenPollAddressProvidedDoesNotMeetCriteriaThenPauseDefaultTimeAndReturnFalse) {
60+
TEST_F(WaitPredicateOnlyTest, givenDefaultSettingsWhenPollAddressProvidedDoesNotMeetCriteriaThenPauseDefaultTimeAndReturnFalse) {
5061
WaitUtils::init();
5162
EXPECT_EQ(WaitUtils::defaultWaitCount, WaitUtils::waitCount);
5263

@@ -59,7 +70,7 @@ TEST(WaitTest, givenDefaultSettingsWhenPollAddressProvidedDoesNotMeetCriteriaThe
5970
EXPECT_EQ(oldCount + WaitUtils::waitCount, CpuIntrinsicsTests::pauseCounter);
6071
}
6172

62-
TEST(WaitTest, givenDefaultSettingsWhenPollAddressProvidedMeetsCriteriaThenPauseDefaultTimeAndReturnTrue) {
73+
TEST_F(WaitPredicateOnlyTest, givenDefaultSettingsWhenPollAddressProvidedMeetsCriteriaThenPauseDefaultTimeAndReturnTrue) {
6374
WaitUtils::init();
6475
EXPECT_EQ(WaitUtils::defaultWaitCount, WaitUtils::waitCount);
6576

@@ -72,10 +83,7 @@ TEST(WaitTest, givenDefaultSettingsWhenPollAddressProvidedMeetsCriteriaThenPause
7283
EXPECT_EQ(oldCount + WaitUtils::waitCount, CpuIntrinsicsTests::pauseCounter);
7384
}
7485

75-
TEST(WaitTest, givenDebugFlagSetZeroWhenPollAddressProvidedMeetsCriteriaThenPauseZeroTimesAndReturnTrue) {
76-
DebugManagerStateRestore restore;
77-
VariableBackup<uint32_t> backupWaitCount(&WaitUtils::waitCount);
78-
86+
TEST_F(WaitPredicateOnlyTest, givenDebugFlagSetZeroWhenPollAddressProvidedMeetsCriteriaThenPauseZeroTimesAndReturnTrue) {
7987
uint32_t count = 0u;
8088
debugManager.flags.WaitLoopCount.set(count);
8189

0 commit comments

Comments
 (0)