public inbox for util-linux@vger.kernel.org
 help / color / mirror / Atom feed
* [PATCH V2 0/4] irqtop,lsirq: Miscellaneous enhancements
@ 2025-02-28 16:13 Joe Jin
  2025-02-28 16:13 ` [PATCH V2 1/4] irqtop: add batch mode support Joe Jin
                   ` (5 more replies)
  0 siblings, 6 replies; 13+ messages in thread
From: Joe Jin @ 2025-02-28 16:13 UTC (permalink / raw)
  To: Karel Zak, Zhenwei Pi, Sami Kerola; +Cc: util-linux, Joe Jin

This patchset add below new options for irqtop:
 '-b|--batch' : Batch mode
 '-n|--iter'  : Specifies the maximum number of iterations
 '-J|--json'  : Json ouput format

Add below for lsirq:
 '-i|--input' : Read data from file

v2:
  - Removed macro irqtop_batch_mode.
  - Replaced macro irqtop_printf() to inline function
  - Changed option '--number' to '--iter'
  - Replace strdup() to xstrdup()
  - Added json output format for irqtop.
  - Remove irqtop input file support.

Joe Jin (4):
  irqtop: add batch mode support
  irqtop: add max iteration support
  irqtop: support json output format
  lsirq: add support for reading data from given file

 bash-completion/irqtop  |  12 +++-
 bash-completion/lsirq   |   4 ++
 sys-utils/irq-common.c  |  19 +++---
 sys-utils/irq-common.h  |   3 +-
 sys-utils/irqtop.1.adoc |   9 +++
 sys-utils/irqtop.c      | 124 +++++++++++++++++++++++++++++++---------
 sys-utils/lsirq.1.adoc  |   3 +
 sys-utils/lsirq.c       |  24 ++++++--
 8 files changed, 155 insertions(+), 43 deletions(-)

-- 
2.43.5


^ permalink raw reply	[flat|nested] 13+ messages in thread

* [PATCH V2 1/4] irqtop: add batch mode support
  2025-02-28 16:13 [PATCH V2 0/4] irqtop,lsirq: Miscellaneous enhancements Joe Jin
@ 2025-02-28 16:13 ` Joe Jin
  2025-02-28 16:13 ` [PATCH V2 2/4] irqtop: add max iteration support Joe Jin
                   ` (4 subsequent siblings)
  5 siblings, 0 replies; 13+ messages in thread
From: Joe Jin @ 2025-02-28 16:13 UTC (permalink / raw)
  To: Karel Zak, Zhenwei Pi, Sami Kerola; +Cc: util-linux, Joe Jin

Add batch mode support, which could be useful for sending output to
other programs or to a file.

Signed-off-by: Joe Jin <joe.jin@oracle.com>
Cc: Zhenwei Pi <pizhenwei@bytedance.com>
Cc: Sami Kerola <kerolasa@iki.fi>
Cc: Karel Zak <kzak@redhat.com>
---
 bash-completion/irqtop  |  6 ++-
 sys-utils/irqtop.1.adoc |  3 ++
 sys-utils/irqtop.c      | 89 ++++++++++++++++++++++++++++++-----------
 3 files changed, 73 insertions(+), 25 deletions(-)

diff --git a/bash-completion/irqtop b/bash-completion/irqtop
index b9e454d4c..215281ee8 100644
--- a/bash-completion/irqtop
+++ b/bash-completion/irqtop
@@ -5,6 +5,9 @@ _irqtop_module()
 	cur="${COMP_WORDS[COMP_CWORD]}"
 	prev="${COMP_WORDS[COMP_CWORD-1]}"
 	case $prev in
+		'-b'|'--batch')
+			return 0
+			;;
 		'-c'|'--cpu-stat')
 			COMPREPLY=( $(compgen -W "auto enable disable" -- $cur) )
 			return 0
@@ -40,7 +43,8 @@ _irqtop_module()
 			return 0
 			;;
 	esac
-	OPTS="	--cpu-stat
+	OPTS="	--batch
+		--cpu-stat
 		--cpu-list
 		--delay
 		--sort
diff --git a/sys-utils/irqtop.1.adoc b/sys-utils/irqtop.1.adoc
index 443e23b84..e81f4fbb6 100644
--- a/sys-utils/irqtop.1.adoc
+++ b/sys-utils/irqtop.1.adoc
@@ -25,6 +25,9 @@ The default output is subject to change. So whenever possible, you should avoid
 *-o*, *--output* _list_::
 Specify which output columns to print. Use *--help* to get a list of all supported columns. The default list of columns may be extended if list is specified in the format _+list_.
 
+*-b*, *--batch*::
+Starts irqtop in batch mode, which could be useful for sending output to other programs or to a file.
+
 *-c*, *--cpu-stat* _mode_::
 Show per-cpu statistics by specified mode. Available modes are: *auto*, *enable*, *disable*. The default option *auto* detects the width of window, then shows the per-cpu statistics if the width of window is large enough to show a full line of statistics.
 
diff --git a/sys-utils/irqtop.c b/sys-utils/irqtop.c
index 8fbedb16a..81a137be0 100644
--- a/sys-utils/irqtop.c
+++ b/sys-utils/irqtop.c
@@ -83,10 +83,32 @@ struct irqtop_ctl {
 	cpu_set_t *cpuset;
 
 	enum irqtop_cpustat_mode cpustat_mode;
+	bool	batch;
 	bool	request_exit,
 		softirq;
 };
 
+static inline int irqtop_printf(struct irqtop_ctl *ctl, const char *fmt, ...)
+{
+	int ret = 0;
+	va_list args;
+
+	if (!ctl)
+		return -1;
+
+	va_start(args, fmt);
+	if (ctl->batch)
+		ret = vprintf(fmt, args);
+	else
+		ret = vw_printw(ctl->win, fmt, args);
+	va_end(args);
+
+	if (!ctl->batch && ret == OK)
+		wrefresh(ctl->win);
+
+	return ret;
+}
+
 /* user's input parser */
 static void parse_input(struct irqtop_ctl *ctl, struct irq_output *out, char c)
 {
@@ -128,16 +150,19 @@ static int update_screen(struct irqtop_ctl *ctl, struct irq_output *out)
 			scols_table_enable_nowrap(cpus, 1);
 	}
 
-	/* print header */
-	move(0, 0);
 	strtime_iso(&now, ISO_TIMESTAMP, timestr, sizeof(timestr));
-	wprintw(ctl->win, _("irqtop | total: %ld delta: %ld | %s | %s\n\n"),
+	if (!ctl->batch)
+		move(0, 0);
+
+	/* print header */
+	irqtop_printf(ctl, _("irqtop | total: %ld delta: %ld | %s | %s\n\n"),
 			   stat->total_irq, stat->delta_irq, ctl->hostname, timestr);
 
+
 	/* print cpus table or not by -c option */
 	if (cpus) {
 		scols_print_table_to_string(cpus, &data);
-		wprintw(ctl->win, "%s\n\n", data);
+		irqtop_printf(ctl, "%s\n\n", data);
 		free(data);
 	}
 
@@ -149,13 +174,15 @@ static int update_screen(struct irqtop_ctl *ctl, struct irq_output *out)
 	if (p) {
 		/* print header in reverse mode */
 		*p = '\0';
-		attron(A_REVERSE);
-		wprintw(ctl->win, "%s\n", data);
-		attroff(A_REVERSE);
+		if (!ctl->batch)
+			attron(A_REVERSE);
+		irqtop_printf(ctl, "%s\n", data);
+		if (!ctl->batch)
+			attroff(A_REVERSE);
 		data = p + 1;
 	}
 
-	wprintw(ctl->win, "%s", data);
+	irqtop_printf(ctl, "%s\n\n", data);
 	free(data0);
 
 	/* clean up */
@@ -212,7 +239,8 @@ static int event_loop(struct irqtop_ctl *ctl, struct irq_output *out)
 		err(EXIT_FAILURE, _("epoll_ctl failed"));
 
 	retval |= update_screen(ctl, out);
-	refresh();
+	if (!ctl->batch)
+		refresh();
 
 	while (!ctl->request_exit) {
 		const ssize_t nr_events = epoll_wait(efd, events, MAX_EVENTS, -1);
@@ -227,10 +255,12 @@ static int event_loop(struct irqtop_ctl *ctl, struct irq_output *out)
 					continue;
 				}
 				if (siginfo.ssi_signo == SIGWINCH) {
-					get_terminal_dimension(&ctl->cols, &ctl->rows);
+					if (!ctl->batch) {
+						get_terminal_dimension(&ctl->cols, &ctl->rows);
 #if HAVE_RESIZETERM
-					resizeterm(ctl->rows, ctl->cols);
+						resizeterm(ctl->rows, ctl->cols);
 #endif
+					}
 				}
 				else {
 					ctl->request_exit = 1;
@@ -245,7 +275,8 @@ static int event_loop(struct irqtop_ctl *ctl, struct irq_output *out)
 			} else
 				abort();
 			retval |= update_screen(ctl, out);
-			refresh();
+			if (!ctl->batch)
+				refresh();
 		}
 	}
 	return retval;
@@ -260,6 +291,7 @@ static void __attribute__((__noreturn__)) usage(void)
 	puts(_("Interactive utility to display kernel interrupt information."));
 
 	fputs(USAGE_OPTIONS, stdout);
+	fputs(_(" -b, --batch batch mode\n"), stdout);
 	fputs(_(" -c, --cpu-stat <mode> show per-cpu stat (auto, enable, disable)\n"), stdout);
 	fputs(_(" -C, --cpu-list <list> specify cpus in list format\n"), stdout);
 	fputs(_(" -d, --delay <secs>   delay updates\n"), stdout);
@@ -291,6 +323,7 @@ static void parse_args(	struct irqtop_ctl *ctl,
 {
 	const char *outarg = NULL;
 	static const struct option longopts[] = {
+		{"batch", no_argument, NULL, 'b'},
 		{"cpu-stat", required_argument, NULL, 'c'},
 		{"cpu-list", required_argument, NULL, 'C'},
 		{"delay", required_argument, NULL, 'd'},
@@ -304,8 +337,11 @@ static void parse_args(	struct irqtop_ctl *ctl,
 	};
 	int o;
 
-	while ((o = getopt_long(argc, argv, "c:C:d:o:s:St:hV", longopts, NULL)) != -1) {
+	while ((o = getopt_long(argc, argv, "bc:C:d:o:s:St:hV", longopts, NULL)) != -1) {
 		switch (o) {
+		case 'b':
+			ctl->batch = 1;
+			break;
 		case 'c':
 			if (!strcmp(optarg, "auto"))
 				ctl->cpustat_mode = IRQTOP_CPUSTAT_AUTO;
@@ -394,16 +430,18 @@ int main(int argc, char **argv)
 
 	parse_args(&ctl, &out, argc, argv);
 
-	is_tty = isatty(STDIN_FILENO);
-	if (is_tty && tcgetattr(STDIN_FILENO, &saved_tty) == -1)
-		fputs(_("terminal setting retrieval"), stdout);
+	if (!ctl.batch) {
+		is_tty = isatty(STDIN_FILENO);
+		if (is_tty && tcgetattr(STDIN_FILENO, &saved_tty) == -1)
+			fputs(_("terminal setting retrieval"), stdout);
 
-	ctl.win = initscr();
-	get_terminal_dimension(&ctl.cols, &ctl.rows);
+		ctl.win = initscr();
+		get_terminal_dimension(&ctl.cols, &ctl.rows);
 #if HAVE_RESIZETERM
-	resizeterm(ctl.rows, ctl.cols);
+		resizeterm(ctl.rows, ctl.cols);
 #endif
-	curs_set(0);
+		curs_set(0);
+	}
 
 	ctl.hostname = xgethostname();
 	event_loop(&ctl, &out);
@@ -412,10 +450,13 @@ int main(int argc, char **argv)
 	free(ctl.hostname);
 	cpuset_free(ctl.cpuset);
 
-	if (is_tty)
-		tcsetattr(STDIN_FILENO, TCSAFLUSH, &saved_tty);
-	delwin(ctl.win);
-	endwin();
+	if (!ctl.batch) {
+		if (is_tty)
+			tcsetattr(STDIN_FILENO, TCSAFLUSH, &saved_tty);
+
+		delwin(ctl.win);
+		endwin();
+	}
 
 	return EXIT_SUCCESS;
 }
-- 
2.43.5


^ permalink raw reply related	[flat|nested] 13+ messages in thread

* [PATCH V2 2/4] irqtop: add max iteration support
  2025-02-28 16:13 [PATCH V2 0/4] irqtop,lsirq: Miscellaneous enhancements Joe Jin
  2025-02-28 16:13 ` [PATCH V2 1/4] irqtop: add batch mode support Joe Jin
