mirror of
https://github.com/intel/compute-runtime.git
synced 2025-12-22 10:17:01 +08:00
WDDM - guard against duplicated host ptr allocs
Signed-off-by: Jaroslaw Chodor <jaroslaw.chodor@intel.com>
This commit is contained in:
committed by
Compute-Runtime-Automation
parent
071bb13fae
commit
f1c24ddcbb
@@ -1113,6 +1113,22 @@ TEST_F(CreateAllocationForHostSurfaceTest, givenTemporaryAllocationWhenCreateAll
|
|||||||
EXPECT_EQ(allocationPtr, hostSurfaceAllocationPtr);
|
EXPECT_EQ(allocationPtr, hostSurfaceAllocationPtr);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST_F(CreateAllocationForHostSurfaceTest, whenCreatingAllocationFromHostPtrSurfaceThenLockMutex) {
|
||||||
|
const char memory[8] = {1, 2, 3, 4, 5, 6, 7, 8};
|
||||||
|
size_t size = sizeof(memory);
|
||||||
|
HostPtrSurface surface(const_cast<char *>(memory), size, true);
|
||||||
|
|
||||||
|
MockExecutionEnvironment executionEnvironment;
|
||||||
|
executionEnvironment.initializeMemoryManager();
|
||||||
|
DeviceBitfield deviceBitfield(1);
|
||||||
|
MockCommandStreamReceiver commandStreamReceiver(executionEnvironment, 0u, deviceBitfield);
|
||||||
|
auto osContext = executionEnvironment.memoryManager->createAndRegisterOsContext(&commandStreamReceiver, EngineDescriptorHelper::getDefaultDescriptor(deviceBitfield));
|
||||||
|
commandStreamReceiver.osContext = osContext;
|
||||||
|
EXPECT_EQ(0, commandStreamReceiver.hostPtrSurfaceCreationMutexLockCount);
|
||||||
|
commandStreamReceiver.createAllocationForHostSurface(surface, true);
|
||||||
|
EXPECT_EQ(1, commandStreamReceiver.hostPtrSurfaceCreationMutexLockCount);
|
||||||
|
}
|
||||||
|
|
||||||
TEST_F(CreateAllocationForHostSurfaceTest, givenReadOnlyHostPointerWhenAllocationForHostSurfaceWithPtrCopyAllowedIsCreatedThenCopyAllocationIsCreatedAndMemoryCopied) {
|
TEST_F(CreateAllocationForHostSurfaceTest, givenReadOnlyHostPointerWhenAllocationForHostSurfaceWithPtrCopyAllowedIsCreatedThenCopyAllocationIsCreatedAndMemoryCopied) {
|
||||||
const char memory[8] = {1, 2, 3, 4, 5, 6, 7, 8};
|
const char memory[8] = {1, 2, 3, 4, 5, 6, 7, 8};
|
||||||
size_t size = sizeof(memory);
|
size_t size = sizeof(memory);
|
||||||
|
|||||||
@@ -601,10 +601,14 @@ bool CommandStreamReceiver::createPreemptionAllocation() {
|
|||||||
std::unique_lock<CommandStreamReceiver::MutexType> CommandStreamReceiver::obtainUniqueOwnership() {
|
std::unique_lock<CommandStreamReceiver::MutexType> CommandStreamReceiver::obtainUniqueOwnership() {
|
||||||
return std::unique_lock<CommandStreamReceiver::MutexType>(this->ownershipMutex);
|
return std::unique_lock<CommandStreamReceiver::MutexType>(this->ownershipMutex);
|
||||||
}
|
}
|
||||||
|
std::unique_lock<CommandStreamReceiver::MutexType> CommandStreamReceiver::obtainHostPtrSurfaceCreationLock() {
|
||||||
|
return std::unique_lock<CommandStreamReceiver::MutexType>(this->hostPtrSurfaceCreationMutex);
|
||||||
|
}
|
||||||
AllocationsList &CommandStreamReceiver::getTemporaryAllocations() { return internalAllocationStorage->getTemporaryAllocations(); }
|
AllocationsList &CommandStreamReceiver::getTemporaryAllocations() { return internalAllocationStorage->getTemporaryAllocations(); }
|
||||||
AllocationsList &CommandStreamReceiver::getAllocationsForReuse() { return internalAllocationStorage->getAllocationsForReuse(); }
|
AllocationsList &CommandStreamReceiver::getAllocationsForReuse() { return internalAllocationStorage->getAllocationsForReuse(); }
|
||||||
|
|
||||||
bool CommandStreamReceiver::createAllocationForHostSurface(HostPtrSurface &surface, bool requiresL3Flush) {
|
bool CommandStreamReceiver::createAllocationForHostSurface(HostPtrSurface &surface, bool requiresL3Flush) {
|
||||||
|
std::unique_lock<decltype(hostPtrSurfaceCreationMutex)> lock = this->obtainHostPtrSurfaceCreationLock();
|
||||||
auto allocation = internalAllocationStorage->obtainTemporaryAllocationWithPtr(surface.getSurfaceSize(), surface.getMemoryPointer(), GraphicsAllocation::AllocationType::EXTERNAL_HOST_PTR);
|
auto allocation = internalAllocationStorage->obtainTemporaryAllocationWithPtr(surface.getSurfaceSize(), surface.getMemoryPointer(), GraphicsAllocation::AllocationType::EXTERNAL_HOST_PTR);
|
||||||
|
|
||||||
if (allocation == nullptr) {
|
if (allocation == nullptr) {
|
||||||
|
|||||||
@@ -281,6 +281,7 @@ class CommandStreamReceiver {
|
|||||||
void printDeviceIndex();
|
void printDeviceIndex();
|
||||||
void checkForNewResources(uint32_t submittedTaskCount, uint32_t allocationTaskCount, GraphicsAllocation &gfxAllocation);
|
void checkForNewResources(uint32_t submittedTaskCount, uint32_t allocationTaskCount, GraphicsAllocation &gfxAllocation);
|
||||||
bool checkImplicitFlushForGpuIdle();
|
bool checkImplicitFlushForGpuIdle();
|
||||||
|
MOCKABLE_VIRTUAL std::unique_lock<MutexType> obtainHostPtrSurfaceCreationLock();
|
||||||
|
|
||||||
std::unique_ptr<FlushStampTracker> flushStamp;
|
std::unique_ptr<FlushStampTracker> flushStamp;
|
||||||
std::unique_ptr<SubmissionAggregator> submissionAggregator;
|
std::unique_ptr<SubmissionAggregator> submissionAggregator;
|
||||||
@@ -297,6 +298,7 @@ class CommandStreamReceiver {
|
|||||||
ResidencyContainer residencyAllocations;
|
ResidencyContainer residencyAllocations;
|
||||||
ResidencyContainer evictionAllocations;
|
ResidencyContainer evictionAllocations;
|
||||||
MutexType ownershipMutex;
|
MutexType ownershipMutex;
|
||||||
|
MutexType hostPtrSurfaceCreationMutex;
|
||||||
ExecutionEnvironment &executionEnvironment;
|
ExecutionEnvironment &executionEnvironment;
|
||||||
|
|
||||||
LinearStream commandStream;
|
LinearStream commandStream;
|
||||||
|
|||||||
@@ -28,9 +28,9 @@ AllocationsList::AllocationsList()
|
|||||||
std::unique_ptr<GraphicsAllocation> AllocationsList::detachAllocation(size_t requiredMinimalSize, const void *requiredPtr, CommandStreamReceiver *commandStreamReceiver, GraphicsAllocation::AllocationType allocationType) {
|
std::unique_ptr<GraphicsAllocation> AllocationsList::detachAllocation(size_t requiredMinimalSize, const void *requiredPtr, CommandStreamReceiver *commandStreamReceiver, GraphicsAllocation::AllocationType allocationType) {
|
||||||
ReusableAllocationRequirements req;
|
ReusableAllocationRequirements req;
|
||||||
req.requiredMinimalSize = requiredMinimalSize;
|
req.requiredMinimalSize = requiredMinimalSize;
|
||||||
commandStreamReceiver == nullptr ? req.csrTagAddress = nullptr : req.csrTagAddress = commandStreamReceiver->getTagAddress();
|
req.csrTagAddress = (commandStreamReceiver == nullptr) ? nullptr : commandStreamReceiver->getTagAddress();
|
||||||
req.allocationType = allocationType;
|
req.allocationType = allocationType;
|
||||||
commandStreamReceiver == nullptr ? req.contextId = UINT32_MAX : req.contextId = commandStreamReceiver->getOsContext().getContextId();
|
req.contextId = (commandStreamReceiver == nullptr) ? UINT32_MAX : commandStreamReceiver->getOsContext().getContextId();
|
||||||
req.requiredPtr = requiredPtr;
|
req.requiredPtr = requiredPtr;
|
||||||
GraphicsAllocation *a = nullptr;
|
GraphicsAllocation *a = nullptr;
|
||||||
GraphicsAllocation *retAlloc = processLocked<AllocationsList, &AllocationsList::detachAllocationImpl>(a, static_cast<void *>(&req));
|
GraphicsAllocation *retAlloc = processLocked<AllocationsList, &AllocationsList::detachAllocationImpl>(a, static_cast<void *>(&req));
|
||||||
|
|||||||
@@ -117,6 +117,11 @@ class MockCommandStreamReceiver : public CommandStreamReceiver {
|
|||||||
makeResidentCalledTimes++;
|
makeResidentCalledTimes++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::unique_lock<CommandStreamReceiver::MutexType> obtainHostPtrSurfaceCreationLock() override {
|
||||||
|
++hostPtrSurfaceCreationMutexLockCount;
|
||||||
|
return CommandStreamReceiver::obtainHostPtrSurfaceCreationLock();
|
||||||
|
}
|
||||||
|
|
||||||
void postInitFlagsSetup() override {}
|
void postInitFlagsSetup() override {}
|
||||||
|
|
||||||
std::vector<char> instructionHeapReserveredData;
|
std::vector<char> instructionHeapReserveredData;
|
||||||
@@ -131,6 +136,7 @@ class MockCommandStreamReceiver : public CommandStreamReceiver {
|
|||||||
bool callParentGetTagAddress = true;
|
bool callParentGetTagAddress = true;
|
||||||
bool createPreemptionAllocationReturn = true;
|
bool createPreemptionAllocationReturn = true;
|
||||||
bool createPreemptionAllocationParentCall = false;
|
bool createPreemptionAllocationParentCall = false;
|
||||||
|
int hostPtrSurfaceCreationMutexLockCount = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
template <typename GfxFamily>
|
template <typename GfxFamily>
|
||||||
|
|||||||
Reference in New Issue
Block a user