From 80fa6a0edcf845974e632fdb40f06dc0bb1aaa31 Mon Sep 17 00:00:00 2001 From: Emilio Castillo Date: Wed, 30 Oct 2013 10:35:05 -0500 Subject: [PATCH] ruby: Fixed a deadlock when restoring a checkpoint with garnet 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 --- src/mem/ruby/network/garnet/fixed-pipeline/SWallocator_d.cc | 2 +- src/mem/ruby/network/garnet/fixed-pipeline/VCallocator_d.cc | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/mem/ruby/network/garnet/fixed-pipeline/SWallocator_d.cc b/src/mem/ruby/network/garnet/fixed-pipeline/SWallocator_d.cc index b12c5416c..e292745c1 100644 --- a/src/mem/ruby/network/garnet/fixed-pipeline/SWallocator_d.cc +++ b/src/mem/ruby/network/garnet/fixed-pipeline/SWallocator_d.cc @@ -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)) { diff --git a/src/mem/ruby/network/garnet/fixed-pipeline/VCallocator_d.cc b/src/mem/ruby/network/garnet/fixed-pipeline/VCallocator_d.cc index 9569810e8..e9e2226a8 100644 --- a/src/mem/ruby/network/garnet/fixed-pipeline/VCallocator_d.cc +++ b/src/mem/ruby/network/garnet/fixed-pipeline/VCallocator_d.cc @@ -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; -- 2.30.2