From 8480615d8d148ad81ac6242a96edf77293c93078 Mon Sep 17 00:00:00 2001 From: Andreas Sandberg Date: Mon, 7 Jan 2013 16:56:39 -0500 Subject: [PATCH] dev: Fix infinite recursion in DMA devices The DMA device sometimes calls the process() method on a completion event directly instead of scheduling it on the current tick. This breaks some devices that assume that the completion handler won't be called until the current event handler has returned. Specifically, it causes infinite recursion in the IdeDisk component because it does not advance its chunk generator until after a dmaRead()/dmaWrite() has returned. This changeset removes this mico-optimization and schedules the event in the current tick instead. This way the semantics event handling stay the same even when the delay is 0. --- src/dev/dma_device.cc | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/dev/dma_device.cc b/src/dev/dma_device.cc index 952d6f622..770370320 100644 --- a/src/dev/dma_device.cc +++ b/src/dev/dma_device.cc @@ -85,10 +85,7 @@ DmaPort::handleResp(PacketPtr pkt, Tick delay) if (state->totBytes == state->numBytes) { if (state->completionEvent) { delay += state->delay; - if (delay) - device->schedule(state->completionEvent, curTick() + delay); - else - state->completionEvent->process(); + device->schedule(state->completionEvent, curTick() + delay); } delete state; } -- 2.30.2