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:
Nikos Nikoleris
2016-06-01 12:23:54 +01:00
parent 8d439221e7
commit 85ef9b0f74

View File

@@ -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);
}