diff --git a/pmu/pmu_list.cpp b/pmu/pmu_list.cpp index d82e33e099c5e669f9eccf3f4c9a121b98e7ceac..071b924f568efae599d3ad7c58efc81e721e5ccc 100644 --- a/pmu/pmu_list.cpp +++ b/pmu/pmu_list.cpp @@ -294,7 +294,31 @@ namespace KUNPENG_PMU { } } - void HandleBlockData(std::vector& pmuData, std::vector& switchData) + + void SortTwoVector(std::vector& pmuData, std::vector& sampleIps) + { + std::vector> combined; + combined.reserve(pmuData.size()); + for (size_t i = 0; i < pmuData.size(); ++i) { + combined.emplace_back(std::make_pair(std::move(pmuData[i]), std::move(sampleIps[i]))); + } + + std::sort(combined.begin(), combined.end(), + [](std::pair& a, std::pair& b) { + if (a.first.tid == b.first.tid) { + return a.first.ts < b.first.ts; + } + return a.first.tid < b.first.tid; + }); + + for (size_t i = 0; i < pmuData.size(); ++i) { + pmuData[i] = std::move(combined[i].first); + sampleIps[i] = std::move(combined[i].second); + } + } + + void HandleBlockData(std::vector& pmuData, std::vector& sampleIps, + SymbolMode symMode,std::vector& switchData) { std::sort(switchData.begin(), switchData.end(), [](const PmuSwitchData& a, const PmuSwitchData& b) { if (a.tid == b.tid) { @@ -305,7 +329,7 @@ namespace KUNPENG_PMU { std::unordered_map> tidToOffTimeStamps; int64_t outTime = 0; int prevTid = -1; - for (const auto& item: switchData) { + for (const auto& item : switchData) { if (item.swOut) { outTime = item.ts; prevTid = item.tid; @@ -323,19 +347,13 @@ namespace KUNPENG_PMU { } } } - - std::sort(pmuData.begin(), pmuData.end(), [](const PmuData& a, const PmuData& b) { - if (a.tid == b.tid) { - return a.ts < b.ts; - } - return a.tid < b.tid; - }); + SortTwoVector(pmuData, sampleIps); int csCnt = 0; int64_t prevTs = 0; int64_t currentTs = 0; int64_t curPeriod = 0; int currentTid = -1; - for (auto& item: pmuData) { + for (auto& item : pmuData) { if (currentTid != item.tid) { currentTid = item.tid; csCnt = 0; @@ -347,7 +365,9 @@ namespace KUNPENG_PMU { if (strcmp(item.evt, "context-switches") == 0) { // Convert stack from 'schedule[kernel] -> futex_wait[kernel] -> ...[kernel] -> lock_wait -> start_thread' // to 'lock_wait -> start_thread', only keeping user stack. - TrimKernelStack(item); + if (symMode != NO_SYMBOL_RESOLVE) { + TrimKernelStack(item); + } // Before the context-switches event, there is only one cycles event, which we need to ignore. if (currentTs == 0) { currentTs = item.ts; @@ -667,7 +687,6 @@ namespace KUNPENG_PMU { } auto& eventData = userDataList[iPmuData]; - auto symMode = symModeList[eventData.pd]; for (size_t i = 0; i < eventData.data.size(); ++i) { auto& pmuData = eventData.data[i]; auto& ipsData = eventData.sampleIps[i]; @@ -675,6 +694,15 @@ namespace KUNPENG_PMU { pmuData.stack = StackToHash(pmuData.pid, ipsData.ips.data(), ipsData.ips.size()); } } + if (GetBlockedSampleState(eventData.pd) == 1) { + for (auto& item : eventData.data) { + if (strcmp(item.evt, "context-switches") == 0) { + // Convert stack from 'schedule[kernel] -> futex_wait[kernel] -> ...[kernel] -> lock_wait -> start_thread' + // to 'lock_wait -> start_thread', only keeping user stack. + TrimKernelStack(item); + } + } + } New(SUCCESS); return SUCCESS; } @@ -760,7 +788,8 @@ namespace KUNPENG_PMU { } else { FillStackInfo(evData); if (GetBlockedSampleState(pd) == 1) { - HandleBlockData(evData.data, evData.switchData); + auto symMode = symModeList[evData.pd]; + HandleBlockData(evData.data, evData.sampleIps, symMode, evData.switchData); } auto inserted = userDataList.emplace(pData, move(evData)); dataList.erase(pd); diff --git a/pmu/sampler.cpp b/pmu/sampler.cpp index cab155621d5ddf0b295aad7042d2a558b70c0ce8..3255aac0db9a4f025ba88bf6127ba30b63434141 100644 --- a/pmu/sampler.cpp +++ b/pmu/sampler.cpp @@ -217,6 +217,7 @@ void KUNPENG_PMU::PerfSampler::RawSampleProcess( return; } KUNPENG_PMU::PerfRawSample *sample = (KUNPENG_PMU::PerfRawSample *)event->sample.array; + ips->ips.reserve(ips->ips.size() + sample->nr); // Copy ips from ring buffer and get stack info later. if (evt->callStack == 0) { int i = 0; @@ -224,12 +225,12 @@ void KUNPENG_PMU::PerfSampler::RawSampleProcess( i++; } if (i < sample->nr) { - ips->ips.push_back(sample->ips[i]); + ips->ips.emplace_back(sample->ips[i]); } } else { for (int i = sample->nr - 1; i >= 0; --i) { if (IsValidIp(sample->ips[i])) { - ips->ips.push_back(sample->ips[i]); + ips->ips.emplace_back(sample->ips[i]); } } } @@ -264,7 +265,7 @@ void KUNPENG_PMU::PerfSampler::ReadRingBuffer(vector &data, vectormmap.tid, event->mmap.filename, event->mmap.addr); } else if (symMode == RESOLVE_ELF) { SymResolverUpdateModuleNoDwarf(event->mmap.tid, event->mmap.filename, event->mmap.addr); @@ -272,7 +273,7 @@ void KUNPENG_PMU::PerfSampler::ReadRingBuffer(vector &data, vectormmap2.tid, event->mmap2.filename, event->mmap2.addr); } else if (symMode == RESOLVE_ELF) { SymResolverUpdateModuleNoDwarf(event->mmap2.tid, event->mmap2.filename, event->mmap2.addr);