cache/memtest: fixes for functional accesses.
--HG-- extra : convert_revision : 688ba4d882cad2c96cf44c9e46999f74266e02ee
This commit is contained in:
parent
01c9d34a0b
commit
0cbcb715e0
6 changed files with 43 additions and 29 deletions
|
@ -359,7 +359,6 @@ MemTest::tick()
|
|||
|
||||
if (probe) {
|
||||
cachePort.sendFunctional(pkt);
|
||||
pkt->makeAtomicResponse();
|
||||
completeRequest(pkt);
|
||||
} else {
|
||||
sendPkt(pkt);
|
||||
|
@ -393,7 +392,6 @@ MemTest::tick()
|
|||
|
||||
if (probe) {
|
||||
cachePort.sendFunctional(pkt);
|
||||
pkt->makeAtomicResponse();
|
||||
completeRequest(pkt);
|
||||
} else {
|
||||
sendPkt(pkt);
|
||||
|
|
31
src/mem/cache/cache_impl.hh
vendored
31
src/mem/cache/cache_impl.hh
vendored
|
@ -641,34 +641,13 @@ Cache<TagStore>::functionalAccess(PacketPtr pkt,
|
|||
return;
|
||||
}
|
||||
|
||||
// Need to check for outstanding misses and writes
|
||||
|
||||
// There can only be one matching outstanding miss.
|
||||
MSHR *mshr = mshrQueue.findMatch(blk_addr);
|
||||
if (mshr) {
|
||||
MSHR::TargetList *targets = mshr->getTargetList();
|
||||
MSHR::TargetList::iterator i = targets->begin();
|
||||
MSHR::TargetList::iterator end = targets->end();
|
||||
for (; i != end; ++i) {
|
||||
PacketPtr targetPkt = i->pkt;
|
||||
if (pkt->checkFunctional(targetPkt))
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
// There can be many matching outstanding writes.
|
||||
std::vector<MSHR*> writes;
|
||||
assert(!writeBuffer.findMatches(blk_addr, writes));
|
||||
/* Need to change this to iterate through targets in mshr??
|
||||
for (int i = 0; i < writes.size(); ++i) {
|
||||
MSHR *mshr = writes[i];
|
||||
if (pkt->checkFunctional(mshr->addr, mshr->size, mshr->writeData))
|
||||
return;
|
||||
}
|
||||
*/
|
||||
|
||||
// Need to check for outstanding misses and writes; if neither one
|
||||
// satisfies, then forward to other side of cache.
|
||||
if (!(mshrQueue.checkFunctional(pkt, blk_addr) ||
|
||||
writeBuffer.checkFunctional(pkt, blk_addr))) {
|
||||
otherSidePort->checkAndSendFunctional(pkt);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/////////////////////////////////////////////////////
|
||||
|
|
14
src/mem/cache/miss/mshr.cc
vendored
14
src/mem/cache/miss/mshr.cc
vendored
|
@ -118,6 +118,20 @@ MSHR::TargetList::clearDownstreamPending()
|
|||
}
|
||||
|
||||
|
||||
bool
|
||||
MSHR::TargetList::checkFunctional(PacketPtr pkt)
|
||||
{
|
||||
Iterator end_i = end();
|
||||
for (Iterator i = begin(); i != end_i; ++i) {
|
||||
if (pkt->checkFunctional(i->pkt)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
MSHR::allocate(Addr _addr, int _size, PacketPtr target,
|
||||
Tick whenReady, Counter _order)
|
||||
|
|
6
src/mem/cache/miss/mshr.hh
vendored
6
src/mem/cache/miss/mshr.hh
vendored
|
@ -82,6 +82,7 @@ class MSHR : public Packet::SenderState
|
|||
void add(PacketPtr pkt, Tick readyTime, Counter order, bool cpuSide);
|
||||
void replaceUpgrades();
|
||||
void clearDownstreamPending();
|
||||
bool checkFunctional(PacketPtr pkt);
|
||||
};
|
||||
|
||||
/** A list of MSHRs. */
|
||||
|
@ -230,6 +231,11 @@ public:
|
|||
|
||||
void handleFill(Packet *pkt, CacheBlk *blk);
|
||||
|
||||
bool checkFunctional(PacketPtr pkt) {
|
||||
return (targets->checkFunctional(pkt) ||
|
||||
deferredTargets->checkFunctional(pkt));
|
||||
}
|
||||
|
||||
/**
|
||||
* Prints the contents of this MSHR to stderr.
|
||||
*/
|
||||
|
|
17
src/mem/cache/miss/mshr_queue.cc
vendored
17
src/mem/cache/miss/mshr_queue.cc
vendored
|
@ -84,9 +84,24 @@ MSHRQueue::findMatches(Addr addr, vector<MSHR*>& matches) const
|
|||
}
|
||||
}
|
||||
return retval;
|
||||
|
||||
}
|
||||
|
||||
|
||||
bool
|
||||
MSHRQueue::checkFunctional(PacketPtr pkt, Addr blk_addr)
|
||||
{
|
||||
MSHR::ConstIterator i = allocatedList.begin();
|
||||
MSHR::ConstIterator end = allocatedList.end();
|
||||
for (; i != end; ++i) {
|
||||
MSHR *mshr = *i;
|
||||
if (mshr->addr == blk_addr && mshr->checkFunctional(pkt)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
MSHR *
|
||||
MSHRQueue::findPending(Addr addr, int size) const
|
||||
{
|
||||
|
|
2
src/mem/cache/miss/mshr_queue.hh
vendored
2
src/mem/cache/miss/mshr_queue.hh
vendored
|
@ -115,6 +115,8 @@ class MSHRQueue
|
|||
*/
|
||||
MSHR *findPending(Addr addr, int size) const;
|
||||
|
||||
bool checkFunctional(PacketPtr pkt, Addr blk_addr);
|
||||
|
||||
/**
|
||||
* Allocates a new MSHR for the request and size. This places the request
|
||||
* as the first target in the MSHR.
|
||||
|
|
Loading…
Reference in a new issue