Hoa Nguyen has submitted this change. (
https://gem5-review.googlesource.com/c/public/gem5/+/36415 )
Change subject: dev-arm,stats: Update stats style of src/dev/arm
......................................................................
dev-arm,stats: Update stats style of src/dev/arm
Change-Id: I722e88801bb8ca0f0d75b5a1bf271fa4d4eded17
Signed-off-by: Hoa Nguyen <hoangu...@ucdavis.edu>
Reviewed-on: https://gem5-review.googlesource.com/c/public/gem5/+/36415
Reviewed-by: Giacomo Travaglini <giacomo.travagl...@arm.com>
Maintainer: Giacomo Travaglini <giacomo.travagl...@arm.com>
Tested-by: kokoro <noreply+kok...@google.com>
---
M src/dev/arm/flash_device.cc
M src/dev/arm/flash_device.hh
M src/dev/arm/hdlcd.cc
M src/dev/arm/hdlcd.hh
M src/dev/arm/smmu_v3.cc
M src/dev/arm/smmu_v3.hh
M src/dev/arm/smmu_v3_caches.cc
M src/dev/arm/smmu_v3_caches.hh
M src/dev/arm/smmu_v3_deviceifc.cc
M src/dev/arm/smmu_v3_transl.cc
M src/dev/arm/ufs_device.cc
M src/dev/arm/ufs_device.hh
12 files changed, 225 insertions(+), 266 deletions(-)
Approvals:
Giacomo Travaglini: Looks good to me, approved; Looks good to me, approved
kokoro: Regressions pass
diff --git a/src/dev/arm/flash_device.cc b/src/dev/arm/flash_device.cc
index c880123..533b3ed 100644
--- a/src/dev/arm/flash_device.cc
+++ b/src/dev/arm/flash_device.cc
@@ -70,6 +70,7 @@
eraseLatency(p.erase_lat),
dataDistribution(p.data_distribution),
numPlanes(p.num_planes),
+ stats(this),
pagesPerBlock(0),
pagesPerDisk(0),
blocksPerDisk(0),
@@ -454,49 +455,39 @@
return unknownPages[index >> 5] & (0x01 << (index % 32));
}
-void
-FlashDevice::regStats()
+FlashDevice::
+FlashDeviceStats::FlashDeviceStats(Stats::Group *parent)
+ : Stats::Group(parent, "FlashDevice"),
+ ADD_STAT(totalGCActivations, "Number of Garbage collector
activations"),
+ ADD_STAT(writeAccess, "Histogram of write addresses"),
+ ADD_STAT(readAccess, "Histogram of read addresses"),
+ ADD_STAT(fileSystemAccess, "Histogram of file system accesses"),
+ ADD_STAT(writeLatency, "Histogram of write latency"),
+ ADD_STAT(readLatency, "Histogram of read latency")
{
- AbstractNVM::regStats();
-
using namespace Stats;
- std::string fd_name = name() + ".FlashDevice";
-
- // Register the stats
/** Amount of GC activations*/
- stats.totalGCActivations
- .name(fd_name + ".totalGCActivations")
- .desc("Number of Garbage collector activations")
+ totalGCActivations
.flags(none);
/** Histogram of address accesses*/
- stats.writeAccess
+ writeAccess
.init(2)
- .name(fd_name + ".writeAccessHist")
- .desc("Histogram of write addresses")
.flags(pdf);
- stats.readAccess
+ readAccess
.init(2)
- .name(fd_name + ".readAccessHist")
- .desc("Histogram of read addresses")
.flags(pdf);
- stats.fileSystemAccess
+ fileSystemAccess
.init(100)
- .name(fd_name + ".fileSystemAccessHist")
- .desc("Histogram of file system accesses")
.flags(pdf);
/** Histogram of access latencies*/
- stats.writeLatency
+ writeLatency
.init(100)
- .name(fd_name + ".writeLatencyHist")
- .desc("Histogram of write latency")
.flags(pdf);
- stats.readLatency
+ readLatency
.init(100)
- .name(fd_name + ".readLatencyHist")
- .desc("Histogram of read latency")
.flags(pdf);
}
diff --git a/src/dev/arm/flash_device.hh b/src/dev/arm/flash_device.hh
index b21acd0..d5097a8 100644
--- a/src/dev/arm/flash_device.hh
+++ b/src/dev/arm/flash_device.hh
@@ -90,7 +90,10 @@
std::function<void()> function;
};
- struct FlashDeviceStats {
+ struct FlashDeviceStats : public Stats::Group
+ {
+ FlashDeviceStats(Stats::Group *parent);
+
/** Amount of GC activations*/
Stats::Scalar totalGCActivations;
@@ -147,9 +150,6 @@
/** Function to test if a page is known*/
bool getUnknownPages(uint32_t index);
- /**Stats register function*/
- void regStats() override;
-
/** Disk sizes in bytes */
uint64_t diskSize;
const uint32_t blockSize;
diff --git a/src/dev/arm/hdlcd.cc b/src/dev/arm/hdlcd.cc
index 472e9aa..a5df836 100644
--- a/src/dev/arm/hdlcd.cc
+++ b/src/dev/arm/hdlcd.cc
@@ -84,7 +84,8 @@
virtRefreshEvent([this]{ virtRefresh(); }, name()),
// Other
imgFormat(p.frame_format), pic(NULL),
conv(PixelConverter::rgba8888_le),
- pixelPump(*this, *p.pxl_clk, p.pixel_chunk)
+ pixelPump(*this, *p.pxl_clk, p.pixel_chunk),
+ stats(this)
{
if (vnc)
vnc->setFrameBuffer(&pixelPump.fb);
@@ -96,18 +97,14 @@
{
}
-void
-HDLcd::regStats()
+HDLcd::
+HDLcdStats::HDLcdStats(Stats::Group *parent)
+ : Stats::Group(parent, "HDLcd"),
+ ADD_STAT(underruns, "Number of buffer underruns")
{
- AmbaDmaDevice::regStats();
-
using namespace Stats;
- stats.underruns
- .name(name() + ".underruns")
- .desc("number of buffer underruns")
- .flags(nozero)
- ;
+ underruns.flags(nozero);
}
void
diff --git a/src/dev/arm/hdlcd.hh b/src/dev/arm/hdlcd.hh
index c41100e..cdf3331 100644
--- a/src/dev/arm/hdlcd.hh
+++ b/src/dev/arm/hdlcd.hh
@@ -93,8 +93,6 @@
HDLcd(const HDLcdParams &p);
~HDLcd();
- void regStats() override;
-
void serialize(CheckpointOut &cp) const override;
void unserialize(CheckpointIn &cp) override;
@@ -391,7 +389,9 @@
std::unique_ptr<DmaEngine> dmaEngine;
protected: // Statistics
- struct {
+ struct HDLcdStats: public Stats::Group
+ {
+ HDLcdStats(Stats::Group *parent);
Stats::Scalar underruns;
} stats;
};
diff --git a/src/dev/arm/smmu_v3.cc b/src/dev/arm/smmu_v3.cc
index 426891a..543a11a 100644
--- a/src/dev/arm/smmu_v3.cc
+++ b/src/dev/arm/smmu_v3.cc
@@ -58,14 +58,14 @@
requestPort(name() + ".request", *this),
tableWalkPort(name() + ".walker", *this),
controlPort(name() + ".control", *this, params.reg_map),
- tlb(params.tlb_entries, params.tlb_assoc, params.tlb_policy),
- configCache(params.cfg_entries, params.cfg_assoc, params.cfg_policy),
- ipaCache(params.ipa_entries, params.ipa_assoc, params.ipa_policy),
+ tlb(params.tlb_entries, params.tlb_assoc, params.tlb_policy, this),
+ configCache(params.cfg_entries, params.cfg_assoc, params.cfg_policy,
this),
+ ipaCache(params.ipa_entries, params.ipa_assoc, params.ipa_policy,
this),
walkCache({ { params.walk_S1L0, params.walk_S1L1,
params.walk_S1L2, params.walk_S1L3,
params.walk_S2L0, params.walk_S2L1,
params.walk_S2L2, params.walk_S2L3 } },
- params.walk_assoc, params.walk_policy),
+ params.walk_assoc, params.walk_policy, this),
tlbEnable(params.tlb_enable),
configCacheEnable(params.cfg_enable),
ipaCacheEnable(params.ipa_enable),
@@ -91,6 +91,7 @@
configLat(params.cfg_lat),
ipaLat(params.ipa_lat),
walkLat(params.walk_lat),
+ stats(this),
deviceInterfaces(params.device_interfaces),
commandExecutor(name() + ".cmd_exec", *this),
regsMap(params.reg_map),
@@ -735,55 +736,35 @@
controlPort.sendRangeChange();
}
-void
-SMMUv3::regStats()
+SMMUv3::SMMUv3Stats::SMMUv3Stats(Stats::Group *parent)
+ : Stats::Group(parent),
+ ADD_STAT(steL1Fetches, "STE L1 fetches"),
+ ADD_STAT(steFetches, "STE fetches"),
+ ADD_STAT(cdL1Fetches, "CD L1 fetches"),
+ ADD_STAT(cdFetches, "CD fetches"),
+ ADD_STAT(translationTimeDist, "Time to translate address"),
+ ADD_STAT(ptwTimeDist, "Time to walk page tables")
{
- ClockedObject::regStats();
-
using namespace Stats;
- for (size_t i = 0; i < deviceInterfaces.size(); i++) {
- deviceInterfaces[i]->microTLB->regStats(
- csprintf("%s.utlb%d", name(), i));
- deviceInterfaces[i]->mainTLB->regStats(
- csprintf("%s.maintlb%d", name(), i));
- }
-
- tlb.regStats(name() + ".tlb");
- configCache.regStats(name() + ".cfg");
- ipaCache.regStats(name() + ".ipa");
- walkCache.regStats(name() + ".walk");
-
steL1Fetches
- .name(name() + ".steL1Fetches")
- .desc("STE L1 fetches")
.flags(pdf);
steFetches
- .name(name() + ".steFetches")
- .desc("STE fetches")
.flags(pdf);
cdL1Fetches
- .name(name() + ".cdL1Fetches")
- .desc("CD L1 fetches")
.flags(pdf);
cdFetches
- .name(name() + ".cdFetches")
- .desc("CD fetches")
.flags(pdf);
translationTimeDist
.init(0, 2000000, 2000)
- .name(name() + ".translationTimeDist")
- .desc("Time to translate address")
.flags(pdf);
ptwTimeDist
.init(0, 2000000, 2000)
- .name(name() + ".ptwTimeDist")
- .desc("Time to walk page tables")
.flags(pdf);
}
diff --git a/src/dev/arm/smmu_v3.hh b/src/dev/arm/smmu_v3.hh
index 7601e15..2d9c1c5 100644
--- a/src/dev/arm/smmu_v3.hh
+++ b/src/dev/arm/smmu_v3.hh
@@ -131,12 +131,16 @@
const Cycles walkLat;
// Stats
- Stats::Scalar steL1Fetches;
- Stats::Scalar steFetches;
- Stats::Scalar cdL1Fetches;
- Stats::Scalar cdFetches;
- Stats::Distribution translationTimeDist;
- Stats::Distribution ptwTimeDist;
+ struct SMMUv3Stats : public Stats::Group
+ {
+ SMMUv3Stats(Stats::Group *parent);
+ Stats::Scalar steL1Fetches;
+ Stats::Scalar steFetches;
+ Stats::Scalar cdL1Fetches;
+ Stats::Scalar cdFetches;
+ Stats::Distribution translationTimeDist;
+ Stats::Distribution ptwTimeDist;
+ } stats;
std::vector<SMMUv3DeviceInterface *> deviceInterfaces;
@@ -169,7 +173,6 @@
virtual ~SMMUv3() {}
virtual void init() override;
- virtual void regStats() override;
Tick recvAtomic(PacketPtr pkt, PortID id);
bool recvTimingReq(PacketPtr pkt, PortID id);
diff --git a/src/dev/arm/smmu_v3_caches.cc b/src/dev/arm/smmu_v3_caches.cc
index a56b8a3..b8f284d 100644
--- a/src/dev/arm/smmu_v3_caches.cc
+++ b/src/dev/arm/smmu_v3_caches.cc
@@ -58,11 +58,13 @@
* TODO: move more code into this base class to reduce duplication.
*/
-SMMUv3BaseCache::SMMUv3BaseCache(const std::string &policy_name, uint32_t
seed) :
+SMMUv3BaseCache::SMMUv3BaseCache(const std::string &policy_name, uint32_t
seed,
+ Stats::Group *parent) :
replacementPolicy(decodePolicyName(policy_name)),
nextToReplace(0),
random(seed),
- useStamp(0)
+ useStamp(0),
+ baseCacheStats(parent)
{}
int
@@ -79,74 +81,65 @@
}
}
-void
-SMMUv3BaseCache::regStats(const std::string &name)
+SMMUv3BaseCache::
+SMMUv3BaseCacheStats::SMMUv3BaseCacheStats(Stats::Group *parent)
+ : Stats::Group(parent),
+ ADD_STAT(averageLookups, "Average number lookups per second"),
+ ADD_STAT(totalLookups, "Total number of lookups"),
+ ADD_STAT(averageMisses, "Average number misses per second"),
+ ADD_STAT(totalMisses, "Total number of misses"),
+ ADD_STAT(averageUpdates, "Average number updates per second"),
+ ADD_STAT(totalUpdates, "Total number of updates"),
+ ADD_STAT(averageHitRate, "Average hit rate"),
+ ADD_STAT(insertions, "Number of insertions (not replacements)")
{
using namespace Stats;
averageLookups
- .name(name + ".averageLookups")
- .desc("Average number lookups per second")
.flags(pdf);
totalLookups
- .name(name + ".totalLookups")
- .desc("Total number of lookups")
.flags(pdf);
averageLookups = totalLookups / simSeconds;
averageMisses
- .name(name + ".averageMisses")
- .desc("Average number misses per second")
.flags(pdf);
totalMisses
- .name(name + ".totalMisses")
- .desc("Total number of misses")
.flags(pdf);
averageMisses = totalMisses / simSeconds;
averageUpdates
- .name(name + ".averageUpdates")
- .desc("Average number updates per second")
.flags(pdf);
totalUpdates
- .name(name + ".totalUpdates")
- .desc("Total number of updates")
.flags(pdf);
averageUpdates = totalUpdates / simSeconds;
averageHitRate
- .name(name + ".averageHitRate")
- .desc("Average hit rate")
.flags(pdf);
averageHitRate = (totalLookups - totalMisses) / totalLookups;
insertions
- .name(name + ".insertions")
- .desc("Number of insertions (not replacements)")
.flags(pdf);
}
-
-
/*
* SMMUTLB
*/
SMMUTLB::SMMUTLB(unsigned numEntries, unsigned _associativity,
- const std::string &policy)
+ const std::string &policy, Stats::Group *parent)
:
- SMMUv3BaseCache(policy, SMMUTLB_SEED),
+ SMMUv3BaseCache(policy, SMMUTLB_SEED, parent),
associativity(_associativity)
{
if (associativity == 0)
@@ -198,9 +191,9 @@
if (result)
result->lastUsed = useStamp++;
- totalLookups++;
+ baseCacheStats.totalLookups++;
if (result == NULL)
- totalMisses++;
+ baseCacheStats.totalMisses++;
}
return result;
@@ -225,9 +218,9 @@
}
if (updStats) {
- totalLookups++;
+ baseCacheStats.totalLookups++;
if (result == NULL)
- totalMisses++;
+ baseCacheStats.totalMisses++;
}
return result;
@@ -251,7 +244,7 @@
set[pickEntryIdxToReplace(set, alloc)] = incoming;
}
- totalUpdates++;
+ baseCacheStats.totalUpdates++;
}
void
@@ -378,7 +371,7 @@
for (size_t i = 0; i < max_idx; i++) {
if (!set[i].valid) {
- insertions++;
+ baseCacheStats.insertions++;
return i;
}
@@ -424,9 +417,9 @@
*/
ARMArchTLB::ARMArchTLB(unsigned numEntries, unsigned _associativity,
- const std::string &policy)
+ const std::string &policy, Stats::Group *parent)
:
- SMMUv3BaseCache(policy, ARMARCHTLB_SEED),
+ SMMUv3BaseCache(policy, ARMARCHTLB_SEED, parent),
associativity(_associativity)
{
if (associativity == 0)
@@ -477,9 +470,9 @@
if (result)
result->lastUsed = useStamp++;
- totalLookups++;
+ baseCacheStats.totalLookups++;
if (result == NULL)
- totalMisses++;
+ baseCacheStats.totalMisses++;
}
return result;
@@ -503,7 +496,7 @@
set[pickEntryIdxToReplace(set)] = incoming;
}
- totalUpdates++;
+ baseCacheStats.totalUpdates++;
}
void
@@ -592,7 +585,7 @@
for (size_t i = 0; i < set.size(); i++) {
if (!set[i].valid) {
- insertions++;
+ baseCacheStats.insertions++;
return i;
}
@@ -623,9 +616,9 @@
*/
IPACache::IPACache(unsigned numEntries, unsigned _associativity,
- const std::string &policy)
+ const std::string &policy, Stats::Group *parent)
:
- SMMUv3BaseCache(policy, IPACACHE_SEED),
+ SMMUv3BaseCache(policy, IPACACHE_SEED, parent),
associativity(_associativity)
{
if (associativity == 0)
@@ -676,9 +669,9 @@
if (result)
result->lastUsed = useStamp++;
- totalLookups++;
+ baseCacheStats.totalLookups++;
if (result == NULL)
- totalMisses++;
+ baseCacheStats.totalMisses++;
}
return result;
@@ -701,7 +694,7 @@
set[pickEntryIdxToReplace(set)] = incoming;
}
- totalUpdates++;
+ baseCacheStats.totalUpdates++;
}
void
@@ -772,7 +765,7 @@
for (size_t i = 0; i < set.size(); i++) {
if (!set[i].valid) {
- insertions++;
+ baseCacheStats.insertions++;
return i;
}
@@ -803,9 +796,9 @@
*/
ConfigCache::ConfigCache(unsigned numEntries, unsigned _associativity,
- const std::string &policy)
+ const std::string &policy, Stats::Group *parent)
:
- SMMUv3BaseCache(policy, CONFIGCACHE_SEED),
+ SMMUv3BaseCache(policy, CONFIGCACHE_SEED, parent),
associativity(_associativity)
{
if (associativity == 0)
@@ -855,9 +848,9 @@
if (result)
result->lastUsed = useStamp++;
- totalLookups++;
+ baseCacheStats.totalLookups++;
if (result == NULL)
- totalMisses++;
+ baseCacheStats.totalMisses++;
}
return result;
@@ -880,7 +873,7 @@
set[pickEntryIdxToReplace(set)] = incoming;
}
- totalUpdates++;
+ baseCacheStats.totalUpdates++;
}
void
@@ -936,7 +929,7 @@
for (size_t i = 0; i < set.size(); i++) {
if (!set[i].valid) {
- insertions++;
+ baseCacheStats.insertions++;
return i;
}
@@ -967,8 +960,10 @@
*/
WalkCache::WalkCache(const std::array<unsigned, 2*WALK_CACHE_LEVELS>
&_sizes,
- unsigned _associativity, const std::string &policy) :
- SMMUv3BaseCache(policy, WALKCACHE_SEED),
+ unsigned _associativity, const std::string &policy,
+ Stats::Group *parent) :
+ SMMUv3BaseCache(policy, WALKCACHE_SEED, parent),
+ walkCacheStats(&(SMMUv3BaseCache::baseCacheStats)),
associativity(_associativity),
sizes()
{
@@ -1035,15 +1030,15 @@
if (result)
result->lastUsed = useStamp++;
- totalLookups++;
+ baseCacheStats.totalLookups++;
if (result == NULL)
- totalMisses++;
+ baseCacheStats.totalMisses++;
- lookupsByStageLevel[stage-1][level]++;
- totalLookupsByStageLevel[stage-1][level]++;
+ walkCacheStats.lookupsByStageLevel[stage-1][level]++;
+ walkCacheStats.totalLookupsByStageLevel[stage-1][level]++;
if (result == NULL) {
- missesByStageLevel[stage-1][level]++;
- totalMissesByStageLevel[stage-1][level]++;
+ walkCacheStats.missesByStageLevel[stage-1][level]++;
+ walkCacheStats.totalMissesByStageLevel[stage-1][level]++;
}
}
@@ -1074,9 +1069,10 @@
incoming;
}
- totalUpdates++;
- updatesByStageLevel[incoming.stage-1][incoming.level]++;
- totalUpdatesByStageLevel[incoming.stage-1][incoming.level]++;
+ baseCacheStats.totalUpdates++;
+ walkCacheStats.updatesByStageLevel[incoming.stage-1][incoming.level]++;
+ walkCacheStats
+ .totalUpdatesByStageLevel[incoming.stage-1][incoming.level]++;
}
void
@@ -1194,8 +1190,8 @@
for (size_t i = 0; i < set.size(); i++) {
if (!set[i].valid) {
- insertions++;
- insertionsByStageLevel[stage-1][level]++;
+ baseCacheStats.insertions++;
+ walkCacheStats.insertionsByStageLevel[stage-1][level]++;
return i;
}
@@ -1221,22 +1217,21 @@
}
-void
-WalkCache::regStats(const std::string &name)
+WalkCache::
+WalkCacheStats::WalkCacheStats(Stats::Group *parent)
+ : Stats::Group(parent, "WalkCache")
{
using namespace Stats;
- SMMUv3BaseCache::regStats(name);
-
for (int s = 0; s < 2; s++) {
for (int l = 0; l < WALK_CACHE_LEVELS; l++) {
averageLookupsByStageLevel[s][l]
- .name(csprintf("%s.averageLookupsS%dL%d", name, s+1, l))
+ .name(csprintf("averageLookupsS%dL%d", s+1, l))
.desc("Average number lookups per second")
.flags(pdf);
totalLookupsByStageLevel[s][l]
- .name(csprintf("%s.totalLookupsS%dL%d", name, s+1, l))
+ .name(csprintf("totalLookupsS%dL%d", s+1, l))
.desc("Total number of lookups")
.flags(pdf);
@@ -1245,12 +1240,12 @@
averageMissesByStageLevel[s][l]
- .name(csprintf("%s.averageMissesS%dL%d", name, s+1, l))
+ .name(csprintf("averageMissesS%dL%d", s+1, l))
.desc("Average number misses per second")
.flags(pdf);
totalMissesByStageLevel[s][l]
- .name(csprintf("%s.totalMissesS%dL%d", name, s+1, l))
+ .name(csprintf("totalMissesS%dL%d", s+1, l))
.desc("Total number of misses")
.flags(pdf);
@@ -1259,12 +1254,12 @@
averageUpdatesByStageLevel[s][l]
- .name(csprintf("%s.averageUpdatesS%dL%d", name, s+1, l))
+ .name(csprintf("averageUpdatesS%dL%d", s+1, l))
.desc("Average number updates per second")
.flags(pdf);
totalUpdatesByStageLevel[s][l]
- .name(csprintf("%s.totalUpdatesS%dL%d", name, s+1, l))
+ .name(csprintf("totalUpdatesS%dL%d", s+1, l))
.desc("Total number of updates")
.flags(pdf);
@@ -1273,7 +1268,7 @@
averageHitRateByStageLevel[s][l]
- .name(csprintf("%s.averageHitRateS%dL%d", name, s+1, l))
+ .name(csprintf("averageHitRateS%dL%d", s+1, l))
.desc("Average hit rate")
.flags(pdf);
@@ -1283,7 +1278,7 @@
/ totalLookupsByStageLevel[s][l];
insertionsByStageLevel[s][l]
- .name(csprintf("%s.insertionsS%dL%d", name, s+1, l))
+ .name(csprintf("insertionsS%dL%d", s+1, l))
.desc("Number of insertions (not replacements)")
.flags(pdf);
}
diff --git a/src/dev/arm/smmu_v3_caches.hh b/src/dev/arm/smmu_v3_caches.hh
index 0dfab72..640710f 100644
--- a/src/dev/arm/smmu_v3_caches.hh
+++ b/src/dev/arm/smmu_v3_caches.hh
@@ -65,26 +65,30 @@
Random random;
uint32_t useStamp;
- Stats::Formula averageLookups;
- Stats::Scalar totalLookups;
+ struct SMMUv3BaseCacheStats : public Stats::Group
+ {
+ SMMUv3BaseCacheStats(Stats::Group *parent);
- Stats::Formula averageMisses;
- Stats::Scalar totalMisses;
+ Stats::Formula averageLookups;
+ Stats::Scalar totalLookups;
- Stats::Formula averageUpdates;
- Stats::Scalar totalUpdates;
+ Stats::Formula averageMisses;
+ Stats::Scalar totalMisses;
- Stats::Formula averageHitRate;
+ Stats::Formula averageUpdates;
+ Stats::Scalar totalUpdates;
- Stats::Scalar insertions;
+ Stats::Formula averageHitRate;
+
+ Stats::Scalar insertions;
+ } baseCacheStats;
static int decodePolicyName(const std::string &policy_name);
public:
- SMMUv3BaseCache(const std::string &policy_name, uint32_t seed);
+ SMMUv3BaseCache(const std::string &policy_name, uint32_t seed,
+ Stats::Group *parent);
virtual ~SMMUv3BaseCache() {}
-
- virtual void regStats(const std::string &name);
};
class SMMUTLB : public SMMUv3BaseCache
@@ -118,7 +122,7 @@
};
SMMUTLB(unsigned numEntries, unsigned _associativity,
- const std::string &policy);
+ const std::string &policy, Stats::Group *parent);
SMMUTLB(const SMMUTLB& tlb) = delete;
virtual ~SMMUTLB() {}
@@ -167,7 +171,7 @@
};
ARMArchTLB(unsigned numEntries, unsigned _associativity,
- const std::string &policy);
+ const std::string &policy, Stats::Group *parent);
virtual ~ARMArchTLB() {}
const Entry *lookup(Addr va, uint16_t asid, uint16_t vmid,
@@ -210,7 +214,7 @@
};
IPACache(unsigned numEntries, unsigned _associativity,
- const std::string &policy);
+ const std::string &policy, Stats::Group *parent);
virtual ~IPACache() {}
const Entry *lookup(Addr ipa, uint16_t vmid, bool updStats=true);
@@ -258,7 +262,7 @@
};
ConfigCache(unsigned numEntries, unsigned _associativity,
- const std::string &policy);
+ const std::string &policy, Stats::Group *parent);
virtual ~ConfigCache() {}
const Entry *lookup(uint32_t sid, uint32_t ssid, bool updStats=true);
@@ -301,7 +305,8 @@
};
WalkCache(const std::array<unsigned, 2*WALK_CACHE_LEVELS> &_sizes,
- unsigned _associativity, const std::string &policy);
+ unsigned _associativity, const std::string &policy,
+ Stats::Group *parent);
virtual ~WalkCache() {}
const Entry *lookup(Addr va, Addr vaMask, uint16_t asid, uint16_t vmid,
@@ -315,25 +320,27 @@
void invalidateVMID(uint16_t vmid);
void invalidateAll();
- void regStats(const std::string &name) override;
-
protected:
- unsigned int lookupsByStageLevel[2][WALK_CACHE_LEVELS];
- Stats::Formula averageLookupsByStageLevel[2][WALK_CACHE_LEVELS];
- Stats::Scalar totalLookupsByStageLevel[2][WALK_CACHE_LEVELS];
+ struct WalkCacheStats : public Stats::Group
+ {
+ WalkCacheStats(Stats::Group *parent);
- unsigned int missesByStageLevel[2][WALK_CACHE_LEVELS];
- Stats::Formula averageMissesByStageLevel[2][WALK_CACHE_LEVELS];
- Stats::Scalar totalMissesByStageLevel[2][WALK_CACHE_LEVELS];
+ unsigned int lookupsByStageLevel[2][WALK_CACHE_LEVELS];
+ Stats::Formula averageLookupsByStageLevel[2][WALK_CACHE_LEVELS];
+ Stats::Scalar totalLookupsByStageLevel[2][WALK_CACHE_LEVELS];
- unsigned int updatesByStageLevel[2][WALK_CACHE_LEVELS];
- Stats::Formula averageUpdatesByStageLevel[2][WALK_CACHE_LEVELS];
- Stats::Scalar totalUpdatesByStageLevel[2][WALK_CACHE_LEVELS];
+ unsigned int missesByStageLevel[2][WALK_CACHE_LEVELS];
+ Stats::Formula averageMissesByStageLevel[2][WALK_CACHE_LEVELS];
+ Stats::Scalar totalMissesByStageLevel[2][WALK_CACHE_LEVELS];
- Stats::Formula averageHitRateByStageLevel[2][WALK_CACHE_LEVELS];
+ unsigned int updatesByStageLevel[2][WALK_CACHE_LEVELS];
+ Stats::Formula averageUpdatesByStageLevel[2][WALK_CACHE_LEVELS];
+ Stats::Scalar totalUpdatesByStageLevel[2][WALK_CACHE_LEVELS];
- Stats::Scalar insertionsByStageLevel[2][WALK_CACHE_LEVELS];
+ Stats::Formula averageHitRateByStageLevel[2][WALK_CACHE_LEVELS];
+ Stats::Scalar insertionsByStageLevel[2][WALK_CACHE_LEVELS];
+ } walkCacheStats;
private:
typedef std::vector<Entry> Set;
std::vector<Set> sets;
diff --git a/src/dev/arm/smmu_v3_deviceifc.cc
b/src/dev/arm/smmu_v3_deviceifc.cc
index f7d4c3e..182c6d2 100644
--- a/src/dev/arm/smmu_v3_deviceifc.cc
+++ b/src/dev/arm/smmu_v3_deviceifc.cc
@@ -48,10 +48,12 @@
smmu(nullptr),
microTLB(new SMMUTLB(p.utlb_entries,
p.utlb_assoc,
- p.utlb_policy)),
+ p.utlb_policy,
+ this)),
mainTLB(new SMMUTLB(p.tlb_entries,
p.tlb_assoc,
- p.tlb_policy)),
+ p.tlb_policy,
+ this)),
microTLBEnable(p.utlb_enable),
mainTLBEnable(p.tlb_enable),
devicePortSem(1),
diff --git a/src/dev/arm/smmu_v3_transl.cc b/src/dev/arm/smmu_v3_transl.cc
index ab8a0e7..9888838 100644
--- a/src/dev/arm/smmu_v3_transl.cc
+++ b/src/dev/arm/smmu_v3_transl.cc
@@ -286,7 +286,7 @@
}
if (context.stage1Enable || context.stage2Enable)
- smmu.ptwTimeDist.sample(curTick() - ptwStartTick);
+ smmu.stats.ptwTimeDist.sample(curTick() - ptwStartTick);
// Free PTW slot
doSemaphoreUp(smmu.ptwSem);
@@ -1236,7 +1236,7 @@
doSemaphoreUp(smmu.requestPortSem);
- smmu.translationTimeDist.sample(curTick() - recvTick);
+ smmu.stats.translationTimeDist.sample(curTick() - recvTick);
ifc.xlateSlotsRemaining++;
if (!request.isAtsRequest && request.isWrite)
ifc.wrBufSlotsRemaining +=
@@ -1365,8 +1365,9 @@
ste_addr = (l2_ptr & ST_L2_ADDR_MASK) + index * sizeof(ste);
- smmu.steL1Fetches++;
- } else if ((smmu.regs.strtab_base_cfg & ST_CFG_FMT_MASK) ==
ST_CFG_FMT_LINEAR) {
+ smmu.stats.steL1Fetches++;
+ } else if ((smmu.regs.strtab_base_cfg & ST_CFG_FMT_MASK)
+ ==
ST_CFG_FMT_LINEAR) {
ste_addr =
(smmu.regs.strtab_base & VMT_BASE_ADDR_MASK) + sid *
sizeof(ste);
} else {
@@ -1389,7 +1390,7 @@
if (!ste.dw0.valid)
panic("STE @ %#x not valid\n", ste_addr);
- smmu.steFetches++;
+ smmu.stats.steFetches++;
}
void
@@ -1427,7 +1428,7 @@
cd_addr = l2_ptr + bits(ssid, split-1, 0) * sizeof(cd);
- smmu.cdL1Fetches++;
+ smmu.stats.cdL1Fetches++;
} else if (ste.dw0.s1fmt == STAGE1_CFG_1L) {
cd_addr = (ste.dw0.s1ctxptr << ST_CD_ADDR_SHIFT) +
ssid*sizeof(cd);
}
@@ -1453,7 +1454,7 @@
if (!cd.dw0.valid)
panic("CD @ %#x not valid\n", cd_addr);
- smmu.cdFetches++;
+ smmu.stats.cdFetches++;
}
void
diff --git a/src/dev/arm/ufs_device.cc b/src/dev/arm/ufs_device.cc
index f4114c1..1406e4a 100644
--- a/src/dev/arm/ufs_device.cc
+++ b/src/dev/arm/ufs_device.cc
@@ -729,6 +729,7 @@
transferTrack(0),
taskCommandTrack(0),
idlePhaseStart(0),
+ stats(this),
SCSIResumeEvent([this]{ SCSIStart(); }, name()),
UTPEvent([this]{ finalUTP(); }, name())
{
@@ -752,116 +753,97 @@
setValues();
}
-void
-UFSHostDevice::regStats()
+UFSHostDevice::
+UFSHostDeviceStats::UFSHostDeviceStats(UFSHostDevice *parent)
+ : Stats::Group(parent, "UFSDiskHost"),
+ ADD_STAT(currentSCSIQueue,
+ "Most up to date length of the command queue"),
+ ADD_STAT(currentReadSSDQueue,
+ "Most up to date length of the read SSD queue"),
+ ADD_STAT(currentWriteSSDQueue,
+ "Most up to date length of the write SSD queue"),
+ /** Amount of data read/written */
+ ADD_STAT(totalReadSSD, "Number of bytes read from SSD"),
+ ADD_STAT(totalWrittenSSD, "Number of bytes written to SSD"),
+ ADD_STAT(totalReadDiskTransactions,"Number of transactions from
disk"),
+ ADD_STAT(totalWriteDiskTransactions, "Number of transactions to
disk"),
+ ADD_STAT(totalReadUFSTransactions, "Number of transactions from
device"),
+ ADD_STAT(totalWriteUFSTransactions, "Number of transactions to
device"),
+ /** Average bandwidth for reads and writes */
+ ADD_STAT(averageReadSSDBW, "Average read bandwidth (bytes/s)",
+ totalReadSSD / simSeconds),
+ ADD_STAT(averageWriteSSDBW, "Average write bandwidth (bytes/s)",
+ totalWrittenSSD / simSeconds),
+ ADD_STAT(averageSCSIQueue, "Average command queue length"),
+ ADD_STAT(averageReadSSDQueue, "Average read queue length"),
+ ADD_STAT(averageWriteSSDQueue, "Average write queue length"),
+ /** Number of doorbells rung*/
+ ADD_STAT(curDoorbell, "Most up to date number of doorbells used",
+ parent->activeDoorbells),
+ ADD_STAT(maxDoorbell, "Maximum number of doorbells utilized"),
+ ADD_STAT(averageDoorbell, "Average number of Doorbells used"),
+ /** Latency*/
+ ADD_STAT(transactionLatency, "Histogram of transaction times"),
+ ADD_STAT(idleTimes, "Histogram of idle times")
{
- DmaDevice::regStats();
-
using namespace Stats;
- std::string UFSHost_name = name() + ".UFSDiskHost";
-
// Register the stats
/** Queue lengths */
- stats.currentSCSIQueue
- .name(UFSHost_name + ".currentSCSIQueue")
- .desc("Most up to date length of the command queue")
+ currentSCSIQueue
.flags(none);
- stats.currentReadSSDQueue
- .name(UFSHost_name + ".currentReadSSDQueue")
- .desc("Most up to date length of the read SSD queue")
+ currentReadSSDQueue
.flags(none);
- stats.currentWriteSSDQueue
- .name(UFSHost_name + ".currentWriteSSDQueue")
- .desc("Most up to date length of the write SSD queue")
+ currentWriteSSDQueue
.flags(none);
/** Amount of data read/written */
- stats.totalReadSSD
- .name(UFSHost_name + ".totalReadSSD")
- .desc("Number of bytes read from SSD")
+ totalReadSSD
.flags(none);
- stats.totalWrittenSSD
- .name(UFSHost_name + ".totalWrittenSSD")
- .desc("Number of bytes written to SSD")
+ totalWrittenSSD
.flags(none);
- stats.totalReadDiskTransactions
- .name(UFSHost_name + ".totalReadDiskTransactions")
- .desc("Number of transactions from disk")
+ totalReadDiskTransactions
.flags(none);
- stats.totalWriteDiskTransactions
- .name(UFSHost_name + ".totalWriteDiskTransactions")
- .desc("Number of transactions to disk")
+ totalWriteDiskTransactions
.flags(none);
- stats.totalReadUFSTransactions
- .name(UFSHost_name + ".totalReadUFSTransactions")
- .desc("Number of transactions from device")
+ totalReadUFSTransactions
.flags(none);
- stats.totalWriteUFSTransactions
- .name(UFSHost_name + ".totalWriteUFSTransactions")
- .desc("Number of transactions to device")
+ totalWriteUFSTransactions
.flags(none);
/** Average bandwidth for reads and writes */
- stats.averageReadSSDBW
- .name(UFSHost_name + ".averageReadSSDBandwidth")
- .desc("Average read bandwidth (bytes/s)")
+ averageReadSSDBW
.flags(nozero);
- stats.averageReadSSDBW = stats.totalReadSSD / simSeconds;
-
- stats.averageWriteSSDBW
- .name(UFSHost_name + ".averageWriteSSDBandwidth")
- .desc("Average write bandwidth (bytes/s)")
+ averageWriteSSDBW
.flags(nozero);
- stats.averageWriteSSDBW = stats.totalWrittenSSD / simSeconds;
-
- stats.averageSCSIQueue
- .name(UFSHost_name + ".averageSCSIQueueLength")
- .desc("Average command queue length")
+ averageSCSIQueue
.flags(nozero);
- stats.averageReadSSDQueue
- .name(UFSHost_name + ".averageReadSSDQueueLength")
- .desc("Average read queue length")
+ averageReadSSDQueue
.flags(nozero);
- stats.averageWriteSSDQueue
- .name(UFSHost_name + ".averageWriteSSDQueueLength")
- .desc("Average write queue length")
+ averageWriteSSDQueue
.flags(nozero);
/** Number of doorbells rung*/
- stats.curDoorbell
- .name(UFSHost_name + ".curDoorbell")
- .desc("Most up to date number of doorbells used")
+ curDoorbell
.flags(none);
- stats.curDoorbell = activeDoorbells;
-
- stats.maxDoorbell
- .name(UFSHost_name + ".maxDoorbell")
- .desc("Maximum number of doorbells utilized")
+ maxDoorbell
.flags(none);
- stats.averageDoorbell
- .name(UFSHost_name + ".averageDoorbell")
- .desc("Average number of Doorbells used")
+ averageDoorbell
.flags(nozero);
/** Latency*/
- stats.transactionLatency
+ transactionLatency
.init(100)
- .name(UFSHost_name + ".transactionLatency")
- .desc("Histogram of transaction times")
.flags(pdf);
- stats.idleTimes
+ idleTimes
.init(100)
- .name(UFSHost_name + ".idlePeriods")
- .desc("Histogram of idle times")
.flags(pdf);
-
}
/**
diff --git a/src/dev/arm/ufs_device.hh b/src/dev/arm/ufs_device.hh
index 2a6d1bf..0712a10 100644
--- a/src/dev/arm/ufs_device.hh
+++ b/src/dev/arm/ufs_device.hh
@@ -495,7 +495,10 @@
/**
* Statistics
*/
- struct UFSHostDeviceStats {
+ struct UFSHostDeviceStats : public Stats::Group
+ {
+ UFSHostDeviceStats(UFSHostDevice *parent);
+
/** Queue lengths */
Stats::Scalar currentSCSIQueue;
Stats::Scalar currentReadSSDQueue;
@@ -992,9 +995,6 @@
*/
void readGarbage();
- /**register statistics*/
- void regStats() override;
-
/**
* Host controller information
*/
--
To view, visit https://gem5-review.googlesource.com/c/public/gem5/+/36415
To unsubscribe, or for help writing mail filters, visit
https://gem5-review.googlesource.com/settings
Gerrit-Project: public/gem5
Gerrit-Branch: develop
Gerrit-Change-Id: I722e88801bb8ca0f0d75b5a1bf271fa4d4eded17
Gerrit-Change-Number: 36415
Gerrit-PatchSet: 25
Gerrit-Owner: Hoa Nguyen <hoangu...@ucdavis.edu>
Gerrit-Reviewer: Andreas Sandberg <andreas.sandb...@arm.com>
Gerrit-Reviewer: Giacomo Travaglini <giacomo.travagl...@arm.com>
Gerrit-Reviewer: Hoa Nguyen <hoangu...@ucdavis.edu>
Gerrit-Reviewer: kokoro <noreply+kok...@google.com>
Gerrit-MessageType: merged
_______________________________________________
gem5-dev mailing list -- gem5-dev@gem5.org
To unsubscribe send an email to gem5-dev-le...@gem5.org
%(web_page_url)slistinfo%(cgiext)s/%(_internal_name)s