2
0

P4 to Git Change 1258779 by gandryey@gera-ocl on 2016/04/15 19:16:15

SWDEV-92245 - [CQE OCL][QR][G] Multiple 32/64 bit Bolt sample crashes on all CPUs. FaultyCL#1257532
	- Bolt calls map/unmap with the same region twice. Add a counter for the same region to track that case

Affected files ...

... //depot/stg/opencl/drivers/opencl/runtime/device/device.cpp#195 edit
... //depot/stg/opencl/drivers/opencl/runtime/device/device.hpp#272 edit
... //depot/stg/opencl/drivers/opencl/runtime/device/gpu/gpuvirtual.cpp#401 edit
... //depot/stg/opencl/drivers/opencl/runtime/device/pal/palvirtual.cpp#6 edit
Este cometimento está contido em:
foreman
2016-04-15 19:22:30 -04:00
ascendente 9b99d758cd
cometimento 6569fba06d
4 ficheiros modificados com 23 adições e 10 eliminações
+7 -5
Ver ficheiro
@@ -689,11 +689,7 @@ Memory::saveMapInfo(
WriteMapInfo* pInfo = &info;
auto it = writeMapInfo_.find(mapAddress);
if (it != writeMapInfo_.end()) {
LogWarning("Double map of the same region!");
}
else {
writeMapInfo_.insert(std::pair<const void*, WriteMapInfo>(mapAddress, info));
it = writeMapInfo_.find(mapAddress);
LogWarning("Double map of the same or overlapped region!");
pInfo = &it->second;
}
@@ -707,6 +703,12 @@ Memory::saveMapInfo(
pInfo->unmapRead_ = true;
}
pInfo->baseMip_ = baseMip;
// Insert into the map if it's the first region
if (++pInfo->count_ == 1) {
writeMapInfo_.insert(std::pair<const void*, WriteMapInfo>(mapAddress, info));
}
}
Program::Program(amd::Device& device)
+6 -3
Ver ficheiro
@@ -629,13 +629,14 @@ public:
SyncFlags(): value_(0) {}
};
struct WriteMapInfo: public amd::EmbeddedObject
struct WriteMapInfo: public amd::HeapObject
{
amd::Coord3D origin_; //!< Origin of the map location
amd::Coord3D region_; //!< Mapped region
amd::Image* baseMip_; //!< The base mip level for images
union {
struct {
uint32_t count_: 8; //!< The same map region counter
uint32_t unmapWrite_: 1; //!< Unmap write operation
uint32_t unmapRead_: 1; //!< Unmap read operation
uint32_t entire_: 1; //!< Process the entire memory
@@ -766,7 +767,7 @@ public:
auto it = writeMapInfo_.find(mapAddress);
if (it == writeMapInfo_.end()) {
if (writeMapInfo_.size() == 0) {
assert(false && "Unmap() call without map!");
LogError("Unmap is a NOP!");
return nullptr;
}
LogWarning("Unknown unmap signature!");
@@ -786,7 +787,9 @@ public:
// Get the first map info
it = writeMapInfo_.begin();
}
writeMapInfo_.erase(it);
if (--it->second.count_ == 0) {
writeMapInfo_.erase(it);
}
}
//! Returns state of memory direct access flag
+5 -1
Ver ficheiro
@@ -1179,12 +1179,16 @@ VirtualGPU::submitUnmapMemory(amd::UnmapMemoryCommand& vcmd)
// Make sure VirtualGPU has an exclusive access to the resources
amd::ScopedLock lock(execution());
profilingBegin(vcmd, true);
gpu::Memory* memory = dev().getGpuMemory(&vcmd.memory());
amd::Memory* owner = memory->owner();
bool unmapMip = false;
const device::Memory::WriteMapInfo* writeMapInfo =
memory->writeMapInfo(vcmd.mapPtr());
if (nullptr == writeMapInfo) {
LogError("Unmap without map call");
return;
}
profilingBegin(vcmd, true);
// Check if image is a mipmap and assign a saved view
amd::Image* amdImage = owner->asImage();
+5 -1
Ver ficheiro
@@ -1422,12 +1422,16 @@ VirtualGPU::submitUnmapMemory(amd::UnmapMemoryCommand& vcmd)
// Make sure VirtualGPU has an exclusive access to the resources
amd::ScopedLock lock(execution());
profilingBegin(vcmd, true);
pal::Memory* memory = dev().getGpuMemory(&vcmd.memory());
amd::Memory* owner = memory->owner();
bool unmapMip = false;
const device::Memory::WriteMapInfo* writeMapInfo =
memory->writeMapInfo(vcmd.mapPtr());
if (nullptr == writeMapInfo) {
LogError("Unmap without map call");
return;
}
profilingBegin(vcmd, true);
// Check if image is a mipmap and assign a saved view
amd::Image* amdImage = owner->asImage();