mem-ruby: Pass UD on ReadShared hit only if SD is not allowed
This commit allows CompData_SD be sent when ReadShared hits on UD line and the local cache keeps the line, unless the request doesn't allow SD. Change-Id: I337f24c871cc4c19c5b5fb11f9b35c0a8eb7911c
This commit is contained in:
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user