summaryrefslogtreecommitdiff
path: root/src/mem/cache
diff options
context:
space:
mode:
Diffstat (limited to 'src/mem/cache')
-rw-r--r--src/mem/cache/base.cc10
-rw-r--r--src/mem/cache/mshr_queue.hh4
-rw-r--r--src/mem/cache/queue.hh8
3 files changed, 15 insertions, 7 deletions
diff --git a/src/mem/cache/base.cc b/src/mem/cache/base.cc
index 1cbfe713b..ecbd3526e 100644
--- a/src/mem/cache/base.cc
+++ b/src/mem/cache/base.cc
@@ -68,8 +68,8 @@ BaseCache::CacheSlavePort::CacheSlavePort(const std::string &_name,
BaseCache::BaseCache(const BaseCacheParams *p, unsigned blk_size)
: MemObject(p),
cpuSidePort(nullptr), memSidePort(nullptr),
- mshrQueue("MSHRs", p->mshrs, 4, p->demand_mshr_reserve),
- writeBuffer("write buffer", p->write_buffers, p->mshrs+1000),
+ mshrQueue("MSHRs", p->mshrs, 0, p->demand_mshr_reserve), // see below
+ writeBuffer("write buffer", p->write_buffers, p->mshrs), // see below
blkSize(blk_size),
lookupLatency(p->hit_latency),
forwardLatency(p->hit_latency),
@@ -85,6 +85,12 @@ BaseCache::BaseCache(const BaseCacheParams *p, unsigned blk_size)
addrRanges(p->addr_ranges.begin(), p->addr_ranges.end()),
system(p->system)
{
+ // the MSHR queue has no reserve entries as we check the MSHR
+ // queue on every single allocation, whereas the write queue has
+ // as many reserve entries as we have MSHRs, since every MSHR may
+ // eventually require a writeback, and we do not check the write
+ // buffer before committing to an MSHR
+
// forward snoops is overridden in init() once we can query
// whether the connected master is actually snooping or not
}
diff --git a/src/mem/cache/mshr_queue.hh b/src/mem/cache/mshr_queue.hh
index ff78cbebb..f0b5c2ab0 100644
--- a/src/mem/cache/mshr_queue.hh
+++ b/src/mem/cache/mshr_queue.hh
@@ -141,7 +141,9 @@ class MSHRQueue : public Queue<MSHR>
*/
bool canPrefetch() const
{
- return (allocated < numEntries - (numReserve + demandReserve));
+ // @todo we may want to revisit the +1, currently added to
+ // keep regressions unchanged
+ return (allocated < numEntries - (numReserve + 1 + demandReserve));
}
};
diff --git a/src/mem/cache/queue.hh b/src/mem/cache/queue.hh
index 11d456e11..fb3e73608 100644
--- a/src/mem/cache/queue.hh
+++ b/src/mem/cache/queue.hh
@@ -69,7 +69,7 @@ class Queue : public Drainable
/**
* The total number of entries in this queue. This number is set
- * as the number of entries requested plus (numReserve - 1). This
+ * as the number of entries requested plus any reserve. This
* allows for the same number of effective entries while still
* maintaining an overflow reserve.
*/
@@ -120,10 +120,10 @@ class Queue : public Drainable
* Create a queue with a given number of entries.
*
* @param num_entries The number of entries in this queue.
- * @param num_overflow The extra overflow entries needed.
+ * @param reserve The extra overflow entries needed.
*/
Queue(const std::string &_label, int num_entries, int reserve) :
- label(_label), numEntries(num_entries + reserve - 1),
+ label(_label), numEntries(num_entries + reserve),
numReserve(reserve), entries(numEntries), _numInService(0),
allocated(0)
{
@@ -139,7 +139,7 @@ class Queue : public Drainable
bool isFull() const
{
- return (allocated > numEntries - numReserve);
+ return (allocated >= numEntries - numReserve);
}
int numInService() const