From: Nikos Nikoleris Date: Wed, 1 Jun 2016 11:23:54 +0000 (+0100) Subject: mem: Align the snoop behavior in the XBar for atomic and timing X-Git-Tag: v19.0.0.0~2578 X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=85ef9b0f74abce291234373954e1319d56403d39;p=gem5.git 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 Reviewed-by: Anouk Van Laer Reviewed-on: https://gem5-review.googlesource.com/5043 Reviewed-by: Jason Lowe-Power Maintainer: Nikos Nikoleris --- diff --git a/src/mem/coherent_xbar.cc b/src/mem/coherent_xbar.cc index 7c3a4e314..ef0620822 100644 --- a/src/mem/coherent_xbar.cc +++ b/src/mem/coherent_xbar.cc @@ -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); }