Writebacks can be pulled out from under the BusRequest when snoops of uprgades to owned blocks hit in the WB buffer
--HG-- extra : convert_revision : f0502836a79ce303150daa7e571badb0bce3a97a
This commit is contained in:
parent
c9102b08fa
commit
23bbd14426
1 changed files with 14 additions and 4 deletions
18
src/mem/cache/base_cache.cc
vendored
18
src/mem/cache/base_cache.cc
vendored
|
@ -135,7 +135,12 @@ BaseCache::CachePort::recvRetry()
|
|||
else if (!isCpuSide)
|
||||
{
|
||||
DPRINTF(CachePort, "%s attempting to send a retry for MSHR\n", name());
|
||||
assert(cache->doMasterRequest());
|
||||
if (cache->doMasterRequest()) {
|
||||
//This can happen if I am the owner of a block and see an upgrade
|
||||
//while the block was in my WB Buffers. I just remove the
|
||||
//wb and de-assert the masterRequest
|
||||
return;
|
||||
}
|
||||
pkt = cache->getPacket();
|
||||
MSHR* mshr = (MSHR*)pkt->senderState;
|
||||
bool success = sendTiming(pkt);
|
||||
|
@ -236,10 +241,15 @@ BaseCache::CacheEvent::process()
|
|||
}
|
||||
}
|
||||
else if (!cachePort->isCpuSide)
|
||||
{
|
||||
{ //MSHR
|
||||
DPRINTF(CachePort, "%s trying to send a MSHR request\n", cachePort->name());
|
||||
assert(cachePort->cache->doMasterRequest());
|
||||
//MSHR
|
||||
if (cachePort->cache->doMasterRequest()) {
|
||||
//This can happen if I am the owner of a block and see an upgrade
|
||||
//while the block was in my WB Buffers. I just remove the
|
||||
//wb and de-assert the masterRequest
|
||||
return;
|
||||
}
|
||||
|
||||
pkt = cachePort->cache->getPacket();
|
||||
MSHR* mshr = (MSHR*) pkt->senderState;
|
||||
bool success = cachePort->sendTiming(pkt);
|
||||
|
|
Loading…
Reference in a new issue