mirror of
https://github.com/intel/compute-runtime.git
synced 2025-12-25 13:33:02 +08:00
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:
committed by
Compute-Runtime-Automation
parent
68e1f81a83
commit
91deddb69b
@@ -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, ¤tPageFaultHandler);
|
||||
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) {
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user