diff options
Diffstat (limited to 'src/mem')
-rw-r--r-- | src/mem/cache/mshr_queue.cc | 21 | ||||
-rw-r--r-- | src/mem/cache/mshr_queue.hh | 5 | ||||
-rw-r--r-- | src/mem/dram_ctrl.cc | 35 | ||||
-rw-r--r-- | src/mem/dram_ctrl.hh | 8 | ||||
-rw-r--r-- | src/mem/dramsim2.cc | 26 | ||||
-rw-r--r-- | src/mem/dramsim2.hh | 8 | ||||
-rw-r--r-- | src/mem/packet_queue.cc | 24 | ||||
-rw-r--r-- | src/mem/packet_queue.hh | 6 | ||||
-rw-r--r-- | src/mem/ruby/structures/RubyMemoryControl.cc | 6 | ||||
-rw-r--r-- | src/mem/ruby/structures/RubyMemoryControl.hh | 2 | ||||
-rw-r--r-- | src/mem/ruby/system/DMASequencer.cc | 29 | ||||
-rw-r--r-- | src/mem/ruby/system/DMASequencer.hh | 5 | ||||
-rw-r--r-- | src/mem/ruby/system/RubyPort.cc | 30 | ||||
-rw-r--r-- | src/mem/ruby/system/RubyPort.hh | 4 | ||||
-rw-r--r-- | src/mem/ruby/system/Sequencer.cc | 4 | ||||
-rw-r--r-- | src/mem/simple_mem.cc | 29 | ||||
-rw-r--r-- | src/mem/simple_mem.hh | 8 | ||||
-rw-r--r-- | src/mem/xbar.cc | 18 | ||||
-rw-r--r-- | src/mem/xbar.hh | 5 |
19 files changed, 94 insertions, 179 deletions
diff --git a/src/mem/cache/mshr_queue.cc b/src/mem/cache/mshr_queue.cc index 3736c9f21..47f044d63 100644 --- a/src/mem/cache/mshr_queue.cc +++ b/src/mem/cache/mshr_queue.cc @@ -56,7 +56,7 @@ MSHRQueue::MSHRQueue(const std::string &_label, int _index) : label(_label), numEntries(num_entries + reserve - 1), numReserve(reserve), demandReserve(demand_reserve), - registers(numEntries), drainManager(NULL), allocated(0), + registers(numEntries), allocated(0), inServiceEntries(0), index(_index) { for (int i = 0; i < numEntries; ++i) { @@ -180,13 +180,11 @@ MSHRQueue::deallocateOne(MSHR *mshr) readyList.erase(mshr->readyIter); } mshr->deallocate(); - if (drainManager && allocated == 0) { + if (drainState() == DrainState::Draining && allocated == 0) { // Notify the drain manager that we have completed draining if // there are no other outstanding requests in this MSHR queue. DPRINTF(Drain, "MSHRQueue now empty, signalling drained\n"); - drainManager->signalDrainDone(); - drainManager = NULL; - setDrainState(DrainState::Drained); + signalDrainDone(); } return retval; } @@ -265,15 +263,8 @@ MSHRQueue::squash(int threadNum) } } -unsigned int -MSHRQueue::drain(DrainManager *dm) +DrainState +MSHRQueue::drain() { - if (allocated == 0) { - setDrainState(DrainState::Drained); - return 0; - } else { - drainManager = dm; - setDrainState(DrainState::Draining); - return 1; - } + return allocated == 0 ? DrainState::Drained : DrainState::Draining; } diff --git a/src/mem/cache/mshr_queue.hh b/src/mem/cache/mshr_queue.hh index 4043bc565..308d371fe 100644 --- a/src/mem/cache/mshr_queue.hh +++ b/src/mem/cache/mshr_queue.hh @@ -92,9 +92,6 @@ class MSHRQueue : public Drainable /** Holds non allocated entries. */ MSHR::List freeList; - /** Drain manager to inform of a completed drain */ - DrainManager *drainManager; - MSHR::Iterator addToReadyList(MSHR *mshr); @@ -258,7 +255,7 @@ class MSHRQueue : public Drainable return readyList.empty() ? MaxTick : readyList.front()->readyTime; } - unsigned int drain(DrainManager *dm); + DrainState drain() M5_ATTR_OVERRIDE; }; #endif //__MEM_CACHE_MSHR_QUEUE_HH__ diff --git a/src/mem/dram_ctrl.cc b/src/mem/dram_ctrl.cc index 0b1509e2f..dc2c03332 100644 --- a/src/mem/dram_ctrl.cc +++ b/src/mem/dram_ctrl.cc @@ -61,7 +61,6 @@ DRAMCtrl::DRAMCtrl(const DRAMCtrlParams* p) : retryRdReq(false), retryWrReq(false), busState(READ), nextReqEvent(this), respondEvent(this), - drainManager(NULL), deviceSize(p->device_size), deviceBusWidth(p->device_bus_width), burstLength(p->burst_length), deviceRowBufferSize(p->device_rowbuffer_size), @@ -694,11 +693,11 @@ DRAMCtrl::processRespondEvent() schedule(respondEvent, respQueue.front()->readyTime); } else { // if there is nothing left in any queue, signal a drain - if (writeQueue.empty() && readQueue.empty() && - drainManager) { + if (drainState() == DrainState::Draining && + writeQueue.empty() && readQueue.empty()) { + DPRINTF(Drain, "DRAM controller done draining\n"); - drainManager->signalDrainDone(); - drainManager = NULL; + signalDrainDone(); } } @@ -1296,15 +1295,17 @@ DRAMCtrl::processNextReqEvent() // trigger writes if we have passed the low threshold (or // if we are draining) if (!writeQueue.empty() && - (drainManager || writeQueue.size() > writeLowThreshold)) { + (drainState() == DrainState::Draining || + writeQueue.size() > writeLowThreshold)) { switch_to_writes = true; } else { // check if we are drained - if (respQueue.empty () && drainManager) { + if (drainState() == DrainState::Draining && + respQueue.empty()) { + DPRINTF(Drain, "DRAM controller done draining\n"); - drainManager->signalDrainDone(); - drainManager = NULL; + signalDrainDone(); } // nothing to do, not even any point in scheduling an @@ -1416,7 +1417,7 @@ DRAMCtrl::processNextReqEvent() // writes, then switch to reads. if (writeQueue.empty() || (writeQueue.size() + minWritesPerSwitch < writeLowThreshold && - !drainManager) || + drainState() != DrainState::Draining) || (!readQueue.empty() && writesThisTime >= minWritesPerSwitch)) { // turn the bus back around for reads again busState = WRITE_TO_READ; @@ -2166,28 +2167,24 @@ DRAMCtrl::getSlavePort(const string &if_name, PortID idx) } } -unsigned int -DRAMCtrl::drain(DrainManager *dm) +DrainState +DRAMCtrl::drain() { // if there is anything in any of our internal queues, keep track // of that as well - if (!(writeQueue.empty() && readQueue.empty() && - respQueue.empty())) { + if (!(writeQueue.empty() && readQueue.empty() && respQueue.empty())) { DPRINTF(Drain, "DRAM controller not drained, write: %d, read: %d," " resp: %d\n", writeQueue.size(), readQueue.size(), respQueue.size()); - drainManager = dm; // the only part that is not drained automatically over time // is the write queue, thus kick things into action if needed if (!writeQueue.empty() && !nextReqEvent.scheduled()) { schedule(nextReqEvent, curTick()); } - setDrainState(DrainState::Draining); - return 1; + return DrainState::Draining; } else { - setDrainState(DrainState::Drained); - return 0; + return DrainState::Drained; } } diff --git a/src/mem/dram_ctrl.hh b/src/mem/dram_ctrl.hh index 1ea04fa56..bf0be04a7 100644 --- a/src/mem/dram_ctrl.hh +++ b/src/mem/dram_ctrl.hh @@ -671,12 +671,6 @@ class DRAMCtrl : public AbstractMemory std::deque<DRAMPacket*> respQueue; /** - * If we need to drain, keep the drain manager around until we're - * done here. - */ - DrainManager *drainManager; - - /** * Vector of ranks */ std::vector<Rank*> ranks; @@ -878,7 +872,7 @@ class DRAMCtrl : public AbstractMemory DRAMCtrl(const DRAMCtrlParams* p); - unsigned int drain(DrainManager* dm); + DrainState drain() M5_ATTR_OVERRIDE; virtual BaseSlavePort& getSlavePort(const std::string& if_name, PortID idx = InvalidPortID); diff --git a/src/mem/dramsim2.cc b/src/mem/dramsim2.cc index dfeca0d47..6d0b84336 100644 --- a/src/mem/dramsim2.cc +++ b/src/mem/dramsim2.cc @@ -52,7 +52,6 @@ DRAMSim2::DRAMSim2(const Params* p) : p->traceFile, p->range.size() / 1024 / 1024, p->enableDebug), retryReq(false), retryResp(false), startTick(0), nbrOutstandingReads(0), nbrOutstandingWrites(0), - drainManager(NULL), sendResponseEvent(this), tickEvent(this) { DPRINTF(DRAMSim2, @@ -118,11 +117,8 @@ DRAMSim2::sendResponse() if (!responseQueue.empty() && !sendResponseEvent.scheduled()) schedule(sendResponseEvent, curTick()); - // check if we were asked to drain and if we are now done - if (drainManager && nbrOutstanding() == 0) { - drainManager->signalDrainDone(); - drainManager = NULL; - } + if (nbrOutstanding() == 0) + signalDrainDone(); } else { retryResp = true; @@ -339,11 +335,8 @@ void DRAMSim2::writeComplete(unsigned id, uint64_t addr, uint64_t cycle) assert(nbrOutstandingWrites != 0); --nbrOutstandingWrites; - // check if we were asked to drain and if we are now done - if (drainManager && nbrOutstanding() == 0) { - drainManager->signalDrainDone(); - drainManager = NULL; - } + if (nbrOutstanding() == 0) + signalDrainDone(); } BaseSlavePort& @@ -357,18 +350,11 @@ DRAMSim2::getSlavePort(const std::string &if_name, PortID idx) } unsigned int -DRAMSim2::drain(DrainManager* dm) +DRAMSim2::drain() { // check our outstanding reads and writes and if any they need to // drain - if (nbrOutstanding() != 0) { - setDrainState(DrainState::Draining); - drainManager = dm; - return 1; - } else { - setDrainState(DrainState::Drained); - return 0; - } + return nbrOutstanding() != 0 ? DrainState::Draining : DrainState::Drained; } DRAMSim2::MemoryPort::MemoryPort(const std::string& _name, diff --git a/src/mem/dramsim2.hh b/src/mem/dramsim2.hh index cd87fe73d..5d8e64282 100644 --- a/src/mem/dramsim2.hh +++ b/src/mem/dramsim2.hh @@ -132,12 +132,6 @@ class DRAMSim2 : public AbstractMemory */ std::deque<PacketPtr> responseQueue; - /** - * If we need to drain, keep the drain manager around until we're - * done here. - */ - DrainManager *drainManager; - unsigned int nbrOutstanding() const; /** @@ -195,7 +189,7 @@ class DRAMSim2 : public AbstractMemory */ void writeComplete(unsigned id, uint64_t addr, uint64_t cycle); - unsigned int drain(DrainManager* dm); + DrainState drain() M5_ATTR_OVERRIDE; virtual BaseSlavePort& getSlavePort(const std::string& if_name, PortID idx = InvalidPortID); diff --git a/src/mem/packet_queue.cc b/src/mem/packet_queue.cc index 86cf599ab..ff248d388 100644 --- a/src/mem/packet_queue.cc +++ b/src/mem/packet_queue.cc @@ -49,7 +49,7 @@ using namespace std; PacketQueue::PacketQueue(EventManager& _em, const std::string& _label) - : em(_em), sendEvent(this), drainManager(NULL), label(_label), + : em(_em), sendEvent(this), label(_label), waitingOnRetry(false) { } @@ -198,11 +198,12 @@ PacketQueue::schedSendEvent(Tick when) } else { // we get a MaxTick when there is no more to send, so if we're // draining, we may be done at this point - if (drainManager && transmitList.empty() && !sendEvent.scheduled()) { + if (drainState() == DrainState::Draining && + transmitList.empty() && !sendEvent.scheduled()) { + DPRINTF(Drain, "PacketQueue done draining," "processing drain event\n"); - drainManager->signalDrainDone(); - drainManager = NULL; + signalDrainDone(); } } } @@ -244,14 +245,15 @@ PacketQueue::processSendEvent() sendDeferredPacket(); } -unsigned int -PacketQueue::drain(DrainManager *dm) +DrainState +PacketQueue::drain() { - if (transmitList.empty()) - return 0; - DPRINTF(Drain, "PacketQueue not drained\n"); - drainManager = dm; - return 1; + if (transmitList.empty()) { + return DrainState::Drained; + } else { + DPRINTF(Drain, "PacketQueue not drained\n"); + return DrainState::Draining; + } } ReqPacketQueue::ReqPacketQueue(EventManager& _em, MasterPort& _masterPort, diff --git a/src/mem/packet_queue.hh b/src/mem/packet_queue.hh index 6584fe997..4eabd1bc4 100644 --- a/src/mem/packet_queue.hh +++ b/src/mem/packet_queue.hh @@ -89,10 +89,6 @@ class PacketQueue : public Drainable /** Event used to call processSendEvent. */ EventWrapper<PacketQueue, &PacketQueue::processSendEvent> sendEvent; - /** If we need to drain, keep the drain manager around until we're done - * here.*/ - DrainManager *drainManager; - protected: /** Label to use for print request packets label stack. */ @@ -192,7 +188,7 @@ class PacketQueue : public Drainable */ void retry(); - unsigned int drain(DrainManager *dm); + DrainState drain() M5_ATTR_OVERRIDE; }; class ReqPacketQueue : public PacketQueue diff --git a/src/mem/ruby/structures/RubyMemoryControl.cc b/src/mem/ruby/structures/RubyMemoryControl.cc index 7e07a82bc..6e40d415c 100644 --- a/src/mem/ruby/structures/RubyMemoryControl.cc +++ b/src/mem/ruby/structures/RubyMemoryControl.cc @@ -640,14 +640,14 @@ RubyMemoryControl::executeCycle() } } -unsigned int -RubyMemoryControl::drain(DrainManager *dm) +DrainState +RubyMemoryControl::drain() { DPRINTF(RubyMemory, "MemoryController drain\n"); if(m_event.scheduled()) { deschedule(m_event); } - return 0; + return DrainState::Drained; } // wakeup: This function is called once per memory controller clock cycle. diff --git a/src/mem/ruby/structures/RubyMemoryControl.hh b/src/mem/ruby/structures/RubyMemoryControl.hh index 78bc74ad5..d69e8f435 100644 --- a/src/mem/ruby/structures/RubyMemoryControl.hh +++ b/src/mem/ruby/structures/RubyMemoryControl.hh @@ -61,7 +61,7 @@ class RubyMemoryControl : public AbstractMemory, public Consumer virtual BaseSlavePort& getSlavePort(const std::string& if_name, PortID idx = InvalidPortID); - unsigned int drain(DrainManager *dm); + DrainState drain() M5_ATTR_OVERRIDE; void wakeup(); void setDescription(const std::string& name) { m_description = name; }; diff --git a/src/mem/ruby/system/DMASequencer.cc b/src/mem/ruby/system/DMASequencer.cc index 0dd28d91c..05592b231 100644 --- a/src/mem/ruby/system/DMASequencer.cc +++ b/src/mem/ruby/system/DMASequencer.cc @@ -42,7 +42,7 @@ DMASequencer::DMASequencer(const Params *p) m_mandatory_q_ptr(NULL), m_usingRubyTester(p->using_ruby_tester), slave_port(csprintf("%s.slave", name()), this, 0, p->ruby_system, p->ruby_system->getAccessBackingStore()), - drainManager(NULL), system(p->system), retry(false) + system(p->system), retry(false) { assert(m_version != -1); } @@ -148,43 +148,34 @@ void DMASequencer::testDrainComplete() { //If we weren't able to drain before, we might be able to now. - if (drainManager != NULL) { + if (drainState() == DrainState::Draining) { unsigned int drainCount = outstandingCount(); DPRINTF(Drain, "Drain count: %u\n", drainCount); if (drainCount == 0) { DPRINTF(Drain, "DMASequencer done draining, signaling drain done\n"); - drainManager->signalDrainDone(); - // Clear the drain manager once we're done with it. - drainManager = NULL; + signalDrainDone(); } } } -unsigned int -DMASequencer::drain(DrainManager *dm) +DrainState +DMASequencer::drain() { if (isDeadlockEventScheduled()) { descheduleDeadlockEvent(); } // If the DMASequencer is not empty, then it needs to clear all outstanding - // requests before it should call drainManager->signalDrainDone() + // requests before it should call signalDrainDone() DPRINTF(Config, "outstanding count %d\n", outstandingCount()); - bool need_drain = outstandingCount() > 0; - // Set status - if (need_drain) { - drainManager = dm; - + if (outstandingCount() > 0) { DPRINTF(Drain, "DMASequencer not drained\n"); - setDrainState(DrainState::Draining); - return 1; + return DrainState::Draining; + } else { + return DrainState::Drained; } - - drainManager = NULL; - setDrainState(DrainState::Drained); - return 0; } void diff --git a/src/mem/ruby/system/DMASequencer.hh b/src/mem/ruby/system/DMASequencer.hh index bcf586acf..ee5a4b698 100644 --- a/src/mem/ruby/system/DMASequencer.hh +++ b/src/mem/ruby/system/DMASequencer.hh @@ -107,7 +107,7 @@ class DMASequencer : public MemObject // A pointer to the controller is needed for atomic support. void setController(AbstractController* _cntrl) { m_controller = _cntrl; } uint32_t getId() { return m_version; } - unsigned int drain(DrainManager *dm); + DrainState drain() M5_ATTR_OVERRIDE; /* SLICC callback */ void dataCallback(const DataBlock & dblk); @@ -129,7 +129,7 @@ class DMASequencer : public MemObject * @return Whether successfully sent */ bool recvTimingResp(PacketPtr pkt, PortID master_port_id); - unsigned int getChildDrainCount(DrainManager *dm); + unsigned int getChildDrainCount(); private: uint32_t m_version; @@ -139,7 +139,6 @@ class DMASequencer : public MemObject MemSlavePort slave_port; - DrainManager *drainManager; System* system; bool retry; diff --git a/src/mem/ruby/system/RubyPort.cc b/src/mem/ruby/system/RubyPort.cc index 5818056e9..d34cb3c2f 100644 --- a/src/mem/ruby/system/RubyPort.cc +++ b/src/mem/ruby/system/RubyPort.cc @@ -59,7 +59,7 @@ RubyPort::RubyPort(const Params *p) memMasterPort(csprintf("%s.mem-master-port", name()), this), memSlavePort(csprintf("%s-mem-slave-port", name()), this, p->ruby_system, p->ruby_system->getAccessBackingStore(), -1), - gotAddrRanges(p->port_master_connection_count), drainManager(NULL) + gotAddrRanges(p->port_master_connection_count) { assert(m_version != -1); @@ -387,20 +387,18 @@ void RubyPort::testDrainComplete() { //If we weren't able to drain before, we might be able to now. - if (drainManager != NULL) { + if (drainState() == DrainState::Draining) { unsigned int drainCount = outstandingCount(); DPRINTF(Drain, "Drain count: %u\n", drainCount); if (drainCount == 0) { DPRINTF(Drain, "RubyPort done draining, signaling drain done\n"); - drainManager->signalDrainDone(); - // Clear the drain manager once we're done with it. - drainManager = NULL; + signalDrainDone(); } } } -unsigned int -RubyPort::drain(DrainManager *dm) +DrainState +RubyPort::drain() { if (isDeadlockEventScheduled()) { descheduleDeadlockEvent(); @@ -408,23 +406,15 @@ RubyPort::drain(DrainManager *dm) // // If the RubyPort is not empty, then it needs to clear all outstanding - // requests before it should call drainManager->signalDrainDone() + // requests before it should call signalDrainDone() // DPRINTF(Config, "outstanding count %d\n", outstandingCount()); - bool need_drain = outstandingCount() > 0; - - // Set status - if (need_drain) { - drainManager = dm; - + if (outstandingCount() > 0) { DPRINTF(Drain, "RubyPort not drained\n"); - setDrainState(DrainState::Draining); - return 1; + return DrainState::Draining; + } else { + return DrainState::Drained; } - - drainManager = NULL; - setDrainState(DrainState::Drained); - return 0; } void diff --git a/src/mem/ruby/system/RubyPort.hh b/src/mem/ruby/system/RubyPort.hh index ff1b2af04..1fbaeba7b 100644 --- a/src/mem/ruby/system/RubyPort.hh +++ b/src/mem/ruby/system/RubyPort.hh @@ -162,7 +162,7 @@ class RubyPort : public MemObject // void setController(AbstractController* _cntrl) { m_controller = _cntrl; } uint32_t getId() { return m_version; } - unsigned int drain(DrainManager *dm); + DrainState drain() M5_ATTR_OVERRIDE; protected: void ruby_hit_callback(PacketPtr pkt); @@ -204,8 +204,6 @@ class RubyPort : public MemObject std::vector<MemSlavePort *> slave_ports; std::vector<PioMasterPort *> master_ports; - DrainManager *drainManager; - // // Based on similar code in the M5 bus. Stores pointers to those ports // that should be called when the Sequencer becomes available after a stall. diff --git a/src/mem/ruby/system/Sequencer.cc b/src/mem/ruby/system/Sequencer.cc index c33f5f819..0a48817ca 100644 --- a/src/mem/ruby/system/Sequencer.cc +++ b/src/mem/ruby/system/Sequencer.cc @@ -77,7 +77,7 @@ Sequencer::~Sequencer() void Sequencer::wakeup() { - assert(getDrainState() != DrainState::Draining); + assert(drainState() != DrainState::Draining); // Check for deadlock of any of the requests Cycles current_time = curCycle(); @@ -215,7 +215,7 @@ Sequencer::insertRequest(PacketPtr pkt, RubyRequestType request_type) // See if we should schedule a deadlock check if (!deadlockCheckEvent.scheduled() && - getDrainState() != DrainState::Draining) { + drainState() != DrainState::Draining) { schedule(deadlockCheckEvent, clockEdge(m_deadlock_threshold)); } diff --git a/src/mem/simple_mem.cc b/src/mem/simple_mem.cc index f36301809..8938b2a55 100644 --- a/src/mem/simple_mem.cc +++ b/src/mem/simple_mem.cc @@ -53,7 +53,7 @@ SimpleMemory::SimpleMemory(const SimpleMemoryParams* p) : port(name() + ".port", *this), latency(p->latency), latency_var(p->latency_var), bandwidth(p->bandwidth), isBusy(false), retryReq(false), retryResp(false), - releaseEvent(this), dequeueEvent(this), drainManager(NULL) + releaseEvent(this), dequeueEvent(this) { } @@ -200,10 +200,9 @@ SimpleMemory::dequeue() // already have an event scheduled, so use re-schedule reschedule(dequeueEvent, std::max(packetQueue.front().tick, curTick()), true); - } else if (drainManager) { - DPRINTF(Drain, "Drainng of SimpleMemory complete\n"); - drainManager->signalDrainDone(); - drainManager = NULL; + } else if (drainState() == DrainState::Draining) { + DPRINTF(Drain, "Draining of SimpleMemory complete\n"); + signalDrainDone(); } } } @@ -233,23 +232,15 @@ SimpleMemory::getSlavePort(const std::string &if_name, PortID idx) } } -unsigned int -SimpleMemory::drain(DrainManager *dm) +DrainState +SimpleMemory::drain() { - int count = 0; - - // also track our internal queue if (!packetQueue.empty()) { - count += 1; - drainManager = dm; DPRINTF(Drain, "SimpleMemory Queue has requests, waiting to drain\n"); - } - - if (count) - setDrainState(DrainState::Draining); - else - setDrainState(DrainState::Drained); - return count; + return DrainState::Draining; + } else { + return DrainState::Drained; + } } SimpleMemory::MemoryPort::MemoryPort(const std::string& _name, diff --git a/src/mem/simple_mem.hh b/src/mem/simple_mem.hh index f69633690..98c41623f 100644 --- a/src/mem/simple_mem.hh +++ b/src/mem/simple_mem.hh @@ -181,17 +181,11 @@ class SimpleMemory : public AbstractMemory */ std::vector<PacketPtr> pendingDelete; - /** - * If we need to drain, keep the drain manager around until we're - * done here. - */ - DrainManager *drainManager; - public: SimpleMemory(const SimpleMemoryParams *p); - unsigned int drain(DrainManager *dm); + DrainState drain() M5_ATTR_OVERRIDE; BaseSlavePort& getSlavePort(const std::string& if_name, PortID idx = InvalidPortID); diff --git a/src/mem/xbar.cc b/src/mem/xbar.cc index bc649581b..7316fbc21 100644 --- a/src/mem/xbar.cc +++ b/src/mem/xbar.cc @@ -145,7 +145,7 @@ BaseXBar::calcPacketTiming(PacketPtr pkt, Tick header_delay) template <typename SrcType, typename DstType> BaseXBar::Layer<SrcType,DstType>::Layer(DstType& _port, BaseXBar& _xbar, const std::string& _name) : - port(_port), xbar(_xbar), _name(_name), state(IDLE), drainManager(NULL), + port(_port), xbar(_xbar), _name(_name), state(IDLE), waitingForPeer(NULL), releaseEvent(this) { } @@ -252,12 +252,10 @@ BaseXBar::Layer<SrcType,DstType>::releaseLayer() // waiting for the peer if (waitingForPeer == NULL) retryWaiting(); - } else if (waitingForPeer == NULL && drainManager) { + } else if (waitingForPeer == NULL && drainState() == DrainState::Draining) { DPRINTF(Drain, "Crossbar done draining, signaling drain manager\n"); //If we weren't able to drain before, do it now. - drainManager->signalDrainDone(); - // Clear the drain event once we're done with it. - drainManager = NULL; + signalDrainDone(); } } @@ -587,18 +585,18 @@ BaseXBar::regStats() } template <typename SrcType, typename DstType> -unsigned int -BaseXBar::Layer<SrcType,DstType>::drain(DrainManager *dm) +DrainState +BaseXBar::Layer<SrcType,DstType>::drain() { //We should check that we're not "doing" anything, and that noone is //waiting. We might be idle but have someone waiting if the device we //contacted for a retry didn't actually retry. if (state != IDLE) { DPRINTF(Drain, "Crossbar not drained\n"); - drainManager = dm; - return 1; + return DrainState::Draining; + } else { + return DrainState::Drained; } - return 0; } template <typename SrcType, typename DstType> diff --git a/src/mem/xbar.hh b/src/mem/xbar.hh index 547e138e9..79e9a5380 100644 --- a/src/mem/xbar.hh +++ b/src/mem/xbar.hh @@ -114,7 +114,7 @@ class BaseXBar : public MemObject * * @return 1 if busy or waiting to retry, or 0 if idle */ - unsigned int drain(DrainManager *dm); + DrainState drain() M5_ATTR_OVERRIDE; /** * Get the crossbar layer's name @@ -217,9 +217,6 @@ class BaseXBar : public MemObject /** track the state of the layer */ State state; - /** manager to signal when drained */ - DrainManager *drainManager; - /** * A deque of ports that retry should be called on because * the original send was delayed due to a busy layer. |