From 2765be92fbc3aedcc6fd0b079a2d88ad8c1ac604 Mon Sep 17 00:00:00 2001 From: Bartosz Taudul Date: Fri, 4 Jun 2021 12:50:55 +0200 Subject: [PATCH] Sample time for hardware samples. --- client/TracySysTrace.cpp | 68 +++++++++++++++++++++++----------------- common/TracyQueue.hpp | 1 + 2 files changed, 40 insertions(+), 29 deletions(-) diff --git a/client/TracySysTrace.cpp b/client/TracySysTrace.cpp index e02a3d8f..bfa930a3 100644 --- a/client/TracySysTrace.cpp +++ b/client/TracySysTrace.cpp @@ -807,7 +807,7 @@ static void SetupSampling( int64_t& samplingPeriod ) pe.type = PERF_TYPE_HARDWARE; pe.size = sizeof( perf_event_attr ); pe.sample_freq = 5000; - pe.sample_type = PERF_SAMPLE_IP; + pe.sample_type = PERF_SAMPLE_IP | PERF_SAMPLE_TIME; pe.disabled = 1; pe.exclude_kernel = 1; pe.exclude_guest = 1; @@ -1022,39 +1022,49 @@ static void SetupSampling( int64_t& samplingPeriod ) { // Layout: // u64 ip + // u64 time - uint64_t ip; + uint64_t ip, t0; s_ring[i].Read( &ip, offset, sizeof( uint64_t ) ); + offset += sizeof( uint64_t ); + s_ring[i].Read( &t0, offset, sizeof( uint64_t ) ); - QueueType type; - switch( id ) +#if defined TRACY_HW_TIMER && ( defined __i386 || defined _M_IX86 || defined __x86_64__ || defined _M_X64 ) + t0 = s_ring[i].ConvertTimeToTsc( t0 ); + if( t0 != 0 ) +#endif { - case EventCpuCycles: - type = QueueType::HwSampleCpuCycle; - break; - case EventInstructionsRetired: - type = QueueType::HwSampleInstructionRetired; - break; - case EventCacheReference: - type = QueueType::HwSampleCacheReference; - break; - case EventCacheMiss: - type = QueueType::HwSampleCacheMiss; - break; - case EventBranchRetired: - type = QueueType::HwSampleBranchRetired; - break; - case EventBranchMiss: - type = QueueType::HwSampleBranchMiss; - break; - default: - assert( false ); - break; - } + QueueType type; + switch( id ) + { + case EventCpuCycles: + type = QueueType::HwSampleCpuCycle; + break; + case EventInstructionsRetired: + type = QueueType::HwSampleInstructionRetired; + break; + case EventCacheReference: + type = QueueType::HwSampleCacheReference; + break; + case EventCacheMiss: + type = QueueType::HwSampleCacheMiss; + break; + case EventBranchRetired: + type = QueueType::HwSampleBranchRetired; + break; + case EventBranchMiss: + type = QueueType::HwSampleBranchMiss; + break; + default: + assert( false ); + break; + } - TracyLfqPrepare( type ); - MemWrite( &item->hwSample.ip, ip ); - TracyLfqCommit; + TracyLfqPrepare( type ); + MemWrite( &item->hwSample.ip, ip ); + MemWrite( &item->hwSample.time, t0 ); + TracyLfqCommit; + } } } s_ring[i].Advance( hdr.size ); diff --git a/common/TracyQueue.hpp b/common/TracyQueue.hpp index 051d9ab0..f3033c4e 100644 --- a/common/TracyQueue.hpp +++ b/common/TracyQueue.hpp @@ -482,6 +482,7 @@ struct QueueTidToPid struct QueueHwSample { uint64_t ip; + int64_t time; }; enum class PlotFormatType : uint8_t