gem5 v24.0.0.0
|
A packet queue is a class that holds deferred packets and later sends them using the associated CPU-side port or memory-side port. More...
#include <packet_queue.hh>
Classes | |
class | DeferredPacket |
A deferred packet, buffered to transmit later. More... | |
Public Member Functions | |
virtual const std::string | name () const =0 |
Provide a name to simplify debugging. | |
size_t | size () const |
Get the size of the queue. | |
Tick | deferredPacketReadyTime () const |
Get the next packet ready time. | |
bool | checkConflict (const PacketPtr pkt, const int blk_size) const |
Check if a packet corresponding to the same address exists in the queue. | |
bool | trySatisfyFunctional (PacketPtr pkt) |
Check the list of buffered packets against the supplied functional request. | |
void | schedSendEvent (Tick when) |
Schedule a send event if we are not already waiting for a retry. | |
void | schedSendTiming (PacketPtr pkt, Tick when) |
Add a packet to the transmit list, and schedule a send event. | |
void | retry () |
Retry sending a packet from the queue. | |
void | disableSanityCheck () |
This allows a user to explicitly disable the sanity check on the size of the transmitList, which is enabled by default. | |
DrainState | drain () override |
Draining is the process of clearing out the states of SimObjects.These are the SimObjects that are partially executed or are partially in flight. | |
Public Member Functions inherited from gem5::Drainable | |
DrainState | drainState () const |
Return the current drain state of an object. | |
virtual void | notifyFork () |
Notify a child process of a fork. | |
Protected Member Functions | |
bool | deferredPacketReady () const |
Check whether we have a packet ready to go on the transmit list. | |
virtual void | sendDeferredPacket () |
Attempt to send a packet. | |
virtual bool | sendTiming (PacketPtr pkt)=0 |
Send a packet using the appropriate method for the specific subclass (request, response or snoop response). | |
PacketQueue (EventManager &_em, const std::string &_label, const std::string &_sendEventName, bool force_order=false, bool disable_sanity_check=false) | |
Create a packet queue, linked to an event manager, and a label that will be used for functional print request packets. | |
virtual | ~PacketQueue () |
Virtual desctructor since the class may be used as a base class. | |
Protected Member Functions inherited from gem5::Drainable | |
Drainable () | |
virtual | ~Drainable () |
virtual void | drainResume () |
Resume execution after a successful drain. | |
void | signalDrainDone () const |
Signal that an object is drained. | |
Protected Attributes | |
const std::string | label |
Label to use for print request packets label stack. | |
bool | waitingOnRetry |
Remember whether we're awaiting a retry. | |
Private Types | |
typedef std::list< DeferredPacket > | DeferredPacketList |
Private Member Functions | |
void | processSendEvent () |
Used to schedule sending of deferred packets. | |
Private Attributes | |
DeferredPacketList | transmitList |
A list of outgoing packets. | |
EventManager & | em |
The manager which is used for the event queue. | |
EventFunctionWrapper | sendEvent |
Event used to call processSendEvent. | |
bool | _disableSanityCheck |
bool | forceOrder |
if true, inserted packets have to be unconditionally scheduled after the last packet in the queue that references the same address | |
A packet queue is a class that holds deferred packets and later sends them using the associated CPU-side port or memory-side port.
Definition at line 65 of file packet_queue.hh.
|
private |
Definition at line 79 of file packet_queue.hh.
|
protected |
Create a packet queue, linked to an event manager, and a label that will be used for functional print request packets.
_em | Event manager used for scheduling this queue |
_label | Label to push on the label stack for print request packets |
force_order | Force insertion order for packets with same address |
disable_sanity_check | Flag used to disable the sanity check on the size of the transmitList. The check is enabled by default. |
Definition at line 50 of file packet_queue.cc.
References processSendEvent().
|
protectedvirtual |
Virtual desctructor since the class may be used as a base class.
Definition at line 61 of file packet_queue.cc.
bool gem5::PacketQueue::checkConflict | ( | const PacketPtr | pkt, |
const int | blk_size ) const |
Check if a packet corresponding to the same address exists in the queue.
pkt | The packet to compare against. |
blk_size | Block size in bytes. |
Definition at line 75 of file packet_queue.cc.
References gem5::MipsISA::p, and transmitList.
Referenced by gem5::BaseCache::CacheReqPacketQueue::checkConflictingSnoop().
|
inlineprotected |
Check whether we have a packet ready to go on the transmit list.
Definition at line 116 of file packet_queue.hh.
References gem5::curTick(), and transmitList.
Referenced by sendDeferredPacket().
|
inline |
Get the next packet ready time.
Definition at line 172 of file packet_queue.hh.
References gem5::MaxTick, and transmitList.
Referenced by gem5::BaseCache::CacheReqPacketQueue::checkConflictingSnoop(), and sendDeferredPacket().
|
inline |
This allows a user to explicitly disable the sanity check on the size of the transmitList, which is enabled by default.
Users must use this function to explicitly disable the sanity check.
Definition at line 221 of file packet_queue.hh.
References _disableSanityCheck.
|
overridevirtual |
Draining is the process of clearing out the states of SimObjects.These are the SimObjects that are partially executed or are partially in flight.
Draining is mostly used before forking and creating a check point.
This function notifies an object that it needs to drain its state.
If the object does not need further simulation to drain internal buffers, it returns DrainState::Drained and automatically switches to the Drained state. If the object needs more simulation, it returns DrainState::Draining and automatically enters the Draining state. Other return values are invalid.
Implements gem5::Drainable.
Definition at line 228 of file packet_queue.cc.
References DPRINTF, gem5::Drained, gem5::Draining, and transmitList.
|
pure virtual |
Provide a name to simplify debugging.
Implemented in gem5::ReqPacketQueue, gem5::RespPacketQueue, and gem5::SnoopRespPacketQueue.
Referenced by retry(), and schedSendTiming().
|
private |
Used to schedule sending of deferred packets.
Definition at line 221 of file packet_queue.cc.
References sendDeferredPacket(), and waitingOnRetry.
Referenced by PacketQueue().
void gem5::PacketQueue::retry | ( | ) |
Retry sending a packet from the queue.
Note that this is not necessarily the same packet if something has been added with an earlier time stamp.
Definition at line 66 of file packet_queue.cc.
References DPRINTF, name(), sendDeferredPacket(), and waitingOnRetry.
Referenced by gem5::QueuedRequestPort::recvReqRetry(), gem5::QueuedResponsePort::recvRespRetry(), and gem5::QueuedRequestPort::recvRetrySnoopResp().
void gem5::PacketQueue::schedSendEvent | ( | Tick | when | ) |
Schedule a send event if we are not already waiting for a retry.
If the requested time is before an already scheduled send event, the event will be rescheduled. If MaxTick is passed, no event is scheduled. Instead, if we are idle and asked to drain then check and signal drained.
when | time to schedule an event |
Definition at line 155 of file packet_queue.cc.
References gem5::curTick(), DPRINTF, gem5::Draining, gem5::Drainable::drainState(), em, gem5::MaxTick, gem5::EventManager::reschedule(), gem5::EventManager::schedule(), gem5::Event::scheduled(), sendEvent, gem5::Drainable::signalDrainDone(), transmitList, waitingOnRetry, and gem5::Event::when().
Referenced by gem5::BaseCache::CacheReqPacketQueue::checkConflictingSnoop(), gem5::BaseCache::CacheRequestPort::schedSendEvent(), schedSendTiming(), and sendDeferredPacket().
Add a packet to the transmit list, and schedule a send event.
pkt | Packet to send |
when | Absolute time (in ticks) to send packet |
Definition at line 107 of file packet_queue.cc.
References _disableSanityCheck, gem5::Packet::cmdString(), gem5::curTick(), DPRINTF, forceOrder, gem5::Packet::getAddr(), gem5::Packet::getSize(), gem5::Packet::isExpressSnoop(), name(), panic, schedSendEvent(), and transmitList.
Referenced by gem5::QueuedRequestPort::schedTimingReq(), gem5::QueuedResponsePort::schedTimingResp(), and gem5::QueuedRequestPort::schedTimingSnoopResp().
|
protectedvirtual |
Attempt to send a packet.
Note that a subclass of the PacketQueue can override this method and thus change the behaviour (as done by the cache for the request queue). The default implementation sends the head of the transmit list. The caller must guarantee that the list is non-empty and that the head packet is scheduled for curTick() (or earlier).
Reimplemented in gem5::BaseCache::CacheReqPacketQueue.
Definition at line 191 of file packet_queue.cc.
References deferredPacketReady(), deferredPacketReadyTime(), gem5::ArmISA::dp, schedSendEvent(), sendTiming(), transmitList, and waitingOnRetry.
Referenced by processSendEvent(), and retry().
|
protectedpure virtual |
Send a packet using the appropriate method for the specific subclass (request, response or snoop response).
Implemented in gem5::ReqPacketQueue, gem5::RespPacketQueue, and gem5::SnoopRespPacketQueue.
Referenced by sendDeferredPacket().
|
inline |
bool gem5::PacketQueue::trySatisfyFunctional | ( | PacketPtr | pkt | ) |
Check the list of buffered packets against the supplied functional request.
Definition at line 87 of file packet_queue.cc.
References gem5::ArmISA::i, label, gem5::Packet::popLabel(), gem5::Packet::pushLabel(), transmitList, and gem5::Packet::trySatisfyFunctional().
Referenced by gem5::SimpleTimingPort::recvFunctional(), gem5::SMMUDevicePort::recvFunctional(), gem5::QueuedRequestPort::trySatisfyFunctional(), and gem5::QueuedResponsePort::trySatisfyFunctional().
|
private |
Definition at line 98 of file packet_queue.hh.
Referenced by disableSanityCheck(), and schedSendTiming().
|
private |
The manager which is used for the event queue.
Definition at line 85 of file packet_queue.hh.
Referenced by schedSendEvent().
|
private |
if true, inserted packets have to be unconditionally scheduled after the last packet in the queue that references the same address
Definition at line 105 of file packet_queue.hh.
Referenced by schedSendTiming().
|
protected |
Label to use for print request packets label stack.
Definition at line 110 of file packet_queue.hh.
Referenced by gem5::ReqPacketQueue::name(), gem5::ReqPacketQueue::name(), gem5::RespPacketQueue::name(), gem5::RespPacketQueue::name(), gem5::SnoopRespPacketQueue::name(), gem5::SnoopRespPacketQueue::name(), and trySatisfyFunctional().
|
private |
Event used to call processSendEvent.
Definition at line 91 of file packet_queue.hh.
Referenced by schedSendEvent().
|
private |
A list of outgoing packets.
Definition at line 82 of file packet_queue.hh.
Referenced by checkConflict(), deferredPacketReady(), deferredPacketReadyTime(), drain(), schedSendEvent(), schedSendTiming(), sendDeferredPacket(), size(), and trySatisfyFunctional().
|
protected |
Remember whether we're awaiting a retry.
Definition at line 113 of file packet_queue.hh.
Referenced by processSendEvent(), retry(), schedSendEvent(), and sendDeferredPacket().