Broadcast signal to all threads while handling USM pagefault

Related-To: NEO-4721

Change-Id: I77185f8db2576f626c1b6b5615ab5d8f9b22076f
Signed-off-by: Lukasz Jobczyk <lukasz.jobczyk@intel.com>
This commit is contained in:
Lukasz Jobczyk
2020-07-06 13:09:12 +02:00
committed by sys_ocldev
parent e3ccf19b47
commit 5739d526c4
8 changed files with 122 additions and 10 deletions

View File

@ -13,12 +13,59 @@
#include <csignal>
#include <sys/mman.h>
#include <sys/syscall.h>
#include <thread>
#include <unistd.h>
using namespace NEO;
using PageFaultManagerLinuxTest = PageFaultManagerConfigFixture;
using MockPageFaultManagerLinux = MockPageFaultManagerHandlerInvoke<PageFaultManagerLinux>;
struct UserSignalMockPageFaultManagerLinux : public PageFaultManagerLinux {
using PageFaultManager::verifyPageFault;
UserSignalMockPageFaultManagerLinux() {
ownThread = std::thread([&]() {
while (!waitForCopyCalled) {
if (ownThreadId == -1) {
ownThreadId = static_cast<int>(syscall(__NR_gettid));
}
}
});
while (ownThreadId == -1) {
}
}
void allowCPUMemoryAccess(void *ptr, size_t size) override {}
void transferToCpu(void *ptr, size_t size, void *cmdQ) override {}
void setAubWritable(bool writable, void *ptr, SVMAllocsManager *unifiedMemoryManager) override {}
void sendSignalToThread(int threadId) override {
PageFaultManagerLinux::sendSignalToThread(ownThreadId);
}
void waitForCopy() override {
PageFaultManagerLinux::waitForCopy();
waitForCopyCalled = true;
}
std::thread ownThread;
int ownThreadId = -1;
bool waitForCopyCalled = false;
};
TEST_F(PageFaultManagerLinuxTest, whenVeryfyingPageFaultThenUserSignalIsSentToOtherThreads) {
auto pageFaultManager = std::make_unique<UserSignalMockPageFaultManagerLinux>();
auto alloc = reinterpret_cast<void *>(0x1);
pageFaultManager->insertAllocation(alloc, 10, nullptr, nullptr);
pageFaultManager->verifyPageFault(alloc);
pageFaultManager->ownThread.join();
EXPECT_TRUE(pageFaultManager->waitForCopyCalled);
}
TEST_F(PageFaultManagerLinuxTest, whenPageFaultIsRaisedThenHandlerIsInvoked) {
auto pageFaultManager = std::make_unique<MockPageFaultManagerLinux>();
EXPECT_FALSE(pageFaultManager->handlerInvoked);

View File

@ -49,6 +49,7 @@ class MockPageFaultManager : public PageFaultManager {
void baseGpuTransfer(void *ptr, void *cmdQ) {
PageFaultManager::transferToGpu(ptr, cmdQ);
}
void broadcastWaitSignal() override {}
int allowMemoryAccessCalled = 0;
int protectMemoryCalled = 0;