diff mbox series

[2/2] kernel-shark: Add command line options for selecting plots to be shown

Message ID 20200424132542.1620-3-y.karadz@gmail.com (mailing list archive)
State Superseded
Delegated to: Steven Rostedt
Headers show
Series Command line options for selecting plots | expand

Commit Message

Yordan Karadzhov April 24, 2020, 1:25 p.m. UTC
Example:
  kernelshark -i mytrace.dat --cpu '1 4-7' --pid 11

This will show CPUs: 1, 4, 5, 6, 7 and task(PID): 11.

Signed-off-by: Yordan Karadzhov (VMware) <y.karadz@gmail.com>
Suggested-by: Julia Lawall  <julia.lawall@inria.fr>
---
 kernel-shark/src/KsUtils.cpp     | 24 ++++++++++++++++++++++++
 kernel-shark/src/KsUtils.hpp     |  2 ++
 kernel-shark/src/kernelshark.cpp | 32 +++++++++++++++++++++++++++++---
 3 files changed, 55 insertions(+), 3 deletions(-)

Comments

Steven Rostedt May 4, 2020, 7:13 p.m. UTC | #1
On Fri, 24 Apr 2020 16:25:42 +0300
"Yordan Karadzhov (VMware)" <y.karadz@gmail.com> wrote:

> Example:
>   kernelshark -i mytrace.dat --cpu '1 4-7' --pid 11

Can we change this to use a comma instead of a space. Then we don't need to
worry about quotes.

  kernelshark -i mytrace.dat --cpu 1,4-7

That's the common format for other unix command lines. See taskset for
instance.

-- Steve


> 
> This will show CPUs: 1, 4, 5, 6, 7 and task(PID): 11.
> 
> Signed-off-by: Yordan Karadzhov (VMware) <y.karadz@gmail.com>
> Suggested-by: Julia Lawall  <julia.lawall@inria.fr>
> ---
>  kernel-shark/src/KsUtils.cpp     | 24 ++++++++++++++++++++++++
>  kernel-shark/src/KsUtils.hpp     |  2 ++
>  kernel-shark/src/kernelshark.cpp | 32 +++++++++++++++++++++++++++++---
>  3 files changed, 55 insertions(+), 3 deletions(-)
> 
>
Julia Lawall May 4, 2020, 7:17 p.m. UTC | #2
On Mon, 4 May 2020, Steven Rostedt wrote:

> On Fri, 24 Apr 2020 16:25:42 +0300
> "Yordan Karadzhov (VMware)" <y.karadz@gmail.com> wrote:
>
> > Example:
> >   kernelshark -i mytrace.dat --cpu '1 4-7' --pid 11
>
> Can we change this to use a comma instead of a space. Then we don't need to
> worry about quotes.

This seems like a good idea.  I was away from it a few days, and my first
intuition was to use a comma.

julia

>
>   kernelshark -i mytrace.dat --cpu 1,4-7
>
> That's the common format for other unix command lines. See taskset for
> instance.
>
> -- Steve
>
>
> >
> > This will show CPUs: 1, 4, 5, 6, 7 and task(PID): 11.
> >
> > Signed-off-by: Yordan Karadzhov (VMware) <y.karadz@gmail.com>
> > Suggested-by: Julia Lawall  <julia.lawall@inria.fr>
> > ---
> >  kernel-shark/src/KsUtils.cpp     | 24 ++++++++++++++++++++++++
> >  kernel-shark/src/KsUtils.hpp     |  2 ++
> >  kernel-shark/src/kernelshark.cpp | 32 +++++++++++++++++++++++++++++---
> >  3 files changed, 55 insertions(+), 3 deletions(-)
> >
> >
>
Yordan Karadzhov May 8, 2020, 1:11 p.m. UTC | #3
On 4.05.20 г. 22:17 ч., Julia Lawall wrote:
> 
> 
> On Mon, 4 May 2020, Steven Rostedt wrote:
> 
>> On Fri, 24 Apr 2020 16:25:42 +0300
>> "Yordan Karadzhov (VMware)" <y.karadz@gmail.com> wrote:
>>
>>> Example:
>>>    kernelshark -i mytrace.dat --cpu '1 4-7' --pid 11
>>
>> Can we change this to use a comma instead of a space. Then we don't need to
>> worry about quotes.
> 
> This seems like a good idea.  I was away from it a few days, and my first
> intuition was to use a comma.
> 
> julia
> 


OK, I will send new version of the patches.

Thanks a lot!
Yordan