@ 2025-02-28 16:13 ` Joe Jin
  2025-03-03  9:39   ` zhenwei pi
  2025-02-28 16:13 ` [PATCH V2 3/4] irqtop: support json output format Joe Jin
                   ` (3 subsequent siblings)
  5 siblings, 1 reply; 13+ messages in thread
From: Joe Jin @ 2025-02-28 16:13 UTC (permalink / raw)
  To: Karel Zak, Zhenwei Pi, Sami Kerola; +Cc: util-linux, Joe Jin

Add support for setting the number of iterations. This is useful in
non-interactive mode.

Signed-off-by: Joe Jin <joe.jin@oracle.com>
Cc: Zhenwei Pi <pizhenwei@bytedance.com>
Cc: Sami Kerola <kerolasa@iki.fi>
Cc: Karel Zak <kzak@redhat.com>
---
 bash-completion/irqtop  |  5 +++++
 sys-utils/irqtop.1.adoc |  3 +++
 sys-utils/irqtop.c      | 19 +++++++++++++++++--
 3 files changed, 25 insertions(+), 2 deletions(-)

diff --git a/bash-completion/irqtop b/bash-completion/irqtop
index 215281ee8..d18ef99bb 100644
--- a/bash-completion/irqtop
+++ b/bash-completion/irqtop
@@ -22,6 +22,10 @@ _irqtop_module()
 			COMPREPLY=( $(compgen -W "secs" -- $cur) )
 			return 0
 			;;
+		'-n'|'--iter')
+			COMPREPLY=( $(compgen -W "the max iterations" -- $cur) )
+			return 0
+			;;
 		'-s'|'--sort')
 			COMPREPLY=( $(compgen -W "irq total delta name" -- $cur) )
 			return 0
@@ -47,6 +51,7 @@ _irqtop_module()
 		--cpu-stat
 		--cpu-list
 		--delay
+		--iter
 		--sort
 		--output
 		--softirq
diff --git a/sys-utils/irqtop.1.adoc b/sys-utils/irqtop.1.adoc
index e81f4fbb6..75930f5cf 100644
--- a/sys-utils/irqtop.1.adoc
+++ b/sys-utils/irqtop.1.adoc
@@ -37,6 +37,9 @@ Specify cpus in list format to show.
 *-d*, *--delay* _seconds_::
 Update interrupt output every _seconds_ intervals.
 
+*-n*, *--iter* _number_::
+Specifies the maximum iterations before quitting.
+
 *-s*, *--sort* _column_::
 Specify sort criteria by column name. See *--help* output to get column names. The sort criteria may be changes in interactive mode.
 
