mem: Align the snoop behavior in the XBar for atomic and timing
When the XBar receives a Writeback/WriteClean packet, it doesn't need to snoop the upstream caches. It only queries the snoop filter and sets the blockCached flag accordingly. This is in line with the recvTimingReq. Change-Id: I0ae22f21491d75a111019124bb95bac7b16d3cd3 Reviewed-by: Andreas Sandberg <andreas.sandberg@arm.com> Reviewed-by: Anouk Van Laer <anouk.vanlaer@arm.com> Reviewed-on: https://gem5-review.googlesource.com/5043 Reviewed-by: Jason Lowe-Power <jason@lowepower.com> Maintainer: Nikos Nikoleris <nikos.nikoleris@arm.com>
This commit is contained in:
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2011-2016 ARM Limited
|
||||
* Copyright (c) 2011-2017 ARM Limited
|
||||
* All rights reserved
|
||||
*
|
||||
* The license below extends only to copyright in the software and shall
|
||||
@@ -661,8 +661,18 @@ CoherentXBar::recvAtomic(PacketPtr pkt, PortID slave_port_id)
|
||||
// between and change the filter state
|
||||
snoopFilter->finishRequest(false, pkt->getAddr(), pkt->isSecure());
|
||||
|
||||
snoop_result = forwardAtomic(pkt, slave_port_id, InvalidPortID,
|
||||
sf_res.first);
|
||||
if (pkt->isEviction()) {
|
||||
// for block-evicting packets, i.e. writebacks and
|
||||
// clean evictions, there is no need to snoop up, as
|
||||
// all we do is determine if the block is cached or
|
||||
// not, instead just set it here based on the snoop
|
||||
// filter result
|
||||
if (!sf_res.first.empty())
|
||||
pkt->setBlockCached();
|
||||
} else {
|
||||
snoop_result = forwardAtomic(pkt, slave_port_id, InvalidPortID,
|
||||
sf_res.first);
|
||||
}
|
||||
} else {
|
||||
snoop_result = forwardAtomic(pkt, slave_port_id);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user