ruby: Check all VNETs for injection in garnet NetworkInterface
authorMatthew Poremba <matthew.poremba@amd.com>
Thu, 19 Jan 2017 16:58:49 +0000 (11:58 -0500)
committerMatthew Poremba <matthew.poremba@amd.com>
Thu, 19 Jan 2017 16:58:49 +0000 (11:58 -0500)
The NetworkInterface wakeup currently iterates over all VNETs and breaks the
loop if a VNET is unable to allocate a VC. This can cause a deadlock if a
lower numbered VNET is unable to allocate a VC while a higher numbered VNET
has idle VCs. This seems like a bug as Garnet 1.0 uses a while loop over an
if-statement, suggesting the break was intended for this while loop. This
patch removes the break statement, which allows up to one message to be
dequeued from a VNET and injected into the network.

src/mem/ruby/network/garnet2.0/NetworkInterface.cc

index 0ac55d2605fb255d423cdaea18eda9edc1a9973c..fe9f1b87eff3763a7b34b12a051f7132ec286c96 100644 (file)
@@ -159,8 +159,6 @@ NetworkInterface::wakeup()
             msg_ptr = b->peekMsgPtr();
             if (flitisizeMessage(msg_ptr, vnet)) {
                 b->dequeue(curTime);
-            } else {
-                break;
             }
         }
     }