diff --git a/include/pmu.h b/include/pmu.h index 89aed63dbb71b10b6e9f64b225bb8759399c4b30..43f1cc1b22b9bfce381ee5fa897eab9620a558f7 100644 --- a/include/pmu.h +++ b/include/pmu.h @@ -352,6 +352,12 @@ int PmuCollectV(int *pd, unsigned len, int milliseconds); */ void PmuStop(int pd); +/** + * @brief exit the analysis phase, currently only symbol resolution is effective. + * @param pd + */ +void PmuExit(int pd); + /** * @brief * Collect data. diff --git a/pmu/pmu.cpp b/pmu/pmu.cpp index 9798ca5171861459633892f79cd3a474c5249412..2c8ef8bd9a08fe3b05203117892ee50e9d0e9447 100644 --- a/pmu/pmu.cpp +++ b/pmu/pmu.cpp @@ -560,6 +560,7 @@ int PmuOpen(enum PmuTaskType collectType, struct PmuAttr *attr) PmuList::GetInstance()->SetSymbolMode(pd, attr->symbolMode); PmuList::GetInstance()->SetBranchSampleFilter(pd, attr->branchSampleFilter); + PmuList::GetInstance()->SetAnalysisStatus(pd, GOING_RESOLVE); err = PmuList::GetInstance()->Register(pd, taskAttr.get()); if (err != SUCCESS) { PmuList::GetInstance()->Close(pd); @@ -887,6 +888,11 @@ void PmuClose(int pd) } } +void PmuExit(int pd) +{ + return PmuList::GetInstance()->SetAnalysisStatus(pd, STOP_RESOLVE); +} + static struct PmuEvt* GetPmuEvent(const char* pmuName, int collectType) { return PfmGetPmuEvent(pmuName, collectType); diff --git a/pmu/pmu_list.cpp b/pmu/pmu_list.cpp index 06aaa744b20427f1d829418b5fd181efc5f38bb8..31b131b7b3b0bfc5f984421388ad42cd08fee96f 100644 --- a/pmu/pmu_list.cpp +++ b/pmu/pmu_list.cpp @@ -38,6 +38,7 @@ namespace KUNPENG_PMU { std::mutex PmuList::dataEvtGroupListMtx; std::mutex PmuList::dataListMtx; std::mutex PmuList::dataParentMtx; + std::mutex PmuList::analysisStatusMtx; int PmuList::CheckRlimit(const unsigned fdNum) { @@ -596,6 +597,9 @@ namespace KUNPENG_PMU { auto symMode = symModeList[eventData.pd]; // Parse dwarf and elf info of each pid and get stack trace for each pmu data. for (size_t i = 0; i < eventData.data.size(); ++i) { + if (GetAnalysisStatus(eventData.pd) == STOP_RESOLVE) { + break; + } auto& pmuData = eventData.data[i]; auto& ipsData = eventData.sampleIps[i]; if (symMode == RESOLVE_ELF) { @@ -635,6 +639,9 @@ namespace KUNPENG_PMU { auto& eventData = userDataList[iPmuData]; for (size_t i = 0; i < eventData.data.size(); ++i) { + if (GetAnalysisStatus(eventData.pd) == STOP_RESOLVE) { + break; + } auto& pmuData = eventData.data[i]; auto& ipsData = eventData.sampleIps[i]; if (pmuData.stack == nullptr) { @@ -732,7 +739,7 @@ namespace KUNPENG_PMU { } auto& evData = dataList[pd]; - auto pData = evData.data.data(); + if (GetTaskType(pd) == COUNTING) { std::vector newPmuData; AggregateUncoreData(pd, evData.data, newPmuData); @@ -751,6 +758,7 @@ namespace KUNPENG_PMU { auto symMode = symModeList[evData.pd]; HandleBlockData(evData.data, evData.sampleIps, symMode, evData.switchData); } + auto pData = evData.data.data(); auto inserted = userDataList.emplace(pData, move(evData)); dataList.erase(pd); return inserted.first->second.data; @@ -974,6 +982,12 @@ namespace KUNPENG_PMU { branchSampleFilterList[pd] = branchSampleFilter; } + void PmuList::SetAnalysisStatus(const int pd, const unsigned status) + { + lock_guard lg(analysisStatusMtx); + analysisStatusList[pd] = status; + } + SymbolMode PmuList::GetSymbolMode(const unsigned pd) { lock_guard lg(dataListMtx); @@ -986,6 +1000,11 @@ namespace KUNPENG_PMU { return branchSampleFilterList[pd]; } + unsigned PmuList::GetAnalysisStatus(const int pd) + { + lock_guard lg(analysisStatusMtx); + return analysisStatusList[pd]; + } void PmuList::OpenDummyEvent(KUNPENG_PMU::PmuTaskAttr* taskParam, const unsigned pd) { diff --git a/pmu/pmu_list.h b/pmu/pmu_list.h index 5e950549f54f52896bb61897f515596845737c33..0798f0f41abeebc31690ec4968c1463c934bf9ab 100644 --- a/pmu/pmu_list.h +++ b/pmu/pmu_list.h @@ -25,6 +25,11 @@ namespace KUNPENG_PMU { +enum AnalysisStatus { + STOP_RESOLVE=0, // stop resolving data + GOING_RESOLVE=1 // go resolving data +}; + struct PmuTaskAttr { int numCpu; // number of cpu to be collected int* cpuList; // list of core ids to be collected @@ -67,8 +72,10 @@ public: void FreeData(PmuData* pmuData); int GetTaskType(const int pd) const; int GetBlockedSampleState(const int pd) const; + void SetSymbolMode(const int pd, const SymbolMode &mode); void SetBranchSampleFilter(const int pd, const unsigned long& branchSampleFilter); + void SetAnalysisStatus(const int pd, const unsigned status); int NewPd(); @@ -128,6 +135,7 @@ private: void AggregateUncoreData(const unsigned pd, const std::vector &evData, std::vector &newEvData); std::vector& GetPreviousData(const unsigned pd); SymbolMode GetSymbolMode(const unsigned pd); + unsigned GetAnalysisStatus(const int pd); unsigned long GetBranchSampleFilter(const unsigned pd); void FillPidList(PmuTaskAttr* taskParam, const unsigned pd); void OpenDummyEvent(PmuTaskAttr* taskParam, const unsigned pd); @@ -138,6 +146,7 @@ private: static std::mutex dataListMtx; static std::mutex dataEvtGroupListMtx; static std::mutex dataParentMtx; + static std::mutex analysisStatusMtx; std::unordered_map>> pmuList; // Key: pd // Value: PmuData List. @@ -178,6 +187,9 @@ private: // Key: pd // Value: branchSampleFilter std::unordered_map branchSampleFilterList; + // Key: pd + // Value: analysis status + std::unordered_map analysisStatusList; }; } // namespace KUNPENG_PMU #endif diff --git a/python/modules/_libkperf/Pmu.py b/python/modules/_libkperf/Pmu.py index fceec20e732aaff14e61479df3be7949edf0c782..cdb0042de7a0728e4df8a650d36e7428264f8e1a 100644 --- a/python/modules/_libkperf/Pmu.py +++ b/python/modules/_libkperf/Pmu.py @@ -1740,6 +1740,19 @@ def PmuStop(pd): c_PmuStop(c_pd) +def PmuExit(pd): + """ + void PmuExit(int pd); + """ + c_PmuExit = kperf_so.PmuExit + c_PmuExit.argtypes = [ctypes.c_int] + c_PmuExit.restype = None + + c_pd = ctypes.c_int(pd) + + c_PmuExit(c_pd) + + def PmuDataFree(pmuData): """ void PmuDataFree(struct PmuData* pmuData); @@ -2237,6 +2250,7 @@ __all__ = [ 'PmuEnable', 'PmuDisable', 'PmuStop', + 'PmuExit', 'PmuRead', 'PmuClose', 'PmuDumpData', diff --git a/python/modules/kperf/pmu.py b/python/modules/kperf/pmu.py index d397e1632198ea14d08096a19260741012c9fa8c..a37523f104fda230e4a969dd1f17839669e6a963 100644 --- a/python/modules/kperf/pmu.py +++ b/python/modules/kperf/pmu.py @@ -440,6 +440,15 @@ def close(pd): return _libkperf.PmuClose(pd) +def exit(pd): + """ + Close task with id . + After PmuExit is called, the parsing symbol phase will be halted. + :param pd: task id + """ + return _libkperf.PmuExit(pd) + + def dump(pmuData, filepath, dump_dwf): """ /** @@ -622,6 +631,7 @@ __all__ = [ 'read', 'stop', 'close', + 'exit', 'dump', 'get_field', 'get_field_exp',