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)
|
else if (!isCpuSide)
|
||||||
{
|
{
|
||||||
DPRINTF(CachePort, "%s attempting to send a retry for MSHR\n", name());
|
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();
|
pkt = cache->getPacket();
|
||||||
MSHR* mshr = (MSHR*)pkt->senderState;
|
MSHR* mshr = (MSHR*)pkt->senderState;
|
||||||
bool success = sendTiming(pkt);
|
bool success = sendTiming(pkt);
|
||||||
|
@ -236,10 +241,15 @@ BaseCache::CacheEvent::process()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (!cachePort->isCpuSide)
|
else if (!cachePort->isCpuSide)
|
||||||
{
|
{ //MSHR
|
||||||
DPRINTF(CachePort, "%s trying to send a MSHR request\n", cachePort->name());
|
DPRINTF(CachePort, "%s trying to send a MSHR request\n", cachePort->name());
|
||||||
assert(cachePort->cache->doMasterRequest());
|
if (cachePort->cache->doMasterRequest()) {
|
||||||
//MSHR
|
//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();
|
pkt = cachePort->cache->getPacket();
|
||||||
MSHR* mshr = (MSHR*) pkt->senderState;
|
MSHR* mshr = (MSHR*) pkt->senderState;
|
||||||
bool success = cachePort->sendTiming(pkt);
|
bool success = cachePort->sendTiming(pkt);
|
||||||
|
|
Loading…
Reference in a new issue