diff --git a/sys-utils/irqtop.c b/sys-utils/irqtop.c
index 81a137be0..17c7d72cb 100644
--- a/sys-utils/irqtop.c
+++ b/sys-utils/irqtop.c
@@ -83,6 +83,7 @@ struct irqtop_ctl {
 	cpu_set_t *cpuset;
 
 	enum irqtop_cpustat_mode cpustat_mode;
+	int64_t	iter;
 	bool	batch;
 	bool	request_exit,
 		softirq;
@@ -190,6 +191,12 @@ static int update_screen(struct irqtop_ctl *ctl, struct irq_output *out)
 	if (ctl->prev_stat)
 		free_irqstat(ctl->prev_stat);
 	ctl->prev_stat = stat;
+
+	if (ctl->iter > 0) {
+		ctl->iter--;
+		if (ctl->iter == 0)
+			ctl->request_exit = 1;
+	}
 	return 0;
 }
 
@@ -295,6 +302,7 @@ static void __attribute__((__noreturn__)) usage(void)
 	fputs(_(" -c, --cpu-stat <mode> show per-cpu stat (auto, enable, disable)\n"), stdout);
 	fputs(_(" -C, --cpu-list <list> specify cpus in list format\n"), stdout);
 	fputs(_(" -d, --delay <secs>   delay updates\n"), stdout);
+	fputs(_(" -n, --iter <number>  the maximum number of iterations\n"), stdout);
 	fputs(_(" -o, --output <list>  define which output columns to use\n"), stdout);
 	fputs(_(" -s, --sort <column>  specify sort column\n"), stdout);
 	fputs(_(" -S, --softirq        show softirqs instead of interrupts\n"), stdout);
