Tommaso Marinelli has uploaded this change for review. ( https://gem5-review.googlesource.com/c/public/gem5/+/29615 )

Change subject: mem-cache: prevent prefetcher from saturating the write buffer
......................................................................

mem-cache: prevent prefetcher from saturating the write buffer

When the write buffer is full, it still has space to store an additional
number of entries (reserve) equal to the number of MSHRs so that if any of
them requires a writeback this can be handled. Even if the slave port is
blocked, a prefetcher can generate new MSHR entries that may lead to
additional writebacks and eventually saturate the reserve space. This is
solved by checking the status of the write buffer before prefetching data.

Change-Id: Iaad04dd6786a09eab7afae4a53d1b1299c341f33
---
M src/mem/cache/base.cc
1 file changed, 3 insertions(+), 3 deletions(-)



diff --git a/src/mem/cache/base.cc b/src/mem/cache/base.cc
index 1e16008..e2986ab 100644
--- a/src/mem/cache/base.cc
+++ b/src/mem/cache/base.cc
@@ -514,7 +514,7 @@

         // Request the bus for a prefetch if this deallocation freed enough
         // MSHRs for a prefetch to take place
-        if (prefetcher && mshrQueue.canPrefetch()) {
+ if (prefetcher && mshrQueue.canPrefetch() && !writeBuffer.isFull()) { Tick next_pf_time = std::max(prefetcher->nextPrefetchReadyTime(),
                                          clockEdge());
             if (next_pf_time != MaxTick)
@@ -764,7 +764,7 @@

     // fall through... no pending requests.  Try a prefetch.
     assert(!miss_mshr && !wq_entry);
-    if (prefetcher && mshrQueue.canPrefetch()) {
+    if (prefetcher && mshrQueue.canPrefetch() && !writeBuffer.isFull()) {
         // If we have a miss queue slot, we can try a prefetch
         PacketPtr pkt = prefetcher->getPacket();
         if (pkt) {
@@ -1643,7 +1643,7 @@

     // Don't signal prefetch ready time if no MSHRs available
     // Will signal once enoguh MSHRs are deallocated
-    if (prefetcher && mshrQueue.canPrefetch()) {
+    if (prefetcher && mshrQueue.canPrefetch() && !writeBuffer.isFull()) {
         nextReady = std::min(nextReady,
                              prefetcher->nextPrefetchReadyTime());
     }

--
To view, visit https://gem5-review.googlesource.com/c/public/gem5/+/29615
To unsubscribe, or for help writing mail filters, visit https://gem5-review.googlesource.com/settings

Gerrit-Project: public/gem5
Gerrit-Branch: develop
Gerrit-Change-Id: Iaad04dd6786a09eab7afae4a53d1b1299c341f33
Gerrit-Change-Number: 29615
Gerrit-PatchSet: 1
Gerrit-Owner: Tommaso Marinelli  <tomma...@ucm.es>
Gerrit-MessageType: newchange
_______________________________________________
gem5-dev mailing list -- gem5-dev@gem5.org
To unsubscribe send an email to gem5-dev-le...@gem5.org
%(web_page_url)slistinfo%(cgiext)s/%(_internal_name)s

Reply via email to