Why "It is OK to receive RequestStatus_Aliased, it can be considered Issued" in Sequencer::makeRequest(PacketPtr pkt)? #919
-
Question: Why This is the code that confuses me, I don't know how the second request with the same address will be resent or where it will be blocked. step1. the code at src/mem/ruby/system/Sequencer.cc if (seq_req_list.size() > 1) {
return RequestStatus_Aliased;
}
m_outstandReqHist.sample(m_outstanding_count);
return RequestStatus_Ready; step2. the code at src/mem/ruby/system/Sequencer.cc RequestStatus status = insertRequest(pkt, primary_type, secondary_type);
// It is OK to receive RequestStatus_Aliased, it can be considered Issued
if (status != RequestStatus_Ready && status != RequestStatus_Aliased)
return status;
// non-aliased with any existing request in the request table, just issue
// to the cache
if (status != RequestStatus_Aliased)
issueRequest(pkt, secondary_type);
return RequestStatus_Issued; step3. use status for judge if retry the code at src/mem/ruby/system/RubyPort.cc // Submit the ruby request
RequestStatus requestStatus = owner.makeRequest(pkt);
// If the request successfully issued then we should return true.
// Otherwise, we need to tell the port to retry at a later point
// and return false.
if (requestStatus == RequestStatus_Issued) {
DPRINTF(RubyPort, "Request %s 0x%x issued\n", pkt->cmdString(),
pkt->getAddr());
return true;
}
|
Beta Was this translation helpful? Give feedback.
Replies: 1 comment
-
As you mention, when a request aliases with a previous address, the request is inserted in the When the request callbacks from the cache, it completes all the pending requests. auto &seq_req_list = m_RequestTable[address];
while (!seq_req_list.empty()) {
....
seq_req_list.pop_front();
} Regarding the Therefore, there is no retry. Let me show you a summary of the example you mention:
With this scheme, Aliased can be considered as Issued because from the point of view of the CPU, it is issued, no retry is needed. Please take into account that there are more details to take into account. I hope it helps :) |
Beta Was this translation helpful? Give feedback.
As you mention, when a request aliases with a previous address, the request is inserted in the
m_RequestTable
.When the request callbacks from the cache, it completes all the pending requests.
You can check an example at
Sequencer::readCallback
Regarding the
issueRequest
, it forwards the request from the sequencer to the caches and the coherence protocol.In the case you mention, the request for that address was already sent to the cache, so there is no need of sending it again.
Therefore, there is no retry. Let me show you a summary of the example you mention: