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 ---