@@ -327,6 +335,7 @@ static void parse_args(	struct irqtop_ctl *ctl,
 		{"cpu-stat", required_argument, NULL, 'c'},
 		{"cpu-list", required_argument, NULL, 'C'},
 		{"delay", required_argument, NULL, 'd'},
+		{"iter", required_argument, NULL, 'n'},
 		{"sort", required_argument, NULL, 's'},
 		{"output", required_argument, NULL, 'o'},
 		{"softirq", no_argument, NULL, 'S'},
@@ -337,7 +346,7 @@ static void parse_args(	struct irqtop_ctl *ctl,
 	};
 	int o;
 
-	while ((o = getopt_long(argc, argv, "bc:C:d:o:s:St:hV", longopts, NULL)) != -1) {
+	while ((o = getopt_long(argc, argv, "bc:C:d:n:o:s:St:hV", longopts, NULL)) != -1) {
 		switch (o) {
 		case 'b':
 			ctl->batch = 1;
@@ -377,6 +386,11 @@ static void parse_args(	struct irqtop_ctl *ctl,
 				ctl->timer.it_value = ctl->timer.it_interval;
 			}
 			break;
+		case 'n':
+			ctl->iter = str2num_or_err(optarg, 10,
+					_("failed to parse iter argument"),
+					0, INT_MAX);
+			break;
 		case 's':
 			set_sort_func_by_name(out, optarg);
 			break;
@@ -423,7 +437,8 @@ int main(int argc, char **argv)
 	};
 	struct irqtop_ctl ctl = {
 		.timer.it_interval = {3, 0},
-		.timer.it_value = {3, 0}
+		.timer.it_value = {3, 0},
+		.iter = -1
 	};
 
 	setlocale(LC_ALL, "");
-- 
2.43.5


^ permalink raw reply related	[flat|nested] 13+ messages in thread

* [PATCH V2 3/4] irqtop: support json output format
  2025-02-28 16:13 [PATCH V2 0/4] irqtop,lsirq: Miscellaneous enhancements Joe Jin
  2025-02-28 16:13 ` [PATCH V2 1/4] irqtop: add batch mode support Joe Jin
  2025-02-28 16:13 ` [PATCH V2 2/4] irqtop: add max iteration support Joe Jin
@ 2025-02-28 16:13 ` Joe Jin
  2025-02-28 16:13 ` [PATCH V2 4/4] lsirq: add support for reading data from given file Joe Jin
                   ` (2 subsequent siblings)
  5 siblings, 0 replies; 13+ messages in thread
From: Joe Jin @ 2025-02-28 16:13 UTC (permalink / raw)
  To: Karel Zak, Zhenwei Pi, Sami Kerola; +Cc: util-linux, Joe Jin

Signed-off-by: Joe Jin <joe.jin@oracle.com>
Cc: Zhenwei Pi <pizhenwei@bytedance.com>
Cc: Sami Kerola <kerolasa@iki.fi>
Cc: Karel Zak <kzak@redhat.com>
---
 bash-completion/irqtop  | 1 +
 sys-utils/irqtop.1.adoc | 3 +++
 sys-utils/irqtop.c      | 8 +++++++-
 3 files changed, 11 insertions(+), 1 deletion(-)

diff --git a/bash-completion/irqtop b/bash-completion/irqtop
index d18ef99bb..5faf122e5 100644
--- a/bash-completion/irqtop
+++ b/bash-completion/irqtop
@@ -48,6 +48,7 @@ _irqtop_module()
 			;;
 	esac
 	OPTS="	--batch
+		--json
 		--cpu-stat
 		--cpu-list
 		--delay
diff --git a/sys-utils/irqtop.1.adoc b/sys-utils/irqtop.1.adoc
index 75930f5cf..880ee1906 100644
--- a/sys-utils/irqtop.1.adoc
+++ b/sys-utils/irqtop.1.adoc
@@ -37,6 +37,9 @@ Specify cpus in list format to show.
 *-d*, *--delay* _seconds_::
 Update interrupt output every _seconds_ intervals.
 
+*-J*, *--json*::
+Use JSON output format. irqtop will run in batch mode.
+
 *-n*, *--iter* _number_::
 Specifies the maximum iterations before quitting.
 
diff --git a/sys-utils/irqtop.c b/sys-utils/irqtop.c
index 17c7d72cb..48b65201f 100644
--- a/sys-utils/irqtop.c
+++ b/sys-utils/irqtop.c
@@ -302,6 +302,7 @@ static void __attribute__((__noreturn__)) usage(void)
 	fputs(_(" -c, --cpu-stat <mode> show per-cpu stat (auto, enable, disable)\n"), stdout);
 	fputs(_(" -C, --cpu-list <list> specify cpus in list format\n"), stdout);
 	fputs(_(" -d, --delay <secs>   delay updates\n"), stdout);
+	fputs(_(" -J, --json  use JSON output format (will run in batch mode)\n"), stdout);
 	fputs(_(" -n, --iter <number>  the maximum number of iterations\n"), stdout);
 	fputs(_(" -o, --output <list>  define which output columns to use\n"), stdout);
 	fputs(_(" -s, --sort <column>  specify sort column\n"), stdout);
@@ -336,6 +337,7 @@ static void parse_args(	struct irqtop_ctl *ctl,
 		{"cpu-list", required_argument, NULL, 'C'},
 		{"delay", required_argument, NULL, 'd'},
 		{"iter", required_argument, NULL, 'n'},
+		{"json", no_argument, NULL, 'J'},
 		{"sort", required_argument, NULL, 's'},
 		{"output", required_argument, NULL, 'o'},
 		{"softirq", no_argument, NULL, 'S'},
@@ -346,7 +348,7 @@ static void parse_args(	struct irqtop_ctl *ctl,
 	};
 	int o;
 
-	while ((o = getopt_long(argc, argv, "bc:C:d:n:o:s:St:hV", longopts, NULL)) != -1) {
+	while ((o = getopt_long(argc, argv, "bc:C:d:Jn:o:s:St:hV", longopts, NULL)) != -1) {
 		switch (o) {
 		case 'b':
 			ctl->batch = 1;
@@ -386,6 +388,10 @@ static void parse_args(	struct irqtop_ctl *ctl,
 				ctl->timer.it_value = ctl->timer.it_interval;
 			}
 			break;
+		case 'J':
+			out->json = 1;
+			ctl->batch = 1;
+			break;
 		case 'n':
 			ctl->iter = str2num_or_err(optarg, 10,
 					_("failed to parse iter argument"),
-- 
2.43.5


^ permalink raw reply related	[flat|nested] 13+ messages in thread

* [PATCH V2 4/4] lsirq: add support for reading data from given file
  2025-02-28 16:13 [PATCH V2 0/4] irqtop,lsirq: Miscellaneous enhancements Joe Jin
                   ` (2 preceding siblings ...)
  2025-02-28 16:13 ` [PATCH V2 3/4] irqtop: support json output format Joe Jin
@ 2025-02-28 16:13 ` Joe Jin
  2025-03-03 10:16 ` [PATCH V2 0/4] irqtop,lsirq: Miscellaneous enhancements Karel Zak
  2025-03-04 10:58 ` Karel Zak
  5 siblings, 0 replies; 13+ messages in thread
From: Joe Jin @ 2025-02-28 16:13 UTC (permalink / raw)
  To: Karel Zak, Zhenwei Pi, Sami Kerola; +Cc: util-linux, Joe Jin

This is helpful for analyzng data saved from other system.

Signed-off-by: Joe Jin <joe.jin@oracle.com>
Cc: Zhenwei Pi <pizhenwei@bytedance.com>
Cc: Sami Kerola <kerolasa@iki.fi>
Cc: Karel Zak <kzak@redhat.com>
---
 bash-completion/lsirq  |  4 ++++
 sys-utils/irq-common.c | 19 +++++++++----------
 sys-utils/irq-common.h |  3 ++-
 sys-utils/irqtop.c     | 12 ++++++++++--
 sys-utils/lsirq.1.adoc |  3 +++
 sys-utils/lsirq.c      | 24 ++++++++++++++++++++----
 6 files changed, 48 insertions(+), 17 deletions(-)

diff --git a/bash-completion/lsirq b/bash-completion/lsirq
index 4c3c9f04f..b913eecd0 100644
--- a/bash-completion/lsirq
+++ b/bash-completion/lsirq
@@ -5,6 +5,9 @@ _lsirq_module()
 	cur="${COMP_WORDS[COMP_CWORD]}"
 	prev="${COMP_WORDS[COMP_CWORD-1]}"
 	case $prev in
+		'-i'|'--input')
+			COMPREPLY=( $(compgen -W "input file" -- $cur) )
+			;;
 		'-o'|'--output')
 			local prefix realcur OUTPUT
 			realcur="${cur##*,}"
@@ -35,6 +38,7 @@ _lsirq_module()
 	OPTS="	--json
 		--pairs
 		--noheadings
+		--input
 		--output
 		--softirq
 		--sort
diff --git a/sys-utils/irq-common.c b/sys-utils/irq-common.c
index f069d8a63..560dd4b82 100644
--- a/sys-utils/irq-common.c
+++ b/sys-utils/irq-common.c
@@ -233,7 +233,8 @@ static bool cpu_in_list(int cpu, size_t setsize, cpu_set_t *cpuset)
 /*
  * irqinfo - parse the system's interrupts
  */
-static struct irq_stat *get_irqinfo(int softirq, size_t setsize, cpu_set_t *cpuset)
+static struct irq_stat *get_irqinfo(const char *input_file, int softirq,
+				    size_t setsize, cpu_set_t *cpuset)
 {
 	FILE *irqfile;
 	char *line = NULL, *tmp;
@@ -247,18 +248,15 @@ static struct irq_stat *get_irqinfo(int softirq, size_t setsize, cpu_set_t *cpus
 	stat->irq_info = xmalloc(sizeof(*stat->irq_info) * IRQ_INFO_LEN);
 	stat->nr_irq_info = IRQ_INFO_LEN;
 
-	if (softirq)
-		irqfile = fopen(_PATH_PROC_SOFTIRQS, "r");
-	else
-		irqfile = fopen(_PATH_PROC_INTERRUPTS, "r");
+	irqfile = fopen(input_file, "r");
 	if (!irqfile) {
-		warn(_("cannot open %s"), _PATH_PROC_INTERRUPTS);
+		warn(_("cannot open %s"), input_file);
 		goto free_stat;
 	}
 
 	/* read header firstly */
 	if (getline(&line, &len, irqfile) < 0) {
-		warn(_("cannot read %s"), _PATH_PROC_INTERRUPTS);
+		warn(_("cannot read %s"), input_file);
 		goto close_file;
 	}
 
@@ -270,7 +268,7 @@ static struct irq_stat *get_irqinfo(int softirq, size_t setsize, cpu_set_t *cpus
 
 	stat->cpus =  xcalloc(stat->nr_active_cpu, sizeof(struct irq_cpu));
 
-	/* parse each line of _PATH_PROC_INTERRUPTS */
+	/* parse each line of input file */
 	while (getline(&line, &len, irqfile) >= 0) {
 		unsigned long count;
 		size_t index;
@@ -527,7 +525,8 @@ struct libscols_table *get_scols_cpus_table(struct irq_output *out,
 	return NULL;
 }
 
-struct libscols_table *get_scols_table(struct irq_output *out,
+struct libscols_table *get_scols_table(const char *input_file,
+					      struct irq_output *out,
 					      struct irq_stat *prev,
 					      struct irq_stat **xstat,
 					      int softirq,
@@ -542,7 +541,7 @@ struct libscols_table *get_scols_table(struct irq_output *out,
 	size_t i;
 
 	/* the stats */
-	stat = get_irqinfo(softirq, setsize, cpuset);
+	stat = get_irqinfo(input_file, softirq, setsize, cpuset);
 	if (!stat)
 		return NULL;
 
diff --git a/sys-utils/irq-common.h b/sys-utils/irq-common.h
index 02b72d752..b9cf72d2a 100644
--- a/sys-utils/irq-common.h
+++ b/sys-utils/irq-common.h
@@ -73,7 +73,8 @@ void irq_print_columns(FILE *f, int nodelta);
 void set_sort_func_by_name(struct irq_output *out, const char *name);
 void set_sort_func_by_key(struct irq_output *out, const char c);
 
-struct libscols_table *get_scols_table(struct irq_output *out,
+struct libscols_table *get_scols_table(const char *input_file,
+                                              struct irq_output *out,
                                               struct irq_stat *prev,
                                               struct irq_stat **xstat,
                                               int softirq,
diff --git a/sys-utils/irqtop.c b/sys-utils/irqtop.c
index 48b65201f..6d001cb10 100644
--- a/sys-utils/irqtop.c
+++ b/sys-utils/irqtop.c
@@ -130,10 +130,18 @@ static int update_screen(struct irqtop_ctl *ctl, struct irq_output *out)
 	struct irq_stat *stat;
 	time_t now = time(NULL);
 	char timestr[64], *data, *data0, *p;
+	char *input_file;
 
 	/* make irqs table */
-	table = get_scols_table(out, ctl->prev_stat, &stat, ctl->softirq,
-				ctl->threshold, ctl->setsize, ctl->cpuset);
+	if (ctl->softirq)
+		input_file = xstrdup(_PATH_PROC_SOFTIRQS);
+	else
+		input_file = xstrdup(_PATH_PROC_INTERRUPTS);
+
+	table = get_scols_table(input_file, out, ctl->prev_stat, &stat,
+				ctl->softirq, ctl->threshold, ctl->setsize,
+				ctl->cpuset);
+	free(input_file);
 	if (!table) {
 		ctl->request_exit = 1;
 		return 1;
diff --git a/sys-utils/lsirq.1.adoc b/sys-utils/lsirq.1.adoc
index 02aea16b3..dd265710c 100644
--- a/sys-utils/lsirq.1.adoc
+++ b/sys-utils/lsirq.1.adoc
@@ -25,6 +25,9 @@ The default output is subject to change. So whenever possible, you should avoid
 *-n*, *--noheadings*::
 Don't print headings.
 
+*-i*, *--input* _file_::
+Read data from _file_ (Which was created by other tools, e.g. sosreport).
+
 *-o*, *--output* _list_::
 Specify which output columns to print. Use *--help* to get a list of all supported columns. The default list of columns may be extended if list is specified in the format _+list_.
 
diff --git a/sys-utils/lsirq.c b/sys-utils/lsirq.c
index e31addaf5..fa2dcaaf3 100644
--- a/sys-utils/lsirq.c
+++ b/sys-utils/lsirq.c
@@ -29,16 +29,17 @@
 #include "optutils.h"
 #include "strutils.h"
 #include "xalloc.h"
+#include "pathnames.h"
 
 #include "irq-common.h"
 
-static int print_irq_data(struct irq_output *out,
+static int print_irq_data(const char *input_file, struct irq_output *out,
 			  int softirq, unsigned long threshold,
 			  size_t setsize, cpu_set_t *cpuset)
 {
 	struct libscols_table *table;
 
-	table = get_scols_table(out, NULL, NULL, softirq, threshold, setsize, cpuset);
+	table = get_scols_table(input_file, out, NULL, NULL, softirq, threshold, setsize, cpuset);
 	if (!table)
 		return -1;
 
@@ -58,6 +59,7 @@ static void __attribute__((__noreturn__)) usage(void)
 	fputs(USAGE_OPTIONS, stdout);
 	fputs(_(" -J, --json           use JSON output format\n"), stdout);
 	fputs(_(" -P, --pairs          use key=\"value\" output format\n"), stdout);
+	fputs(_(" -i, --input          read data from input file\n"), stdout);
 	fputs(_(" -n, --noheadings     don't print headings\n"), stdout);
 	fputs(_(" -o, --output <list>  define which output columns to use\n"), stdout);
 	fputs(_(" -s, --sort <column>  specify sort column\n"), stdout);
@@ -82,6 +84,7 @@ int main(int argc, char **argv)
 	static const struct option longopts[] = {
 		{"sort", required_argument, NULL, 's'},
 		{"noheadings", no_argument, NULL, 'n'},
+		{"input", required_argument, NULL, 'i'},
 		{"output", required_argument, NULL, 'o'},
 		{"threshold", required_argument, NULL, 't'},
 		{"cpu-list", required_argument, NULL, 'C'},
@@ -103,10 +106,11 @@ int main(int argc, char **argv)
 	cpu_set_t *cpuset = NULL;
 	size_t setsize = 0;
 	int softirq = 0;
+	char *input_file = NULL;
 
 	setlocale(LC_ALL, "");
 
-	while ((c = getopt_long(argc, argv, "no:s:t:C:ShJPV", longopts, NULL)) != -1) {
+	while ((c = getopt_long(argc, argv, "i:no:s:t:C:ShJPV", longopts, NULL)) != -1) {
 		err_exclusive_options(c, longopts, excl, excl_st);
 
 		switch (c) {
@@ -116,6 +120,9 @@ int main(int argc, char **argv)
 		case 'P':
 			out.pairs = 1;
 			break;
+		case 'i':
+			input_file = xstrdup(optarg);
+			break;
 		case 'n':
 			out.no_headings = 1;
 			break;
@@ -157,6 +164,13 @@ int main(int argc, char **argv)
 		}
 	}
 
+	if (input_file == NULL) {
+		if (softirq == 1)
+			input_file = xstrdup(_PATH_PROC_SOFTIRQS);
+		else
+			input_file = xstrdup(_PATH_PROC_INTERRUPTS);
+	}
+
 	/* default */
 	if (!out.ncolumns) {
 		out.columns[out.ncolumns++] = COL_IRQ;
@@ -171,8 +185,10 @@ int main(int argc, char **argv)
 				irq_column_name_to_id) < 0)
 		exit(EXIT_FAILURE);
 
-	if (print_irq_data(&out, softirq, threshold, setsize, cpuset) < 0)
+	if (print_irq_data(input_file, &out, softirq, threshold, setsize, cpuset) < 0)
 		return EXIT_FAILURE;
 
+	free(input_file);
+
 	return EXIT_SUCCESS;
 }
-- 
2.43.5


^ permalink raw reply related	[flat|nested] 13+ messages in thread

* Re: [PATCH V2 2/4] irqtop: add max iteration support
  2025-02-28 16:13 ` [PATCH V2 2/4] irqtop: add max iteration support Joe Jin
@ 2025-03-03  9:39   ` zhenwei pi
  2025-03-04  1:39     ` Joe Jin
  0 siblings, 1 reply; 13+ messages in thread
From: zhenwei pi @ 2025-03-03  9:39 UTC (permalink / raw)
  To: Joe Jin, Karel Zak, Sami Kerola; +Cc: util-linux



On 3/1/25 00:13, Joe Jin wrote:
> Add support for setting the number of iterations. This is useful in
> non-interactive mode.
> 
> Signed-off-by: Joe Jin <joe.jin@oracle.com>
> Cc: Zhenwei Pi <pizhenwei@bytedance.com>
> Cc: Sami Kerola <kerolasa@iki.fi>
> Cc: Karel Zak <kzak@redhat.com>
> ---
>   bash-completion/irqtop  |  5 +++++
>   sys-utils/irqtop.1.adoc |  3 +++
>   sys-utils/irqtop.c      | 19 +++++++++++++++++--
>   3 files changed, 25 insertions(+), 2 deletions(-)
> 
> diff --git a/bash-completion/irqtop b/bash-completion/irqtop
> index 215281ee8..d18ef99bb 100644
> --- a/bash-completion/irqtop
> +++ b/bash-completion/irqtop
> @@ -22,6 +22,10 @@ _irqtop_module()
>   			COMPREPLY=( $(compgen -W "secs" -- $cur) )
>   			return 0
>   			;;
> +		'-n'|'--iter')
> +			COMPREPLY=( $(compgen -W "the max iterations" -- $cur) )
> +			return 0
> +			;;
>   		'-s'|'--sort')
>   			COMPREPLY=( $(compgen -W "irq total delta name" -- $cur) )
>   			return 0
> @@ -47,6 +51,7 @@ _irqtop_module()
>   		--cpu-stat
>   		--cpu-list
>   		--delay
> +		--iter
>   		--sort
>   		--output
>   		--softirq
> diff --git a/sys-utils/irqtop.1.adoc b/sys-utils/irqtop.1.adoc
> index e81f4fbb6..75930f5cf 100644
> --- a/sys-utils/irqtop.1.adoc
> +++ b/sys-utils/irqtop.1.adoc
> @@ -37,6 +37,9 @@ Specify cpus in list format to show.
>   *-d*, *--delay* _seconds_::
>   Update interrupt output every _seconds_ intervals.
>   
> +*-n*, *--iter* _number_::
> +Specifies the maximum iterations before quitting.
> +
>   *-s*, *--sort* _column_::
>   Specify sort criteria by column name. See *--help* output to get column names. The sort criteria may be changes in interactive mode.
>   
> diff --git a/sys-utils/irqtop.c b/sys-utils/irqtop.c
> index 81a137be0..17c7d72cb 100644
> --- a/sys-utils/irqtop.c
> +++ b/sys-utils/irqtop.c
> @@ -83,6 +83,7 @@ struct irqtop_ctl {
>   	cpu_set_t *cpuset;
>   
>   	enum irqtop_cpustat_mode cpustat_mode;
> +	int64_t	iter;
>   	bool	batch;
>   	bool	request_exit,
>   		softirq;
> @@ -190,6 +191,12 @@ static int update_screen(struct irqtop_ctl *ctl, struct irq_output *out)
>   	if (ctl->prev_stat)
>   		free_irqstat(ctl->prev_stat);
>   	ctl->prev_stat = stat;
> +
> +	if (ctl->iter > 0) {
> +		ctl->iter--;
> +		if (ctl->iter == 0)
> +			ctl->request_exit = 1;
> +	}
>   	return 0;
>   }

If ctl->iter is initialized as int64_max, then we have codes like:

if (--ctl->iter == 0) {
     ctl->request_exit = 1;
}

>   
> @@ -295,6 +302,7 @@ static void __attribute__((__noreturn__)) usage(void)
>   	fputs(_(" -c, --cpu-stat <mode> show per-cpu stat (auto, enable, disable)\n"), stdout);
>   	fputs(_(" -C, --cpu-list <list> specify cpus in list format\n"), stdout);
>   	fputs(_(" -d, --delay <secs>   delay updates\n"), stdout);
> +	fputs(_(" -n, --iter <number>  the maximum number of iterations\n"), stdout);
>   	fputs(_(" -o, --output <list>  define which output columns to use\n"), stdout);
>   	fputs(_(" -s, --sort <column>  specify sort column\n"), stdout);
>   	fputs(_(" -S, --softirq        show softirqs instead of interrupts\n"), stdout);
> @@ -327,6 +335,7 @@ static void parse_args(	struct irqtop_ctl *ctl,
>   		{"cpu-stat", required_argument, NULL, 'c'},
>   		{"cpu-list", required_argument, NULL, 'C'},
>   		{"delay", required_argument, NULL, 'd'},
> +		{"iter", required_argument, NULL, 'n'},
>   		{"sort", required_argument, NULL, 's'},
>   		{"output", required_argument, NULL, 'o'},
>   		{"softirq", no_argument, NULL, 'S'},
> @@ -337,7 +346,7 @@ static void parse_args(	struct irqtop_ctl *ctl,
>   	};
>   	int o;
>   
> -	while ((o = getopt_long(argc, argv, "bc:C:d:o:s:St:hV", longopts, NULL)) != -1) {
> +	while ((o = getopt_long(argc, argv, "bc:C:d:n:o:s:St:hV", longopts, NULL)) != -1) {
>   		switch (o) {
>   		case 'b':
>   			ctl->batch = 1;
> @@ -377,6 +386,11 @@ static void parse_args(	struct irqtop_ctl *ctl,
>   				ctl->timer.it_value = ctl->timer.it_interval;
>   			}
>   			break;
> +		case 'n':
> +			ctl->iter = str2num_or_err(optarg, 10,
> +					_("failed to parse iter argument"),
> +					0, INT_MAX);
> +			break;
>   		case 's':
>   			set_sort_func_by_name(out, optarg);
>   			break;
> @@ -423,7 +437,8 @@ int main(int argc, char **argv)
>   	};
>   	struct irqtop_ctl ctl = {
>   		.timer.it_interval = {3, 0},
> -		.timer.it_value = {3, 0}
> +		.timer.it_value = {3, 0},
> +		.iter = -1
>   	};
>   
>   	setlocale(LC_ALL, "");


^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH V2 0/4] irqtop,lsirq: Miscellaneous enhancements
  2025-02-28 16:13 [PATCH V2 0/4] irqtop,lsirq: Miscellaneous enhancements Joe Jin
                   ` (3 preceding siblings ...)
  2025-02-28 16:13 ` [PATCH V2 4/4] lsirq: add support for reading data from given file Joe Jin
@ 2025-03-03 10:16 ` Karel Zak
  2025-03-04  1:38   ` Joe Jin
  2025-03-04 10:58 ` Karel Zak
  5 siblings, 1 reply; 13+ messages in thread
From: Karel Zak @ 2025-03-03 10:16 UTC (permalink / raw)
  To: Joe Jin; +Cc: Zhenwei Pi, Sami Kerola, util-linux

On Fri, Feb 28, 2025 at 08:13:30AM GMT, Joe Jin wrote:
> This patchset add below new options for irqtop:
>  '-b|--batch' : Batch mode
>  '-n|--iter'  : Specifies the maximum number of iterations
>  '-J|--json'  : Json ouput format
> 
> Add below for lsirq:
>  '-i|--input' : Read data from file
> 
> v2:
>   - Removed macro irqtop_batch_mode.
>   - Replaced macro irqtop_printf() to inline function
>   - Changed option '--number' to '--iter'
>   - Replace strdup() to xstrdup()
>   - Added json output format for irqtop.
>   - Remove irqtop input file support.
> 
> Joe Jin (4):
>   irqtop: add batch mode support
>   irqtop: add max iteration support
>   irqtop: support json output format
>   lsirq: add support for reading data from given file
> 
>  bash-completion/irqtop  |  12 +++-
>  bash-completion/lsirq   |   4 ++
>  sys-utils/irq-common.c  |  19 +++---
>  sys-utils/irq-common.h  |   3 +-
>  sys-utils/irqtop.1.adoc |   9 +++
>  sys-utils/irqtop.c      | 124 +++++++++++++++++++++++++++++++---------
>  sys-utils/lsirq.1.adoc  |   3 +
>  sys-utils/lsirq.c       |  24 ++++++--
>  8 files changed, 155 insertions(+), 43 deletions(-)

Thanks for the update. I have created a PR
(https://github.com/util-linux/util-linux/pull/3435) to test it with
CI tests.

    Karel

-- 
 Karel Zak  <kzak@redhat.com>
 http://karelzak.blogspot.com


^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH V2 0/4] irqtop,lsirq: Miscellaneous enhancements
  2025-03-03 10:16 ` [PATCH V2 0/4] irqtop,lsirq: Miscellaneous enhancements Karel Zak
@ 2025-03-04  1:38   ` Joe Jin
  2025-03-04  3:50     ` zhenwei pi
  0 siblings, 1 reply; 13+ messages in thread
From: Joe Jin @ 2025-03-04  1:38 UTC (permalink / raw)
  To: Karel Zak; +Cc: Zhenwei Pi, Sami Kerola, util-linux

On 3/3/25 02:16, Karel Zak wrote:
> On Fri, Feb 28, 2025 at 08:13:30AM GMT, Joe Jin wrote:
>> This patchset add below new options for irqtop:
>>  '-b|--batch' : Batch mode
>>  '-n|--iter'  : Specifies the maximum number of iterations
>>  '-J|--json'  : Json ouput format
>>
>> Add below for lsirq:
>>  '-i|--input' : Read data from file
>>
>> v2:
>>   - Removed macro irqtop_batch_mode.
>>   - Replaced macro irqtop_printf() to inline function
>>   - Changed option '--number' to '--iter'
>>   - Replace strdup() to xstrdup()
>>   - Added json output format for irqtop.
>>   - Remove irqtop input file support.
>>
>> Joe Jin (4):
>>   irqtop: add batch mode support
>>   irqtop: add max iteration support
>>   irqtop: support json output format
>>   lsirq: add support for reading data from given file
>>
>>  bash-completion/irqtop  |  12 +++-
>>  bash-completion/lsirq   |   4 ++
>>  sys-utils/irq-common.c  |  19 +++---
>>  sys-utils/irq-common.h  |   3 +-
>>  sys-utils/irqtop.1.adoc |   9 +++
>>  sys-utils/irqtop.c      | 124 +++++++++++++++++++++++++++++++---------
>>  sys-utils/lsirq.1.adoc  |   3 +
>>  sys-utils/lsirq.c       |  24 ++++++--
>>  8 files changed, 155 insertions(+), 43 deletions(-)
> Thanks for the update. I have created a PR
> (https://github.com/util-linux/util-linux/pull/3435) to test it with
> CI tests.

Thanks so much!


>     Karel
>


^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH V2 2/4] irqtop: add max iteration support
  2025-03-03  9:39   ` zhenwei pi
@ 2025-03-04  1:39     ` Joe Jin
  2025-03-04  3:49       ` zhenwei pi
  0 siblings, 1 reply; 13+ messages in thread
From: Joe Jin @ 2025-03-04  1:39 UTC (permalink / raw)
  To: zhenwei pi, Karel Zak, Sami Kerola; +Cc: util-linux

On 3/3/25 01:39, zhenwei pi wrote:
>
>
> On 3/1/25 00:13, Joe Jin wrote:
>> Add support for setting the number of iterations. This is useful in
>> non-interactive mode.
>>
>> Signed-off-by: Joe Jin <joe.jin@oracle.com>
>> Cc: Zhenwei Pi <pizhenwei@bytedance.com>
>> Cc: Sami Kerola <kerolasa@iki.fi>
>> Cc: Karel Zak <kzak@redhat.com>
>> ---
>>   bash-completion/irqtop  |  5 +++++
>>   sys-utils/irqtop.1.adoc |  3 +++
>>   sys-utils/irqtop.c      | 19 +++++++++++++++++--
>>   3 files changed, 25 insertions(+), 2 deletions(-)
>>
>> diff --git a/bash-completion/irqtop b/bash-completion/irqtop
>> index 215281ee8..d18ef99bb 100644
>> --- a/bash-completion/irqtop
>> +++ b/bash-completion/irqtop
>> @@ -22,6 +22,10 @@ _irqtop_module()
>>               COMPREPLY=( $(compgen -W "secs" -- $cur) )
>>               return 0
>>               ;;
>> +        '-n'|'--iter')
>> +            COMPREPLY=( $(compgen -W "the max iterations" -- $cur) )
>> +            return 0
>> +            ;;
>>           '-s'|'--sort')
>>               COMPREPLY=( $(compgen -W "irq total delta name" -- $cur) )
>>               return 0
>> @@ -47,6 +51,7 @@ _irqtop_module()
>>           --cpu-stat
>>           --cpu-list
>>           --delay
>> +        --iter
>>           --sort
>>           --output
>>           --softirq
>> diff --git a/sys-utils/irqtop.1.adoc b/sys-utils/irqtop.1.adoc
>> index e81f4fbb6..75930f5cf 100644
>> --- a/sys-utils/irqtop.1.adoc
>> +++ b/sys-utils/irqtop.1.adoc
>> @@ -37,6 +37,9 @@ Specify cpus in list format to show.
>>   *-d*, *--delay* _seconds_::
>>   Update interrupt output every _seconds_ intervals.
>>   +*-n*, *--iter* _number_::
>> +Specifies the maximum iterations before quitting.
>> +
>>   *-s*, *--sort* _column_::
>>   Specify sort criteria by column name. See *--help* output to get column names. The sort criteria may be changes in interactive mode.
>>   diff --git a/sys-utils/irqtop.c b/sys-utils/irqtop.c
>> index 81a137be0..17c7d72cb 100644
>> --- a/sys-utils/irqtop.c
>> +++ b/sys-utils/irqtop.c
>> @@ -83,6 +83,7 @@ struct irqtop_ctl {
>>       cpu_set_t *cpuset;
>>         enum irqtop_cpustat_mode cpustat_mode;
>> +    int64_t    iter;
>>       bool    batch;
>>       bool    request_exit,
>>           softirq;
>> @@ -190,6 +191,12 @@ static int update_screen(struct irqtop_ctl *ctl, struct irq_output *out)
>>       if (ctl->prev_stat)
>>           free_irqstat(ctl->prev_stat);
>>       ctl->prev_stat = stat;
>> +
>> +    if (ctl->iter > 0) {
>> +        ctl->iter--;
>> +        if (ctl->iter == 0)
>> +            ctl->request_exit = 1;
>> +    }
>>       return 0;
>>   }
>
> If ctl->iter is initialized as int64_max, then we have codes like:
>
> if (--ctl->iter == 0) {
>     ctl->request_exit = 1;
> }

Yes they are exactly same.
As Karel has queued for CI test, maybe keep current code?

Thanks,
Joe
>
>>   @@ -295,6 +302,7 @@ static void __attribute__((__noreturn__)) usage(void)
>>       fputs(_(" -c, --cpu-stat <mode> show per-cpu stat (auto, enable, disable)\n"), stdout);
>>       fputs(_(" -C, --cpu-list <list> specify cpus in list format\n"), stdout);
>>       fputs(_(" -d, --delay <secs>   delay updates\n"), stdout);
>> +    fputs(_(" -n, --iter <number>  the maximum number of iterations\n"), stdout);
>>       fputs(_(" -o, --output <list>  define which output columns to use\n"), stdout);
>>       fputs(_(" -s, --sort <column>  specify sort column\n"), stdout);
>>       fputs(_(" -S, --softirq        show softirqs instead of interrupts\n"), stdout);
>> @@ -327,6 +335,7 @@ static void parse_args(    struct irqtop_ctl *ctl,
>>           {"cpu-stat", required_argument, NULL, 'c'},
>>           {"cpu-list", required_argument, NULL, 'C'},
>>           {"delay", required_argument, NULL, 'd'},
>> +        {"iter", required_argument, NULL, 'n'},
>>           {"sort", required_argument, NULL, 's'},
>>           {"output", required_argument, NULL, 'o'},
>>           {"softirq", no_argument, NULL, 'S'},
>> @@ -337,7 +346,7 @@ static void parse_args(    struct irqtop_ctl *ctl,
>>       };
>>       int o;
>>   -    while ((o = getopt_long(argc, argv, "bc:C:d:o:s:St:hV", longopts, NULL)) != -1) {
>> +    while ((o = getopt_long(argc, argv, "bc:C:d:n:o:s:St:hV", longopts, NULL)) != -1) {
>>           switch (o) {
>>           case 'b':
>>               ctl->batch = 1;
>> @@ -377,6 +386,11 @@ static void parse_args(    struct irqtop_ctl *ctl,
>>                   ctl->timer.it_value = ctl->timer.it_interval;
>>               }
>>               break;
>> +        case 'n':
>> +            ctl->iter = str2num_or_err(optarg, 10,
>> +                    _("failed to parse iter argument"),
>> +                    0, INT_MAX);
>> +            break;
>>           case 's':
>>               set_sort_func_by_name(out, optarg);
>>               break;
>> @@ -423,7 +437,8 @@ int main(int argc, char **argv)
>>       };
>>       struct irqtop_ctl ctl = {
>>           .timer.it_interval = {3, 0},
>> -        .timer.it_value = {3, 0}
>> +        .timer.it_value = {3, 0},
>> +        .iter = -1
>>       };
>>         setlocale(LC_ALL, "");
>


^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: Re: [PATCH V2 2/4] irqtop: add max iteration support
  2025-03-04  1:39     ` Joe Jin
@ 2025-03-04  3:49       ` zhenwei pi
  0 siblings, 0 replies; 13+ messages in thread
From: zhenwei pi @ 2025-03-04  3:49 UTC (permalink / raw)
  To: Joe Jin, Karel Zak, Sami Kerola; +Cc: util-linux

>>
>> If ctl->iter is initialized as int64_max, then we have codes like:
>>
>> if (--ctl->iter == 0) {
>>      ctl->request_exit = 1;
>> }
> 
> Yes they are exactly same.
> As Karel has queued for CI test, maybe keep current code?
> 
> Thanks,
> Joe

Fine.

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: Re: [PATCH V2 0/4] irqtop,lsirq: Miscellaneous enhancements
  2025-03-04  1:38   ` Joe Jin
@ 2025-03-04  3:50     ` zhenwei pi
  0 siblings, 0 replies; 13+ messages in thread
From: zhenwei pi @ 2025-03-04  3:50 UTC (permalink / raw)
  To: Joe Jin, Karel Zak; +Cc: Sami Kerola, util-linux

This series looks good to me!

Reviewed-by: zhenwei pi <pizhenwei@bytedance.com>

On 3/4/25 09:38, Joe Jin wrote:
> On 3/3/25 02:16, Karel Zak wrote:
>> On Fri, Feb 28, 2025 at 08:13:30AM GMT, Joe Jin wrote:
>>> This patchset add below new options for irqtop:
>>>   '-b|--batch' : Batch mode
>>>   '-n|--iter'  : Specifies the maximum number of iterations
>>>   '-J|--json'  : Json ouput format
>>>
>>> Add below for lsirq:
>>>   '-i|--input' : Read data from file
>>>
>>> v2:
>>>    - Removed macro irqtop_batch_mode.
>>>    - Replaced macro irqtop_printf() to inline function
>>>    - Changed option '--number' to '--iter'
>>>    - Replace strdup() to xstrdup()
>>>    - Added json output format for irqtop.
>>>    - Remove irqtop input file support.
>>>
>>> Joe Jin (4):
>>>    irqtop: add batch mode support
>>>    irqtop: add max iteration support
>>>    irqtop: support json output format
>>>    lsirq: add support for reading data from given file
>>>
>>>   bash-completion/irqtop  |  12 +++-
>>>   bash-completion/lsirq   |   4 ++
>>>   sys-utils/irq-common.c  |  19 +++---
>>>   sys-utils/irq-common.h  |   3 +-
>>>   sys-utils/irqtop.1.adoc |   9 +++
>>>   sys-utils/irqtop.c      | 124 +++++++++++++++++++++++++++++++---------
>>>   sys-utils/lsirq.1.adoc  |   3 +
>>>   sys-utils/lsirq.c       |  24 ++++++--
>>>   8 files changed, 155 insertions(+), 43 deletions(-)
>> Thanks for the update. I have created a PR
>> (https://github.com/util-linux/util-linux/pull/3435) to test it with
>> CI tests.
> 
> Thanks so much!
> 
> 
>>      Karel
>>
> 


^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH V2 0/4] irqtop,lsirq: Miscellaneous enhancements
  2025-02-28 16:13 [PATCH V2 0/4] irqtop,lsirq: Miscellaneous enhancements Joe Jin
                   ` (4 preceding siblings ...)
  2025-03-03 10:16 ` [PATCH V2 0/4] irqtop,lsirq: Miscellaneous enhancements Karel Zak
@ 2025-03-04 10:58 ` Karel Zak
  2025-03-05  2:23   ` Joe Jin
  5 siblings, 1 reply; 13+ messages in thread
From: Karel Zak @ 2025-03-04 10:58 UTC (permalink / raw)
  To: Joe Jin; +Cc: Zhenwei Pi, Sami Kerola, util-linux

On Fri, Feb 28, 2025 at 08:13:30AM GMT, Joe Jin wrote:
> v2:
>   - Removed macro irqtop_batch_mode.
>   - Replaced macro irqtop_printf() to inline function
>   - Changed option '--number' to '--iter'
>   - Replace strdup() to xstrdup()
>   - Added json output format for irqtop.
>   - Remove irqtop input file support.
> 
> Joe Jin (4):
>   irqtop: add batch mode support
>   irqtop: add max iteration support
>   irqtop: support json output format
>   lsirq: add support for reading data from given file
> 
>  bash-completion/irqtop  |  12 +++-
>  bash-completion/lsirq   |   4 ++
>  sys-utils/irq-common.c  |  19 +++---
>  sys-utils/irq-common.h  |   3 +-
>  sys-utils/irqtop.1.adoc |   9 +++
>  sys-utils/irqtop.c      | 124 +++++++++++++++++++++++++++++++---------
>  sys-utils/lsirq.1.adoc  |   3 +
>  sys-utils/lsirq.c       |  24 ++++++--
>  8 files changed, 155 insertions(+), 43 deletions(-)

 Applied, thanks.

    Karel

-- 
 Karel Zak  <kzak@redhat.com>
 http://karelzak.blogspot.com


^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH V2 0/4] irqtop,lsirq: Miscellaneous enhancements
  2025-03-04 10:58 ` Karel Zak
@ 2025-03-05  2:23   ` Joe Jin
  0 siblings, 0 replies; 13+ messages in thread
From: Joe Jin @ 2025-03-05  2:23 UTC (permalink / raw)
  To: Karel Zak; +Cc: Zhenwei Pi, Sami Kerola, util-linux

On 3/4/25 02:58, Karel Zak wrote:
> On Fri, Feb 28, 2025 at 08:13:30AM GMT, Joe Jin wrote:
>> v2:
>>   - Removed macro irqtop_batch_mode.
>>   - Replaced macro irqtop_printf() to inline function
>>   - Changed option '--number' to '--iter'
>>   - Replace strdup() to xstrdup()
>>   - Added json output format for irqtop.
>>   - Remove irqtop input file support.
>>
>> Joe Jin (4):
>>   irqtop: add batch mode support
>>   irqtop: add max iteration support
>>   irqtop: support json output format
>>   lsirq: add support for reading data from given file
>>
>>  bash-completion/irqtop  |  12 +++-
>>  bash-completion/lsirq   |   4 ++
>>  sys-utils/irq-common.c  |  19 +++---
>>  sys-utils/irq-common.h  |   3 +-
>>  sys-utils/irqtop.1.adoc |   9 +++
>>  sys-utils/irqtop.c      | 124 +++++++++++++++++++++++++++++++---------
>>  sys-utils/lsirq.1.adoc  |   3 +
>>  sys-utils/lsirq.c       |  24 ++++++--
>>  8 files changed, 155 insertions(+), 43 deletions(-)
>  Applied, thanks.

Thanks so much!


>
>     Karel
>


^ permalink raw reply	[flat|nested] 13+ messages in thread

end of thread, other threads:[~2025-03-05  2:23 UTC | newest]

Thread overview: 13+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-02-28 16:13 [PATCH V2 0/4] irqtop,lsirq: Miscellaneous enhancements Joe Jin
2025-02-28 16:13 ` [PATCH V2 1/4] irqtop: add batch mode support Joe Jin
2025-02-28 16:13 ` [PATCH V2 2/4] irqtop: add max iteration support Joe Jin
2025-03-03  9:39   ` zhenwei pi
2025-03-04  1:39     ` Joe Jin
2025-03-04  3:49       ` zhenwei pi
2025-02-28 16:13 ` [PATCH V2 3/4] irqtop: support json output format Joe Jin
2025-02-28 16:13 ` [PATCH V2 4/4] lsirq: add support for reading data from given file Joe Jin
2025-03-03 10:16 ` [PATCH V2 0/4] irqtop,lsirq: Miscellaneous enhancements Karel Zak
2025-03-04  1:38   ` Joe Jin
2025-03-04  3:50     ` zhenwei pi
2025-03-04 10:58 ` Karel Zak
2025-03-05  2:23   ` Joe Jin

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox