diff --git a/src/mem/coherent_xbar.cc b/src/mem/coherent_xbar.cc index f33a33b0f..c0d8ab037 100644 --- a/src/mem/coherent_xbar.cc +++ b/src/mem/coherent_xbar.cc @@ -317,8 +317,10 @@ CoherentXBar::recvTimingReq(PacketPtr pkt, PortID slave_port_id) pktSize[slave_port_id][master_port_id] += pkt_size; transDist[pkt_cmd]++; - if (is_express_snoop) + if (is_express_snoop) { snoops++; + snoopTraffic += pkt_size; + } } if (sink_packet) @@ -415,8 +417,10 @@ CoherentXBar::recvTimingSnoopReq(PacketPtr pkt, PortID master_port_id) pkt->getAddr()); // update stats here as we know the forwarding will succeed + unsigned int pkt_size = pkt->hasData() ? pkt->getSize() : 0; transDist[pkt->cmdToIndex()]++; snoops++; + snoopTraffic += pkt_size; // we should only see express snoops from caches assert(pkt->isExpressSnoop()); @@ -588,6 +592,7 @@ CoherentXBar::recvTimingSnoopResp(PacketPtr pkt, PortID slave_port_id) // stats updates transDist[pkt_cmd]++; snoops++; + snoopTraffic += pkt_size; return true; } @@ -739,7 +744,9 @@ CoherentXBar::recvAtomicSnoop(PacketPtr pkt, PortID master_port_id) pkt->cmdString()); // add the request snoop data + unsigned int pkt_size = pkt->hasData() ? pkt->getSize() : 0; snoops++; + snoopTraffic += pkt_size; // forward to all snoopers std::pair snoop_result; @@ -965,6 +972,11 @@ CoherentXBar::regStats() .desc("Total snoops (count)") ; + snoopTraffic + .name(name() + ".snoopTraffic") + .desc("Total snoop traffic (bytes)") + ; + snoopFanout .init(0, snoopPorts.size(), 1) .name(name() + ".snoop_fanout") diff --git a/src/mem/coherent_xbar.hh b/src/mem/coherent_xbar.hh index 8c55b59da..0f641664d 100644 --- a/src/mem/coherent_xbar.hh +++ b/src/mem/coherent_xbar.hh @@ -394,6 +394,7 @@ class CoherentXBar : public BaseXBar bool sinkPacket(const PacketPtr pkt) const; Stats::Scalar snoops; + Stats::Scalar snoopTraffic; Stats::Distribution snoopFanout; public: