summaryrefslogtreecommitdiff
path: root/src/mem/ruby/network/MessageBuffer.cc
diff options
context:
space:
mode:
authorMatthew Poremba <matthew.poremba@amd.com>2017-01-19 11:59:10 -0500
committerMatthew Poremba <matthew.poremba@amd.com>2017-01-19 11:59:10 -0500
commit42044645b9e3a60bd77a84de6c356033d6133004 (patch)
tree0afd45ce0d71b4dc8cefe21f3ec188cb21a9774e /src/mem/ruby/network/MessageBuffer.cc
parenta4b546c3a139aeb33f087422637ac06fc4477d11 (diff)
downloadgem5-42044645b9e3a60bd77a84de6c356033d6133004.tar.xz
ruby: Check MessageBuffer space in garnet NetworkInterface
Garnet's NetworkInterface does not consider the size of MessageBuffers when ejecting a Message from the network. Add a size check for the MessageBuffer and only enqueue if space is available. If space is not available, the message if placed in a queue and the credit is held. A callback from the MessageBuffer is implemented to wake the NetworkInterface. If there are messages in the stalled queue, they are processed first, in a FIFO manner and if succesfully ejected, the credit is finally sent back upstream. The maximum size of the stall queue is equal to the number of valid VNETs with MessageBuffers attached.
Diffstat (limited to 'src/mem/ruby/network/MessageBuffer.cc')
-rw-r--r--src/mem/ruby/network/MessageBuffer.cc19
1 files changed, 19 insertions, 0 deletions
diff --git a/src/mem/ruby/network/MessageBuffer.cc b/src/mem/ruby/network/MessageBuffer.cc
index 573d8833a..67bc7f72d 100644
--- a/src/mem/ruby/network/MessageBuffer.cc
+++ b/src/mem/ruby/network/MessageBuffer.cc
@@ -60,6 +60,8 @@ MessageBuffer::MessageBuffer(const Params *p)
m_buf_msgs = 0;
m_stall_time = 0;
+
+ m_dequeue_callback = nullptr;
}
unsigned int
@@ -241,10 +243,27 @@ MessageBuffer::dequeue(Tick current_time, bool decrement_messages)
m_buf_msgs--;
}
+ // if a dequeue callback was requested, call it now
+ if (m_dequeue_callback) {
+ m_dequeue_callback();
+ }
+
return delay;
}
void
+MessageBuffer::registerDequeueCallback(std::function<void()> callback)
+{
+ m_dequeue_callback = callback;
+}
+
+void
+MessageBuffer::unregisterDequeueCallback()
+{
+ m_dequeue_callback = nullptr;
+}
+
+void
MessageBuffer::clear()
{
m_prio_heap.clear();