>>
>>    kernelshark -i mytrace.dat --cpu 1,4-7
>>
>> That's the common format for other unix command lines. See taskset for
>> instance.
>>
>> -- Steve
>>
>>
>>>
>>> This will show CPUs: 1, 4, 5, 6, 7 and task(PID): 11.
>>>
>>> Signed-off-by: Yordan Karadzhov (VMware) <y.karadz@gmail.com>
>>> Suggested-by: Julia Lawall  <julia.lawall@inria.fr>
>>> ---
>>>   kernel-shark/src/KsUtils.cpp     | 24 ++++++++++++++++++++++++
>>>   kernel-shark/src/KsUtils.hpp     |  2 ++
>>>   kernel-shark/src/kernelshark.cpp | 32 +++++++++++++++++++++++++++++---
>>>   3 files changed, 55 insertions(+), 3 deletions(-)
>>>
>>>
>>
diff mbox series

Patch

diff --git a/kernel-shark/src/KsUtils.cpp b/kernel-shark/src/KsUtils.cpp
index e99509f..4a46014 100644
--- a/kernel-shark/src/KsUtils.cpp
+++ b/kernel-shark/src/KsUtils.cpp
@@ -298,6 +298,30 @@  QStringList splitArguments(QString cmd)
 	return argv;
 }
 
+/** Parse a string containing Ids. The string can be of the form "1 4-7 9". */
+QVector<int> parseIdList(QString v_str)
+{
+	QStringList list = v_str.split(" ", QString::SkipEmptyParts);
+	QVector<int> v;
+
+	for (auto item: list) {
+		int i = item.indexOf('-');
+		if (i > 0) {
+			/* This item is an interval. */
+			int from = item.left(i).toInt();
+			int n = item.right(i).toInt() - from + 1;
+			int size = v.size();
+
+			v.resize(size + n);
+			std::iota(v.begin() + size, v.end(), from);
+		} else {
+			v.append(item.toInt());
+		}
+	}
+
+	return v;
+}
+
 }; // KsUtils
 
 /** A stream operator for converting QColor into KsPlot::Color. */
diff --git a/kernel-shark/src/KsUtils.hpp b/kernel-shark/src/KsUtils.hpp
index db1bf5e..2efc01c 100644
--- a/kernel-shark/src/KsUtils.hpp
+++ b/kernel-shark/src/KsUtils.hpp
@@ -132,6 +132,8 @@  QString getSaveFile(QWidget *parent,
 
 QStringList splitArguments(QString cmd);
 
+QVector<int> parseIdList(QString v_str);
+
 }; // KsUtils
 
 /** Identifier of the Dual Marker active state. */
diff --git a/kernel-shark/src/kernelshark.cpp b/kernel-shark/src/kernelshark.cpp
index 1ec6678..55b5831 100644
--- a/kernel-shark/src/kernelshark.cpp
+++ b/kernel-shark/src/kernelshark.cpp
@@ -29,20 +29,43 @@  void usage(const char *prog)
 	printf("  -u	unregister plugin, use plugin name or absolute path\n");
 	printf("  -s	import a session\n");
 	printf("  -l	import the last session\n");
+	puts(" --cpu	show plots for CPU cores, default is \"show all\"");
+	puts(" --pid	show plots for tasks, default is \"do not show\"");
+	puts("\n example:");
+	puts("  kernelshark -i mytrace.dat --cpu \'1 4-7\' --pid 11 -p path/to/my/plugin/myplugin.so\n");
 }
 
+#define KS_LONG_OPTS 0
+static option longOptions[] = {
+	{"help", no_argument, nullptr, 'h'},
+	{"pid", required_argument, nullptr, KS_LONG_OPTS},
+	{"cpu", required_argument, nullptr, KS_LONG_OPTS},
+	{nullptr, 0, nullptr, 0}
+};
+
 int main(int argc, char **argv)
 {
 	QApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
 	QApplication a(argc, argv);
 
+	QVector<int> cpuPlots, taskPlots;
+	bool fromSession = false;
+	int optionIndex = 0;
 	KsMainWindow ks;
-
 	int c;
-	bool fromSession = false;
 
-	while ((c = getopt(argc, argv, "hvi:p:u:s:l")) != -1) {
+	while ((c = getopt_long(argc, argv, "hvi:p:u:s:l",
+					    longOptions,
+					    &optionIndex)) != -1) {
 		switch(c) {
+		case KS_LONG_OPTS:
+			if (strcmp(longOptions[optionIndex].name, "cpu") == 0)
+				cpuPlots = KsUtils::parseIdList(QString(optarg));
+			else if (strcmp(longOptions[optionIndex].name, "pid") == 0)
+				taskPlots = KsUtils::parseIdList(QString(optarg));
+
+			break;
+
 		case 'h':
 			usage(argv[0]);
 			return 0;
@@ -95,6 +118,9 @@  int main(int argc, char **argv)
 			ks.loadDataFile(QString(input_file));
 	}
 
+	ks.setCPUPlots(cpuPlots);
+	ks.setTaskPlots(taskPlots);
+
 	ks.show();
 	return a.exec();
 }