snoop_filter.cc (11135:9d09dab39689) | snoop_filter.cc (11199:929fd978ab4e) |
---|---|
1/* 2 * Copyright (c) 2013-2015 ARM Limited 3 * All rights reserved 4 * 5 * The license below extends only to copyright in the software and shall 6 * not be construed as granting a license to any other intellectual 7 * property including but not limited to intellectual property relating 8 * to a hardware implementation of the functionality of the software --- 114 unchanged lines hidden (view full) --- 123 // filter -> we do not need to keep the in-flight request, but make 124 // sure that we know that that cluster has a copy 125 panic_if(!(sf_item.holder & req_port), "Need to hold the value!"); 126 DPRINTF(SnoopFilter, 127 "%s: not marking request. SF value %x.%x\n", 128 __func__, sf_item.requested, sf_item.holder); 129 } 130 } else { // if (!cpkt->needsResponse()) | 1/* 2 * Copyright (c) 2013-2015 ARM Limited 3 * All rights reserved 4 * 5 * The license below extends only to copyright in the software and shall 6 * not be construed as granting a license to any other intellectual 7 * property including but not limited to intellectual property relating 8 * to a hardware implementation of the functionality of the software --- 114 unchanged lines hidden (view full) --- 123 // filter -> we do not need to keep the in-flight request, but make 124 // sure that we know that that cluster has a copy 125 panic_if(!(sf_item.holder & req_port), "Need to hold the value!"); 126 DPRINTF(SnoopFilter, 127 "%s: not marking request. SF value %x.%x\n", 128 __func__, sf_item.requested, sf_item.holder); 129 } 130 } else { // if (!cpkt->needsResponse()) |
131 assert(cpkt->evictingBlock()); | 131 assert(cpkt->isEviction()); |
132 // make sure that the sender actually had the line 133 panic_if(!(sf_item.holder & req_port), "requester %x is not a " \ 134 "holder :( SF value %x.%x\n", req_port, 135 sf_item.requested, sf_item.holder); 136 // CleanEvicts and Writebacks -> the sender and all caches above 137 // it may not have the line anymore. 138 if (!cpkt->isBlockCached()) { 139 sf_item.holder &= ~req_port; --- 62 unchanged lines hidden (view full) --- 202 else 203 hitMultiSnoops++; 204 205 // ReadEx and Writes require both invalidation and exlusivity, while reads 206 // require neither. Writebacks on the other hand require exclusivity but 207 // not the invalidation. Previously Writebacks did not generate upward 208 // snoops so this was never an aissue. Now that Writebacks generate snoops 209 // we need to special case for Writebacks. | 132 // make sure that the sender actually had the line 133 panic_if(!(sf_item.holder & req_port), "requester %x is not a " \ 134 "holder :( SF value %x.%x\n", req_port, 135 sf_item.requested, sf_item.holder); 136 // CleanEvicts and Writebacks -> the sender and all caches above 137 // it may not have the line anymore. 138 if (!cpkt->isBlockCached()) { 139 sf_item.holder &= ~req_port; --- 62 unchanged lines hidden (view full) --- 202 else 203 hitMultiSnoops++; 204 205 // ReadEx and Writes require both invalidation and exlusivity, while reads 206 // require neither. Writebacks on the other hand require exclusivity but 207 // not the invalidation. Previously Writebacks did not generate upward 208 // snoops so this was never an aissue. Now that Writebacks generate snoops 209 // we need to special case for Writebacks. |
210 assert(cpkt->cmd == MemCmd::Writeback || cpkt->req->isUncacheable() || | 210 assert(cpkt->isWriteback() || cpkt->req->isUncacheable() || |
211 (cpkt->isInvalidate() == cpkt->needsExclusive())); 212 if (cpkt->isInvalidate() && !sf_item.requested) { 213 // Early clear of the holder, if no other request is currently going on 214 // @todo: This should possibly be updated even though we do not filter 215 // upward snoops 216 sf_item.holder = 0; 217 } 218 --- 46 unchanged lines hidden (view full) --- 265 sf_item.requested, sf_item.holder); 266 267 sf_item.holder &= ~rsp_mask; 268 // The snoop filter does not see any ACKs from non-responding sharers 269 // that have been invalidated :( So below assert would be nice, but.. 270 //assert(sf_item.holder == 0); 271 sf_item.holder = 0; 272 } | 211 (cpkt->isInvalidate() == cpkt->needsExclusive())); 212 if (cpkt->isInvalidate() && !sf_item.requested) { 213 // Early clear of the holder, if no other request is currently going on 214 // @todo: This should possibly be updated even though we do not filter 215 // upward snoops 216 sf_item.holder = 0; 217 } 218 --- 46 unchanged lines hidden (view full) --- 265 sf_item.requested, sf_item.holder); 266 267 sf_item.holder &= ~rsp_mask; 268 // The snoop filter does not see any ACKs from non-responding sharers 269 // that have been invalidated :( So below assert would be nice, but.. 270 //assert(sf_item.holder == 0); 271 sf_item.holder = 0; 272 } |
273 assert(cpkt->cmd != MemCmd::Writeback); | 273 assert(!cpkt->isWriteback()); |
274 sf_item.holder |= req_mask; 275 sf_item.requested &= ~req_mask; 276 assert(sf_item.requested | sf_item.holder); 277 DPRINTF(SnoopFilter, "%s: new SF value %x.%x\n", 278 __func__, sf_item.requested, sf_item.holder); 279} 280 281void --- 112 unchanged lines hidden --- | 274 sf_item.holder |= req_mask; 275 sf_item.requested &= ~req_mask; 276 assert(sf_item.requested | sf_item.holder); 277 DPRINTF(SnoopFilter, "%s: new SF value %x.%x\n", 278 __func__, sf_item.requested, sf_item.holder); 279} 280 281void --- 112 unchanged lines hidden --- |