diff --git a/src/mem/ruby/protocol/chi/CHI-cache-actions.sm b/src/mem/ruby/protocol/chi/CHI-cache-actions.sm index eb54d01053..6123a6c70d 100644 --- a/src/mem/ruby/protocol/chi/CHI-cache-actions.sm +++ b/src/mem/ruby/protocol/chi/CHI-cache-actions.sm @@ -2600,18 +2600,18 @@ action(Send_CompData, desc="") { bool is_rd_nsd := tbe.reqType == CHIRequestType:ReadNotSharedDirty; bool is_rd_unique := tbe.reqType == CHIRequestType:ReadUnique; - // if the request type allows SD - bool snd_dirty_on_rs := is_rd_shared && !is_rd_nsd; - // Send UC/UD on ReadShared or ReadNotSharedDirty if the line has no sharers // and one of the followings are met // 1) the config allows or // 2) local cache won't have the line or - // 3) dirty will be passed + // 3) Dirty will be passed but the request doesn't allow SD bool snd_unique_on_rs := (fwd_unique_on_readshared || tbe.dataToBeInvalid || - snd_dirty_on_rs) + (tbe.dataDirty && is_rd_nsd)) && tbe.dataUnique && tbe.dir_sharers.isEmpty(); + // if the request type allows and we won't be caching the data + bool snd_dirty_on_rs := (is_rd_shared && !is_rd_nsd) && + !tbe.dir_ownerExists; if (is_rd_once) { tbe.snd_msgType := CHIDataType:CompData_I; diff --git a/src/mem/ruby/protocol/chi/CHI-cache-transitions.sm b/src/mem/ruby/protocol/chi/CHI-cache-transitions.sm index 31b5b0914a..9aaee236ac 100644 --- a/src/mem/ruby/protocol/chi/CHI-cache-transitions.sm +++ b/src/mem/ruby/protocol/chi/CHI-cache-transitions.sm @@ -767,7 +767,7 @@ transition({UD_RSC,SD_RSC}, Local_Eviction, BUSY_BLKD) {ReplTBEAvailable} { ProcessNextState; } -transition({UD_RSC,SD_RSC,UC_RSC,UD_RU,UC_RU,UD_RSD}, Global_Eviction, BUSY_BLKD) {ReplTBEAvailable} { +transition({UD_RSC,SD_RSC,UC_RSC,UD_RU,UC_RU,UD_RSD,SD_RSD}, Global_Eviction, BUSY_BLKD) {ReplTBEAvailable} { Initiate_Replacement; Initiate_Replacement_WB_BackInvalidate; Profile_Eviction;