diff options
author | Andreas Hansson <andreas.hansson@arm.com> | 2015-09-25 13:25:34 -0400 |
---|---|---|
committer | Andreas Hansson <andreas.hansson@arm.com> | 2015-09-25 13:25:34 -0400 |
commit | 9a0129dcbf3cc223c88b8c0bc46ac9b375c11abf (patch) | |
tree | 184f8bcb5f9ef6a1bc530608c00f7469a556e65f /src/mem/probes/stack_dist.cc | |
parent | 806e1fbf0f63d386d4ae80ff0d4ab77e6c37f9d6 (diff) | |
download | gem5-9a0129dcbf3cc223c88b8c0bc46ac9b375c11abf.tar.xz |
mem: Add PacketInfo to be used for packet probe points
This patch fixes a use-after-delete issue in the packet probe points
by adding a PacketInfo struct to retain the key fields before passing
the packet onwards. We want to probe the packet after it is
successfully sent, but by that time the fields may be modified, and
the packet may even be deleted.
Amazingly enough the issue has gone undetected for months, and only
recently popped up in our regressions.
Diffstat (limited to 'src/mem/probes/stack_dist.cc')
-rw-r--r-- | src/mem/probes/stack_dist.cc | 10 |
1 files changed, 5 insertions, 5 deletions
diff --git a/src/mem/probes/stack_dist.cc b/src/mem/probes/stack_dist.cc index c742cae7b..a447f49e5 100644 --- a/src/mem/probes/stack_dist.cc +++ b/src/mem/probes/stack_dist.cc @@ -94,15 +94,15 @@ StackDistProbe::regStats() } void -StackDistProbe::handleRequest(const PacketPtr &pkt) +StackDistProbe::handleRequest(const ProbePoints::PacketInfo &pkt_info) { // only capturing read and write requests (which allocate in the // cache) - if (!pkt->isRead() && !pkt->isWrite()) + if (!pkt_info.cmd.isRead() && !pkt_info.cmd.isWrite()) return; // Align the address to a cache line size - const Addr aligned_addr(roundDown(pkt->getAddr(), lineSize)); + const Addr aligned_addr(roundDown(pkt_info.addr, lineSize)); // Calculate the stack distance const uint64_t sd(calc.calcStackDistAndUpdate(aligned_addr).first); @@ -113,7 +113,7 @@ StackDistProbe::handleRequest(const PacketPtr &pkt) // Sample the stack distance of the address in linear bins if (!disableLinearHists) { - if (pkt->isRead()) + if (pkt_info.cmd.isRead()) readLinearHist.sample(sd); else writeLinearHist.sample(sd); @@ -123,7 +123,7 @@ StackDistProbe::handleRequest(const PacketPtr &pkt) int sd_lg2 = sd == 0 ? 1 : floorLog2(sd); // Sample the stack distance of the address in log bins - if (pkt->isRead()) + if (pkt_info.cmd.isRead()) readLogHist.sample(sd_lg2); else writeLogHist.sample(sd_lg2); |