Skip to content

Commit a92798e

Browse files
Improve Pmu Ult's such that syscalls are not called directly
Signed-off-by: Mayank Raghuwanshi <mayank.raghuwanshi@intel.com>
1 parent 1823054 commit a92798e

File tree

4 files changed

+46
-59
lines changed

4 files changed

+46
-59
lines changed

level_zero/tools/source/sysman/linux/pmu/pmu_imp.cpp

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -42,17 +42,13 @@ uint32_t PmuInterfaceImp::getEventType() {
4242
return eventTypeVal;
4343
}
4444

45-
ssize_t PmuInterfaceImp::readCounters(int fd, uint64_t *data, ssize_t sizeOfdata) {
46-
return read(fd, data, sizeOfdata);
47-
}
48-
4945
int PmuInterfaceImp::getErrorNo() {
5046
return errno;
5147
}
5248

5349
inline int64_t PmuInterfaceImp::perfEventOpen(perf_event_attr *attr, pid_t pid, int cpu, int groupFd, uint64_t flags) {
5450
attr->size = sizeof(*attr);
55-
return syscall(perfEventOpenSyscallNumber, attr, pid, cpu, groupFd, flags);
51+
return this->syscallFunction(perfEventOpenSyscallNumber, attr, pid, cpu, groupFd, flags);
5652
}
5753

5854
int64_t PmuInterfaceImp::pmuInterfaceOpen(uint64_t config, int group, uint32_t format) {
@@ -82,7 +78,7 @@ int64_t PmuInterfaceImp::pmuInterfaceOpen(uint64_t config, int group, uint32_t f
8278

8379
int PmuInterfaceImp::pmuRead(int fd, uint64_t *data, ssize_t sizeOfdata) {
8480
ssize_t len;
85-
len = readCounters(fd, data, sizeOfdata);
81+
len = this->readFunction(fd, data, sizeOfdata);
8682
if (len != sizeOfdata) {
8783
return -1;
8884
}

level_zero/tools/source/sysman/linux/pmu/pmu_imp.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,9 +24,10 @@ class PmuInterfaceImp : public PmuInterface, NEO::NonCopyableOrMovableClass {
2424
MOCKABLE_VIRTUAL int pmuRead(int fd, uint64_t *data, ssize_t sizeOfdata) override;
2525

2626
protected:
27-
MOCKABLE_VIRTUAL int64_t perfEventOpen(perf_event_attr *attr, pid_t pid, int cpu, int groupFd, uint64_t flags);
28-
MOCKABLE_VIRTUAL ssize_t readCounters(int fd, uint64_t *data, ssize_t sizeOfdata);
2927
MOCKABLE_VIRTUAL int getErrorNo();
28+
MOCKABLE_VIRTUAL int64_t perfEventOpen(perf_event_attr *attr, pid_t pid, int cpu, int groupFd, uint64_t flags);
29+
decltype(&read) readFunction = read;
30+
decltype(&syscall) syscallFunction = syscall;
3031

3132
private:
3233
uint32_t getEventType();

level_zero/tools/test/unit_tests/sources/sysman/linux/pmu/mock_pmu.h

Lines changed: 6 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,8 @@ class MockPmuInterfaceImpForSysman : public PmuInterfaceImp {
2323
public:
2424
using PmuInterfaceImp::getErrorNo;
2525
using PmuInterfaceImp::perfEventOpen;
26-
using PmuInterfaceImp::readCounters;
26+
using PmuInterfaceImp::readFunction;
27+
using PmuInterfaceImp::syscallFunction;
2728
MockPmuInterfaceImpForSysman(LinuxSysmanImp *pLinuxSysmanImp) : PmuInterfaceImp(pLinuxSysmanImp) {}
2829
};
2930
template <>
@@ -37,41 +38,22 @@ struct Mock<MockPmuInterfaceImpForSysman> : public MockPmuInterfaceImpForSysman
3738
return -1;
3839
}
3940

40-
int mockedPmuReadAfterClearAndSuccessReturn(int fd, uint64_t *data, ssize_t sizeOfdata) {
41-
memset(data, 0, sizeOfdata);
42-
return 0;
43-
}
44-
45-
int mockedPmuReadAndFailureReturn(int fd, uint64_t *data, ssize_t sizeOfdata) {
46-
return -1;
47-
}
48-
49-
ssize_t mockReadCounterSuccess(int fd, uint64_t *data, ssize_t sizeOfdata) {
50-
data[0] = mockEventVal;
51-
data[1] = mockTimeStamp;
52-
return sizeOfdata;
53-
}
54-
55-
ssize_t mockedReadCountersForGroupSuccess(int fd, uint64_t *data, ssize_t sizeOfdata) {
41+
int mockedReadCountersForGroupSuccess(int fd, uint64_t *data, ssize_t sizeOfdata) {
5642
data[0] = mockEventCount;
5743
data[1] = mockTimeStamp;
5844
data[2] = mockEvent1Val;
5945
data[3] = mockEvent2Val;
60-
return sizeOfdata;
46+
return 0;
6147
}
6248

63-
ssize_t mockReadCounterFailure(int fd, uint64_t *data, ssize_t sizeOfdata) {
64-
return -1;
65-
}
6649
int mockGetErrorNoSuccess() {
6750
return EINVAL;
6851
}
6952
int mockGetErrorNoFailure() {
7053
return EBADF;
7154
}
72-
55+
MOCK_METHOD(int, pmuRead, (int fd, uint64_t *data, ssize_t sizeOfdata), (override));
7356
MOCK_METHOD(int64_t, perfEventOpen, (perf_event_attr * attr, pid_t pid, int cpu, int groupFd, uint64_t flags), (override));
74-
MOCK_METHOD(ssize_t, readCounters, (int fd, uint64_t *data, ssize_t sizeOfdata), (override));
7557
MOCK_METHOD(int, getErrorNo, (), (override));
7658
};
7759

@@ -85,5 +67,6 @@ struct Mock<PmuFsAccess> : public PmuFsAccess {
8567
return ZE_RESULT_SUCCESS;
8668
}
8769
};
70+
8871
} // namespace ult
8972
} // namespace L0

level_zero/tools/test/unit_tests/sources/sysman/linux/pmu/test_pmu.cpp

Lines changed: 35 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -31,10 +31,10 @@ struct SysmanPmuFixture : public SysmanDeviceFixture {
3131
.WillByDefault(::testing::Invoke(pFsAccess.get(), &Mock<PmuFsAccess>::readValSuccess));
3232
ON_CALL(*pPmuInterface.get(), perfEventOpen(_, _, _, _, _))
3333
.WillByDefault(::testing::Invoke(pPmuInterface.get(), &Mock<MockPmuInterfaceImpForSysman>::mockedPerfEventOpenAndSuccessReturn));
34+
ON_CALL(*pPmuInterface.get(), pmuRead(_, _, _))
35+
.WillByDefault(::testing::Invoke(pPmuInterface.get(), &Mock<MockPmuInterfaceImpForSysman>::mockedReadCountersForGroupSuccess));
3436
ON_CALL(*pPmuInterface.get(), getErrorNo())
3537
.WillByDefault(::testing::Invoke(pPmuInterface.get(), &Mock<MockPmuInterfaceImpForSysman>::mockGetErrorNoSuccess));
36-
ON_CALL(*pPmuInterface.get(), readCounters(_, _, _))
37-
.WillByDefault(::testing::Invoke(pPmuInterface.get(), &Mock<MockPmuInterfaceImpForSysman>::mockReadCounterSuccess));
3838
}
3939
void TearDown() override {
4040
SysmanDeviceFixture::TearDown();
@@ -43,38 +43,48 @@ struct SysmanPmuFixture : public SysmanDeviceFixture {
4343
}
4444
};
4545

