CHI specification (ver.B to ver.F) provides support for RequestRetry in order to ensure that when a request (from RN/HN) reaches a completer (HN/SN), it is either accepted or given a RetryAck response to prevent blocking of the REQ channel.
To my understanding, blocking of the REQ channel, only by RN->HN requests, may result in a deadlock since it may prevent the associated HN->SN requests from making forward progress. However, blocking HN->SN requests should not result in a deadlock since the requests for SN will (eventually) be serviced without relying on additional messages on the REQ channel. This is because SN behaves as a sink unlike RN which can generate additional request(s). The need to support RequestRetry at SN (for HN->SN requests) therefore seems to arise from performance concerns, since HN->SN requests that block the REQ channel may potentially cause queuing up of RN->HN requests that could have been serviced fully by the HN (without the need to go to SN), thereby impacting performance.
Is it correct to assume that support for retries at HN (for RN->HN requests) is required for correct and deadlock-free operation, while support for retries at SN (for HN->SN requests) is needed for addressing potential performance concerns?
Thanks in advance.