From patchwork Wed Jan 9 13:09:40 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Yordan Karadzhov X-Patchwork-Id: 10760245 Return-Path: Received: from mail-wr1-f65.google.com ([209.85.221.65]:35611 "EHLO mail-wr1-f65.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1730250AbfAINKB (ORCPT ); Wed, 9 Jan 2019 08:10:01 -0500 Received: by mail-wr1-f65.google.com with SMTP id 96so7627234wrb.2 for ; Wed, 09 Jan 2019 05:10:00 -0800 (PST) From: Yordan Karadzhov To: rostedt@goodmis.org Cc: linux-trace-devel@vger.kernel.org Subject: [PATCH v2 1/6] kernel-shark-qt: Rearrange the "Filter" top menu Date: Wed, 9 Jan 2019 15:09:40 +0200 Message-Id: <20190109130945.28519-2-ykaradzhov@vmware.com> In-Reply-To: <20190109130945.28519-1-ykaradzhov@vmware.com> References: <20190109130945.28519-1-ykaradzhov@vmware.com> Sender: linux-trace-devel-owner@vger.kernel.org List-ID: Content-Length: 3279 Now the "Filter" top menu contains only "Show Task" and "Show CPU" menu actions ("Hide" versions are removed). Signed-off-by: Yordan Karadzhov --- kernel-shark-qt/src/KsMainWindow.cpp | 46 ++++++++++++++++++++++------ kernel-shark-qt/src/KsMainWindow.hpp | 6 ++-- 2 files changed, 40 insertions(+), 12 deletions(-) diff --git a/kernel-shark-qt/src/KsMainWindow.cpp b/kernel-shark-qt/src/KsMainWindow.cpp index a375126..8bb51a3 100644 --- a/kernel-shark-qt/src/KsMainWindow.cpp +++ b/kernel-shark-qt/src/KsMainWindow.cpp @@ -53,8 +53,7 @@ KsMainWindow::KsMainWindow(QWidget *parent) _listFilterSyncCBox(nullptr), _showEventsAction("Show events", this), _showTasksAction("Show tasks", this), - _hideTasksAction("Hide tasks", this), - _hideCPUsAction("Hide CPUs", this), + _showCPUsAction("Show CPUs", this), _advanceFilterAction("Advance Filtering", this), _clearAllFilters("Clear all filters", this), _cpuSelectAction("CPUs", this), @@ -205,11 +204,8 @@ void KsMainWindow::_createActions() connect(&_showTasksAction, &QAction::triggered, this, &KsMainWindow::_showTasks); - connect(&_hideTasksAction, &QAction::triggered, - this, &KsMainWindow::_hideTasks); - - connect(&_hideCPUsAction, &QAction::triggered, - this, &KsMainWindow::_hideCPUs); + connect(&_showCPUsAction, &QAction::triggered, + this, &KsMainWindow::_showCPUs); connect(&_advanceFilterAction, &QAction::triggered, this, &KsMainWindow::_advancedFiltering); @@ -322,8 +318,7 @@ void KsMainWindow::_createMenus() filter->addAction(&_showEventsAction); filter->addAction(&_showTasksAction); - filter->addAction(&_hideTasksAction); - filter->addAction(&_hideCPUsAction); + filter->addAction(&_showCPUsAction); filter->addAction(&_advanceFilterAction); filter->addAction(&_clearAllFilters); @@ -621,6 +616,39 @@ void KsMainWindow::_hideTasks() dialog->show(); } +void KsMainWindow::_showCPUs() +{ + kshark_context *kshark_ctx(nullptr); + KsCheckBoxWidget *cpu_cbd; + KsCheckBoxDialog *dialog; + + if (!kshark_instance(&kshark_ctx)) + return; + + cpu_cbd = new KsCPUCheckBoxWidget(_data.tep(), this); + dialog = new KsCheckBoxDialog(cpu_cbd, this); + + if (!kshark_ctx->show_cpu_filter || + !kshark_ctx->show_cpu_filter->count) { + cpu_cbd->setDefault(true); + } else { + int nCPUs = tep_get_cpus(_data.tep()); + QVector v(nCPUs, false); + + for (int i = 0; i < nCPUs; ++i) { + if (tracecmd_filter_id_find(kshark_ctx->show_cpu_filter, i)) + v[i] = true; + } + + cpu_cbd->set(v); + } + + connect(dialog, &KsCheckBoxDialog::apply, + &_data, &KsDataStore::applyPosCPUFilter); + + dialog->show(); +} + void KsMainWindow::_hideCPUs() { kshark_context *kshark_ctx(nullptr); diff --git a/kernel-shark-qt/src/KsMainWindow.hpp b/kernel-shark-qt/src/KsMainWindow.hpp index 301acc9..44f7dd7 100644 --- a/kernel-shark-qt/src/KsMainWindow.hpp +++ b/kernel-shark-qt/src/KsMainWindow.hpp @@ -118,9 +118,7 @@ private: QAction _showTasksAction; - QAction _hideTasksAction; - - QAction _hideCPUsAction; + QAction _showCPUsAction; QAction _advanceFilterAction; @@ -173,6 +171,8 @@ private: void _hideTasks(); + void _showCPUs(); + void _hideCPUs(); void _advancedFiltering(); From patchwork Wed Jan 9 13:09:41 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Yordan Karadzhov X-Patchwork-Id: 10760247 Return-Path: Received: from mail-wr1-f68.google.com ([209.85.221.68]:46427 "EHLO mail-wr1-f68.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1730249AbfAINKC (ORCPT ); Wed, 9 Jan 2019 08:10:02 -0500 Received: by mail-wr1-f68.google.com with SMTP id l9so7566042wrt.13 for ; Wed, 09 Jan 2019 05:10:01 -0800 (PST) From: Yordan Karadzhov To: rostedt@goodmis.org Cc: linux-trace-devel@vger.kernel.org Subject: [PATCH v2 2/6] kernel-shark-qt: Cosmetic modifications in KsQuickContextMenu Date: Wed, 9 Jan 2019 15:09:41 +0200 Message-Id: <20190109130945.28519-3-ykaradzhov@vmware.com> In-Reply-To: <20190109130945.28519-1-ykaradzhov@vmware.com> References: <20190109130945.28519-1-ykaradzhov@vmware.com> Sender: linux-trace-devel-owner@vger.kernel.org List-ID: Content-Length: 4416 The following minor modifications in KsQuickContextMenu are introduced: 1. Removes the "Apply to list/graph" check-boxes. 2. Swaps the position of the Show / Hide actions 3. Adds "clear all filters" action. Signed-off-by: Yordan Karadzhov --- kernel-shark-qt/src/KsQuickContextMenu.cpp | 63 +++++++--------------- kernel-shark-qt/src/KsQuickContextMenu.hpp | 4 +- 2 files changed, 23 insertions(+), 44 deletions(-) diff --git a/kernel-shark-qt/src/KsQuickContextMenu.cpp b/kernel-shark-qt/src/KsQuickContextMenu.cpp index 6c9c9ef..728ecbd 100644 --- a/kernel-shark-qt/src/KsQuickContextMenu.cpp +++ b/kernel-shark-qt/src/KsQuickContextMenu.cpp @@ -62,7 +62,7 @@ KsQuickContextMenu::KsQuickContextMenu(KsDataStore *data, size_t row, _addTaskPlotAction(this), _removeCPUPlotAction(this), _removeTaskPlotAction(this), - _deselectAction(this) + _clearAllFilters(this) { typedef void (KsQuickContextMenu::*mfp)(); QString taskName, parentName, descr; @@ -87,37 +87,14 @@ KsQuickContextMenu::KsQuickContextMenu(KsDataStore *data, size_t row, parentName = parent->metaObject()->className(); - addSection("Pointer menu"); + addSection("Pointer filter menu"); - if (parentName == "KsTraceViewer") { - _graphSyncCBox = - KsUtils::addCheckBoxToMenu(this, "Apply filters to Graph"); - - connect(_graphSyncCBox, &QCheckBox::stateChanged, - &KsUtils::graphFilterSync); - - /* - * By defauls the filters will be append to the List (Table) - * only. - */ - KsUtils::listFilterSync(true); - KsUtils::graphFilterSync(false); - _graphSyncCBox->setChecked(false); - } - - if (parentName == "KsTraceGraph" && - (graphs = dynamic_cast(parent))) { - _listSyncCBox = - KsUtils::addCheckBoxToMenu(this, "Apply filters to List"); - - connect(_listSyncCBox, &QCheckBox::stateChanged, - &KsUtils::listFilterSync); - - /* By defauls the filters will be append to the Graph only. */ - KsUtils::graphFilterSync(true); - KsUtils::listFilterSync(false); - _listSyncCBox->setChecked(false); - } + descr = "Show task ["; + descr += taskName; + descr += "-"; + descr += QString("%1").arg(pid); + descr += "] only"; + lamAddAction(&_showTaskAction, &KsQuickContextMenu::_showTask); descr = "Hide task ["; descr += taskName; @@ -126,30 +103,30 @@ KsQuickContextMenu::KsQuickContextMenu(KsDataStore *data, size_t row, descr += "]"; lamAddAction(&_hideTaskAction, &KsQuickContextMenu::_hideTask); - descr = "Show task ["; - descr += taskName; - descr += "-"; - descr += QString("%1").arg(pid); + descr = "Show event ["; + descr += kshark_get_event_name_easy(_data->rows()[_row]); descr += "] only"; - lamAddAction(&_showTaskAction, &KsQuickContextMenu::_showTask); + lamAddAction(&_showEventAction, &KsQuickContextMenu::_showEvent); descr = "Hide event ["; descr += kshark_get_event_name_easy(_data->rows()[_row]); descr += "]"; lamAddAction(&_hideEventAction, &KsQuickContextMenu::_hideEvent); - descr = "Show event ["; - descr += kshark_get_event_name_easy(_data->rows()[_row]); - descr += "] only"; - lamAddAction(&_showEventAction, &KsQuickContextMenu::_showEvent); + if (parentName == "KsTraceViewer") { + descr = QString("Show CPU [%1] only").arg(cpu); + lamAddAction(&_showCPUAction, &KsQuickContextMenu::_showCPU); + } descr = QString("Hide CPU [%1]").arg(_data->rows()[_row]->cpu); lamAddAction(&_hideCPUAction, &KsQuickContextMenu::_hideCPU); - if (parentName == "KsTraceViewer") { - descr = QString("Show CPU [%1] only").arg(cpu); - lamAddAction(&_showCPUAction, &KsQuickContextMenu::_showCPU); + descr = "Clear all filters"; + lamAddAction(&_clearAllFilters, &KsQuickContextMenu::_clearFilters); + addSection("Pointer plot menu"); + + if (parentName == "KsTraceViewer") { descr = "Add ["; descr += taskName; descr += "-"; diff --git a/kernel-shark-qt/src/KsQuickContextMenu.hpp b/kernel-shark-qt/src/KsQuickContextMenu.hpp index f5a2a78..df8a65b 100644 --- a/kernel-shark-qt/src/KsQuickContextMenu.hpp +++ b/kernel-shark-qt/src/KsQuickContextMenu.hpp @@ -85,6 +85,8 @@ private: QVector _getFilterVector(tracecmd_filter_id *filter, int newId); + void _clearFilters() {_data->clearAllFilters();} + KsDataStore *_data; size_t _row; @@ -105,7 +107,7 @@ private: QAction _removeTaskPlotAction; - QAction _deselectAction; + QAction _clearAllFilters; }; /** From patchwork Wed Jan 9 13:09:42 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Yordan Karadzhov X-Patchwork-Id: 10760249 Return-Path: Received: from mail-wm1-f68.google.com ([209.85.128.68]:38308 "EHLO mail-wm1-f68.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1730250AbfAINKD (ORCPT ); Wed, 9 Jan 2019 08:10:03 -0500 Received: by mail-wm1-f68.google.com with SMTP id m22so8192841wml.3 for ; Wed, 09 Jan 2019 05:10:02 -0800 (PST) From: Yordan Karadzhov To: rostedt@goodmis.org Cc: linux-trace-devel@vger.kernel.org Subject: [PATCH v2 3/6] kernel-shark-qt: Make the selection in the Table less touchy Date: Wed, 9 Jan 2019 15:09:42 +0200 Message-Id: <20190109130945.28519-4-ykaradzhov@vmware.com> In-Reply-To: <20190109130945.28519-1-ykaradzhov@vmware.com> References: <20190109130945.28519-1-ykaradzhov@vmware.com> Sender: linux-trace-devel-owner@vger.kernel.org List-ID: Content-Length: 2064 This patch aims to make the selection in the table by using the mouse more intuitive (less touchy). First of all, it disables the auto-scrolling in horizontal direction. In addition to this, it makes sure that all columns of the table have proper sizes when the main window gets resized by the user. Signed-off-by: Yordan Karadzhov --- kernel-shark-qt/src/KsTraceViewer.cpp | 18 ++++++++++++++++++ kernel-shark-qt/src/KsTraceViewer.hpp | 2 ++ 2 files changed, 20 insertions(+) diff --git a/kernel-shark-qt/src/KsTraceViewer.cpp b/kernel-shark-qt/src/KsTraceViewer.cpp index d64c2af..2418de3 100644 --- a/kernel-shark-qt/src/KsTraceViewer.cpp +++ b/kernel-shark-qt/src/KsTraceViewer.cpp @@ -30,6 +30,23 @@ void KsTableView::mousePressEvent(QMouseEvent *e) { QTableView::mousePressEvent(e); } +/** + * Reimplemented the handler for Auto-scrolling. With this we disable + * the Horizontal Auto-scrolling. + */ +void KsTableView::scrollTo(const QModelIndex &index, ScrollHint hint) +{ + int bottomMargin(2); + + if (hint == QAbstractItemView::EnsureVisible && + index.row() > indexAt(rect().topLeft()).row() && + index.row() < indexAt(rect().bottomLeft()).row() - bottomMargin) + return; + + QTableView::scrollTo(index, hint); +} + + /** Create a default (empty) Trace viewer widget. */ KsTraceViewer::KsTraceViewer(QWidget *parent) : QWidget(parent), @@ -588,6 +605,7 @@ void KsTraceViewer::resizeEvent(QResizeEvent* event) int nColumns = _tableHeader.count(); int tableSize(0), viewSize, freeSpace; + _resizeToContents(); for (int c = 0; c < nColumns; ++c) { tableSize += _view.columnWidth(c); } diff --git a/kernel-shark-qt/src/KsTraceViewer.hpp b/kernel-shark-qt/src/KsTraceViewer.hpp index a89fce1..a8c1fe6 100644 --- a/kernel-shark-qt/src/KsTraceViewer.hpp +++ b/kernel-shark-qt/src/KsTraceViewer.hpp @@ -33,6 +33,8 @@ public: : QTableView(parent) {}; void mousePressEvent(QMouseEvent *event) override; + + void scrollTo(const QModelIndex &index, ScrollHint hint) override; }; /** From patchwork Wed Jan 9 13:09:43 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Yordan Karadzhov X-Patchwork-Id: 10760251 Return-Path: Received: from mail-wr1-f66.google.com ([209.85.221.66]:44757 "EHLO mail-wr1-f66.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1730249AbfAINKE (ORCPT ); Wed, 9 Jan 2019 08:10:04 -0500 Received: by mail-wr1-f66.google.com with SMTP id z5so7569440wrt.11 for ; Wed, 09 Jan 2019 05:10:03 -0800 (PST) From: Yordan Karadzhov To: rostedt@goodmis.org Cc: linux-trace-devel@vger.kernel.org Subject: [PATCH v2 4/6] kernel-shark-qt: Do not auto-scrolling when the marker switches Date: Wed, 9 Jan 2019 15:09:43 +0200 Message-Id: <20190109130945.28519-5-ykaradzhov@vmware.com> In-Reply-To: <20190109130945.28519-1-ykaradzhov@vmware.com> References: <20190109130945.28519-1-ykaradzhov@vmware.com> Sender: linux-trace-devel-owner@vger.kernel.org List-ID: Content-Length: 1455 In some cases, the auto-scrolling (inside the table) to the position of the marker, when the user switches between MarkerA and MarkerB can be very annoying. This patch disables this vertical auto-scrolling. Jumping to the position of the Active marker is still possible, but the user has to do a second click on the MarkerA/MarkerB button. Signed-off-by: Yordan Karadzhov --- kernel-shark-qt/src/KsTraceViewer.cpp | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/kernel-shark-qt/src/KsTraceViewer.cpp b/kernel-shark-qt/src/KsTraceViewer.cpp index 2418de3..f02fbbb 100644 --- a/kernel-shark-qt/src/KsTraceViewer.cpp +++ b/kernel-shark-qt/src/KsTraceViewer.cpp @@ -578,13 +578,18 @@ void KsTraceViewer::markSwitch() */ size_t row =_mState->getMarker(state)._pos; - QModelIndex index = _proxyModel.mapFromSource(_model.index(row, 0)); + QModelIndex index = + _proxyModel.mapFromSource(_model.index(row, 0)); /* * The row of the active marker will be colored according to - * the assigned property of the current state of the Dual marker. + * the assigned property of the current state of the Dual + * marker. Auto-scrolling is temporarily disabled because we + * do not want to scroll to the position of the marker yet. */ + _view.setAutoScroll(false); _view.selectRow(index.row()); + _view.setAutoScroll(true); } else { _view.clearSelection(); } From patchwork Wed Jan 9 13:09:44 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Yordan Karadzhov X-Patchwork-Id: 10760253 Return-Path: Received: from mail-wm1-f67.google.com ([209.85.128.67]:50936 "EHLO mail-wm1-f67.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1730250AbfAINKF (ORCPT ); Wed, 9 Jan 2019 08:10:05 -0500 Received: by mail-wm1-f67.google.com with SMTP id n190so7579855wmd.0 for ; Wed, 09 Jan 2019 05:10:04 -0800 (PST) From: Yordan Karadzhov To: rostedt@goodmis.org Cc: linux-trace-devel@vger.kernel.org Subject: [PATCH v2 5/6] kernel-shark-qt: Add the CPU filters to the filter clearing method Date: Wed, 9 Jan 2019 15:09:44 +0200 Message-Id: <20190109130945.28519-6-ykaradzhov@vmware.com> In-Reply-To: <20190109130945.28519-1-ykaradzhov@vmware.com> References: <20190109130945.28519-1-ykaradzhov@vmware.com> Sender: linux-trace-devel-owner@vger.kernel.org List-ID: When we introdused the CPU filters, we forgot to add these filters to void KsDataStore::clearAllFilters(). Signed-off-by: Yordan Karadzhov --- kernel-shark-qt/src/KsUtils.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/kernel-shark-qt/src/KsUtils.cpp b/kernel-shark-qt/src/KsUtils.cpp index 0298010..34b2e2d 100644 --- a/kernel-shark-qt/src/KsUtils.cpp +++ b/kernel-shark-qt/src/KsUtils.cpp @@ -375,6 +375,8 @@ void KsDataStore::clearAllFilters() kshark_filter_clear(kshark_ctx, KS_HIDE_TASK_FILTER); kshark_filter_clear(kshark_ctx, KS_SHOW_EVENT_FILTER); kshark_filter_clear(kshark_ctx, KS_HIDE_EVENT_FILTER); + kshark_filter_clear(kshark_ctx, KS_SHOW_CPU_FILTER); + kshark_filter_clear(kshark_ctx, KS_HIDE_CPU_FILTER); tep_filter_reset(kshark_ctx->advanced_event_filter); kshark_clear_all_filters(kshark_ctx, _rows, _dataSize); From patchwork Wed Jan 9 13:09:45 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Yordan Karadzhov X-Patchwork-Id: 10760255 Return-Path: Received: from mail-wm1-f68.google.com ([209.85.128.68]:40443 "EHLO mail-wm1-f68.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1730249AbfAINKG (ORCPT ); Wed, 9 Jan 2019 08:10:06 -0500 Received: by mail-wm1-f68.google.com with SMTP id f188so8129723wmf.5 for ; Wed, 09 Jan 2019 05:10:05 -0800 (PST) From: Yordan Karadzhov To: rostedt@goodmis.org Cc: linux-trace-devel@vger.kernel.org Subject: [PATCH v2 6/6] kernel-shark-qt: Fix bug in plugin actions execution Date: Wed, 9 Jan 2019 15:09:45 +0200 Message-Id: <20190109130945.28519-7-ykaradzhov@vmware.com> In-Reply-To: <20190109130945.28519-1-ykaradzhov@vmware.com> References: <20190109130945.28519-1-ykaradzhov@vmware.com> Sender: linux-trace-devel-owner@vger.kernel.org List-ID: Content-Length: 1284 Plugin-provided actions are executed when loading the data. These actions can be used to modify the contain of the kshark_entries generated by a given event type and we consider the case of having more than one plugin-provided actions per event type. However, the code that handles the case of multiple actions per-event has a bug. The "if" was introduced with the idea that only the last per-event action will modify the KS_PLUGIN_UNTOUCHED flag of the entry, but it misbehaves in the case of a single per-event action in the list, followed by actions for other events. Signed-off-by: Yordan Karadzhov --- kernel-shark-qt/src/libkshark.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/kernel-shark-qt/src/libkshark.c b/kernel-shark-qt/src/libkshark.c index 598ea52..9ab2d57 100644 --- a/kernel-shark-qt/src/libkshark.c +++ b/kernel-shark-qt/src/libkshark.c @@ -750,8 +750,7 @@ static size_t get_records(struct kshark_context *kshark_ctx, entry->event_id))) { evt_handler->event_func(kshark_ctx, rec, entry); evt_handler = evt_handler->next; - if (!evt_handler) - entry->visible &= ~KS_PLUGIN_UNTOUCHED_MASK; + entry->visible &= ~KS_PLUGIN_UNTOUCHED_MASK; } pid = entry->pid;