feature: register handler when we migrate to GPU

Created registerFaultHandler() and checkFaultHandlerFromPageFaultManager()
and removed registering sigaction() from the contructor of the
PageFaultManagerLinux class.

Added if statment to check the current pagefault handler is from the
pagefault manager. If not, register the pagefault handler of the current
pagefault manager on linux.

Refactored windows exception vector adding logic to
registerFaultHandler() and call upon the constructor of the
PageFaultManagerWindows, and make
checkFaultHandlerFromPageFaultManager() always return true for windows.

Related-To: NEO-8190
Signed-off-by: Young Jin Yoon <young.jin.yoon@intel.com>
This commit is contained in:
Young Jin Yoon
2023-08-04 01:48:26 +00:00
committed by Compute-Runtime-Automation
parent 68e1f81a83
commit 91deddb69b
10 changed files with 135 additions and 19 deletions

View File

@@ -23,9 +23,30 @@ std::unique_ptr<PageFaultManager> PageFaultManager::create() {
return pageFaultManager;
}
std::function<void(int signal, siginfo_t *info, void *context)> PageFaultManagerLinux::pageFaultHandler;
std::function<void(int signal, siginfo_t *info, void *context)> PageFaultManagerLinux::pageFaultHandler = nullptr;
PageFaultManagerLinux::PageFaultManagerLinux() {
PageFaultManagerLinux::registerFaultHandler();
UNRECOVERABLE_IF(pageFaultHandler == nullptr);
this->evictMemoryAfterCopy = DebugManager.flags.EnableDirectSubmission.get() &&
DebugManager.flags.USMEvictAfterMigration.get();
}
PageFaultManagerLinux::~PageFaultManagerLinux() {
if (!previousHandlerRestored) {
auto retVal = sigaction(SIGSEGV, &previousPageFaultHandler, nullptr);
UNRECOVERABLE_IF(retVal != 0);
}
}
bool PageFaultManagerLinux::checkFaultHandlerFromPageFaultManager() {
struct sigaction currentPageFaultHandler = {};
sigaction(SIGSEGV, NULL, &currentPageFaultHandler);
return (currentPageFaultHandler.sa_sigaction == pageFaultHandlerWrapper);
}
void PageFaultManagerLinux::registerFaultHandler() {
pageFaultHandler = [&](int signal, siginfo_t *info, void *context) {
if (!this->verifyPageFault(info->si_addr)) {
callPreviousHandler(signal, info, context);
@@ -38,16 +59,6 @@ PageFaultManagerLinux::PageFaultManagerLinux() {
auto retVal = sigaction(SIGSEGV, &pageFaultManagerHandler, &previousPageFaultHandler);
UNRECOVERABLE_IF(retVal != 0);
this->evictMemoryAfterCopy = DebugManager.flags.EnableDirectSubmission.get() &&
DebugManager.flags.USMEvictAfterMigration.get();
}
PageFaultManagerLinux::~PageFaultManagerLinux() {
if (!previousHandlerRestored) {
auto retVal = sigaction(SIGSEGV, &previousPageFaultHandler, nullptr);
UNRECOVERABLE_IF(retVal != 0);
}
}
void PageFaultManagerLinux::pageFaultHandlerWrapper(int signal, siginfo_t *info, void *context) {

View File

@@ -27,6 +27,9 @@ class PageFaultManagerLinux : public PageFaultManager {
void evictMemoryAfterImplCopy(GraphicsAllocation *allocation, Device *device) override;
void allowCPUMemoryEvictionImpl(void *ptr, CommandStreamReceiver &csr, OSInterface *osInterface) override;
bool checkFaultHandlerFromPageFaultManager() override;
void registerFaultHandler() override;
void callPreviousHandler(int signal, siginfo_t *info, void *context);
bool previousHandlerRestored = false;