2019-07-04 12:17:42 +02:00
|
|
|
/*
|
2022-01-25 10:26:22 +00:00
|
|
|
* Copyright (C) 2019-2022 Intel Corporation
|
2019-07-04 12:17:42 +02:00
|
|
|
*
|
|
|
|
|
* SPDX-License-Identifier: MIT
|
|
|
|
|
*
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
#pragma once
|
|
|
|
|
|
2020-02-23 22:44:01 +01:00
|
|
|
#include "shared/source/helpers/non_copyable_or_moveable.h"
|
|
|
|
|
#include "shared/source/utilities/spinlock.h"
|
2019-07-04 12:17:42 +02:00
|
|
|
|
2020-09-14 16:39:12 +02:00
|
|
|
#include "memory_properties_flags.h"
|
|
|
|
|
|
2019-07-04 12:17:42 +02:00
|
|
|
#include <memory>
|
|
|
|
|
#include <unordered_map>
|
|
|
|
|
|
|
|
|
|
namespace NEO {
|
2020-09-15 12:35:17 +02:00
|
|
|
class GraphicsAllocation;
|
|
|
|
|
class Device;
|
2019-07-04 12:17:42 +02:00
|
|
|
class SVMAllocsManager;
|
|
|
|
|
|
|
|
|
|
class PageFaultManager : public NonCopyableOrMovableClass {
|
|
|
|
|
public:
|
|
|
|
|
static std::unique_ptr<PageFaultManager> create();
|
|
|
|
|
|
|
|
|
|
virtual ~PageFaultManager() = default;
|
|
|
|
|
|
2020-12-10 07:54:28 +00:00
|
|
|
MOCKABLE_VIRTUAL void moveAllocationToGpuDomain(void *ptr);
|
2022-01-25 10:26:22 +00:00
|
|
|
MOCKABLE_VIRTUAL void moveAllocationsWithinUMAllocsManagerToGpuDomain(SVMAllocsManager *unifiedMemoryManager);
|
2020-09-14 16:39:12 +02:00
|
|
|
void insertAllocation(void *ptr, size_t size, SVMAllocsManager *unifiedMemoryManager, void *cmdQ, const MemoryProperties &memoryProperties);
|
2019-07-04 12:17:42 +02:00
|
|
|
void removeAllocation(void *ptr);
|
|
|
|
|
|
2020-09-14 16:39:12 +02:00
|
|
|
enum class AllocationDomain {
|
|
|
|
|
None,
|
|
|
|
|
Cpu,
|
|
|
|
|
Gpu,
|
|
|
|
|
};
|
|
|
|
|
|
2019-07-04 12:17:42 +02:00
|
|
|
struct PageFaultData {
|
|
|
|
|
size_t size;
|
|
|
|
|
SVMAllocsManager *unifiedMemoryManager;
|
|
|
|
|
void *cmdQ;
|
2020-09-14 16:39:12 +02:00
|
|
|
AllocationDomain domain;
|
2019-07-04 12:17:42 +02:00
|
|
|
};
|
|
|
|
|
|
2021-07-01 21:41:52 +00:00
|
|
|
typedef void (*gpuDomainHandlerFunc)(PageFaultManager *pageFaultHandler, void *alloc, PageFaultData &pageFaultData);
|
|
|
|
|
|
|
|
|
|
void setGpuDomainHandler(gpuDomainHandlerFunc gpuHandlerFuncPtr);
|
|
|
|
|
|
2019-07-04 12:17:42 +02:00
|
|
|
virtual void allowCPUMemoryAccess(void *ptr, size_t size) = 0;
|
|
|
|
|
virtual void protectCPUMemoryAccess(void *ptr, size_t size) = 0;
|
2021-07-01 21:41:52 +00:00
|
|
|
MOCKABLE_VIRTUAL void transferToCpu(void *ptr, size_t size, void *cmdQ);
|
2019-07-04 12:17:42 +02:00
|
|
|
|
2021-07-01 21:41:52 +00:00
|
|
|
protected:
|
2020-09-15 12:35:17 +02:00
|
|
|
virtual void evictMemoryAfterImplCopy(GraphicsAllocation *allocation, Device *device) = 0;
|
2020-07-06 13:09:12 +02:00
|
|
|
|
2019-07-04 12:17:42 +02:00
|
|
|
MOCKABLE_VIRTUAL bool verifyPageFault(void *ptr);
|
|
|
|
|
MOCKABLE_VIRTUAL void transferToGpu(void *ptr, void *cmdQ);
|
2019-11-13 14:19:55 +01:00
|
|
|
MOCKABLE_VIRTUAL void setAubWritable(bool writable, void *ptr, SVMAllocsManager *unifiedMemoryManager);
|
2019-07-04 12:17:42 +02:00
|
|
|
|
2021-03-08 11:39:07 +00:00
|
|
|
static void handleGpuDomainTransferForHw(PageFaultManager *pageFaultHandler, void *alloc, PageFaultData &pageFaultData);
|
2021-04-02 14:22:34 +00:00
|
|
|
static void handleGpuDomainTransferForAubAndTbx(PageFaultManager *pageFaultHandler, void *alloc, PageFaultData &pageFaultData);
|
2021-03-08 11:39:07 +00:00
|
|
|
void selectGpuDomainHandler();
|
2022-03-09 14:55:32 +00:00
|
|
|
inline void migrateStorageToGpuDomain(void *ptr, PageFaultData &pageFaultData);
|
|
|
|
|
inline void migrateStorageToCpuDomain(void *ptr, PageFaultData &pageFaultData);
|
2021-03-08 11:39:07 +00:00
|
|
|
|
|
|
|
|
decltype(&handleGpuDomainTransferForHw) gpuDomainHandler = &handleGpuDomainTransferForHw;
|
2021-07-01 21:41:52 +00:00
|
|
|
|
2019-07-04 12:17:42 +02:00
|
|
|
std::unordered_map<void *, PageFaultData> memoryData;
|
|
|
|
|
SpinLock mtx;
|
|
|
|
|
};
|
|
|
|
|
} // namespace NEO
|