ruby: Fix overflow reported by ASAN in MessageBuffer.
authorMatthew Poremba <matthew.poremba@amd.com>
Fri, 2 Dec 2016 16:40:40 +0000 (11:40 -0500)
committerMatthew Poremba <matthew.poremba@amd.com>
Fri, 2 Dec 2016 16:40:40 +0000 (11:40 -0500)
In MessageBuffer the m_not_avail_count member is incremented but not used.
This causes an overflow reported by ASAN. This patch changes from an int to
Stats::Scalar, since the count is useful in debugging finite MessageBuffers.

src/mem/ruby/network/MessageBuffer.cc
src/mem/ruby/network/MessageBuffer.hh

index b78e9aad08639719773d746f3cac0887dcff87c4..557e0e80ef7d2c8e82dbc7abd96c0546482b41a0 100644 (file)
@@ -51,7 +51,6 @@ MessageBuffer::MessageBuffer(const Params *p)
     m_size_last_time_size_checked = 0;
     m_size_at_cycle_start = 0;
     m_msgs_this_cycle = 0;
-    m_not_avail_count = 0;
     m_priority_rank = 0;
 
     m_stall_msg_map.clear();
@@ -350,6 +349,15 @@ MessageBuffer::isReady(Tick current_time) const
         (m_prio_heap.front()->getLastEnqueueTime() <= current_time));
 }
 
+void
+MessageBuffer::regStats()
+{
+    m_not_avail_count
+        .name(name() + ".not_avail_count")
+        .desc("Number of times this buffer did not have N slots available")
+        .flags(Stats::nozero);
+}
+
 uint32_t
 MessageBuffer::functionalWrite(Packet *pkt)
 {
index 5c9e1089b8490793815eb12fa72334513c4d0fa3..2a82887cd2ad1257492ecd3f6b39f83e9d4ec124 100644 (file)
@@ -116,6 +116,8 @@ class MessageBuffer : public SimObject
     void setIncomingLink(int link_id) { m_input_link_id = link_id; }
     void setVnet(int net) { m_vnet_id = net; }
 
+    void regStats();
+
     // Function for figuring out if any of the messages in the buffer need
     // to be updated with the data from the packet.
     // Return value indicates the number of messages that were updated.
@@ -150,8 +152,8 @@ class MessageBuffer : public SimObject
     unsigned int m_size_at_cycle_start;
     unsigned int m_msgs_this_cycle;
 
-    int m_not_avail_count;  // count the # of times I didn't have N
-                            // slots available
+    Stats::Scalar m_not_avail_count;  // count the # of times I didn't have N
+                                      // slots available
     uint64_t m_msg_counter;
     int m_priority_rank;
     const bool m_strict_fifo;