From: "Yordan Karadzhov (VMware)" <y.karadz@gmail.com> To: rostedt@goodmis.org Cc: linux-trace-devel@vger.kernel.org, "Yordan Karadzhov (VMware)" <y.karadz@gmail.com> Subject: [PATCH v8 35/44] kernel-shark: Integrate streams with KsPlotTools Date: Mon, 4 Jan 2021 19:47:15 +0200 Message-ID: <20210104174724.70404-36-y.karadz@gmail.com> (raw) In-Reply-To: <20210104174724.70404-1-y.karadz@gmail.com> The C++ ploting toolls are adapted in order to be able to work with the new version of the C API. Now we can handle multiple Data streams. Signed-off-by: Yordan Karadzhov (VMware) <y.karadz@gmail.com> --- src/CMakeLists.txt | 4 +- src/KsPlotTools.cpp | 94 ++++++++++++++++++++++++++++++++------------- src/KsPlotTools.hpp | 4 +- 3 files changed, 71 insertions(+), 31 deletions(-) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index fe440db..9646cbb 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -41,8 +41,8 @@ install(FILES "${KS_DIR}/src/libkshark.h" if (OPENGL_FOUND) message(STATUS "libkshark-plot") - add_library(kshark-plot SHARED libkshark-plot.c) -# KsPlotTools.cpp) + add_library(kshark-plot SHARED libkshark-plot.c + KsPlotTools.cpp) target_link_libraries(kshark-plot kshark ${GLUT_LIBRARY} diff --git a/src/KsPlotTools.cpp b/src/KsPlotTools.cpp index fe3008e..113a6c0 100644 --- a/src/KsPlotTools.cpp +++ b/src/KsPlotTools.cpp @@ -10,16 +10,13 @@ */ // C +#include <cstring> #include <math.h> // C++ #include <algorithm> #include <vector> -// OpenGL -#include <GL/freeglut.h> -#include <GL/gl.h> - // KernelShark #include "KsPlotTools.hpp" @@ -109,29 +106,45 @@ void Color::setRainbowColor(int n) ColorTable getTaskColorTable() { struct kshark_context *kshark_ctx(nullptr); + int nTasks(0), pid, *pids, i(0), *streamIds; + std::vector<int> tempPids; ColorTable colors; - int nTasks, pid, *pids, i(0); if (!kshark_instance(&kshark_ctx)) return colors; - nTasks = kshark_get_task_pids(kshark_ctx, &pids); - if (!nTasks) + streamIds = kshark_all_streams(kshark_ctx); + for (int j = 0; j < kshark_ctx->n_streams; ++j) { + nTasks = kshark_get_task_pids(kshark_ctx, streamIds[j], &pids); + tempPids.insert(tempPids.end(), pids, pids + nTasks); + free(pids); + } + + free(streamIds); + + if (!tempPids.size()) return colors; - std::vector<int> temp_pids(pids, pids + nTasks); - std::sort(temp_pids.begin(), temp_pids.end()); + std::sort(tempPids.begin(), tempPids.end()); - free(pids); + /* Erase duplicates. */ + tempPids.erase(unique(tempPids.begin(), tempPids.end()), + tempPids.end()); - if (temp_pids[i] == 0) { - /* The "Idle" process (pid = 0) will be plotted in black. */ + /* Erase negative (error codes). */ + auto isNegative = [](int i) {return i < 0;}; + auto it = remove_if(tempPids.begin(), tempPids.end(), isNegative); + tempPids.erase(it, tempPids.end()); + + nTasks = tempPids.size(); + if (tempPids[i] == 0) { + /* Pid <= 0 will be plotted in black. */ colors[i++] = {}; } for (; i < nTasks; ++i) { - pid = temp_pids[i]; - colors[pid].setRainbowColor(i - 1); + pid = tempPids[i]; + colors[pid].setRainbowColor(i); } return colors; @@ -145,16 +158,26 @@ ColorTable getTaskColorTable() */ ColorTable getCPUColorTable() { - struct kshark_context *kshark_ctx(nullptr); + kshark_context *kshark_ctx(nullptr); + int nCPUs, nCPUMax(0), *streamIds; + kshark_data_stream *stream; ColorTable colors; - int nCPUs; if (!kshark_instance(&kshark_ctx)) return colors; - nCPUs = tep_get_cpus(kshark_ctx->pevent); - for (int i = 0; i < nCPUs; ++i) - colors[i].setRainbowColor(i); + streamIds = kshark_all_streams(kshark_ctx); + for (int i = 0; i < kshark_ctx->n_streams; ++i) { + stream = kshark_get_data_stream(kshark_ctx, streamIds[i]); + nCPUs = stream->n_cpus; + if (nCPUMax < nCPUs) + nCPUMax = nCPUs; + } + + free(streamIds); + + for (int i = 0; i < nCPUMax; ++i) + colors[i].setRainbowColor(i + 8); return colors; } @@ -788,9 +811,10 @@ void Graph::setBin(int bin, int pidF, int pidB, const Color &col, uint8_t m) /** * @brief Process a CPU Graph. * + * @param sd: Data stream identifier. * @param cpu: The CPU core. */ -void Graph::fillCPUGraph(int cpu) +void Graph::fillCPUGraph(int sd, int cpu) { struct kshark_entry *eFront; int pidFront(0), pidBack(0); @@ -804,6 +828,7 @@ void Graph::fillCPUGraph(int cpu) eFront = nullptr; pidFront = ksmodel_get_pid_front(_histoPtr, bin, + sd, cpu, true, _collectionPtr, @@ -813,6 +838,7 @@ void Graph::fillCPUGraph(int cpu) eFront = _histoPtr->data[index]; pidBack = ksmodel_get_pid_back(_histoPtr, bin, + sd, cpu, true, _collectionPtr, @@ -820,10 +846,11 @@ void Graph::fillCPUGraph(int cpu) pidBackNoFilter = ksmodel_get_pid_back(_histoPtr, bin, - cpu, - false, - _collectionPtr, - nullptr); + sd, + cpu, + false, + _collectionPtr, + nullptr); if (pidBack != pidBackNoFilter) pidBack = KS_FILTERED_BIN; @@ -832,6 +859,7 @@ void Graph::fillCPUGraph(int cpu) if (eFront) { if (!(eFront->visible & KS_EVENT_VIEW_FILTER_MASK) && ksmodel_cpu_visible_event_exist(_histoPtr, bin, + sd, cpu, _collectionPtr, &index)) { @@ -874,6 +902,7 @@ void Graph::fillCPUGraph(int cpu) */ pidBackNoFilter = ksmodel_get_pid_back(_histoPtr, LOWER_OVERFLOW_BIN, + sd, cpu, false, _collectionPtr, @@ -882,6 +911,7 @@ void Graph::fillCPUGraph(int cpu) /* Now get the Pid back, applying filters. */ pidBack = ksmodel_get_pid_back(_histoPtr, LOWER_OVERFLOW_BIN, + sd, cpu, true, _collectionPtr, @@ -916,9 +946,10 @@ void Graph::fillCPUGraph(int cpu) /** * @brief Process a Task Graph. * + * @param sd: Data stream identifier. * @param pid: The Process Id of the Task. */ -void Graph::fillTaskGraph(int pid) +void Graph::fillTaskGraph(int sd, int pid) { int cpuFront, cpuBack(0), pidFront(0), pidBack(0), lastCpu(-1), bin(0); struct kshark_entry *eFront; @@ -972,6 +1003,7 @@ void Graph::fillTaskGraph(int pid) */ int cpuPid = ksmodel_get_pid_back(_histoPtr, bin, + sd, lastCpu, false, nullptr, // No collection @@ -998,6 +1030,7 @@ void Graph::fillTaskGraph(int pid) eFront = nullptr; /* Get the CPU used by this task. */ cpuFront = ksmodel_get_cpu_front(_histoPtr, bin, + sd, pid, false, _collectionPtr, @@ -1006,6 +1039,7 @@ void Graph::fillTaskGraph(int pid) eFront = _histoPtr->data[index]; cpuBack = ksmodel_get_cpu_back(_histoPtr, bin, + sd, pid, false, _collectionPtr, @@ -1020,6 +1054,7 @@ void Graph::fillTaskGraph(int pid) */ pidFront = ksmodel_get_pid_front(_histoPtr, bin, + sd, cpuFront, false, _collectionPtr, @@ -1027,6 +1062,7 @@ void Graph::fillTaskGraph(int pid) pidBack = ksmodel_get_pid_back(_histoPtr, bin, + sd, cpuBack, false, _collectionPtr, @@ -1037,6 +1073,7 @@ void Graph::fillTaskGraph(int pid) if (!(eFront->visible & KS_EVENT_VIEW_FILTER_MASK) && ksmodel_task_visible_event_exist(_histoPtr, bin, + sd, pid, _collectionPtr, &index)) { @@ -1062,8 +1099,9 @@ void Graph::fillTaskGraph(int pid) * No data from this Task in the very first bin. Use the Lower * Overflow Bin to retrieve the CPU used by the task (if any). */ - cpuFront = ksmodel_get_cpu_back(_histoPtr, LOWER_OVERFLOW_BIN, pid, - false, _collectionPtr, nullptr); + cpuFront = ksmodel_get_cpu_back(_histoPtr, LOWER_OVERFLOW_BIN, + sd, pid, + false, _collectionPtr, nullptr); if (cpuFront >= 0) { /* * The Lower Overflow Bin contains data from this Task. @@ -1075,6 +1113,7 @@ void Graph::fillTaskGraph(int pid) pidCpu0 = ksmodel_get_pid_back(_histoPtr, 0, + sd, cpuFront, false, _collectionPtr, @@ -1082,6 +1121,7 @@ void Graph::fillTaskGraph(int pid) pidCpuLOB = ksmodel_get_pid_back(_histoPtr, LOWER_OVERFLOW_BIN, + sd, cpuFront, false, _collectionPtr, diff --git a/src/KsPlotTools.hpp b/src/KsPlotTools.hpp index ee447f1..6e66373 100644 --- a/src/KsPlotTools.hpp +++ b/src/KsPlotTools.hpp @@ -432,9 +432,9 @@ public: /** @brief Set the Hash table of Task's colors. */ void setBinColorTablePtr(KsPlot::ColorTable *ct) {_binColors = ct;} - void fillCPUGraph(int cpu); + void fillCPUGraph(int sd, int cpu); - void fillTaskGraph(int pid); + void fillTaskGraph(int sd, int pid); void draw(float s = 1); -- 2.25.1
next prev parent reply index Thread overview: 46+ messages / expand[flat|nested] mbox.gz Atom feed top 2021-01-04 17:46 [PATCH v8 00/44] Start KernelShark v2 transformation Yordan Karadzhov (VMware) 2021-01-04 17:46 ` [PATCH v8 01/44] kernel-shark: Adopt trace-cmd API changes Yordan Karadzhov (VMware) 2021-01-04 17:46 ` [PATCH v8 02/44] kernel-shark: Use libtraceevent and libtracefs Yordan Karadzhov (VMware) 2021-01-04 17:46 ` [PATCH v8 03/44] kernel-shark: Add license information Yordan Karadzhov (VMware) 2021-01-04 17:46 ` [PATCH v8 04/44] kernel-shark: Change the CMake minimum version required Yordan Karadzhov (VMware) 2021-01-04 17:46 ` [PATCH v8 05/44] kernel-shark: Change default libraries install location Yordan Karadzhov (VMware) 2021-01-04 17:46 ` [PATCH v8 06/44] kernel-shark: Split the installation in two components Yordan Karadzhov (VMware) 2021-01-04 17:46 ` [PATCH v8 07/44] kernel-shark: Update README Yordan Karadzhov (VMware) 2021-01-04 17:46 ` [PATCH v8 08/44] kernel-shark: Define build target for JSONC Yordan Karadzhov (VMware) 2021-01-04 17:46 ` [PATCH v8 09/44] kernel-shark: Use only signed types in kshark_entry Yordan Karadzhov (VMware) 2021-01-04 17:46 ` [PATCH v8 10/44] kernel-shark: Add stream_id to kshark_entry Yordan Karadzhov (VMware) 2021-01-04 17:46 ` [PATCH v8 11/44] kernel-shark: Introduce libkshark-hash Yordan Karadzhov (VMware) 2021-01-04 17:46 ` [PATCH v8 12/44] kernel-shark: Introduce Data streams Yordan Karadzhov (VMware) 2021-01-04 17:46 ` [PATCH v8 13/44] kernel-shark: Rename static methods in libkshark Yordan Karadzhov (VMware) 2021-01-04 17:46 ` [PATCH v8 14/44] kernel-shark: Add basic methods for Data streams Yordan Karadzhov (VMware) 2021-01-04 17:46 ` [PATCH v8 15/44] kernel-shark: Housekeeping before implementing stream interface Yordan Karadzhov (VMware) 2021-01-04 17:46 ` [PATCH v8 16/44] kernel-shark: Add stream interface for trace-cmd data Yordan Karadzhov (VMware) 2021-01-04 17:46 ` [PATCH v8 17/44] kernel-shark: Start introducing KernelShark 2.0 Yordan Karadzhov (VMware) 2021-01-04 17:46 ` [PATCH v8 18/44] kernel-shark: Start using data streams Yordan Karadzhov (VMware) 2021-01-04 17:46 ` [PATCH v8 19/44] kernel-shark: Remove dead code Yordan Karadzhov (VMware) 2021-01-04 17:47 ` [PATCH v8 20/44] kernel-shark: Redesign the plugin interface Yordan Karadzhov (VMware) 2021-01-04 17:47 ` [PATCH v8 21/44] kernel-shark: Complete the stream integration Yordan Karadzhov (VMware) 2021-01-04 17:47 ` [PATCH v8 22/44] kernel-shark: Provide merging of multiple data streams Yordan Karadzhov (VMware) 2021-01-04 17:47 ` [PATCH v8 23/44] kernel-shark: Integrate the stream definitions with data model Yordan Karadzhov (VMware) 2021-01-04 17:47 ` [PATCH v8 24/44] kernel-shark: Use only signed types for model defs Yordan Karadzhov (VMware) 2021-01-04 17:47 ` [PATCH v8 25/44] kernel-shark: Add ksmodel_get_bin() Yordan Karadzhov (VMware) 2021-01-04 17:47 ` [PATCH v8 26/44] kernel-shark: Protect ksmodel_set_in_range_bining() Yordan Karadzhov (VMware) 2021-01-04 17:47 ` [PATCH v8 27/44] kernel-shark: Add methods for time calibration Yordan Karadzhov (VMware) 2021-01-04 17:47 ` [PATCH v8 28/44] kernel-shark: Integrate streams with libkshark-configio Yordan Karadzhov (VMware) 2021-01-04 17:47 ` [PATCH v8 29/44] kernel-shark: Add support for drawing text Yordan Karadzhov (VMware) 2021-01-04 17:47 ` [PATCH v8 30/44] kernel-shark: Make GLUT optional dependency Yordan Karadzhov (VMware) 2021-01-04 17:47 ` [PATCH v8 31/44] kernel-shark: Add ksplot_draw_polyline() Yordan Karadzhov (VMware) 2021-01-04 17:47 ` [PATCH v8 32/44] kernel-shark: Optimize ksplot_draw_polygon() Yordan Karadzhov (VMware) 2021-01-04 17:47 ` [PATCH v8 33/44] kernel-shark: Add basic infrastructure for testing Yordan Karadzhov (VMware) 2021-01-04 17:47 ` [PATCH v8 34/44] kernel-shark: Add "github Actions" workflow Yordan Karadzhov (VMware) 2021-01-04 17:47 ` Yordan Karadzhov (VMware) [this message] 2021-01-04 17:47 ` [PATCH v8 36/44] kernel-shark: Add getStreamColorTable() Yordan Karadzhov (VMware) 2021-01-04 17:47 ` [PATCH v8 37/44] kernel-shark: Redefine the args of KsPlot::getColor() Yordan Karadzhov (VMware) 2021-01-04 17:47 ` [PATCH v8 38/44] kernel-shark: Add TextBox class to KsPlot namespace Yordan Karadzhov (VMware) 2021-01-04 17:47 ` [PATCH v8 39/44] kernel-shark: Consistent method naming in KsPlotTools Yordan Karadzhov (VMware) 2021-01-04 17:47 ` [PATCH v8 40/44] kernel-shark: Make the label part of the graph Yordan Karadzhov (VMware) 2021-01-04 17:47 ` [PATCH v8 41/44] kernel-shark: Remove the hard-coded Idle PID Yordan Karadzhov (VMware) 2021-01-04 17:47 ` [PATCH v8 42/44] kernel-shark: Add class Polyline to KsPlot namespace Yordan Karadzhov (VMware) 2021-01-04 17:47 ` [PATCH v8 43/44] kernel-shark: Add VirtBridge and VirtGap classes Yordan Karadzhov (VMware) 2021-01-04 17:47 ` [PATCH v8 44/44] kernel-shark: Add double click interface to PlotObject Yordan Karadzhov (VMware) 2021-01-05 0:27 ` [PATCH v8 00/44] Start KernelShark v2 transformation Steven Rostedt
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=20210104174724.70404-36-y.karadz@gmail.com \ --to=y.karadz@gmail.com \ --cc=linux-trace-devel@vger.kernel.org \ --cc=rostedt@goodmis.org \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: link
Linux-Trace-Devel Archive on lore.kernel.org Archives are clonable: git clone --mirror https://lore.kernel.org/linux-trace-devel/0 linux-trace-devel/git/0.git # If you have public-inbox 1.1+ installed, you may # initialize and index your mirror using the following commands: public-inbox-init -V2 linux-trace-devel linux-trace-devel/ https://lore.kernel.org/linux-trace-devel \ linux-trace-devel@vger.kernel.org public-inbox-index linux-trace-devel Example config snippet for mirrors Newsgroup available over NNTP: nntp://nntp.lore.kernel.org/org.kernel.vger.linux-trace-devel AGPL code for this site: git clone https://public-inbox.org/public-inbox.git