mirror of
https://github.com/intel/compute-runtime.git
synced 2025-09-20 13:11:34 +08:00
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:

committed by
sys_ocldev

parent
e3ccf19b47
commit
5739d526c4
@ -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);
|
||||
|
@ -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;
|
||||
|
Reference in New Issue
Block a user