ruby: Fixed a deadlock when restoring a checkpoint with garnet
authorEmilio Castillo <castilloe@unican.es>
Wed, 30 Oct 2013 15:35:05 +0000 (10:35 -0500)
committerEmilio Castillo <castilloe@unican.es>
Wed, 30 Oct 2013 15:35:05 +0000 (10:35 -0500)
This patch fixes a problem where in Garnet, the enqueue time in the
VCallocator and the SWallocator which is of type Cycles was being stored
inside a variable with int type.

This lead to a known problem restoring checkpoints with garnet & the fixed
pipeline enabled. That value was really big and didn't fit in the variable
overflowing it, therefore some conditions on the VC allocation stage & the
SW allocation stage were not met and the packets didn't advance through the
network, leading to a deadlock panic right after the checkpoint was restored.

Committed by: Nilay Vaish <nilay@cs.wisc.edu>

src/mem/ruby/network/garnet/fixed-pipeline/SWallocator_d.cc
src/mem/ruby/network/garnet/fixed-pipeline/VCallocator_d.cc

index b12c5416c2ffa56a4c0e88962377d9f8ea9855d6..e292745c1cd39f17cbe5aa388cfc40955b6fd7c1 100644 (file)
@@ -133,7 +133,7 @@ bool
 SWallocator_d::is_candidate_inport(int inport, int invc)
 {
     int outport = m_input_unit[inport]->get_route(invc);
-    int t_enqueue_time = m_input_unit[inport]->get_enqueue_time(invc);
+    Cycles t_enqueue_time = m_input_unit[inport]->get_enqueue_time(invc);
     int t_vnet = get_vnet(invc);
     int vc_base = t_vnet*m_vc_per_vnet;
     if ((m_router->get_net_ptr())->isVNetOrdered(t_vnet)) {
index 9569810e86a35c2ff2e2a0d9c88eefb0a83e5bf8..e9e2226a8f58f57058dbdc38349ebd1e62acb178 100644 (file)
@@ -124,7 +124,7 @@ VCallocator_d::is_invc_candidate(int inport_iter, int invc_iter)
 {
     int outport = m_input_unit[inport_iter]->get_route(invc_iter);
     int vnet = get_vnet(invc_iter);
-    int t_enqueue_time =
+    Cycles t_enqueue_time =
         m_input_unit[inport_iter]->get_enqueue_time(invc_iter);
 
     int invc_base = vnet*m_vc_per_vnet;