46-
TEST_F(SysmanPmuFixture, GivenValidPmuHandleWhenCallingPmuReadAndReadCountersFunctionReturnsSuccessThenSuccessIsReturned) {
47-
uint64_t data[2];
48-
int validFd = 10;
49-
EXPECT_EQ(0, pLinuxSysmanImp->pPmuInterface->pmuRead(validFd, data, sizeof(data)));
50-
EXPECT_EQ(mockEventVal, data[0]);
51-
EXPECT_EQ(mockTimeStamp, data[1]);
46+
inline static ssize_t openReadReturnSuccess(int fd, void *data, size_t sizeOfdata) {
47+
uint64_t dataVal[2] = {mockEventVal, mockTimeStamp};
48+
memcpy_s(data, sizeOfdata, dataVal, sizeOfdata);
49+
return sizeOfdata;
5250
}
5351

54-
TEST_F(SysmanPmuFixture, GivenValidPmuHandleWhenCallingPmuReadAndReadCountersFunctionReturnsFailureThenFailureIsReturned) {
55-
ON_CALL(*pPmuInterface.get(), readCounters(_, _, _))
56-
.WillByDefault(::testing::Invoke(pPmuInterface.get(), &Mock<MockPmuInterfaceImpForSysman>::mockReadCounterFailure));
57-
int validFd = 10;
58-
uint64_t data[2];
59-
EXPECT_EQ(-1, pLinuxSysmanImp->pPmuInterface->pmuRead(validFd, data, sizeof(data)));
52+
inline static ssize_t openReadReturnFailure(int fd, void *data, size_t sizeOfdata) {
53+
return -1;
54+
}
55+
56+
inline static long int syscallReturnSuccess(long int sysNo, ...) noexcept {
57+
return mockPmuFd;
6058
}
6159

62-
TEST_F(SysmanPmuFixture, GivenValidPmuHandleWhenCallingReadCountersAndInvalidFdIsPassedToReadSyscallThenFailureIsReturned) {
60+
TEST_F(SysmanPmuFixture, GivenValidPmuHandleWhenCallingPmuReadThenSuccessIsReturned) {
6361
MockPmuInterfaceImpForSysman *pmuInterface = new MockPmuInterfaceImpForSysman(pLinuxSysmanImp);
62+
pmuInterface->readFunction = openReadReturnSuccess;
6463
uint64_t data[2];
65-
int invalidFd = -1;
66-
EXPECT_EQ(-1, pmuInterface->readCounters(invalidFd, data, sizeof(data)));
64+
int validFd = 10;
65+
EXPECT_EQ(0, pmuInterface->pmuRead(validFd, data, sizeof(data)));
66+
EXPECT_EQ(mockEventVal, data[0]);
67+
EXPECT_EQ(mockTimeStamp, data[1]);
6768
delete pmuInterface;
6869
}
6970

70-
TEST_F(SysmanPmuFixture, GivenValidPmuHandleWhenCallingPerfEventOpenAndInvalidConfigIsPassedThenFailureIsReturned) {
71+
TEST_F(SysmanPmuFixture, GivenValidPmuHandleWhenCallingPerEventOpenThenSuccessIsReturned) {
7172
MockPmuInterfaceImpForSysman *pmuInterface = new MockPmuInterfaceImpForSysman(pLinuxSysmanImp);
73+
pmuInterface->syscallFunction = syscallReturnSuccess;
7274
struct perf_event_attr attr = {};
7375
int cpu = 0;
74-
attr.type = 0;
7576
attr.read_format = static_cast<uint64_t>(PERF_FORMAT_TOTAL_TIME_ENABLED);
76-
attr.config = 0;
77-
EXPECT_LT(pmuInterface->perfEventOpen(&attr, -1, cpu, -1, 0), 0);
77+
attr.config = 11;
78+
EXPECT_EQ(mockPmuFd, pmuInterface->perfEventOpen(&attr, -1, cpu, -1, 0));
79+
delete pmuInterface;
80+
}
81+
82+
TEST_F(SysmanPmuFixture, GivenValidPmuHandleWhenCallingThenFailureIsReturned) {
83+
MockPmuInterfaceImpForSysman *pmuInterface = new MockPmuInterfaceImpForSysman(pLinuxSysmanImp);
84+
pmuInterface->readFunction = openReadReturnFailure;
85+
int validFd = 10;
86+
uint64_t data[2];
87+
EXPECT_EQ(-1, pmuInterface->pmuRead(validFd, data, sizeof(data)));
7888
delete pmuInterface;
7989
}
8090

@@ -84,8 +94,6 @@ TEST_F(SysmanPmuFixture, GivenValidPmuHandleWhenCallingPmuInterfaceOpenAndPerfEv
8494
}
8595

8696
TEST_F(SysmanPmuFixture, GivenValidPmuHandleWhenReadingGroupOfEventsUsingGroupFdThenSuccessIsReturned) {
87-
ON_CALL(*pPmuInterface.get(), readCounters(_, _, _))
88-
.WillByDefault(::testing::Invoke(pPmuInterface.get(), &Mock<MockPmuInterfaceImpForSysman>::mockedReadCountersForGroupSuccess));
8997
uint64_t configForEvent1 = 10;
9098
int64_t groupFd = pLinuxSysmanImp->pPmuInterface->pmuInterfaceOpen(configForEvent1, -1, PERF_FORMAT_TOTAL_TIME_ENABLED | PERF_FORMAT_GROUP); // To get group leader
9199
uint64_t configForEvent2 = 15;
@@ -114,13 +122,12 @@ TEST_F(SysmanPmuFixture, GivenValidPmuHandleWhenCallingPmuInterfaceOpenAndPerfEv
114122
EXPECT_EQ(-1, pLinuxSysmanImp->pPmuInterface->pmuInterfaceOpen(config, -1, PERF_FORMAT_TOTAL_TIME_ENABLED));
115123
}
116124

117-
TEST_F(SysmanPmuFixture, GivenValidPmuHandleWhenCallingReadCountersAndInvalidFdIsPassedToReadSyscallThenErrorNoInavlidFileDescriptorIsSet) {
125+
TEST_F(SysmanPmuFixture, GivenValidPmuHandleWhenAndDomainErrorOccursThenDomainErrorIsReturnedBygetErrorNoFunction) {
118126
MockPmuInterfaceImpForSysman *pmuInterface = new MockPmuInterfaceImpForSysman(pLinuxSysmanImp);
119-
uint64_t data[2];
120-
int invalidFd = -1;
121-
EXPECT_EQ(-1, pmuInterface->readCounters(invalidFd, data, sizeof(data)));
122-
EXPECT_EQ(EBADF, pmuInterface->getErrorNo());
127+
log(-1.0); //Domain error injected
128+
EXPECT_EQ(EDOM, pmuInterface->getErrorNo());
123129
delete pmuInterface;
124130
}
131+
125132
} // namespace ult
126133
} // namespace L0

0 commit comments

Comments
 (0)