* [Intel-gfx] [PATCH i-g-t 0/3] More intel_gpu_top improvements
@ 2023-02-03 11:16 ` Tvrtko Ursulin
0 siblings, 0 replies; 28+ messages in thread
From: Tvrtko Ursulin @ 2023-02-03 11:16 UTC (permalink / raw)
To: igt-dev, Intel-gfx
From: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
Suggestion was received to omit repeating header lines when outputting to a file
and also to add the CVS mode for easy parsing. We have JSON but I guess CVS can
definitely be easier for some use cases.
Tvrtko Ursulin (3):
intel_gpu_top: Do not repeat header lines in non-interactive output
intel_gpu_top: Rename STDOUT to TEXT
intel_gpu_top: Add CVS output format
man/intel_gpu_top.rst | 3 +
tools/intel_gpu_top.c | 137 +++++++++++++++++++++++++++++++++---------
2 files changed, 111 insertions(+), 29 deletions(-)
--
2.34.1
^ permalink raw reply [flat|nested] 28+ messages in thread
* [igt-dev] [PATCH i-g-t 0/3] More intel_gpu_top improvements
@ 2023-02-03 11:16 ` Tvrtko Ursulin
0 siblings, 0 replies; 28+ messages in thread
From: Tvrtko Ursulin @ 2023-02-03 11:16 UTC (permalink / raw)
To: igt-dev, Intel-gfx; +Cc: Tvrtko Ursulin
From: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
Suggestion was received to omit repeating header lines when outputting to a file
and also to add the CVS mode for easy parsing. We have JSON but I guess CVS can
definitely be easier for some use cases.
Tvrtko Ursulin (3):
intel_gpu_top: Do not repeat header lines in non-interactive output
intel_gpu_top: Rename STDOUT to TEXT
intel_gpu_top: Add CVS output format
man/intel_gpu_top.rst | 3 +
tools/intel_gpu_top.c | 137 +++++++++++++++++++++++++++++++++---------
2 files changed, 111 insertions(+), 29 deletions(-)
--
2.34.1
^ permalink raw reply [flat|nested] 28+ messages in thread
* [Intel-gfx] [PATCH i-g-t 1/3] intel_gpu_top: Do not repeat header lines in non-interactive output
2023-02-03 11:16 ` [igt-dev] " Tvrtko Ursulin
@ 2023-02-03 11:16 ` Tvrtko Ursulin
-1 siblings, 0 replies; 28+ messages in thread
From: Tvrtko Ursulin @ 2023-02-03 11:16 UTC (permalink / raw)
To: igt-dev, Intel-gfx; +Cc: Caleb Callaway
From: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
If output is redirected to a file, or a pipe, lets not repeat the headers
because that can usually mean user is trying to parse the data later and
so repeated headers are a hindrance.
Signed-off-by: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
Cc: Caleb Callaway <caleb.callaway@intel.com>
---
tools/intel_gpu_top.c | 19 ++++++++++++++-----
1 file changed, 14 insertions(+), 5 deletions(-)
diff --git a/tools/intel_gpu_top.c b/tools/intel_gpu_top.c
index 0a1de41b3374..e2a7f4753099 100644
--- a/tools/intel_gpu_top.c
+++ b/tools/intel_gpu_top.c
@@ -1391,6 +1391,7 @@ static unsigned int stdout_level;
#define STDOUT_HEADER_REPEAT 20
static unsigned int stdout_lines = STDOUT_HEADER_REPEAT;
+static bool stdout_header_repeat;
static void
stdout_open_struct(const char *name)
@@ -1580,16 +1581,22 @@ static const struct print_operations term_pops = {
static bool print_groups(struct cnt_group **groups)
{
- unsigned int headers = stdout_lines % STDOUT_HEADER_REPEAT + 1;
+ static bool headers_printed = false;
bool print_data = true;
- if (output_mode == STDOUT && (headers == 1 || headers == 2)) {
- for (struct cnt_group **grp = groups; *grp; grp++)
- print_data = pops->print_group(*grp, headers);
+ if (output_mode == STDOUT &&
+ (stdout_header_repeat || !headers_printed)) {
+ unsigned int headers = stdout_lines % STDOUT_HEADER_REPEAT + 1;
+
+ if (headers == 1 || headers == 2)
+ for (struct cnt_group **grp = groups; *grp; grp++)
+ print_data = pops->print_group(*grp, headers);
+
+ headers_printed = print_data;
}
for (struct cnt_group **grp = groups; print_data && *grp; grp++)
- pops->print_group(*grp, false);
+ pops->print_group(*grp, 0);
return print_data;
}
@@ -2512,6 +2519,8 @@ int main(int argc, char **argv)
out = stdout;
}
+ stdout_header_repeat = output_mode == STDOUT && isatty(fileno(out));
+
if (signal(SIGINT, sigint_handler) == SIG_ERR)
fprintf(stderr, "Failed to install signal handler!\n");
--
2.34.1
^ permalink raw reply related [flat|nested] 28+ messages in thread
* [igt-dev] [PATCH i-g-t 1/3] intel_gpu_top: Do not repeat header lines in non-interactive output
@ 2023-02-03 11:16 ` Tvrtko Ursulin
0 siblings, 0 replies; 28+ messages in thread
From: Tvrtko Ursulin @ 2023-02-03 11:16 UTC (permalink / raw)
To: igt-dev, Intel-gfx; +Cc: Caleb Callaway, Tvrtko Ursulin
From: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
If output is redirected to a file, or a pipe, lets not repeat the headers
because that can usually mean user is trying to parse the data later and
so repeated headers are a hindrance.
Signed-off-by: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
Cc: Caleb Callaway <caleb.callaway@intel.com>
---
tools/intel_gpu_top.c | 19 ++++++++++++++-----
1 file changed, 14 insertions(+), 5 deletions(-)
diff --git a/tools/intel_gpu_top.c b/tools/intel_gpu_top.c
index 0a1de41b3374..e2a7f4753099 100644
--- a/tools/intel_gpu_top.c
+++ b/tools/intel_gpu_top.c
@@ -1391,6 +1391,7 @@ static unsigned int stdout_level;
#define STDOUT_HEADER_REPEAT 20
static unsigned int stdout_lines = STDOUT_HEADER_REPEAT;
+static bool stdout_header_repeat;
static void
stdout_open_struct(const char *name)
@@ -1580,16 +1581,22 @@ static const struct print_operations term_pops = {
static bool print_groups(struct cnt_group **groups)
{
- unsigned int headers = stdout_lines % STDOUT_HEADER_REPEAT + 1;
+ static bool headers_printed = false;
bool print_data = true;
- if (output_mode == STDOUT && (headers == 1 || headers == 2)) {
- for (struct cnt_group **grp = groups; *grp; grp++)
- print_data = pops->print_group(*grp, headers);
+ if (output_mode == STDOUT &&
+ (stdout_header_repeat || !headers_printed)) {
+ unsigned int headers = stdout_lines % STDOUT_HEADER_REPEAT + 1;
+
+ if (headers == 1 || headers == 2)
+ for (struct cnt_group **grp = groups; *grp; grp++)
+ print_data = pops->print_group(*grp, headers);
+
+ headers_printed = print_data;
}
for (struct cnt_group **grp = groups; print_data && *grp; grp++)
- pops->print_group(*grp, false);
+ pops->print_group(*grp, 0);
return print_data;
}
@@ -2512,6 +2519,8 @@ int main(int argc, char **argv)
out = stdout;
}
+ stdout_header_repeat = output_mode == STDOUT && isatty(fileno(out));
+
if (signal(SIGINT, sigint_handler) == SIG_ERR)
fprintf(stderr, "Failed to install signal handler!\n");
--
2.34.1
^ permalink raw reply related [flat|nested] 28+ messages in thread
* [Intel-gfx] [PATCH i-g-t 2/3] intel_gpu_top: Rename STDOUT to TEXT
2023-02-03 11:16 ` [igt-dev] " Tvrtko Ursulin
@ 2023-02-03 11:16 ` Tvrtko Ursulin
-1 siblings, 0 replies; 28+ messages in thread
From: Tvrtko Ursulin @ 2023-02-03 11:16 UTC (permalink / raw)
To: igt-dev, Intel-gfx; +Cc: Caleb Callaway
From: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
Internal cleanup only - the name text is more accurate given the output
can also go to a file.
Signed-off-by: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
Cc: Caleb Callaway <caleb.callaway@intel.com>
---
tools/intel_gpu_top.c | 54 +++++++++++++++++++++----------------------
1 file changed, 26 insertions(+), 28 deletions(-)
diff --git a/tools/intel_gpu_top.c b/tools/intel_gpu_top.c
index e2a7f4753099..a980cc7043dc 100644
--- a/tools/intel_gpu_top.c
+++ b/tools/intel_gpu_top.c
@@ -1282,7 +1282,7 @@ usage(const char *appname)
static enum {
INTERACTIVE,
- STDOUT,
+ TEXT,
JSON
} output_mode;
@@ -1387,33 +1387,31 @@ json_add_member(const struct cnt_group *parent, struct cnt_item *item,
return 1;
}
-static unsigned int stdout_level;
+static unsigned int text_level;
-#define STDOUT_HEADER_REPEAT 20
-static unsigned int stdout_lines = STDOUT_HEADER_REPEAT;
-static bool stdout_header_repeat;
+#define TEXT_HEADER_REPEAT 20
+static unsigned int text_lines = TEXT_HEADER_REPEAT;
+static bool text_header_repeat;
-static void
-stdout_open_struct(const char *name)
+static void text_open_struct(const char *name)
{
- stdout_level++;
- assert(stdout_level > 0);
+ text_level++;
+ assert(text_level > 0);
}
-static void
-stdout_close_struct(void)
+static void text_close_struct(void)
{
- assert(stdout_level > 0);
- if (--stdout_level == 0) {
- stdout_lines++;
+ assert(text_level > 0);
+ if (--text_level == 0) {
+ text_lines++;
fputs("\n", out);
fflush(out);
}
}
static unsigned int
-stdout_add_member(const struct cnt_group *parent, struct cnt_item *item,
- unsigned int headers)
+text_add_member(const struct cnt_group *parent, struct cnt_item *item,
+ unsigned int headers)
{
unsigned int fmt_tot = item->fmt_width + (item->fmt_precision ? 1 : 0);
char buf[fmt_tot + 1];
@@ -1565,10 +1563,10 @@ static const struct print_operations json_pops = {
.print_group = print_group,
};
-static const struct print_operations stdout_pops = {
- .open_struct = stdout_open_struct,
- .close_struct = stdout_close_struct,
- .add_member = stdout_add_member,
+static const struct print_operations text_pops = {
+ .open_struct = text_open_struct,
+ .close_struct = text_close_struct,
+ .add_member = text_add_member,
.print_group = print_group,
};
@@ -1584,9 +1582,9 @@ static bool print_groups(struct cnt_group **groups)
static bool headers_printed = false;
bool print_data = true;
- if (output_mode == STDOUT &&
- (stdout_header_repeat || !headers_printed)) {
- unsigned int headers = stdout_lines % STDOUT_HEADER_REPEAT + 1;
+ if (output_mode == TEXT &&
+ (text_header_repeat || !headers_printed)) {
+ unsigned int headers = text_lines % TEXT_HEADER_REPEAT + 1;
if (headers == 1 || headers == 2)
for (struct cnt_group **grp = groups; *grp; grp++)
@@ -2492,7 +2490,7 @@ int main(int argc, char **argv)
list_device = true;
break;
case 'l':
- output_mode = STDOUT;
+ output_mode = TEXT;
break;
case 'h':
usage(argv[0]);
@@ -2505,7 +2503,7 @@ int main(int argc, char **argv)
}
if (output_mode == INTERACTIVE && (output_path || isatty(1) != 1))
- output_mode = STDOUT;
+ output_mode = TEXT;
if (output_path && strcmp(output_path, "-")) {
out = fopen(output_path, "w");
@@ -2519,7 +2517,7 @@ int main(int argc, char **argv)
out = stdout;
}
- stdout_header_repeat = output_mode == STDOUT && isatty(fileno(out));
+ text_header_repeat = output_mode == TEXT && isatty(fileno(out));
if (signal(SIGINT, sigint_handler) == SIG_ERR)
fprintf(stderr, "Failed to install signal handler!\n");
@@ -2531,8 +2529,8 @@ int main(int argc, char **argv)
pops = &term_pops;
interactive_stdin();
break;
- case STDOUT:
- pops = &stdout_pops;
+ case TEXT:
+ pops = &text_pops;
break;
case JSON:
pops = &json_pops;
--
2.34.1
^ permalink raw reply related [flat|nested] 28+ messages in thread
* [igt-dev] [PATCH i-g-t 2/3] intel_gpu_top: Rename STDOUT to TEXT
@ 2023-02-03 11:16 ` Tvrtko Ursulin
0 siblings, 0 replies; 28+ messages in thread
From: Tvrtko Ursulin @ 2023-02-03 11:16 UTC (permalink / raw)
To: igt-dev, Intel-gfx; +Cc: Caleb Callaway, Tvrtko Ursulin
From: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
Internal cleanup only - the name text is more accurate given the output
can also go to a file.
Signed-off-by: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
Cc: Caleb Callaway <caleb.callaway@intel.com>
---
tools/intel_gpu_top.c | 54 +++++++++++++++++++++----------------------
1 file changed, 26 insertions(+), 28 deletions(-)
diff --git a/tools/intel_gpu_top.c b/tools/intel_gpu_top.c
index e2a7f4753099..a980cc7043dc 100644
--- a/tools/intel_gpu_top.c
+++ b/tools/intel_gpu_top.c
@@ -1282,7 +1282,7 @@ usage(const char *appname)
static enum {
INTERACTIVE,
- STDOUT,
+ TEXT,
JSON
} output_mode;
@@ -1387,33 +1387,31 @@ json_add_member(const struct cnt_group *parent, struct cnt_item *item,
return 1;
}
-static unsigned int stdout_level;
+static unsigned int text_level;
-#define STDOUT_HEADER_REPEAT 20
-static unsigned int stdout_lines = STDOUT_HEADER_REPEAT;
-static bool stdout_header_repeat;
+#define TEXT_HEADER_REPEAT 20
+static unsigned int text_lines = TEXT_HEADER_REPEAT;
+static bool text_header_repeat;
-static void
-stdout_open_struct(const char *name)
+static void text_open_struct(const char *name)
{
- stdout_level++;
- assert(stdout_level > 0);
+ text_level++;
+ assert(text_level > 0);
}
-static void
-stdout_close_struct(void)
+static void text_close_struct(void)
{
- assert(stdout_level > 0);
- if (--stdout_level == 0) {
- stdout_lines++;
+ assert(text_level > 0);
+ if (--text_level == 0) {
+ text_lines++;
fputs("\n", out);
fflush(out);
}
}
static unsigned int
-stdout_add_member(const struct cnt_group *parent, struct cnt_item *item,
- unsigned int headers)
+text_add_member(const struct cnt_group *parent, struct cnt_item *item,
+ unsigned int headers)
{
unsigned int fmt_tot = item->fmt_width + (item->fmt_precision ? 1 : 0);
char buf[fmt_tot + 1];
@@ -1565,10 +1563,10 @@ static const struct print_operations json_pops = {
.print_group = print_group,
};
-static const struct print_operations stdout_pops = {
- .open_struct = stdout_open_struct,
- .close_struct = stdout_close_struct,
- .add_member = stdout_add_member,
+static const struct print_operations text_pops = {
+ .open_struct = text_open_struct,
+ .close_struct = text_close_struct,
+ .add_member = text_add_member,
.print_group = print_group,
};
@@ -1584,9 +1582,9 @@ static bool print_groups(struct cnt_group **groups)
static bool headers_printed = false;
bool print_data = true;
- if (output_mode == STDOUT &&
- (stdout_header_repeat || !headers_printed)) {
- unsigned int headers = stdout_lines % STDOUT_HEADER_REPEAT + 1;
+ if (output_mode == TEXT &&
+ (text_header_repeat || !headers_printed)) {
+ unsigned int headers = text_lines % TEXT_HEADER_REPEAT + 1;
if (headers == 1 || headers == 2)
for (struct cnt_group **grp = groups; *grp; grp++)
@@ -2492,7 +2490,7 @@ int main(int argc, char **argv)
list_device = true;
break;
case 'l':
- output_mode = STDOUT;
+ output_mode = TEXT;
break;
case 'h':
usage(argv[0]);
@@ -2505,7 +2503,7 @@ int main(int argc, char **argv)
}
if (output_mode == INTERACTIVE && (output_path || isatty(1) != 1))
- output_mode = STDOUT;
+ output_mode = TEXT;
if (output_path && strcmp(output_path, "-")) {
out = fopen(output_path, "w");
@@ -2519,7 +2517,7 @@ int main(int argc, char **argv)
out = stdout;
}
- stdout_header_repeat = output_mode == STDOUT && isatty(fileno(out));
+ text_header_repeat = output_mode == TEXT && isatty(fileno(out));
if (signal(SIGINT, sigint_handler) == SIG_ERR)
fprintf(stderr, "Failed to install signal handler!\n");
@@ -2531,8 +2529,8 @@ int main(int argc, char **argv)
pops = &term_pops;
interactive_stdin();
break;
- case STDOUT:
- pops = &stdout_pops;
+ case TEXT:
+ pops = &text_pops;
break;
case JSON:
pops = &json_pops;
--
2.34.1
^ permalink raw reply related [flat|nested] 28+ messages in thread
* [Intel-gfx] [PATCH i-g-t 3/3] intel_gpu_top: Add CVS output format
2023-02-03 11:16 ` [igt-dev] " Tvrtko Ursulin
@ 2023-02-03 11:16 ` Tvrtko Ursulin
-1 siblings, 0 replies; 28+ messages in thread
From: Tvrtko Ursulin @ 2023-02-03 11:16 UTC (permalink / raw)
To: igt-dev, Intel-gfx; +Cc: Caleb Callaway
From: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
Add CVS output mode.
Signed-off-by: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
Cc: Caleb Callaway <caleb.callaway@intel.com>
---
man/intel_gpu_top.rst | 3 ++
tools/intel_gpu_top.c | 78 +++++++++++++++++++++++++++++++++++++++++--
2 files changed, 78 insertions(+), 3 deletions(-)
diff --git a/man/intel_gpu_top.rst b/man/intel_gpu_top.rst
index 69834756b81e..77228277b9bf 100644
--- a/man/intel_gpu_top.rst
+++ b/man/intel_gpu_top.rst
@@ -31,6 +31,9 @@ OPTIONS
-h
Show help text.
+-c
+ Output CVS formatted data.
+
-J
Output JSON formatted data.
diff --git a/tools/intel_gpu_top.c b/tools/intel_gpu_top.c
index a980cc7043dc..4c425ca027e3 100644
--- a/tools/intel_gpu_top.c
+++ b/tools/intel_gpu_top.c
@@ -1268,6 +1268,7 @@ usage(const char *appname)
"\n"
"\tThe following parameters are optional:\n\n"
"\t[-h] Show this help text.\n"
+ "\t[-c] Output CVS formatted data.\n"
"\t[-J] Output JSON formatted data.\n"
"\t[-l] List plain text data.\n"
"\t[-o <file|->] Output to specified file or '-' for standard out.\n"
@@ -1283,6 +1284,7 @@ usage(const char *appname)
static enum {
INTERACTIVE,
TEXT,
+ CVS,
JSON
} output_mode;
@@ -1457,6 +1459,22 @@ text_add_member(const struct cnt_group *parent, struct cnt_item *item,
return len > 0 ? len : 0;
}
+static unsigned int
+cvs_add_member(const struct cnt_group *parent, struct cnt_item *item,
+ unsigned int headers)
+{
+ int len = 0;
+
+ if (headers)
+ fprintf(out, "%s %s", parent->display_name, item->unit);
+ else
+ len = fprintf(out, "%f",
+ pmu_calc(&item->pmu->val, item->d, item->t,
+ item->s));
+
+ return len > 0 ? len : 0;
+}
+
static void
term_open_struct(const char *name)
{
@@ -1540,6 +1558,46 @@ print_group(struct cnt_group *grp, unsigned int headers)
return consumed;
}
+static unsigned int cvs_count, prev_cvs_count;
+
+static void cvs_close_struct(void)
+{
+ assert(text_level > 0);
+ if (--text_level == 0) {
+ cvs_count = prev_cvs_count = 0;
+ text_lines++;
+ fputs("\n", out);
+ fflush(out);
+ }
+}
+
+static bool
+cvs_print_group(struct cnt_group *grp, unsigned int headers)
+{
+ unsigned int consumed = 0;
+ struct cnt_item *item;
+
+ if (!present_in_group(grp))
+ return false;
+
+ text_open_struct(grp->name);
+
+ for (item = grp->items; item->name; item++) {
+ if (!item->pmu || !item->pmu->present)
+ continue;
+
+ if (cvs_count != prev_cvs_count)
+ fprintf(out, ",");
+ prev_cvs_count = cvs_count++;
+
+ consumed += cvs_add_member(grp, item, headers);
+ }
+
+ cvs_close_struct();
+
+ return consumed;
+}
+
static bool
term_print_group(struct cnt_group *grp, unsigned int headers)
{
@@ -1570,6 +1628,13 @@ static const struct print_operations text_pops = {
.print_group = print_group,
};
+static const struct print_operations cvs_pops = {
+ .open_struct = text_open_struct,
+ .close_struct = cvs_close_struct,
+ .add_member = cvs_add_member,
+ .print_group = cvs_print_group,
+};
+
static const struct print_operations term_pops = {
.open_struct = term_open_struct,
.close_struct = term_close_struct,
@@ -1582,11 +1647,12 @@ static bool print_groups(struct cnt_group **groups)
static bool headers_printed = false;
bool print_data = true;
- if (output_mode == TEXT &&
+ if ((output_mode == TEXT || output_mode == CVS) &&
(text_header_repeat || !headers_printed)) {
+ const unsigned int header_lines = output_mode == TEXT ? 2 : 1;
unsigned int headers = text_lines % TEXT_HEADER_REPEAT + 1;
- if (headers == 1 || headers == 2)
+ if (headers > 0 && headers <= header_lines)
for (struct cnt_group **grp = groups; *grp; grp++)
print_data = pops->print_group(*grp, headers);
@@ -2469,7 +2535,7 @@ int main(int argc, char **argv)
char *codename = NULL;
/* Parse options */
- while ((ch = getopt(argc, argv, "o:s:d:pJLlh")) != -1) {
+ while ((ch = getopt(argc, argv, "o:s:d:pcJLlh")) != -1) {
switch (ch) {
case 'o':
output_path = optarg;
@@ -2483,6 +2549,9 @@ int main(int argc, char **argv)
case 'p':
physical_engines = true;
break;
+ case 'c':
+ output_mode = CVS;
+ break;
case 'J':
output_mode = JSON;
break;
@@ -2532,6 +2601,9 @@ int main(int argc, char **argv)
case TEXT:
pops = &text_pops;
break;
+ case CVS:
+ pops = &cvs_pops;
+ break;
case JSON:
pops = &json_pops;
break;
--
2.34.1
^ permalink raw reply related [flat|nested] 28+ messages in thread
* [igt-dev] [PATCH i-g-t 3/3] intel_gpu_top: Add CVS output format
@ 2023-02-03 11:16 ` Tvrtko Ursulin
0 siblings, 0 replies; 28+ messages in thread
From: Tvrtko Ursulin @ 2023-02-03 11:16 UTC (permalink / raw)
To: igt-dev, Intel-gfx; +Cc: Caleb Callaway, Tvrtko Ursulin
From: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
Add CVS output mode.
Signed-off-by: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
Cc: Caleb Callaway <caleb.callaway@intel.com>
---
man/intel_gpu_top.rst | 3 ++
tools/intel_gpu_top.c | 78 +++++++++++++++++++++++++++++++++++++++++--
2 files changed, 78 insertions(+), 3 deletions(-)
diff --git a/man/intel_gpu_top.rst b/man/intel_gpu_top.rst
index 69834756b81e..77228277b9bf 100644
--- a/man/intel_gpu_top.rst
+++ b/man/intel_gpu_top.rst
@@ -31,6 +31,9 @@ OPTIONS
-h
Show help text.
+-c
+ Output CVS formatted data.
+
-J
Output JSON formatted data.
diff --git a/tools/intel_gpu_top.c b/tools/intel_gpu_top.c
index a980cc7043dc..4c425ca027e3 100644
--- a/tools/intel_gpu_top.c
+++ b/tools/intel_gpu_top.c
@@ -1268,6 +1268,7 @@ usage(const char *appname)
"\n"
"\tThe following parameters are optional:\n\n"
"\t[-h] Show this help text.\n"
+ "\t[-c] Output CVS formatted data.\n"
"\t[-J] Output JSON formatted data.\n"
"\t[-l] List plain text data.\n"
"\t[-o <file|->] Output to specified file or '-' for standard out.\n"
@@ -1283,6 +1284,7 @@ usage(const char *appname)
static enum {
INTERACTIVE,
TEXT,
+ CVS,
JSON
} output_mode;
@@ -1457,6 +1459,22 @@ text_add_member(const struct cnt_group *parent, struct cnt_item *item,
return len > 0 ? len : 0;
}
+static unsigned int
+cvs_add_member(const struct cnt_group *parent, struct cnt_item *item,
+ unsigned int headers)
+{
+ int len = 0;
+
+ if (headers)
+ fprintf(out, "%s %s", parent->display_name, item->unit);
+ else
+ len = fprintf(out, "%f",
+ pmu_calc(&item->pmu->val, item->d, item->t,
+ item->s));
+
+ return len > 0 ? len : 0;
+}
+
static void
term_open_struct(const char *name)
{
@@ -1540,6 +1558,46 @@ print_group(struct cnt_group *grp, unsigned int headers)
return consumed;
}
+static unsigned int cvs_count, prev_cvs_count;
+
+static void cvs_close_struct(void)
+{
+ assert(text_level > 0);
+ if (--text_level == 0) {
+ cvs_count = prev_cvs_count = 0;
+ text_lines++;
+ fputs("\n", out);
+ fflush(out);
+ }
+}
+
+static bool
+cvs_print_group(struct cnt_group *grp, unsigned int headers)
+{
+ unsigned int consumed = 0;
+ struct cnt_item *item;
+
+ if (!present_in_group(grp))
+ return false;
+
+ text_open_struct(grp->name);
+
+ for (item = grp->items; item->name; item++) {
+ if (!item->pmu || !item->pmu->present)
+ continue;
+
+ if (cvs_count != prev_cvs_count)
+ fprintf(out, ",");
+ prev_cvs_count = cvs_count++;
+
+ consumed += cvs_add_member(grp, item, headers);
+ }
+
+ cvs_close_struct();
+
+ return consumed;
+}
+
static bool
term_print_group(struct cnt_group *grp, unsigned int headers)
{
@@ -1570,6 +1628,13 @@ static const struct print_operations text_pops = {
.print_group = print_group,
};
+static const struct print_operations cvs_pops = {
+ .open_struct = text_open_struct,
+ .close_struct = cvs_close_struct,
+ .add_member = cvs_add_member,
+ .print_group = cvs_print_group,
+};
+
static const struct print_operations term_pops = {
.open_struct = term_open_struct,
.close_struct = term_close_struct,
@@ -1582,11 +1647,12 @@ static bool print_groups(struct cnt_group **groups)
static bool headers_printed = false;
bool print_data = true;
- if (output_mode == TEXT &&
+ if ((output_mode == TEXT || output_mode == CVS) &&
(text_header_repeat || !headers_printed)) {
+ const unsigned int header_lines = output_mode == TEXT ? 2 : 1;
unsigned int headers = text_lines % TEXT_HEADER_REPEAT + 1;
- if (headers == 1 || headers == 2)
+ if (headers > 0 && headers <= header_lines)
for (struct cnt_group **grp = groups; *grp; grp++)
print_data = pops->print_group(*grp, headers);
@@ -2469,7 +2535,7 @@ int main(int argc, char **argv)
char *codename = NULL;
/* Parse options */
- while ((ch = getopt(argc, argv, "o:s:d:pJLlh")) != -1) {
+ while ((ch = getopt(argc, argv, "o:s:d:pcJLlh")) != -1) {
switch (ch) {
case 'o':
output_path = optarg;
@@ -2483,6 +2549,9 @@ int main(int argc, char **argv)
case 'p':
physical_engines = true;
break;
+ case 'c':
+ output_mode = CVS;
+ break;
case 'J':
output_mode = JSON;
break;
@@ -2532,6 +2601,9 @@ int main(int argc, char **argv)
case TEXT:
pops = &text_pops;
break;
+ case CVS:
+ pops = &cvs_pops;
+ break;
case JSON:
pops = &json_pops;
break;
--
2.34.1
^ permalink raw reply related [flat|nested] 28+ messages in thread
* Re: [Intel-gfx] [igt-dev] [PATCH i-g-t 3/3] intel_gpu_top: Add CVS output format
2023-02-03 11:16 ` [igt-dev] " Tvrtko Ursulin
@ 2023-02-03 11:22 ` Ville Syrjälä
-1 siblings, 0 replies; 28+ messages in thread
From: Ville Syrjälä @ 2023-02-03 11:22 UTC (permalink / raw)
To: Tvrtko Ursulin; +Cc: igt-dev, Intel-gfx, Caleb Callaway
On Fri, Feb 03, 2023 at 11:16:36AM +0000, Tvrtko Ursulin wrote:
> From: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
>
> Add CVS output mode.
Should that be csv?
>
> Signed-off-by: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
> Cc: Caleb Callaway <caleb.callaway@intel.com>
> ---
> man/intel_gpu_top.rst | 3 ++
> tools/intel_gpu_top.c | 78 +++++++++++++++++++++++++++++++++++++++++--
> 2 files changed, 78 insertions(+), 3 deletions(-)
>
> diff --git a/man/intel_gpu_top.rst b/man/intel_gpu_top.rst
> index 69834756b81e..77228277b9bf 100644
> --- a/man/intel_gpu_top.rst
> +++ b/man/intel_gpu_top.rst
> @@ -31,6 +31,9 @@ OPTIONS
> -h
> Show help text.
>
> +-c
> + Output CVS formatted data.
> +
> -J
> Output JSON formatted data.
>
> diff --git a/tools/intel_gpu_top.c b/tools/intel_gpu_top.c
> index a980cc7043dc..4c425ca027e3 100644
> --- a/tools/intel_gpu_top.c
> +++ b/tools/intel_gpu_top.c
> @@ -1268,6 +1268,7 @@ usage(const char *appname)
> "\n"
> "\tThe following parameters are optional:\n\n"
> "\t[-h] Show this help text.\n"
> + "\t[-c] Output CVS formatted data.\n"
> "\t[-J] Output JSON formatted data.\n"
> "\t[-l] List plain text data.\n"
> "\t[-o <file|->] Output to specified file or '-' for standard out.\n"
> @@ -1283,6 +1284,7 @@ usage(const char *appname)
> static enum {
> INTERACTIVE,
> TEXT,
> + CVS,
> JSON
> } output_mode;
>
> @@ -1457,6 +1459,22 @@ text_add_member(const struct cnt_group *parent, struct cnt_item *item,
> return len > 0 ? len : 0;
> }
>
> +static unsigned int
> +cvs_add_member(const struct cnt_group *parent, struct cnt_item *item,
> + unsigned int headers)
> +{
> + int len = 0;
> +
> + if (headers)
> + fprintf(out, "%s %s", parent->display_name, item->unit);
> + else
> + len = fprintf(out, "%f",
> + pmu_calc(&item->pmu->val, item->d, item->t,
> + item->s));
> +
> + return len > 0 ? len : 0;
> +}
> +
> static void
> term_open_struct(const char *name)
> {
> @@ -1540,6 +1558,46 @@ print_group(struct cnt_group *grp, unsigned int headers)
> return consumed;
> }
>
> +static unsigned int cvs_count, prev_cvs_count;
> +
> +static void cvs_close_struct(void)
> +{
> + assert(text_level > 0);
> + if (--text_level == 0) {
> + cvs_count = prev_cvs_count = 0;
> + text_lines++;
> + fputs("\n", out);
> + fflush(out);
> + }
> +}
> +
> +static bool
> +cvs_print_group(struct cnt_group *grp, unsigned int headers)
> +{
> + unsigned int consumed = 0;
> + struct cnt_item *item;
> +
> + if (!present_in_group(grp))
> + return false;
> +
> + text_open_struct(grp->name);
> +
> + for (item = grp->items; item->name; item++) {
> + if (!item->pmu || !item->pmu->present)
> + continue;
> +
> + if (cvs_count != prev_cvs_count)
> + fprintf(out, ",");
> + prev_cvs_count = cvs_count++;
> +
> + consumed += cvs_add_member(grp, item, headers);
> + }
> +
> + cvs_close_struct();
> +
> + return consumed;
> +}
> +
> static bool
> term_print_group(struct cnt_group *grp, unsigned int headers)
> {
> @@ -1570,6 +1628,13 @@ static const struct print_operations text_pops = {
> .print_group = print_group,
> };
>
> +static const struct print_operations cvs_pops = {
> + .open_struct = text_open_struct,
> + .close_struct = cvs_close_struct,
> + .add_member = cvs_add_member,
> + .print_group = cvs_print_group,
> +};
> +
> static const struct print_operations term_pops = {
> .open_struct = term_open_struct,
> .close_struct = term_close_struct,
> @@ -1582,11 +1647,12 @@ static bool print_groups(struct cnt_group **groups)
> static bool headers_printed = false;
> bool print_data = true;
>
> - if (output_mode == TEXT &&
> + if ((output_mode == TEXT || output_mode == CVS) &&
> (text_header_repeat || !headers_printed)) {
> + const unsigned int header_lines = output_mode == TEXT ? 2 : 1;
> unsigned int headers = text_lines % TEXT_HEADER_REPEAT + 1;
>
> - if (headers == 1 || headers == 2)
> + if (headers > 0 && headers <= header_lines)
> for (struct cnt_group **grp = groups; *grp; grp++)
> print_data = pops->print_group(*grp, headers);
>
> @@ -2469,7 +2535,7 @@ int main(int argc, char **argv)
> char *codename = NULL;
>
> /* Parse options */
> - while ((ch = getopt(argc, argv, "o:s:d:pJLlh")) != -1) {
> + while ((ch = getopt(argc, argv, "o:s:d:pcJLlh")) != -1) {
> switch (ch) {
> case 'o':
> output_path = optarg;
> @@ -2483,6 +2549,9 @@ int main(int argc, char **argv)
> case 'p':
> physical_engines = true;
> break;
> + case 'c':
> + output_mode = CVS;
> + break;
> case 'J':
> output_mode = JSON;
> break;
> @@ -2532,6 +2601,9 @@ int main(int argc, char **argv)
> case TEXT:
> pops = &text_pops;
> break;
> + case CVS:
> + pops = &cvs_pops;
> + break;
> case JSON:
> pops = &json_pops;
> break;
> --
> 2.34.1
--
Ville Syrjälä
Intel
^ permalink raw reply [flat|nested] 28+ messages in thread
* Re: [igt-dev] [PATCH i-g-t 3/3] intel_gpu_top: Add CVS output format
@ 2023-02-03 11:22 ` Ville Syrjälä
0 siblings, 0 replies; 28+ messages in thread
From: Ville Syrjälä @ 2023-02-03 11:22 UTC (permalink / raw)
To: Tvrtko Ursulin; +Cc: igt-dev, Intel-gfx, Caleb Callaway, Tvrtko Ursulin
On Fri, Feb 03, 2023 at 11:16:36AM +0000, Tvrtko Ursulin wrote:
> From: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
>
> Add CVS output mode.
Should that be csv?
>
> Signed-off-by: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
> Cc: Caleb Callaway <caleb.callaway@intel.com>
> ---
> man/intel_gpu_top.rst | 3 ++
> tools/intel_gpu_top.c | 78 +++++++++++++++++++++++++++++++++++++++++--
> 2 files changed, 78 insertions(+), 3 deletions(-)
>
> diff --git a/man/intel_gpu_top.rst b/man/intel_gpu_top.rst
> index 69834756b81e..77228277b9bf 100644
> --- a/man/intel_gpu_top.rst
> +++ b/man/intel_gpu_top.rst
> @@ -31,6 +31,9 @@ OPTIONS
> -h
> Show help text.
>
> +-c
> + Output CVS formatted data.
> +
> -J
> Output JSON formatted data.
>
> diff --git a/tools/intel_gpu_top.c b/tools/intel_gpu_top.c
> index a980cc7043dc..4c425ca027e3 100644
> --- a/tools/intel_gpu_top.c
> +++ b/tools/intel_gpu_top.c
> @@ -1268,6 +1268,7 @@ usage(const char *appname)
> "\n"
> "\tThe following parameters are optional:\n\n"
> "\t[-h] Show this help text.\n"
> + "\t[-c] Output CVS formatted data.\n"
> "\t[-J] Output JSON formatted data.\n"
> "\t[-l] List plain text data.\n"
> "\t[-o <file|->] Output to specified file or '-' for standard out.\n"
> @@ -1283,6 +1284,7 @@ usage(const char *appname)
> static enum {
> INTERACTIVE,
> TEXT,
> + CVS,
> JSON
> } output_mode;
>
> @@ -1457,6 +1459,22 @@ text_add_member(const struct cnt_group *parent, struct cnt_item *item,
> return len > 0 ? len : 0;
> }
>
> +static unsigned int
> +cvs_add_member(const struct cnt_group *parent, struct cnt_item *item,
> + unsigned int headers)
> +{
> + int len = 0;
> +
> + if (headers)
> + fprintf(out, "%s %s", parent->display_name, item->unit);
> + else
> + len = fprintf(out, "%f",
> + pmu_calc(&item->pmu->val, item->d, item->t,
> + item->s));
> +
> + return len > 0 ? len : 0;
> +}
> +
> static void
> term_open_struct(const char *name)
> {
> @@ -1540,6 +1558,46 @@ print_group(struct cnt_group *grp, unsigned int headers)
> return consumed;
> }
>
> +static unsigned int cvs_count, prev_cvs_count;
> +
> +static void cvs_close_struct(void)
> +{
> + assert(text_level > 0);
> + if (--text_level == 0) {
> + cvs_count = prev_cvs_count = 0;
> + text_lines++;
> + fputs("\n", out);
> + fflush(out);
> + }
> +}
> +
> +static bool
> +cvs_print_group(struct cnt_group *grp, unsigned int headers)
> +{
> + unsigned int consumed = 0;
> + struct cnt_item *item;
> +
> + if (!present_in_group(grp))
> + return false;
> +
> + text_open_struct(grp->name);
> +
> + for (item = grp->items; item->name; item++) {
> + if (!item->pmu || !item->pmu->present)
> + continue;
> +
> + if (cvs_count != prev_cvs_count)
> + fprintf(out, ",");
> + prev_cvs_count = cvs_count++;
> +
> + consumed += cvs_add_member(grp, item, headers);
> + }
> +
> + cvs_close_struct();
> +
> + return consumed;
> +}
> +
> static bool
> term_print_group(struct cnt_group *grp, unsigned int headers)
> {
> @@ -1570,6 +1628,13 @@ static const struct print_operations text_pops = {
> .print_group = print_group,
> };
>
> +static const struct print_operations cvs_pops = {
> + .open_struct = text_open_struct,
> + .close_struct = cvs_close_struct,
> + .add_member = cvs_add_member,
> + .print_group = cvs_print_group,
> +};
> +
> static const struct print_operations term_pops = {
> .open_struct = term_open_struct,
> .close_struct = term_close_struct,
> @@ -1582,11 +1647,12 @@ static bool print_groups(struct cnt_group **groups)
> static bool headers_printed = false;
> bool print_data = true;
>
> - if (output_mode == TEXT &&
> + if ((output_mode == TEXT || output_mode == CVS) &&
> (text_header_repeat || !headers_printed)) {
> + const unsigned int header_lines = output_mode == TEXT ? 2 : 1;
> unsigned int headers = text_lines % TEXT_HEADER_REPEAT + 1;
>
> - if (headers == 1 || headers == 2)
> + if (headers > 0 && headers <= header_lines)
> for (struct cnt_group **grp = groups; *grp; grp++)
> print_data = pops->print_group(*grp, headers);
>
> @@ -2469,7 +2535,7 @@ int main(int argc, char **argv)
> char *codename = NULL;
>
> /* Parse options */
> - while ((ch = getopt(argc, argv, "o:s:d:pJLlh")) != -1) {
> + while ((ch = getopt(argc, argv, "o:s:d:pcJLlh")) != -1) {
> switch (ch) {
> case 'o':
> output_path = optarg;
> @@ -2483,6 +2549,9 @@ int main(int argc, char **argv)
> case 'p':
> physical_engines = true;
> break;
> + case 'c':
> + output_mode = CVS;
> + break;
> case 'J':
> output_mode = JSON;
> break;
> @@ -2532,6 +2601,9 @@ int main(int argc, char **argv)
> case TEXT:
> pops = &text_pops;
> break;
> + case CVS:
> + pops = &cvs_pops;
> + break;
> case JSON:
> pops = &json_pops;
> break;
> --
> 2.34.1
--
Ville Syrjälä
Intel
^ permalink raw reply [flat|nested] 28+ messages in thread
* Re: [Intel-gfx] [igt-dev] [PATCH i-g-t 3/3] intel_gpu_top: Add CVS output format
2023-02-03 11:22 ` Ville Syrjälä
@ 2023-02-03 11:27 ` Tvrtko Ursulin
-1 siblings, 0 replies; 28+ messages in thread
From: Tvrtko Ursulin @ 2023-02-03 11:27 UTC (permalink / raw)
To: Ville Syrjälä; +Cc: igt-dev, Intel-gfx, Caleb Callaway
On 03/02/2023 11:22, Ville Syrjälä wrote:
> On Fri, Feb 03, 2023 at 11:16:36AM +0000, Tvrtko Ursulin wrote:
>> From: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
>>
>> Add CVS output mode.
>
> Should that be csv?
Lol at least I was consistent.. facepalm.
Regards,
Tvrtko
>>
>> Signed-off-by: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
>> Cc: Caleb Callaway <caleb.callaway@intel.com>
>> ---
>> man/intel_gpu_top.rst | 3 ++
>> tools/intel_gpu_top.c | 78 +++++++++++++++++++++++++++++++++++++++++--
>> 2 files changed, 78 insertions(+), 3 deletions(-)
>>
>> diff --git a/man/intel_gpu_top.rst b/man/intel_gpu_top.rst
>> index 69834756b81e..77228277b9bf 100644
>> --- a/man/intel_gpu_top.rst
>> +++ b/man/intel_gpu_top.rst
>> @@ -31,6 +31,9 @@ OPTIONS
>> -h
>> Show help text.
>>
>> +-c
>> + Output CVS formatted data.
>> +
>> -J
>> Output JSON formatted data.
>>
>> diff --git a/tools/intel_gpu_top.c b/tools/intel_gpu_top.c
>> index a980cc7043dc..4c425ca027e3 100644
>> --- a/tools/intel_gpu_top.c
>> +++ b/tools/intel_gpu_top.c
>> @@ -1268,6 +1268,7 @@ usage(const char *appname)
>> "\n"
>> "\tThe following parameters are optional:\n\n"
>> "\t[-h] Show this help text.\n"
>> + "\t[-c] Output CVS formatted data.\n"
>> "\t[-J] Output JSON formatted data.\n"
>> "\t[-l] List plain text data.\n"
>> "\t[-o <file|->] Output to specified file or '-' for standard out.\n"
>> @@ -1283,6 +1284,7 @@ usage(const char *appname)
>> static enum {
>> INTERACTIVE,
>> TEXT,
>> + CVS,
>> JSON
>> } output_mode;
>>
>> @@ -1457,6 +1459,22 @@ text_add_member(const struct cnt_group *parent, struct cnt_item *item,
>> return len > 0 ? len : 0;
>> }
>>
>> +static unsigned int
>> +cvs_add_member(const struct cnt_group *parent, struct cnt_item *item,
>> + unsigned int headers)
>> +{
>> + int len = 0;
>> +
>> + if (headers)
>> + fprintf(out, "%s %s", parent->display_name, item->unit);
>> + else
>> + len = fprintf(out, "%f",
>> + pmu_calc(&item->pmu->val, item->d, item->t,
>> + item->s));
>> +
>> + return len > 0 ? len : 0;
>> +}
>> +
>> static void
>> term_open_struct(const char *name)
>> {
>> @@ -1540,6 +1558,46 @@ print_group(struct cnt_group *grp, unsigned int headers)
>> return consumed;
>> }
>>
>> +static unsigned int cvs_count, prev_cvs_count;
>> +
>> +static void cvs_close_struct(void)
>> +{
>> + assert(text_level > 0);
>> + if (--text_level == 0) {
>> + cvs_count = prev_cvs_count = 0;
>> + text_lines++;
>> + fputs("\n", out);
>> + fflush(out);
>> + }
>> +}
>> +
>> +static bool
>> +cvs_print_group(struct cnt_group *grp, unsigned int headers)
>> +{
>> + unsigned int consumed = 0;
>> + struct cnt_item *item;
>> +
>> + if (!present_in_group(grp))
>> + return false;
>> +
>> + text_open_struct(grp->name);
>> +
>> + for (item = grp->items; item->name; item++) {
>> + if (!item->pmu || !item->pmu->present)
>> + continue;
>> +
>> + if (cvs_count != prev_cvs_count)
>> + fprintf(out, ",");
>> + prev_cvs_count = cvs_count++;
>> +
>> + consumed += cvs_add_member(grp, item, headers);
>> + }
>> +
>> + cvs_close_struct();
>> +
>> + return consumed;
>> +}
>> +
>> static bool
>> term_print_group(struct cnt_group *grp, unsigned int headers)
>> {
>> @@ -1570,6 +1628,13 @@ static const struct print_operations text_pops = {
>> .print_group = print_group,
>> };
>>
>> +static const struct print_operations cvs_pops = {
>> + .open_struct = text_open_struct,
>> + .close_struct = cvs_close_struct,
>> + .add_member = cvs_add_member,
>> + .print_group = cvs_print_group,
>> +};
>> +
>> static const struct print_operations term_pops = {
>> .open_struct = term_open_struct,
>> .close_struct = term_close_struct,
>> @@ -1582,11 +1647,12 @@ static bool print_groups(struct cnt_group **groups)
>> static bool headers_printed = false;
>> bool print_data = true;
>>
>> - if (output_mode == TEXT &&
>> + if ((output_mode == TEXT || output_mode == CVS) &&
>> (text_header_repeat || !headers_printed)) {
>> + const unsigned int header_lines = output_mode == TEXT ? 2 : 1;
>> unsigned int headers = text_lines % TEXT_HEADER_REPEAT + 1;
>>
>> - if (headers == 1 || headers == 2)
>> + if (headers > 0 && headers <= header_lines)
>> for (struct cnt_group **grp = groups; *grp; grp++)
>> print_data = pops->print_group(*grp, headers);
>>
>> @@ -2469,7 +2535,7 @@ int main(int argc, char **argv)
>> char *codename = NULL;
>>
>> /* Parse options */
>> - while ((ch = getopt(argc, argv, "o:s:d:pJLlh")) != -1) {
>> + while ((ch = getopt(argc, argv, "o:s:d:pcJLlh")) != -1) {
>> switch (ch) {
>> case 'o':
>> output_path = optarg;
>> @@ -2483,6 +2549,9 @@ int main(int argc, char **argv)
>> case 'p':
>> physical_engines = true;
>> break;
>> + case 'c':
>> + output_mode = CVS;
>> + break;
>> case 'J':
>> output_mode = JSON;
>> break;
>> @@ -2532,6 +2601,9 @@ int main(int argc, char **argv)
>> case TEXT:
>> pops = &text_pops;
>> break;
>> + case CVS:
>> + pops = &cvs_pops;
>> + break;
>> case JSON:
>> pops = &json_pops;
>> break;
>> --
>> 2.34.1
>
^ permalink raw reply [flat|nested] 28+ messages in thread
* Re: [igt-dev] [PATCH i-g-t 3/3] intel_gpu_top: Add CVS output format
@ 2023-02-03 11:27 ` Tvrtko Ursulin
0 siblings, 0 replies; 28+ messages in thread
From: Tvrtko Ursulin @ 2023-02-03 11:27 UTC (permalink / raw)
To: Ville Syrjälä
Cc: igt-dev, Intel-gfx, Caleb Callaway, Tvrtko Ursulin
On 03/02/2023 11:22, Ville Syrjälä wrote:
> On Fri, Feb 03, 2023 at 11:16:36AM +0000, Tvrtko Ursulin wrote:
>> From: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
>>
>> Add CVS output mode.
>
> Should that be csv?
Lol at least I was consistent.. facepalm.
Regards,
Tvrtko
>>
>> Signed-off-by: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
>> Cc: Caleb Callaway <caleb.callaway@intel.com>
>> ---
>> man/intel_gpu_top.rst | 3 ++
>> tools/intel_gpu_top.c | 78 +++++++++++++++++++++++++++++++++++++++++--
>> 2 files changed, 78 insertions(+), 3 deletions(-)
>>
>> diff --git a/man/intel_gpu_top.rst b/man/intel_gpu_top.rst
>> index 69834756b81e..77228277b9bf 100644
>> --- a/man/intel_gpu_top.rst
>> +++ b/man/intel_gpu_top.rst
>> @@ -31,6 +31,9 @@ OPTIONS
>> -h
>> Show help text.
>>
>> +-c
>> + Output CVS formatted data.
>> +
>> -J
>> Output JSON formatted data.
>>
>> diff --git a/tools/intel_gpu_top.c b/tools/intel_gpu_top.c
>> index a980cc7043dc..4c425ca027e3 100644
>> --- a/tools/intel_gpu_top.c
>> +++ b/tools/intel_gpu_top.c
>> @@ -1268,6 +1268,7 @@ usage(const char *appname)
>> "\n"
>> "\tThe following parameters are optional:\n\n"
>> "\t[-h] Show this help text.\n"
>> + "\t[-c] Output CVS formatted data.\n"
>> "\t[-J] Output JSON formatted data.\n"
>> "\t[-l] List plain text data.\n"
>> "\t[-o <file|->] Output to specified file or '-' for standard out.\n"
>> @@ -1283,6 +1284,7 @@ usage(const char *appname)
>> static enum {
>> INTERACTIVE,
>> TEXT,
>> + CVS,
>> JSON
>> } output_mode;
>>
>> @@ -1457,6 +1459,22 @@ text_add_member(const struct cnt_group *parent, struct cnt_item *item,
>> return len > 0 ? len : 0;
>> }
>>
>> +static unsigned int
>> +cvs_add_member(const struct cnt_group *parent, struct cnt_item *item,
>> + unsigned int headers)
>> +{
>> + int len = 0;
>> +
>> + if (headers)
>> + fprintf(out, "%s %s", parent->display_name, item->unit);
>> + else
>> + len = fprintf(out, "%f",
>> + pmu_calc(&item->pmu->val, item->d, item->t,
>> + item->s));
>> +
>> + return len > 0 ? len : 0;
>> +}
>> +
>> static void
>> term_open_struct(const char *name)
>> {
>> @@ -1540,6 +1558,46 @@ print_group(struct cnt_group *grp, unsigned int headers)
>> return consumed;
>> }
>>
>> +static unsigned int cvs_count, prev_cvs_count;
>> +
>> +static void cvs_close_struct(void)
>> +{
>> + assert(text_level > 0);
>> + if (--text_level == 0) {
>> + cvs_count = prev_cvs_count = 0;
>> + text_lines++;
>> + fputs("\n", out);
>> + fflush(out);
>> + }
>> +}
>> +
>> +static bool
>> +cvs_print_group(struct cnt_group *grp, unsigned int headers)
>> +{
>> + unsigned int consumed = 0;
>> + struct cnt_item *item;
>> +
>> + if (!present_in_group(grp))
>> + return false;
>> +
>> + text_open_struct(grp->name);
>> +
>> + for (item = grp->items; item->name; item++) {
>> + if (!item->pmu || !item->pmu->present)
>> + continue;
>> +
>> + if (cvs_count != prev_cvs_count)
>> + fprintf(out, ",");
>> + prev_cvs_count = cvs_count++;
>> +
>> + consumed += cvs_add_member(grp, item, headers);
>> + }
>> +
>> + cvs_close_struct();
>> +
>> + return consumed;
>> +}
>> +
>> static bool
>> term_print_group(struct cnt_group *grp, unsigned int headers)
>> {
>> @@ -1570,6 +1628,13 @@ static const struct print_operations text_pops = {
>> .print_group = print_group,
>> };
>>
>> +static const struct print_operations cvs_pops = {
>> + .open_struct = text_open_struct,
>> + .close_struct = cvs_close_struct,
>> + .add_member = cvs_add_member,
>> + .print_group = cvs_print_group,
>> +};
>> +
>> static const struct print_operations term_pops = {
>> .open_struct = term_open_struct,
>> .close_struct = term_close_struct,
>> @@ -1582,11 +1647,12 @@ static bool print_groups(struct cnt_group **groups)
>> static bool headers_printed = false;
>> bool print_data = true;
>>
>> - if (output_mode == TEXT &&
>> + if ((output_mode == TEXT || output_mode == CVS) &&
>> (text_header_repeat || !headers_printed)) {
>> + const unsigned int header_lines = output_mode == TEXT ? 2 : 1;
>> unsigned int headers = text_lines % TEXT_HEADER_REPEAT + 1;
>>
>> - if (headers == 1 || headers == 2)
>> + if (headers > 0 && headers <= header_lines)
>> for (struct cnt_group **grp = groups; *grp; grp++)
>> print_data = pops->print_group(*grp, headers);
>>
>> @@ -2469,7 +2535,7 @@ int main(int argc, char **argv)
>> char *codename = NULL;
>>
>> /* Parse options */
>> - while ((ch = getopt(argc, argv, "o:s:d:pJLlh")) != -1) {
>> + while ((ch = getopt(argc, argv, "o:s:d:pcJLlh")) != -1) {
>> switch (ch) {
>> case 'o':
>> output_path = optarg;
>> @@ -2483,6 +2549,9 @@ int main(int argc, char **argv)
>> case 'p':
>> physical_engines = true;
>> break;
>> + case 'c':
>> + output_mode = CVS;
>> + break;
>> case 'J':
>> output_mode = JSON;
>> break;
>> @@ -2532,6 +2601,9 @@ int main(int argc, char **argv)
>> case TEXT:
>> pops = &text_pops;
>> break;
>> + case CVS:
>> + pops = &cvs_pops;
>> + break;
>> case JSON:
>> pops = &json_pops;
>> break;
>> --
>> 2.34.1
>
^ permalink raw reply [flat|nested] 28+ messages in thread
* [Intel-gfx] [PATCH i-g-t 3/3] intel_gpu_top: Add CSV output format
2023-02-03 11:16 ` [igt-dev] " Tvrtko Ursulin
@ 2023-02-03 11:30 ` Tvrtko Ursulin
-1 siblings, 0 replies; 28+ messages in thread
From: Tvrtko Ursulin @ 2023-02-03 11:30 UTC (permalink / raw)
To: igt-dev, Intel-gfx; +Cc: Caleb Callaway
From: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
Add CSV output mode.
Signed-off-by: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
Cc: Caleb Callaway <caleb.callaway@intel.com>
---
man/intel_gpu_top.rst | 3 ++
tools/intel_gpu_top.c | 78 +++++++++++++++++++++++++++++++++++++++++--
2 files changed, 78 insertions(+), 3 deletions(-)
diff --git a/man/intel_gpu_top.rst b/man/intel_gpu_top.rst
index 69834756b81e..77228277b9bf 100644
--- a/man/intel_gpu_top.rst
+++ b/man/intel_gpu_top.rst
@@ -31,6 +31,9 @@ OPTIONS
-h
Show help text.
+-c
+ Output CVS formatted data.
+
-J
Output JSON formatted data.
diff --git a/tools/intel_gpu_top.c b/tools/intel_gpu_top.c
index a980cc7043dc..2e1365959d8b 100644
--- a/tools/intel_gpu_top.c
+++ b/tools/intel_gpu_top.c
@@ -1268,6 +1268,7 @@ usage(const char *appname)
"\n"
"\tThe following parameters are optional:\n\n"
"\t[-h] Show this help text.\n"
+ "\t[-c] Output CSV formatted data.\n"
"\t[-J] Output JSON formatted data.\n"
"\t[-l] List plain text data.\n"
"\t[-o <file|->] Output to specified file or '-' for standard out.\n"
@@ -1283,6 +1284,7 @@ usage(const char *appname)
static enum {
INTERACTIVE,
TEXT,
+ CSV,
JSON
} output_mode;
@@ -1457,6 +1459,22 @@ text_add_member(const struct cnt_group *parent, struct cnt_item *item,
return len > 0 ? len : 0;
}
+static unsigned int
+csv_add_member(const struct cnt_group *parent, struct cnt_item *item,
+ unsigned int headers)
+{
+ int len = 0;
+
+ if (headers)
+ fprintf(out, "%s %s", parent->display_name, item->unit);
+ else
+ len = fprintf(out, "%f",
+ pmu_calc(&item->pmu->val, item->d, item->t,
+ item->s));
+
+ return len > 0 ? len : 0;
+}
+
static void
term_open_struct(const char *name)
{
@@ -1540,6 +1558,46 @@ print_group(struct cnt_group *grp, unsigned int headers)
return consumed;
}
+static unsigned int csv_count, prev_csv_count;
+
+static void csv_close_struct(void)
+{
+ assert(text_level > 0);
+ if (--text_level == 0) {
+ csv_count = prev_csv_count = 0;
+ text_lines++;
+ fputs("\n", out);
+ fflush(out);
+ }
+}
+
+static bool
+csv_print_group(struct cnt_group *grp, unsigned int headers)
+{
+ unsigned int consumed = 0;
+ struct cnt_item *item;
+
+ if (!present_in_group(grp))
+ return false;
+
+ text_open_struct(grp->name);
+
+ for (item = grp->items; item->name; item++) {
+ if (!item->pmu || !item->pmu->present)
+ continue;
+
+ if (csv_count != prev_csv_count)
+ fprintf(out, ",");
+ prev_csv_count = csv_count++;
+
+ consumed += csv_add_member(grp, item, headers);
+ }
+
+ csv_close_struct();
+
+ return consumed;
+}
+
static bool
term_print_group(struct cnt_group *grp, unsigned int headers)
{
@@ -1570,6 +1628,13 @@ static const struct print_operations text_pops = {
.print_group = print_group,
};
+static const struct print_operations csv_pops = {
+ .open_struct = text_open_struct,
+ .close_struct = csv_close_struct,
+ .add_member = csv_add_member,
+ .print_group = csv_print_group,
+};
+
static const struct print_operations term_pops = {
.open_struct = term_open_struct,
.close_struct = term_close_struct,
@@ -1582,11 +1647,12 @@ static bool print_groups(struct cnt_group **groups)
static bool headers_printed = false;
bool print_data = true;
- if (output_mode == TEXT &&
+ if ((output_mode == TEXT || output_mode == CSV) &&
(text_header_repeat || !headers_printed)) {
+ const unsigned int header_lines = output_mode == TEXT ? 2 : 1;
unsigned int headers = text_lines % TEXT_HEADER_REPEAT + 1;
- if (headers == 1 || headers == 2)
+ if (headers > 0 && headers <= header_lines)
for (struct cnt_group **grp = groups; *grp; grp++)
print_data = pops->print_group(*grp, headers);
@@ -2469,7 +2535,7 @@ int main(int argc, char **argv)
char *codename = NULL;
/* Parse options */
- while ((ch = getopt(argc, argv, "o:s:d:pJLlh")) != -1) {
+ while ((ch = getopt(argc, argv, "o:s:d:pcJLlh")) != -1) {
switch (ch) {
case 'o':
output_path = optarg;
@@ -2483,6 +2549,9 @@ int main(int argc, char **argv)
case 'p':
physical_engines = true;
break;
+ case 'c':
+ output_mode = CSV;
+ break;
case 'J':
output_mode = JSON;
break;
@@ -2532,6 +2601,9 @@ int main(int argc, char **argv)
case TEXT:
pops = &text_pops;
break;
+ case CSV:
+ pops = &csv_pops;
+ break;
case JSON:
pops = &json_pops;
break;
--
2.34.1
^ permalink raw reply related [flat|nested] 28+ messages in thread
* [igt-dev] [PATCH i-g-t 3/3] intel_gpu_top: Add CSV output format
@ 2023-02-03 11:30 ` Tvrtko Ursulin
0 siblings, 0 replies; 28+ messages in thread
From: Tvrtko Ursulin @ 2023-02-03 11:30 UTC (permalink / raw)
To: igt-dev, Intel-gfx; +Cc: Caleb Callaway, Tvrtko Ursulin
From: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
Add CSV output mode.
Signed-off-by: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
Cc: Caleb Callaway <caleb.callaway@intel.com>
---
man/intel_gpu_top.rst | 3 ++
tools/intel_gpu_top.c | 78 +++++++++++++++++++++++++++++++++++++++++--
2 files changed, 78 insertions(+), 3 deletions(-)
diff --git a/man/intel_gpu_top.rst b/man/intel_gpu_top.rst
index 69834756b81e..77228277b9bf 100644
--- a/man/intel_gpu_top.rst
+++ b/man/intel_gpu_top.rst
@@ -31,6 +31,9 @@ OPTIONS
-h
Show help text.
+-c
+ Output CVS formatted data.
+
-J
Output JSON formatted data.
diff --git a/tools/intel_gpu_top.c b/tools/intel_gpu_top.c
index a980cc7043dc..2e1365959d8b 100644
--- a/tools/intel_gpu_top.c
+++ b/tools/intel_gpu_top.c
@@ -1268,6 +1268,7 @@ usage(const char *appname)
"\n"
"\tThe following parameters are optional:\n\n"
"\t[-h] Show this help text.\n"
+ "\t[-c] Output CSV formatted data.\n"
"\t[-J] Output JSON formatted data.\n"
"\t[-l] List plain text data.\n"
"\t[-o <file|->] Output to specified file or '-' for standard out.\n"
@@ -1283,6 +1284,7 @@ usage(const char *appname)
static enum {
INTERACTIVE,
TEXT,
+ CSV,
JSON
} output_mode;
@@ -1457,6 +1459,22 @@ text_add_member(const struct cnt_group *parent, struct cnt_item *item,
return len > 0 ? len : 0;
}
+static unsigned int
+csv_add_member(const struct cnt_group *parent, struct cnt_item *item,
+ unsigned int headers)
+{
+ int len = 0;
+
+ if (headers)
+ fprintf(out, "%s %s", parent->display_name, item->unit);
+ else
+ len = fprintf(out, "%f",
+ pmu_calc(&item->pmu->val, item->d, item->t,
+ item->s));
+
+ return len > 0 ? len : 0;
+}
+
static void
term_open_struct(const char *name)
{
@@ -1540,6 +1558,46 @@ print_group(struct cnt_group *grp, unsigned int headers)
return consumed;
}
+static unsigned int csv_count, prev_csv_count;
+
+static void csv_close_struct(void)
+{
+ assert(text_level > 0);
+ if (--text_level == 0) {
+ csv_count = prev_csv_count = 0;
+ text_lines++;
+ fputs("\n", out);
+ fflush(out);
+ }
+}
+
+static bool
+csv_print_group(struct cnt_group *grp, unsigned int headers)
+{
+ unsigned int consumed = 0;
+ struct cnt_item *item;
+
+ if (!present_in_group(grp))
+ return false;
+
+ text_open_struct(grp->name);
+
+ for (item = grp->items; item->name; item++) {
+ if (!item->pmu || !item->pmu->present)
+ continue;
+
+ if (csv_count != prev_csv_count)
+ fprintf(out, ",");
+ prev_csv_count = csv_count++;
+
+ consumed += csv_add_member(grp, item, headers);
+ }
+
+ csv_close_struct();
+
+ return consumed;
+}
+
static bool
term_print_group(struct cnt_group *grp, unsigned int headers)
{
@@ -1570,6 +1628,13 @@ static const struct print_operations text_pops = {
.print_group = print_group,
};
+static const struct print_operations csv_pops = {
+ .open_struct = text_open_struct,
+ .close_struct = csv_close_struct,
+ .add_member = csv_add_member,
+ .print_group = csv_print_group,
+};
+
static const struct print_operations term_pops = {
.open_struct = term_open_struct,
.close_struct = term_close_struct,
@@ -1582,11 +1647,12 @@ static bool print_groups(struct cnt_group **groups)
static bool headers_printed = false;
bool print_data = true;
- if (output_mode == TEXT &&
+ if ((output_mode == TEXT || output_mode == CSV) &&
(text_header_repeat || !headers_printed)) {
+ const unsigned int header_lines = output_mode == TEXT ? 2 : 1;
unsigned int headers = text_lines % TEXT_HEADER_REPEAT + 1;
- if (headers == 1 || headers == 2)
+ if (headers > 0 && headers <= header_lines)
for (struct cnt_group **grp = groups; *grp; grp++)
print_data = pops->print_group(*grp, headers);
@@ -2469,7 +2535,7 @@ int main(int argc, char **argv)
char *codename = NULL;
/* Parse options */
- while ((ch = getopt(argc, argv, "o:s:d:pJLlh")) != -1) {
+ while ((ch = getopt(argc, argv, "o:s:d:pcJLlh")) != -1) {
switch (ch) {
case 'o':
output_path = optarg;
@@ -2483,6 +2549,9 @@ int main(int argc, char **argv)
case 'p':
physical_engines = true;
break;
+ case 'c':
+ output_mode = CSV;
+ break;
case 'J':
output_mode = JSON;
break;
@@ -2532,6 +2601,9 @@ int main(int argc, char **argv)
case TEXT:
pops = &text_pops;
break;
+ case CSV:
+ pops = &csv_pops;
+ break;
case JSON:
pops = &json_pops;
break;
--
2.34.1
^ permalink raw reply related [flat|nested] 28+ messages in thread
* [Intel-gfx] [PATCH i-g-t 3/3] intel_gpu_top: Add CSV output format
2023-02-03 11:16 ` [igt-dev] " Tvrtko Ursulin
@ 2023-02-03 11:31 ` Tvrtko Ursulin
-1 siblings, 0 replies; 28+ messages in thread
From: Tvrtko Ursulin @ 2023-02-03 11:31 UTC (permalink / raw)
To: igt-dev, Intel-gfx; +Cc: Caleb Callaway
From: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
Add CSV output mode.
Signed-off-by: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
Cc: Caleb Callaway <caleb.callaway@intel.com>
---
man/intel_gpu_top.rst | 3 ++
tools/intel_gpu_top.c | 78 +++++++++++++++++++++++++++++++++++++++++--
2 files changed, 78 insertions(+), 3 deletions(-)
diff --git a/man/intel_gpu_top.rst b/man/intel_gpu_top.rst
index 69834756b81e..2d041457a95e 100644
--- a/man/intel_gpu_top.rst
+++ b/man/intel_gpu_top.rst
@@ -31,6 +31,9 @@ OPTIONS
-h
Show help text.
+-c
+ Output CSV formatted data.
+
-J
Output JSON formatted data.
diff --git a/tools/intel_gpu_top.c b/tools/intel_gpu_top.c
index a980cc7043dc..2e1365959d8b 100644
--- a/tools/intel_gpu_top.c
+++ b/tools/intel_gpu_top.c
@@ -1268,6 +1268,7 @@ usage(const char *appname)
"\n"
"\tThe following parameters are optional:\n\n"
"\t[-h] Show this help text.\n"
+ "\t[-c] Output CSV formatted data.\n"
"\t[-J] Output JSON formatted data.\n"
"\t[-l] List plain text data.\n"
"\t[-o <file|->] Output to specified file or '-' for standard out.\n"
@@ -1283,6 +1284,7 @@ usage(const char *appname)
static enum {
INTERACTIVE,
TEXT,
+ CSV,
JSON
} output_mode;
@@ -1457,6 +1459,22 @@ text_add_member(const struct cnt_group *parent, struct cnt_item *item,
return len > 0 ? len : 0;
}
+static unsigned int
+csv_add_member(const struct cnt_group *parent, struct cnt_item *item,
+ unsigned int headers)
+{
+ int len = 0;
+
+ if (headers)
+ fprintf(out, "%s %s", parent->display_name, item->unit);
+ else
+ len = fprintf(out, "%f",
+ pmu_calc(&item->pmu->val, item->d, item->t,
+ item->s));
+
+ return len > 0 ? len : 0;
+}
+
static void
term_open_struct(const char *name)
{
@@ -1540,6 +1558,46 @@ print_group(struct cnt_group *grp, unsigned int headers)
return consumed;
}
+static unsigned int csv_count, prev_csv_count;
+
+static void csv_close_struct(void)
+{
+ assert(text_level > 0);
+ if (--text_level == 0) {
+ csv_count = prev_csv_count = 0;
+ text_lines++;
+ fputs("\n", out);
+ fflush(out);
+ }
+}
+
+static bool
+csv_print_group(struct cnt_group *grp, unsigned int headers)
+{
+ unsigned int consumed = 0;
+ struct cnt_item *item;
+
+ if (!present_in_group(grp))
+ return false;
+
+ text_open_struct(grp->name);
+
+ for (item = grp->items; item->name; item++) {
+ if (!item->pmu || !item->pmu->present)
+ continue;
+
+ if (csv_count != prev_csv_count)
+ fprintf(out, ",");
+ prev_csv_count = csv_count++;
+
+ consumed += csv_add_member(grp, item, headers);
+ }
+
+ csv_close_struct();
+
+ return consumed;
+}
+
static bool
term_print_group(struct cnt_group *grp, unsigned int headers)
{
@@ -1570,6 +1628,13 @@ static const struct print_operations text_pops = {
.print_group = print_group,
};
+static const struct print_operations csv_pops = {
+ .open_struct = text_open_struct,
+ .close_struct = csv_close_struct,
+ .add_member = csv_add_member,
+ .print_group = csv_print_group,
+};
+
static const struct print_operations term_pops = {
.open_struct = term_open_struct,
.close_struct = term_close_struct,
@@ -1582,11 +1647,12 @@ static bool print_groups(struct cnt_group **groups)
static bool headers_printed = false;
bool print_data = true;
- if (output_mode == TEXT &&
+ if ((output_mode == TEXT || output_mode == CSV) &&
(text_header_repeat || !headers_printed)) {
+ const unsigned int header_lines = output_mode == TEXT ? 2 : 1;
unsigned int headers = text_lines % TEXT_HEADER_REPEAT + 1;
- if (headers == 1 || headers == 2)
+ if (headers > 0 && headers <= header_lines)
for (struct cnt_group **grp = groups; *grp; grp++)
print_data = pops->print_group(*grp, headers);
@@ -2469,7 +2535,7 @@ int main(int argc, char **argv)
char *codename = NULL;
/* Parse options */
- while ((ch = getopt(argc, argv, "o:s:d:pJLlh")) != -1) {
+ while ((ch = getopt(argc, argv, "o:s:d:pcJLlh")) != -1) {
switch (ch) {
case 'o':
output_path = optarg;
@@ -2483,6 +2549,9 @@ int main(int argc, char **argv)
case 'p':
physical_engines = true;
break;
+ case 'c':
+ output_mode = CSV;
+ break;
case 'J':
output_mode = JSON;
break;
@@ -2532,6 +2601,9 @@ int main(int argc, char **argv)
case TEXT:
pops = &text_pops;
break;
+ case CSV:
+ pops = &csv_pops;
+ break;
case JSON:
pops = &json_pops;
break;
--
2.34.1
^ permalink raw reply related [flat|nested] 28+ messages in thread
* [igt-dev] [PATCH i-g-t 3/3] intel_gpu_top: Add CSV output format
@ 2023-02-03 11:31 ` Tvrtko Ursulin
0 siblings, 0 replies; 28+ messages in thread
From: Tvrtko Ursulin @ 2023-02-03 11:31 UTC (permalink / raw)
To: igt-dev, Intel-gfx; +Cc: Caleb Callaway, Tvrtko Ursulin
From: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
Add CSV output mode.
Signed-off-by: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
Cc: Caleb Callaway <caleb.callaway@intel.com>
---
man/intel_gpu_top.rst | 3 ++
tools/intel_gpu_top.c | 78 +++++++++++++++++++++++++++++++++++++++++--
2 files changed, 78 insertions(+), 3 deletions(-)
diff --git a/man/intel_gpu_top.rst b/man/intel_gpu_top.rst
index 69834756b81e..2d041457a95e 100644
--- a/man/intel_gpu_top.rst
+++ b/man/intel_gpu_top.rst
@@ -31,6 +31,9 @@ OPTIONS
-h
Show help text.
+-c
+ Output CSV formatted data.
+
-J
Output JSON formatted data.
diff --git a/tools/intel_gpu_top.c b/tools/intel_gpu_top.c
index a980cc7043dc..2e1365959d8b 100644
--- a/tools/intel_gpu_top.c
+++ b/tools/intel_gpu_top.c
@@ -1268,6 +1268,7 @@ usage(const char *appname)
"\n"
"\tThe following parameters are optional:\n\n"
"\t[-h] Show this help text.\n"
+ "\t[-c] Output CSV formatted data.\n"
"\t[-J] Output JSON formatted data.\n"
"\t[-l] List plain text data.\n"
"\t[-o <file|->] Output to specified file or '-' for standard out.\n"
@@ -1283,6 +1284,7 @@ usage(const char *appname)
static enum {
INTERACTIVE,
TEXT,
+ CSV,
JSON
} output_mode;
@@ -1457,6 +1459,22 @@ text_add_member(const struct cnt_group *parent, struct cnt_item *item,
return len > 0 ? len : 0;
}
+static unsigned int
+csv_add_member(const struct cnt_group *parent, struct cnt_item *item,
+ unsigned int headers)
+{
+ int len = 0;
+
+ if (headers)
+ fprintf(out, "%s %s", parent->display_name, item->unit);
+ else
+ len = fprintf(out, "%f",
+ pmu_calc(&item->pmu->val, item->d, item->t,
+ item->s));
+
+ return len > 0 ? len : 0;
+}
+
static void
term_open_struct(const char *name)
{
@@ -1540,6 +1558,46 @@ print_group(struct cnt_group *grp, unsigned int headers)
return consumed;
}
+static unsigned int csv_count, prev_csv_count;
+
+static void csv_close_struct(void)
+{
+ assert(text_level > 0);
+ if (--text_level == 0) {
+ csv_count = prev_csv_count = 0;
+ text_lines++;
+ fputs("\n", out);
+ fflush(out);
+ }
+}
+
+static bool
+csv_print_group(struct cnt_group *grp, unsigned int headers)
+{
+ unsigned int consumed = 0;
+ struct cnt_item *item;
+
+ if (!present_in_group(grp))
+ return false;
+
+ text_open_struct(grp->name);
+
+ for (item = grp->items; item->name; item++) {
+ if (!item->pmu || !item->pmu->present)
+ continue;
+
+ if (csv_count != prev_csv_count)
+ fprintf(out, ",");
+ prev_csv_count = csv_count++;
+
+ consumed += csv_add_member(grp, item, headers);
+ }
+
+ csv_close_struct();
+
+ return consumed;
+}
+
static bool
term_print_group(struct cnt_group *grp, unsigned int headers)
{
@@ -1570,6 +1628,13 @@ static const struct print_operations text_pops = {
.print_group = print_group,
};
+static const struct print_operations csv_pops = {
+ .open_struct = text_open_struct,
+ .close_struct = csv_close_struct,
+ .add_member = csv_add_member,
+ .print_group = csv_print_group,
+};
+
static const struct print_operations term_pops = {
.open_struct = term_open_struct,
.close_struct = term_close_struct,
@@ -1582,11 +1647,12 @@ static bool print_groups(struct cnt_group **groups)
static bool headers_printed = false;
bool print_data = true;
- if (output_mode == TEXT &&
+ if ((output_mode == TEXT || output_mode == CSV) &&
(text_header_repeat || !headers_printed)) {
+ const unsigned int header_lines = output_mode == TEXT ? 2 : 1;
unsigned int headers = text_lines % TEXT_HEADER_REPEAT + 1;
- if (headers == 1 || headers == 2)
+ if (headers > 0 && headers <= header_lines)
for (struct cnt_group **grp = groups; *grp; grp++)
print_data = pops->print_group(*grp, headers);
@@ -2469,7 +2535,7 @@ int main(int argc, char **argv)
char *codename = NULL;
/* Parse options */
- while ((ch = getopt(argc, argv, "o:s:d:pJLlh")) != -1) {
+ while ((ch = getopt(argc, argv, "o:s:d:pcJLlh")) != -1) {
switch (ch) {
case 'o':
output_path = optarg;
@@ -2483,6 +2549,9 @@ int main(int argc, char **argv)
case 'p':
physical_engines = true;
break;
+ case 'c':
+ output_mode = CSV;
+ break;
case 'J':
output_mode = JSON;
break;
@@ -2532,6 +2601,9 @@ int main(int argc, char **argv)
case TEXT:
pops = &text_pops;
break;
+ case CSV:
+ pops = &csv_pops;
+ break;
case JSON:
pops = &json_pops;
break;
--
2.34.1
^ permalink raw reply related [flat|nested] 28+ messages in thread
* [igt-dev] ✓ Fi.CI.BAT: success for More intel_gpu_top improvements (rev3)
2023-02-03 11:16 ` [igt-dev] " Tvrtko Ursulin
` (3 preceding siblings ...)
(?)
@ 2023-02-03 14:49 ` Patchwork
-1 siblings, 0 replies; 28+ messages in thread
From: Patchwork @ 2023-02-03 14:49 UTC (permalink / raw)
To: Tvrtko Ursulin; +Cc: igt-dev
[-- Attachment #1: Type: text/plain, Size: 2463 bytes --]
== Series Details ==
Series: More intel_gpu_top improvements (rev3)
URL : https://patchwork.freedesktop.org/series/113644/
State : success
== Summary ==
CI Bug Log - changes from CI_DRM_12691 -> IGTPW_8444
====================================================
Summary
-------
**SUCCESS**
No regressions found.
External URL: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_8444/index.html
Participating hosts (28 -> 26)
------------------------------
Missing (2): fi-kbl-soraka fi-snb-2520m
Known issues
------------
Here are the changes found in IGTPW_8444 that come from known issues:
### IGT changes ###
#### Possible fixes ####
* igt@i915_selftest@live@gt_heartbeat:
- fi-apl-guc: [DMESG-FAIL][1] ([i915#5334]) -> [PASS][2]
[1]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_12691/fi-apl-guc/igt@i915_selftest@live@gt_heartbeat.html
[2]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_8444/fi-apl-guc/igt@i915_selftest@live@gt_heartbeat.html
* igt@i915_selftest@live@migrate:
- {bat-adlp-9}: [DMESG-FAIL][3] ([i915#7699]) -> [PASS][4]
[3]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_12691/bat-adlp-9/igt@i915_selftest@live@migrate.html
[4]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_8444/bat-adlp-9/igt@i915_selftest@live@migrate.html
{name}: This element is suppressed. This means it is ignored when computing
the status of the difference (SUCCESS, WARNING, or FAILURE).
[i915#4983]: https://gitlab.freedesktop.org/drm/intel/issues/4983
[i915#5334]: https://gitlab.freedesktop.org/drm/intel/issues/5334
[i915#5354]: https://gitlab.freedesktop.org/drm/intel/issues/5354
[i915#6367]: https://gitlab.freedesktop.org/drm/intel/issues/6367
[i915#7699]: https://gitlab.freedesktop.org/drm/intel/issues/7699
[i915#7996]: https://gitlab.freedesktop.org/drm/intel/issues/7996
Build changes
-------------
* CI: CI-20190529 -> None
* IGT: IGT_7148 -> IGTPW_8444
CI-20190529: 20190529
CI_DRM_12691: 2153bc2944d37403c6d5c4e1082d074a34d39ae9 @ git://anongit.freedesktop.org/gfx-ci/linux
IGTPW_8444: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_8444/index.html
IGT_7148: ee8e31cf39c44d3fdbd04d8db239f8a815f86121 @ https://gitlab.freedesktop.org/drm/igt-gpu-tools.git
Testlist changes
----------------
+igt@kms_dsc@basic-dsc
-igt@kms_dsc@dsc-basic
== Logs ==
For more details see: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_8444/index.html
[-- Attachment #2: Type: text/html, Size: 2827 bytes --]
^ permalink raw reply [flat|nested] 28+ messages in thread
* [igt-dev] ✓ Fi.CI.IGT: success for More intel_gpu_top improvements (rev3)
2023-02-03 11:16 ` [igt-dev] " Tvrtko Ursulin
` (4 preceding siblings ...)
(?)
@ 2023-02-04 17:27 ` Patchwork
-1 siblings, 0 replies; 28+ messages in thread
From: Patchwork @ 2023-02-04 17:27 UTC (permalink / raw)
To: Tvrtko Ursulin; +Cc: igt-dev
[-- Attachment #1: Type: text/plain, Size: 21637 bytes --]
== Series Details ==
Series: More intel_gpu_top improvements (rev3)
URL : https://patchwork.freedesktop.org/series/113644/
State : success
== Summary ==
CI Bug Log - changes from CI_DRM_12691_full -> IGTPW_8444_full
====================================================
Summary
-------
**SUCCESS**
No regressions found.
External URL: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_8444/index.html
Participating hosts (9 -> 9)
------------------------------
No changes in participating hosts
Known issues
------------
Here are the changes found in IGTPW_8444_full that come from known issues:
### IGT changes ###
#### Issues hit ####
* igt@gem_exec_fair@basic-none@rcs0:
- shard-glk: [PASS][1] -> [FAIL][2] ([i915#2842]) +1 similar issue
[1]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_12691/shard-glk5/igt@gem_exec_fair@basic-none@rcs0.html
[2]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_8444/shard-glk4/igt@gem_exec_fair@basic-none@rcs0.html
* igt@kms_cursor_legacy@flip-vs-cursor@atomic-transitions:
- shard-glk: [PASS][3] -> [FAIL][4] ([i915#2346])
[3]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_12691/shard-glk9/igt@kms_cursor_legacy@flip-vs-cursor@atomic-transitions.html
[4]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_8444/shard-glk3/igt@kms_cursor_legacy@flip-vs-cursor@atomic-transitions.html
* igt@kms_flip@2x-flip-vs-expired-vblank-interruptible@ac-hdmi-a1-hdmi-a2:
- shard-glk: [PASS][5] -> [FAIL][6] ([i915#79])
[5]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_12691/shard-glk3/igt@kms_flip@2x-flip-vs-expired-vblank-interruptible@ac-hdmi-a1-hdmi-a2.html
[6]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_8444/shard-glk3/igt@kms_flip@2x-flip-vs-expired-vblank-interruptible@ac-hdmi-a1-hdmi-a2.html
#### Possible fixes ####
* igt@fbdev@nullptr:
- {shard-rkl}: [SKIP][7] ([i915#2582]) -> [PASS][8] +1 similar issue
[7]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_12691/shard-rkl-1/igt@fbdev@nullptr.html
[8]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_8444/shard-rkl-6/igt@fbdev@nullptr.html
* igt@gem_ctx_persistence@hang:
- {shard-rkl}: [SKIP][9] ([i915#6252]) -> [PASS][10]
[9]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_12691/shard-rkl-5/igt@gem_ctx_persistence@hang.html
[10]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_8444/shard-rkl-4/igt@gem_ctx_persistence@hang.html
* igt@gem_eio@suspend:
- {shard-rkl}: [FAIL][11] ([i915#5115] / [i915#7052]) -> [PASS][12]
[11]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_12691/shard-rkl-4/igt@gem_eio@suspend.html
[12]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_8444/shard-rkl-2/igt@gem_eio@suspend.html
* igt@gem_exec_endless@dispatch@bcs0:
- {shard-rkl}: [SKIP][13] ([i915#6247]) -> [PASS][14]
[13]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_12691/shard-rkl-5/igt@gem_exec_endless@dispatch@bcs0.html
[14]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_8444/shard-rkl-1/igt@gem_exec_endless@dispatch@bcs0.html
* igt@gem_exec_fair@basic-pace@rcs0:
- shard-glk: [FAIL][15] ([i915#2842]) -> [PASS][16]
[15]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_12691/shard-glk7/igt@gem_exec_fair@basic-pace@rcs0.html
[16]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_8444/shard-glk6/igt@gem_exec_fair@basic-pace@rcs0.html
* igt@gem_exec_reloc@basic-wc-read-noreloc:
- {shard-rkl}: [SKIP][17] ([i915#3281]) -> [PASS][18] +9 similar issues
[17]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_12691/shard-rkl-2/igt@gem_exec_reloc@basic-wc-read-noreloc.html
[18]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_8444/shard-rkl-5/igt@gem_exec_reloc@basic-wc-read-noreloc.html
* igt@gem_mmap_gtt@coherency:
- {shard-rkl}: [SKIP][19] ([fdo#111656]) -> [PASS][20]
[19]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_12691/shard-rkl-1/igt@gem_mmap_gtt@coherency.html
[20]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_8444/shard-rkl-5/igt@gem_mmap_gtt@coherency.html
* igt@gem_pread@bench:
- {shard-rkl}: [SKIP][21] ([i915#3282]) -> [PASS][22] +5 similar issues
[21]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_12691/shard-rkl-2/igt@gem_pread@bench.html
[22]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_8444/shard-rkl-5/igt@gem_pread@bench.html
* igt@gen9_exec_parse@bb-start-far:
- {shard-rkl}: [SKIP][23] ([i915#2527]) -> [PASS][24] +3 similar issues
[23]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_12691/shard-rkl-4/igt@gen9_exec_parse@bb-start-far.html
[24]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_8444/shard-rkl-5/igt@gen9_exec_parse@bb-start-far.html
* igt@i915_pm_dc@dc9-dpms:
- {shard-rkl}: [SKIP][25] ([i915#3361]) -> [PASS][26]
[25]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_12691/shard-rkl-5/igt@i915_pm_dc@dc9-dpms.html
[26]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_8444/shard-rkl-4/igt@i915_pm_dc@dc9-dpms.html
* igt@i915_pm_rpm@dpms-lpsp:
- {shard-rkl}: [SKIP][27] ([i915#1397]) -> [PASS][28]
[27]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_12691/shard-rkl-3/igt@i915_pm_rpm@dpms-lpsp.html
[28]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_8444/shard-rkl-6/igt@i915_pm_rpm@dpms-lpsp.html
* igt@kms_big_fb@x-tiled-addfb-size-offset-overflow:
- {shard-tglu}: [SKIP][29] ([i915#1845] / [i915#7651]) -> [PASS][30] +3 similar issues
[29]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_12691/shard-tglu-6/igt@kms_big_fb@x-tiled-addfb-size-offset-overflow.html
[30]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_8444/shard-tglu-1/igt@kms_big_fb@x-tiled-addfb-size-offset-overflow.html
* igt@kms_ccs@pipe-a-bad-pixel-format-y_tiled_gen12_rc_ccs:
- {shard-rkl}: [SKIP][31] ([i915#1845] / [i915#4098]) -> [PASS][32] +21 similar issues
[31]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_12691/shard-rkl-2/igt@kms_ccs@pipe-a-bad-pixel-format-y_tiled_gen12_rc_ccs.html
[32]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_8444/shard-rkl-6/igt@kms_ccs@pipe-a-bad-pixel-format-y_tiled_gen12_rc_ccs.html
* igt@kms_flip@flip-vs-expired-vblank@b-hdmi-a2:
- shard-glk: [FAIL][33] ([i915#79]) -> [PASS][34]
[33]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_12691/shard-glk7/igt@kms_flip@flip-vs-expired-vblank@b-hdmi-a2.html
[34]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_8444/shard-glk4/igt@kms_flip@flip-vs-expired-vblank@b-hdmi-a2.html
* igt@kms_frontbuffer_tracking@fbc-1p-primscrn-shrfb-msflip-blt:
- {shard-tglu}: [SKIP][35] ([i915#1849]) -> [PASS][36] +4 similar issues
[35]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_12691/shard-tglu-6/igt@kms_frontbuffer_tracking@fbc-1p-primscrn-shrfb-msflip-blt.html
[36]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_8444/shard-tglu-1/igt@kms_frontbuffer_tracking@fbc-1p-primscrn-shrfb-msflip-blt.html
* igt@kms_frontbuffer_tracking@fbc-1p-primscrn-spr-indfb-draw-mmap-gtt:
- {shard-rkl}: [SKIP][37] ([i915#1849] / [i915#4098]) -> [PASS][38] +14 similar issues
[37]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_12691/shard-rkl-1/igt@kms_frontbuffer_tracking@fbc-1p-primscrn-spr-indfb-draw-mmap-gtt.html
[38]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_8444/shard-rkl-6/igt@kms_frontbuffer_tracking@fbc-1p-primscrn-spr-indfb-draw-mmap-gtt.html
* igt@kms_frontbuffer_tracking@fbc-modesetfrombusy:
- shard-glk: [FAIL][39] -> [PASS][40]
[39]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_12691/shard-glk6/igt@kms_frontbuffer_tracking@fbc-modesetfrombusy.html
[40]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_8444/shard-glk3/igt@kms_frontbuffer_tracking@fbc-modesetfrombusy.html
* igt@kms_plane@pixel-format@pipe-b-planes:
- {shard-tglu}: [SKIP][41] ([i915#1849] / [i915#3558]) -> [PASS][42] +1 similar issue
[41]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_12691/shard-tglu-6/igt@kms_plane@pixel-format@pipe-b-planes.html
[42]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_8444/shard-tglu-1/igt@kms_plane@pixel-format@pipe-b-planes.html
* igt@kms_plane@plane-panning-top-left@pipe-a-planes:
- {shard-rkl}: [SKIP][43] ([i915#1849]) -> [PASS][44] +5 similar issues
[43]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_12691/shard-rkl-1/igt@kms_plane@plane-panning-top-left@pipe-a-planes.html
[44]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_8444/shard-rkl-6/igt@kms_plane@plane-panning-top-left@pipe-a-planes.html
* igt@kms_psr@cursor_render:
- {shard-rkl}: [SKIP][45] ([i915#1072]) -> [PASS][46] +1 similar issue
[45]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_12691/shard-rkl-5/igt@kms_psr@cursor_render.html
[46]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_8444/shard-rkl-6/igt@kms_psr@cursor_render.html
* igt@kms_vblank@pipe-c-wait-forked-busy:
- {shard-tglu}: [SKIP][47] ([i915#7651]) -> [PASS][48] +4 similar issues
[47]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_12691/shard-tglu-6/igt@kms_vblank@pipe-c-wait-forked-busy.html
[48]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_8444/shard-tglu-7/igt@kms_vblank@pipe-c-wait-forked-busy.html
* igt@perf@gen8-unprivileged-single-ctx-counters:
- {shard-rkl}: [SKIP][49] ([i915#2436]) -> [PASS][50]
[49]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_12691/shard-rkl-4/igt@perf@gen8-unprivileged-single-ctx-counters.html
[50]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_8444/shard-rkl-5/igt@perf@gen8-unprivileged-single-ctx-counters.html
* igt@prime_vgem@basic-fence-flip:
- {shard-rkl}: [SKIP][51] ([fdo#109295] / [i915#3708] / [i915#4098]) -> [PASS][52]
[51]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_12691/shard-rkl-4/igt@prime_vgem@basic-fence-flip.html
[52]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_8444/shard-rkl-6/igt@prime_vgem@basic-fence-flip.html
* igt@prime_vgem@coherency-gtt:
- {shard-rkl}: [SKIP][53] ([fdo#109295] / [fdo#111656] / [i915#3708]) -> [PASS][54]
[53]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_12691/shard-rkl-3/igt@prime_vgem@coherency-gtt.html
[54]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_8444/shard-rkl-5/igt@prime_vgem@coherency-gtt.html
{name}: This element is suppressed. This means it is ignored when computing
the status of the difference (SUCCESS, WARNING, or FAILURE).
[fdo#109274]: https://bugs.freedesktop.org/show_bug.cgi?id=109274
[fdo#109280]: https://bugs.freedesktop.org/show_bug.cgi?id=109280
[fdo#109283]: https://bugs.freedesktop.org/show_bug.cgi?id=109283
[fdo#109289]: https://bugs.freedesktop.org/show_bug.cgi?id=109289
[fdo#109291]: https://bugs.freedesktop.org/show_bug.cgi?id=109291
[fdo#109295]: https://bugs.freedesktop.org/show_bug.cgi?id=109295
[fdo#109302]: https://bugs.freedesktop.org/show_bug.cgi?id=109302
[fdo#109307]: https://bugs.freedesktop.org/show_bug.cgi?id=109307
[fdo#109308]: https://bugs.freedesktop.org/show_bug.cgi?id=109308
[fdo#109309]: https://bugs.freedesktop.org/show_bug.cgi?id=109309
[fdo#109312]: https://bugs.freedesktop.org/show_bug.cgi?id=109312
[fdo#109314]: https://bugs.freedesktop.org/show_bug.cgi?id=109314
[fdo#109315]: https://bugs.freedesktop.org/show_bug.cgi?id=109315
[fdo#109506]: https://bugs.freedesktop.org/show_bug.cgi?id=109506
[fdo#109642]: https://bugs.freedesktop.org/show_bug.cgi?id=109642
[fdo#110189]: https://bugs.freedesktop.org/show_bug.cgi?id=110189
[fdo#110723]: https://bugs.freedesktop.org/show_bug.cgi?id=110723
[fdo#111068]: https://bugs.freedesktop.org/show_bug.cgi?id=111068
[fdo#111614]: https://bugs.freedesktop.org/show_bug.cgi?id=111614
[fdo#111615]: https://bugs.freedesktop.org/show_bug.cgi?id=111615
[fdo#111644]: https://bugs.freedesktop.org/show_bug.cgi?id=111644
[fdo#111656]: https://bugs.freedesktop.org/show_bug.cgi?id=111656
[fdo#111825]: https://bugs.freedesktop.org/show_bug.cgi?id=111825
[fdo#111827]: https://bugs.freedesktop.org/show_bug.cgi?id=111827
[fdo#112054]: https://bugs.freedesktop.org/show_bug.cgi?id=112054
[fdo#112283]: https://bugs.freedesktop.org/show_bug.cgi?id=112283
[i915#1072]: https://gitlab.freedesktop.org/drm/intel/issues/1072
[i915#132]: https://gitlab.freedesktop.org/drm/intel/issues/132
[i915#1397]: https://gitlab.freedesktop.org/drm/intel/issues/1397
[i915#1722]: https://gitlab.freedesktop.org/drm/intel/issues/1722
[i915#1825]: https://gitlab.freedesktop.org/drm/intel/issues/1825
[i915#1839]: https://gitlab.freedesktop.org/drm/intel/issues/1839
[i915#1845]: https://gitlab.freedesktop.org/drm/intel/issues/1845
[i915#1849]: https://gitlab.freedesktop.org/drm/intel/issues/1849
[i915#1902]: https://gitlab.freedesktop.org/drm/intel/issues/1902
[i915#2346]: https://gitlab.freedesktop.org/drm/intel/issues/2346
[i915#2433]: https://gitlab.freedesktop.org/drm/intel/issues/2433
[i915#2436]: https://gitlab.freedesktop.org/drm/intel/issues/2436
[i915#2437]: https://gitlab.freedesktop.org/drm/intel/issues/2437
[i915#2527]: https://gitlab.freedesktop.org/drm/intel/issues/2527
[i915#2575]: https://gitlab.freedesktop.org/drm/intel/issues/2575
[i915#2582]: https://gitlab.freedesktop.org/drm/intel/issues/2582
[i915#2587]: https://gitlab.freedesktop.org/drm/intel/issues/2587
[i915#2658]: https://gitlab.freedesktop.org/drm/intel/issues/2658
[i915#2672]: https://gitlab.freedesktop.org/drm/intel/issues/2672
[i915#2705]: https://gitlab.freedesktop.org/drm/intel/issues/2705
[i915#280]: https://gitlab.freedesktop.org/drm/intel/issues/280
[i915#284]: https://gitlab.freedesktop.org/drm/intel/issues/284
[i915#2842]: https://gitlab.freedesktop.org/drm/intel/issues/2842
[i915#2856]: https://gitlab.freedesktop.org/drm/intel/issues/2856
[i915#2920]: https://gitlab.freedesktop.org/drm/intel/issues/2920
[i915#3116]: https://gitlab.freedesktop.org/drm/intel/issues/3116
[i915#315]: https://gitlab.freedesktop.org/drm/intel/issues/315
[i915#3281]: https://gitlab.freedesktop.org/drm/intel/issues/3281
[i915#3282]: https://gitlab.freedesktop.org/drm/intel/issues/3282
[i915#3297]: https://gitlab.freedesktop.org/drm/intel/issues/3297
[i915#3299]: https://gitlab.freedesktop.org/drm/intel/issues/3299
[i915#3318]: https://gitlab.freedesktop.org/drm/intel/issues/3318
[i915#3359]: https://gitlab.freedesktop.org/drm/intel/issues/3359
[i915#3361]: https://gitlab.freedesktop.org/drm/intel/issues/3361
[i915#3458]: https://gitlab.freedesktop.org/drm/intel/issues/3458
[i915#3469]: https://gitlab.freedesktop.org/drm/intel/issues/3469
[i915#3528]: https://gitlab.freedesktop.org/drm/intel/issues/3528
[i915#3539]: https://gitlab.freedesktop.org/drm/intel/issues/3539
[i915#3546]: https://gitlab.freedesktop.org/drm/intel/issues/3546
[i915#3555]: https://gitlab.freedesktop.org/drm/intel/issues/3555
[i915#3558]: https://gitlab.freedesktop.org/drm/intel/issues/3558
[i915#3637]: https://gitlab.freedesktop.org/drm/intel/issues/3637
[i915#3638]: https://gitlab.freedesktop.org/drm/intel/issues/3638
[i915#3689]: https://gitlab.freedesktop.org/drm/intel/issues/3689
[i915#3708]: https://gitlab.freedesktop.org/drm/intel/issues/3708
[i915#3734]: https://gitlab.freedesktop.org/drm/intel/issues/3734
[i915#3742]: https://gitlab.freedesktop.org/drm/intel/issues/3742
[i915#3840]: https://gitlab.freedesktop.org/drm/intel/issues/3840
[i915#3886]: https://gitlab.freedesktop.org/drm/intel/issues/3886
[i915#3936]: https://gitlab.freedesktop.org/drm/intel/issues/3936
[i915#3952]: https://gitlab.freedesktop.org/drm/intel/issues/3952
[i915#3955]: https://gitlab.freedesktop.org/drm/intel/issues/3955
[i915#3966]: https://gitlab.freedesktop.org/drm/intel/issues/3966
[i915#4036]: https://gitlab.freedesktop.org/drm/intel/issues/4036
[i915#4070]: https://gitlab.freedesktop.org/drm/intel/issues/4070
[i915#4077]: https://gitlab.freedesktop.org/drm/intel/issues/4077
[i915#4078]: https://gitlab.freedesktop.org/drm/intel/issues/4078
[i915#4079]: https://gitlab.freedesktop.org/drm/intel/issues/4079
[i915#4083]: https://gitlab.freedesktop.org/drm/intel/issues/4083
[i915#4098]: https://gitlab.freedesktop.org/drm/intel/issues/4098
[i915#4103]: https://gitlab.freedesktop.org/drm/intel/issues/4103
[i915#4212]: https://gitlab.freedesktop.org/drm/intel/issues/4212
[i915#4213]: https://gitlab.freedesktop.org/drm/intel/issues/4213
[i915#426]: https://gitlab.freedesktop.org/drm/intel/issues/426
[i915#4270]: https://gitlab.freedesktop.org/drm/intel/issues/4270
[i915#4281]: https://gitlab.freedesktop.org/drm/intel/issues/4281
[i915#4387]: https://gitlab.freedesktop.org/drm/intel/issues/4387
[i915#4538]: https://gitlab.freedesktop.org/drm/intel/issues/4538
[i915#4565]: https://gitlab.freedesktop.org/drm/intel/issues/4565
[i915#4613]: https://gitlab.freedesktop.org/drm/intel/issues/4613
[i915#4771]: https://gitlab.freedesktop.org/drm/intel/issues/4771
[i915#4812]: https://gitlab.freedesktop.org/drm/intel/issues/4812
[i915#4833]: https://gitlab.freedesktop.org/drm/intel/issues/4833
[i915#4852]: https://gitlab.freedesktop.org/drm/intel/issues/4852
[i915#4859]: https://gitlab.freedesktop.org/drm/intel/issues/4859
[i915#4860]: https://gitlab.freedesktop.org/drm/intel/issues/4860
[i915#4880]: https://gitlab.freedesktop.org/drm/intel/issues/4880
[i915#4885]: https://gitlab.freedesktop.org/drm/intel/issues/4885
[i915#4983]: https://gitlab.freedesktop.org/drm/intel/issues/4983
[i915#5115]: https://gitlab.freedesktop.org/drm/intel/issues/5115
[i915#5176]: https://gitlab.freedesktop.org/drm/intel/issues/5176
[i915#5235]: https://gitlab.freedesktop.org/drm/intel/issues/5235
[i915#5286]: https://gitlab.freedesktop.org/drm/intel/issues/5286
[i915#5288]: https://gitlab.freedesktop.org/drm/intel/issues/5288
[i915#5289]: https://gitlab.freedesktop.org/drm/intel/issues/5289
[i915#5325]: https://gitlab.freedesktop.org/drm/intel/issues/5325
[i915#533]: https://gitlab.freedesktop.org/drm/intel/issues/533
[i915#5461]: https://gitlab.freedesktop.org/drm/intel/issues/5461
[i915#5563]: https://gitlab.freedesktop.org/drm/intel/issues/5563
[i915#5784]: https://gitlab.freedesktop.org/drm/intel/issues/5784
[i915#6095]: https://gitlab.freedesktop.org/drm/intel/issues/6095
[i915#6245]: https://gitlab.freedesktop.org/drm/intel/issues/6245
[i915#6247]: https://gitlab.freedesktop.org/drm/intel/issues/6247
[i915#6248]: https://gitlab.freedesktop.org/drm/intel/issues/6248
[i915#6252]: https://gitlab.freedesktop.org/drm/intel/issues/6252
[i915#6301]: https://gitlab.freedesktop.org/drm/intel/issues/6301
[i915#6334]: https://gitlab.freedesktop.org/drm/intel/issues/6334
[i915#6335]: https://gitlab.freedesktop.org/drm/intel/issues/6335
[i915#6344]: https://gitlab.freedesktop.org/drm/intel/issues/6344
[i915#6403]: https://gitlab.freedesktop.org/drm/intel/issues/6403
[i915#6412]: https://gitlab.freedesktop.org/drm/intel/issues/6412
[i915#6433]: https://gitlab.freedesktop.org/drm/intel/issues/6433
[i915#6497]: https://gitlab.freedesktop.org/drm/intel/issues/6497
[i915#6524]: https://gitlab.freedesktop.org/drm/intel/issues/6524
[i915#658]: https://gitlab.freedesktop.org/drm/intel/issues/658
[i915#6621]: https://gitlab.freedesktop.org/drm/intel/issues/6621
[i915#6768]: https://gitlab.freedesktop.org/drm/intel/issues/6768
[i915#6944]: https://gitlab.freedesktop.org/drm/intel/issues/6944
[i915#6946]: https://gitlab.freedesktop.org/drm/intel/issues/6946
[i915#6953]: https://gitlab.freedesktop.org/drm/intel/issues/6953
[i915#7052]: https://gitlab.freedesktop.org/drm/intel/issues/7052
[i915#7116]: https://gitlab.freedesktop.org/drm/intel/issues/7116
[i915#7118]: https://gitlab.freedesktop.org/drm/intel/issues/7118
[i915#7128]: https://gitlab.freedesktop.org/drm/intel/issues/7128
[i915#7178]: https://gitlab.freedesktop.org/drm/intel/issues/7178
[i915#7294]: https://gitlab.freedesktop.org/drm/intel/issues/7294
[i915#7456]: https://gitlab.freedesktop.org/drm/intel/issues/7456
[i915#7561]: https://gitlab.freedesktop.org/drm/intel/issues/7561
[i915#7651]: https://gitlab.freedesktop.org/drm/intel/issues/7651
[i915#7697]: https://gitlab.freedesktop.org/drm/intel/issues/7697
[i915#7701]: https://gitlab.freedesktop.org/drm/intel/issues/7701
[i915#7707]: https://gitlab.freedesktop.org/drm/intel/issues/7707
[i915#7711]: https://gitlab.freedesktop.org/drm/intel/issues/7711
[i915#7742]: https://gitlab.freedesktop.org/drm/intel/issues/7742
[i915#7828]: https://gitlab.freedesktop.org/drm/intel/issues/7828
[i915#79]: https://gitlab.freedesktop.org/drm/intel/issues/79
[i915#7949]: https://gitlab.freedesktop.org/drm/intel/issues/7949
[i915#7975]: https://gitlab.freedesktop.org/drm/intel/issues/7975
[i915#7981]: https://gitlab.freedesktop.org/drm/intel/issues/7981
[i915#7997]: https://gitlab.freedesktop.org/drm/intel/issues/7997
Build changes
-------------
* CI: CI-20190529 -> None
* IGT: IGT_7148 -> IGTPW_8444
CI-20190529: 20190529
CI_DRM_12691: 2153bc2944d37403c6d5c4e1082d074a34d39ae9 @ git://anongit.freedesktop.org/gfx-ci/linux
IGTPW_8444: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_8444/index.html
IGT_7148: ee8e31cf39c44d3fdbd04d8db239f8a815f86121 @ https://gitlab.freedesktop.org/drm/igt-gpu-tools.git
== Logs ==
For more details see: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_8444/index.html
[-- Attachment #2: Type: text/html, Size: 14670 bytes --]
^ permalink raw reply [flat|nested] 28+ messages in thread
* Re: [Intel-gfx] [igt-dev] [PATCH i-g-t 2/3] intel_gpu_top: Rename STDOUT to TEXT
2023-02-03 11:16 ` [igt-dev] " Tvrtko Ursulin
@ 2023-02-07 13:15 ` Kamil Konieczny
-1 siblings, 0 replies; 28+ messages in thread
From: Kamil Konieczny @ 2023-02-07 13:15 UTC (permalink / raw)
To: igt-dev; +Cc: Intel-gfx, Caleb Callaway
On 2023-02-03 at 11:16:35 +0000, Tvrtko Ursulin wrote:
> From: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
>
> Internal cleanup only - the name text is more accurate given the output
> can also go to a file.
>
> Signed-off-by: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
> Cc: Caleb Callaway <caleb.callaway@intel.com>
Lgtm,
Reviewed-by: Kamil Konieczny <kamil.konieczny@linux.intel.com>
> ---
> tools/intel_gpu_top.c | 54 +++++++++++++++++++++----------------------
> 1 file changed, 26 insertions(+), 28 deletions(-)
>
> diff --git a/tools/intel_gpu_top.c b/tools/intel_gpu_top.c
> index e2a7f4753099..a980cc7043dc 100644
> --- a/tools/intel_gpu_top.c
> +++ b/tools/intel_gpu_top.c
> @@ -1282,7 +1282,7 @@ usage(const char *appname)
>
> static enum {
> INTERACTIVE,
> - STDOUT,
> + TEXT,
> JSON
> } output_mode;
>
> @@ -1387,33 +1387,31 @@ json_add_member(const struct cnt_group *parent, struct cnt_item *item,
> return 1;
> }
>
> -static unsigned int stdout_level;
> +static unsigned int text_level;
>
> -#define STDOUT_HEADER_REPEAT 20
> -static unsigned int stdout_lines = STDOUT_HEADER_REPEAT;
> -static bool stdout_header_repeat;
> +#define TEXT_HEADER_REPEAT 20
> +static unsigned int text_lines = TEXT_HEADER_REPEAT;
> +static bool text_header_repeat;
>
> -static void
> -stdout_open_struct(const char *name)
> +static void text_open_struct(const char *name)
> {
> - stdout_level++;
> - assert(stdout_level > 0);
> + text_level++;
> + assert(text_level > 0);
> }
>
> -static void
> -stdout_close_struct(void)
> +static void text_close_struct(void)
> {
> - assert(stdout_level > 0);
> - if (--stdout_level == 0) {
> - stdout_lines++;
> + assert(text_level > 0);
> + if (--text_level == 0) {
> + text_lines++;
> fputs("\n", out);
> fflush(out);
> }
> }
>
> static unsigned int
> -stdout_add_member(const struct cnt_group *parent, struct cnt_item *item,
> - unsigned int headers)
> +text_add_member(const struct cnt_group *parent, struct cnt_item *item,
> + unsigned int headers)
> {
> unsigned int fmt_tot = item->fmt_width + (item->fmt_precision ? 1 : 0);
> char buf[fmt_tot + 1];
> @@ -1565,10 +1563,10 @@ static const struct print_operations json_pops = {
> .print_group = print_group,
> };
>
> -static const struct print_operations stdout_pops = {
> - .open_struct = stdout_open_struct,
> - .close_struct = stdout_close_struct,
> - .add_member = stdout_add_member,
> +static const struct print_operations text_pops = {
> + .open_struct = text_open_struct,
> + .close_struct = text_close_struct,
> + .add_member = text_add_member,
> .print_group = print_group,
> };
>
> @@ -1584,9 +1582,9 @@ static bool print_groups(struct cnt_group **groups)
> static bool headers_printed = false;
> bool print_data = true;
>
> - if (output_mode == STDOUT &&
> - (stdout_header_repeat || !headers_printed)) {
> - unsigned int headers = stdout_lines % STDOUT_HEADER_REPEAT + 1;
> + if (output_mode == TEXT &&
> + (text_header_repeat || !headers_printed)) {
> + unsigned int headers = text_lines % TEXT_HEADER_REPEAT + 1;
>
> if (headers == 1 || headers == 2)
> for (struct cnt_group **grp = groups; *grp; grp++)
> @@ -2492,7 +2490,7 @@ int main(int argc, char **argv)
> list_device = true;
> break;
> case 'l':
> - output_mode = STDOUT;
> + output_mode = TEXT;
> break;
> case 'h':
> usage(argv[0]);
> @@ -2505,7 +2503,7 @@ int main(int argc, char **argv)
> }
>
> if (output_mode == INTERACTIVE && (output_path || isatty(1) != 1))
> - output_mode = STDOUT;
> + output_mode = TEXT;
>
> if (output_path && strcmp(output_path, "-")) {
> out = fopen(output_path, "w");
> @@ -2519,7 +2517,7 @@ int main(int argc, char **argv)
> out = stdout;
> }
>
> - stdout_header_repeat = output_mode == STDOUT && isatty(fileno(out));
> + text_header_repeat = output_mode == TEXT && isatty(fileno(out));
>
> if (signal(SIGINT, sigint_handler) == SIG_ERR)
> fprintf(stderr, "Failed to install signal handler!\n");
> @@ -2531,8 +2529,8 @@ int main(int argc, char **argv)
> pops = &term_pops;
> interactive_stdin();
> break;
> - case STDOUT:
> - pops = &stdout_pops;
> + case TEXT:
> + pops = &text_pops;
> break;
> case JSON:
> pops = &json_pops;
> --
> 2.34.1
>
^ permalink raw reply [flat|nested] 28+ messages in thread
* Re: [igt-dev] [PATCH i-g-t 2/3] intel_gpu_top: Rename STDOUT to TEXT
@ 2023-02-07 13:15 ` Kamil Konieczny
0 siblings, 0 replies; 28+ messages in thread
From: Kamil Konieczny @ 2023-02-07 13:15 UTC (permalink / raw)
To: igt-dev; +Cc: Intel-gfx, Caleb Callaway, Tvrtko Ursulin
On 2023-02-03 at 11:16:35 +0000, Tvrtko Ursulin wrote:
> From: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
>
> Internal cleanup only - the name text is more accurate given the output
> can also go to a file.
>
> Signed-off-by: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
> Cc: Caleb Callaway <caleb.callaway@intel.com>
Lgtm,
Reviewed-by: Kamil Konieczny <kamil.konieczny@linux.intel.com>
> ---
> tools/intel_gpu_top.c | 54 +++++++++++++++++++++----------------------
> 1 file changed, 26 insertions(+), 28 deletions(-)
>
> diff --git a/tools/intel_gpu_top.c b/tools/intel_gpu_top.c
> index e2a7f4753099..a980cc7043dc 100644
> --- a/tools/intel_gpu_top.c
> +++ b/tools/intel_gpu_top.c
> @@ -1282,7 +1282,7 @@ usage(const char *appname)
>
> static enum {
> INTERACTIVE,
> - STDOUT,
> + TEXT,
> JSON
> } output_mode;
>
> @@ -1387,33 +1387,31 @@ json_add_member(const struct cnt_group *parent, struct cnt_item *item,
> return 1;
> }
>
> -static unsigned int stdout_level;
> +static unsigned int text_level;
>
> -#define STDOUT_HEADER_REPEAT 20
> -static unsigned int stdout_lines = STDOUT_HEADER_REPEAT;
> -static bool stdout_header_repeat;
> +#define TEXT_HEADER_REPEAT 20
> +static unsigned int text_lines = TEXT_HEADER_REPEAT;
> +static bool text_header_repeat;
>
> -static void
> -stdout_open_struct(const char *name)
> +static void text_open_struct(const char *name)
> {
> - stdout_level++;
> - assert(stdout_level > 0);
> + text_level++;
> + assert(text_level > 0);
> }
>
> -static void
> -stdout_close_struct(void)
> +static void text_close_struct(void)
> {
> - assert(stdout_level > 0);
> - if (--stdout_level == 0) {
> - stdout_lines++;
> + assert(text_level > 0);
> + if (--text_level == 0) {
> + text_lines++;
> fputs("\n", out);
> fflush(out);
> }
> }
>
> static unsigned int
> -stdout_add_member(const struct cnt_group *parent, struct cnt_item *item,
> - unsigned int headers)
> +text_add_member(const struct cnt_group *parent, struct cnt_item *item,
> + unsigned int headers)
> {
> unsigned int fmt_tot = item->fmt_width + (item->fmt_precision ? 1 : 0);
> char buf[fmt_tot + 1];
> @@ -1565,10 +1563,10 @@ static const struct print_operations json_pops = {
> .print_group = print_group,
> };
>
> -static const struct print_operations stdout_pops = {
> - .open_struct = stdout_open_struct,
> - .close_struct = stdout_close_struct,
> - .add_member = stdout_add_member,
> +static const struct print_operations text_pops = {
> + .open_struct = text_open_struct,
> + .close_struct = text_close_struct,
> + .add_member = text_add_member,
> .print_group = print_group,
> };
>
> @@ -1584,9 +1582,9 @@ static bool print_groups(struct cnt_group **groups)
> static bool headers_printed = false;
> bool print_data = true;
>
> - if (output_mode == STDOUT &&
> - (stdout_header_repeat || !headers_printed)) {
> - unsigned int headers = stdout_lines % STDOUT_HEADER_REPEAT + 1;
> + if (output_mode == TEXT &&
> + (text_header_repeat || !headers_printed)) {
> + unsigned int headers = text_lines % TEXT_HEADER_REPEAT + 1;
>
> if (headers == 1 || headers == 2)
> for (struct cnt_group **grp = groups; *grp; grp++)
> @@ -2492,7 +2490,7 @@ int main(int argc, char **argv)
> list_device = true;
> break;
> case 'l':
> - output_mode = STDOUT;
> + output_mode = TEXT;
> break;
> case 'h':
> usage(argv[0]);
> @@ -2505,7 +2503,7 @@ int main(int argc, char **argv)
> }
>
> if (output_mode == INTERACTIVE && (output_path || isatty(1) != 1))
> - output_mode = STDOUT;
> + output_mode = TEXT;
>
> if (output_path && strcmp(output_path, "-")) {
> out = fopen(output_path, "w");
> @@ -2519,7 +2517,7 @@ int main(int argc, char **argv)
> out = stdout;
> }
>
> - stdout_header_repeat = output_mode == STDOUT && isatty(fileno(out));
> + text_header_repeat = output_mode == TEXT && isatty(fileno(out));
>
> if (signal(SIGINT, sigint_handler) == SIG_ERR)
> fprintf(stderr, "Failed to install signal handler!\n");
> @@ -2531,8 +2529,8 @@ int main(int argc, char **argv)
> pops = &term_pops;
> interactive_stdin();
> break;
> - case STDOUT:
> - pops = &stdout_pops;
> + case TEXT:
> + pops = &text_pops;
> break;
> case JSON:
> pops = &json_pops;
> --
> 2.34.1
>
^ permalink raw reply [flat|nested] 28+ messages in thread
* Re: [Intel-gfx] [PATCH i-g-t 1/3] intel_gpu_top: Do not repeat header lines in non-interactive output
2023-02-03 11:16 ` [igt-dev] " Tvrtko Ursulin
@ 2023-02-07 13:25 ` Kamil Konieczny
-1 siblings, 0 replies; 28+ messages in thread
From: Kamil Konieczny @ 2023-02-07 13:25 UTC (permalink / raw)
To: igt-dev; +Cc: Intel-gfx, Caleb Callaway
On 2023-02-03 at 11:16:34 +0000, Tvrtko Ursulin wrote:
> From: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
>
> If output is redirected to a file, or a pipe, lets not repeat the headers
> because that can usually mean user is trying to parse the data later and
> so repeated headers are a hindrance.
>
> Signed-off-by: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
> Cc: Caleb Callaway <caleb.callaway@intel.com>
Reviewed-by: Kamil Konieczny <kamil.konieczny@linux.intel.com>
> ---
> tools/intel_gpu_top.c | 19 ++++++++++++++-----
> 1 file changed, 14 insertions(+), 5 deletions(-)
>
> diff --git a/tools/intel_gpu_top.c b/tools/intel_gpu_top.c
> index 0a1de41b3374..e2a7f4753099 100644
> --- a/tools/intel_gpu_top.c
> +++ b/tools/intel_gpu_top.c
> @@ -1391,6 +1391,7 @@ static unsigned int stdout_level;
>
> #define STDOUT_HEADER_REPEAT 20
> static unsigned int stdout_lines = STDOUT_HEADER_REPEAT;
> +static bool stdout_header_repeat;
>
> static void
> stdout_open_struct(const char *name)
> @@ -1580,16 +1581,22 @@ static const struct print_operations term_pops = {
>
> static bool print_groups(struct cnt_group **groups)
> {
> - unsigned int headers = stdout_lines % STDOUT_HEADER_REPEAT + 1;
> + static bool headers_printed = false;
> bool print_data = true;
>
> - if (output_mode == STDOUT && (headers == 1 || headers == 2)) {
> - for (struct cnt_group **grp = groups; *grp; grp++)
> - print_data = pops->print_group(*grp, headers);
> + if (output_mode == STDOUT &&
> + (stdout_header_repeat || !headers_printed)) {
> + unsigned int headers = stdout_lines % STDOUT_HEADER_REPEAT + 1;
> +
> + if (headers == 1 || headers == 2)
> + for (struct cnt_group **grp = groups; *grp; grp++)
> + print_data = pops->print_group(*grp, headers);
> +
> + headers_printed = print_data;
> }
>
> for (struct cnt_group **grp = groups; print_data && *grp; grp++)
> - pops->print_group(*grp, false);
> + pops->print_group(*grp, 0);
>
> return print_data;
> }
> @@ -2512,6 +2519,8 @@ int main(int argc, char **argv)
> out = stdout;
> }
>
> + stdout_header_repeat = output_mode == STDOUT && isatty(fileno(out));
> +
> if (signal(SIGINT, sigint_handler) == SIG_ERR)
> fprintf(stderr, "Failed to install signal handler!\n");
>
> --
> 2.34.1
>
^ permalink raw reply [flat|nested] 28+ messages in thread
* Re: [igt-dev] [Intel-gfx] [PATCH i-g-t 1/3] intel_gpu_top: Do not repeat header lines in non-interactive output
@ 2023-02-07 13:25 ` Kamil Konieczny
0 siblings, 0 replies; 28+ messages in thread
From: Kamil Konieczny @ 2023-02-07 13:25 UTC (permalink / raw)
To: igt-dev; +Cc: Intel-gfx, Caleb Callaway
On 2023-02-03 at 11:16:34 +0000, Tvrtko Ursulin wrote:
> From: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
>
> If output is redirected to a file, or a pipe, lets not repeat the headers
> because that can usually mean user is trying to parse the data later and
> so repeated headers are a hindrance.
>
> Signed-off-by: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
> Cc: Caleb Callaway <caleb.callaway@intel.com>
Reviewed-by: Kamil Konieczny <kamil.konieczny@linux.intel.com>
> ---
> tools/intel_gpu_top.c | 19 ++++++++++++++-----
> 1 file changed, 14 insertions(+), 5 deletions(-)
>
> diff --git a/tools/intel_gpu_top.c b/tools/intel_gpu_top.c
> index 0a1de41b3374..e2a7f4753099 100644
> --- a/tools/intel_gpu_top.c
> +++ b/tools/intel_gpu_top.c
> @@ -1391,6 +1391,7 @@ static unsigned int stdout_level;
>
> #define STDOUT_HEADER_REPEAT 20
> static unsigned int stdout_lines = STDOUT_HEADER_REPEAT;
> +static bool stdout_header_repeat;
>
> static void
> stdout_open_struct(const char *name)
> @@ -1580,16 +1581,22 @@ static const struct print_operations term_pops = {
>
> static bool print_groups(struct cnt_group **groups)
> {
> - unsigned int headers = stdout_lines % STDOUT_HEADER_REPEAT + 1;
> + static bool headers_printed = false;
> bool print_data = true;
>
> - if (output_mode == STDOUT && (headers == 1 || headers == 2)) {
> - for (struct cnt_group **grp = groups; *grp; grp++)
> - print_data = pops->print_group(*grp, headers);
> + if (output_mode == STDOUT &&
> + (stdout_header_repeat || !headers_printed)) {
> + unsigned int headers = stdout_lines % STDOUT_HEADER_REPEAT + 1;
> +
> + if (headers == 1 || headers == 2)
> + for (struct cnt_group **grp = groups; *grp; grp++)
> + print_data = pops->print_group(*grp, headers);
> +
> + headers_printed = print_data;
> }
>
> for (struct cnt_group **grp = groups; print_data && *grp; grp++)
> - pops->print_group(*grp, false);
> + pops->print_group(*grp, 0);
>
> return print_data;
> }
> @@ -2512,6 +2519,8 @@ int main(int argc, char **argv)
> out = stdout;
> }
>
> + stdout_header_repeat = output_mode == STDOUT && isatty(fileno(out));
> +
> if (signal(SIGINT, sigint_handler) == SIG_ERR)
> fprintf(stderr, "Failed to install signal handler!\n");
>
> --
> 2.34.1
>
^ permalink raw reply [flat|nested] 28+ messages in thread
* Re: [Intel-gfx] [PATCH i-g-t 3/3] intel_gpu_top: Add CSV output format
2023-02-03 11:31 ` [igt-dev] " Tvrtko Ursulin
@ 2023-02-07 13:29 ` Kamil Konieczny
-1 siblings, 0 replies; 28+ messages in thread
From: Kamil Konieczny @ 2023-02-07 13:29 UTC (permalink / raw)
To: igt-dev; +Cc: Intel-gfx, Caleb Callaway
On 2023-02-03 at 11:31:19 +0000, Tvrtko Ursulin wrote:
> From: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
>
> Add CSV output mode.
>
> Signed-off-by: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
> Cc: Caleb Callaway <caleb.callaway@intel.com>
Reviewed-by: Kamil Konieczny <kamil.konieczny@linux.intel.com>
> ---
> man/intel_gpu_top.rst | 3 ++
> tools/intel_gpu_top.c | 78 +++++++++++++++++++++++++++++++++++++++++--
> 2 files changed, 78 insertions(+), 3 deletions(-)
>
> diff --git a/man/intel_gpu_top.rst b/man/intel_gpu_top.rst
> index 69834756b81e..2d041457a95e 100644
> --- a/man/intel_gpu_top.rst
> +++ b/man/intel_gpu_top.rst
> @@ -31,6 +31,9 @@ OPTIONS
> -h
> Show help text.
>
> +-c
> + Output CSV formatted data.
> +
> -J
> Output JSON formatted data.
>
> diff --git a/tools/intel_gpu_top.c b/tools/intel_gpu_top.c
> index a980cc7043dc..2e1365959d8b 100644
> --- a/tools/intel_gpu_top.c
> +++ b/tools/intel_gpu_top.c
> @@ -1268,6 +1268,7 @@ usage(const char *appname)
> "\n"
> "\tThe following parameters are optional:\n\n"
> "\t[-h] Show this help text.\n"
> + "\t[-c] Output CSV formatted data.\n"
> "\t[-J] Output JSON formatted data.\n"
> "\t[-l] List plain text data.\n"
> "\t[-o <file|->] Output to specified file or '-' for standard out.\n"
> @@ -1283,6 +1284,7 @@ usage(const char *appname)
> static enum {
> INTERACTIVE,
> TEXT,
> + CSV,
> JSON
> } output_mode;
>
> @@ -1457,6 +1459,22 @@ text_add_member(const struct cnt_group *parent, struct cnt_item *item,
> return len > 0 ? len : 0;
> }
>
> +static unsigned int
> +csv_add_member(const struct cnt_group *parent, struct cnt_item *item,
> + unsigned int headers)
> +{
> + int len = 0;
> +
> + if (headers)
> + fprintf(out, "%s %s", parent->display_name, item->unit);
> + else
> + len = fprintf(out, "%f",
> + pmu_calc(&item->pmu->val, item->d, item->t,
> + item->s));
> +
> + return len > 0 ? len : 0;
> +}
> +
> static void
> term_open_struct(const char *name)
> {
> @@ -1540,6 +1558,46 @@ print_group(struct cnt_group *grp, unsigned int headers)
> return consumed;
> }
>
> +static unsigned int csv_count, prev_csv_count;
> +
> +static void csv_close_struct(void)
> +{
> + assert(text_level > 0);
> + if (--text_level == 0) {
> + csv_count = prev_csv_count = 0;
> + text_lines++;
> + fputs("\n", out);
> + fflush(out);
> + }
> +}
> +
> +static bool
> +csv_print_group(struct cnt_group *grp, unsigned int headers)
> +{
> + unsigned int consumed = 0;
> + struct cnt_item *item;
> +
> + if (!present_in_group(grp))
> + return false;
> +
> + text_open_struct(grp->name);
> +
> + for (item = grp->items; item->name; item++) {
> + if (!item->pmu || !item->pmu->present)
> + continue;
> +
> + if (csv_count != prev_csv_count)
> + fprintf(out, ",");
> + prev_csv_count = csv_count++;
> +
> + consumed += csv_add_member(grp, item, headers);
> + }
> +
> + csv_close_struct();
> +
> + return consumed;
> +}
> +
> static bool
> term_print_group(struct cnt_group *grp, unsigned int headers)
> {
> @@ -1570,6 +1628,13 @@ static const struct print_operations text_pops = {
> .print_group = print_group,
> };
>
> +static const struct print_operations csv_pops = {
> + .open_struct = text_open_struct,
> + .close_struct = csv_close_struct,
> + .add_member = csv_add_member,
> + .print_group = csv_print_group,
> +};
> +
> static const struct print_operations term_pops = {
> .open_struct = term_open_struct,
> .close_struct = term_close_struct,
> @@ -1582,11 +1647,12 @@ static bool print_groups(struct cnt_group **groups)
> static bool headers_printed = false;
> bool print_data = true;
>
> - if (output_mode == TEXT &&
> + if ((output_mode == TEXT || output_mode == CSV) &&
> (text_header_repeat || !headers_printed)) {
> + const unsigned int header_lines = output_mode == TEXT ? 2 : 1;
> unsigned int headers = text_lines % TEXT_HEADER_REPEAT + 1;
>
> - if (headers == 1 || headers == 2)
> + if (headers > 0 && headers <= header_lines)
> for (struct cnt_group **grp = groups; *grp; grp++)
> print_data = pops->print_group(*grp, headers);
>
> @@ -2469,7 +2535,7 @@ int main(int argc, char **argv)
> char *codename = NULL;
>
> /* Parse options */
> - while ((ch = getopt(argc, argv, "o:s:d:pJLlh")) != -1) {
> + while ((ch = getopt(argc, argv, "o:s:d:pcJLlh")) != -1) {
> switch (ch) {
> case 'o':
> output_path = optarg;
> @@ -2483,6 +2549,9 @@ int main(int argc, char **argv)
> case 'p':
> physical_engines = true;
> break;
> + case 'c':
> + output_mode = CSV;
> + break;
> case 'J':
> output_mode = JSON;
> break;
> @@ -2532,6 +2601,9 @@ int main(int argc, char **argv)
> case TEXT:
> pops = &text_pops;
> break;
> + case CSV:
> + pops = &csv_pops;
> + break;
> case JSON:
> pops = &json_pops;
> break;
> --
> 2.34.1
>
^ permalink raw reply [flat|nested] 28+ messages in thread
* Re: [igt-dev] [Intel-gfx] [PATCH i-g-t 3/3] intel_gpu_top: Add CSV output format
@ 2023-02-07 13:29 ` Kamil Konieczny
0 siblings, 0 replies; 28+ messages in thread
From: Kamil Konieczny @ 2023-02-07 13:29 UTC (permalink / raw)
To: igt-dev; +Cc: Intel-gfx, Caleb Callaway
On 2023-02-03 at 11:31:19 +0000, Tvrtko Ursulin wrote:
> From: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
>
> Add CSV output mode.
>
> Signed-off-by: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
> Cc: Caleb Callaway <caleb.callaway@intel.com>
Reviewed-by: Kamil Konieczny <kamil.konieczny@linux.intel.com>
> ---
> man/intel_gpu_top.rst | 3 ++
> tools/intel_gpu_top.c | 78 +++++++++++++++++++++++++++++++++++++++++--
> 2 files changed, 78 insertions(+), 3 deletions(-)
>
> diff --git a/man/intel_gpu_top.rst b/man/intel_gpu_top.rst
> index 69834756b81e..2d041457a95e 100644
> --- a/man/intel_gpu_top.rst
> +++ b/man/intel_gpu_top.rst
> @@ -31,6 +31,9 @@ OPTIONS
> -h
> Show help text.
>
> +-c
> + Output CSV formatted data.
> +
> -J
> Output JSON formatted data.
>
> diff --git a/tools/intel_gpu_top.c b/tools/intel_gpu_top.c
> index a980cc7043dc..2e1365959d8b 100644
> --- a/tools/intel_gpu_top.c
> +++ b/tools/intel_gpu_top.c
> @@ -1268,6 +1268,7 @@ usage(const char *appname)
> "\n"
> "\tThe following parameters are optional:\n\n"
> "\t[-h] Show this help text.\n"
> + "\t[-c] Output CSV formatted data.\n"
> "\t[-J] Output JSON formatted data.\n"
> "\t[-l] List plain text data.\n"
> "\t[-o <file|->] Output to specified file or '-' for standard out.\n"
> @@ -1283,6 +1284,7 @@ usage(const char *appname)
> static enum {
> INTERACTIVE,
> TEXT,
> + CSV,
> JSON
> } output_mode;
>
> @@ -1457,6 +1459,22 @@ text_add_member(const struct cnt_group *parent, struct cnt_item *item,
> return len > 0 ? len : 0;
> }
>
> +static unsigned int
> +csv_add_member(const struct cnt_group *parent, struct cnt_item *item,
> + unsigned int headers)
> +{
> + int len = 0;
> +
> + if (headers)
> + fprintf(out, "%s %s", parent->display_name, item->unit);
> + else
> + len = fprintf(out, "%f",
> + pmu_calc(&item->pmu->val, item->d, item->t,
> + item->s));
> +
> + return len > 0 ? len : 0;
> +}
> +
> static void
> term_open_struct(const char *name)
> {
> @@ -1540,6 +1558,46 @@ print_group(struct cnt_group *grp, unsigned int headers)
> return consumed;
> }
>
> +static unsigned int csv_count, prev_csv_count;
> +
> +static void csv_close_struct(void)
> +{
> + assert(text_level > 0);
> + if (--text_level == 0) {
> + csv_count = prev_csv_count = 0;
> + text_lines++;
> + fputs("\n", out);
> + fflush(out);
> + }
> +}
> +
> +static bool
> +csv_print_group(struct cnt_group *grp, unsigned int headers)
> +{
> + unsigned int consumed = 0;
> + struct cnt_item *item;
> +
> + if (!present_in_group(grp))
> + return false;
> +
> + text_open_struct(grp->name);
> +
> + for (item = grp->items; item->name; item++) {
> + if (!item->pmu || !item->pmu->present)
> + continue;
> +
> + if (csv_count != prev_csv_count)
> + fprintf(out, ",");
> + prev_csv_count = csv_count++;
> +
> + consumed += csv_add_member(grp, item, headers);
> + }
> +
> + csv_close_struct();
> +
> + return consumed;
> +}
> +
> static bool
> term_print_group(struct cnt_group *grp, unsigned int headers)
> {
> @@ -1570,6 +1628,13 @@ static const struct print_operations text_pops = {
> .print_group = print_group,
> };
>
> +static const struct print_operations csv_pops = {
> + .open_struct = text_open_struct,
> + .close_struct = csv_close_struct,
> + .add_member = csv_add_member,
> + .print_group = csv_print_group,
> +};
> +
> static const struct print_operations term_pops = {
> .open_struct = term_open_struct,
> .close_struct = term_close_struct,
> @@ -1582,11 +1647,12 @@ static bool print_groups(struct cnt_group **groups)
> static bool headers_printed = false;
> bool print_data = true;
>
> - if (output_mode == TEXT &&
> + if ((output_mode == TEXT || output_mode == CSV) &&
> (text_header_repeat || !headers_printed)) {
> + const unsigned int header_lines = output_mode == TEXT ? 2 : 1;
> unsigned int headers = text_lines % TEXT_HEADER_REPEAT + 1;
>
> - if (headers == 1 || headers == 2)
> + if (headers > 0 && headers <= header_lines)
> for (struct cnt_group **grp = groups; *grp; grp++)
> print_data = pops->print_group(*grp, headers);
>
> @@ -2469,7 +2535,7 @@ int main(int argc, char **argv)
> char *codename = NULL;
>
> /* Parse options */
> - while ((ch = getopt(argc, argv, "o:s:d:pJLlh")) != -1) {
> + while ((ch = getopt(argc, argv, "o:s:d:pcJLlh")) != -1) {
> switch (ch) {
> case 'o':
> output_path = optarg;
> @@ -2483,6 +2549,9 @@ int main(int argc, char **argv)
> case 'p':
> physical_engines = true;
> break;
> + case 'c':
> + output_mode = CSV;
> + break;
> case 'J':
> output_mode = JSON;
> break;
> @@ -2532,6 +2601,9 @@ int main(int argc, char **argv)
> case TEXT:
> pops = &text_pops;
> break;
> + case CSV:
> + pops = &csv_pops;
> + break;
> case JSON:
> pops = &json_pops;
> break;
> --
> 2.34.1
>
^ permalink raw reply [flat|nested] 28+ messages in thread
* Re: [Intel-gfx] [PATCH i-g-t 1/3] intel_gpu_top: Do not repeat header lines in non-interactive output
2023-02-03 11:16 ` [igt-dev] " Tvrtko Ursulin
@ 2023-02-08 12:31 ` Kamil Konieczny
-1 siblings, 0 replies; 28+ messages in thread
From: Kamil Konieczny @ 2023-02-08 12:31 UTC (permalink / raw)
To: igt-dev; +Cc: Intel-gfx, Caleb Callaway
Hi Tvrtko,
one small nit, see below.
On 2023-02-03 at 11:16:34 +0000, Tvrtko Ursulin wrote:
> From: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
>
> If output is redirected to a file, or a pipe, lets not repeat the headers
> because that can usually mean user is trying to parse the data later and
> so repeated headers are a hindrance.
>
> Signed-off-by: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
> Cc: Caleb Callaway <caleb.callaway@intel.com>
> ---
> tools/intel_gpu_top.c | 19 ++++++++++++++-----
> 1 file changed, 14 insertions(+), 5 deletions(-)
>
> diff --git a/tools/intel_gpu_top.c b/tools/intel_gpu_top.c
> index 0a1de41b3374..e2a7f4753099 100644
> --- a/tools/intel_gpu_top.c
> +++ b/tools/intel_gpu_top.c
> @@ -1391,6 +1391,7 @@ static unsigned int stdout_level;
>
> #define STDOUT_HEADER_REPEAT 20
> static unsigned int stdout_lines = STDOUT_HEADER_REPEAT;
> +static bool stdout_header_repeat;
>
> static void
> stdout_open_struct(const char *name)
> @@ -1580,16 +1581,22 @@ static const struct print_operations term_pops = {
>
> static bool print_groups(struct cnt_group **groups)
> {
> - unsigned int headers = stdout_lines % STDOUT_HEADER_REPEAT + 1;
> + static bool headers_printed = false;
----------------------------------- ^
Remove this initialization (use checkpatch from Linux kernel).
Please correct and resend (you can keep my r-b).
Regards,
Kamil
> bool print_data = true;
>
> - if (output_mode == STDOUT && (headers == 1 || headers == 2)) {
> - for (struct cnt_group **grp = groups; *grp; grp++)
> - print_data = pops->print_group(*grp, headers);
> + if (output_mode == STDOUT &&
> + (stdout_header_repeat || !headers_printed)) {
> + unsigned int headers = stdout_lines % STDOUT_HEADER_REPEAT + 1;
> +
> + if (headers == 1 || headers == 2)
> + for (struct cnt_group **grp = groups; *grp; grp++)
> + print_data = pops->print_group(*grp, headers);
> +
> + headers_printed = print_data;
> }
>
> for (struct cnt_group **grp = groups; print_data && *grp; grp++)
> - pops->print_group(*grp, false);
> + pops->print_group(*grp, 0);
>
> return print_data;
> }
> @@ -2512,6 +2519,8 @@ int main(int argc, char **argv)
> out = stdout;
> }
>
> + stdout_header_repeat = output_mode == STDOUT && isatty(fileno(out));
> +
> if (signal(SIGINT, sigint_handler) == SIG_ERR)
> fprintf(stderr, "Failed to install signal handler!\n");
>
> --
> 2.34.1
>
^ permalink raw reply [flat|nested] 28+ messages in thread
* Re: [igt-dev] [Intel-gfx] [PATCH i-g-t 1/3] intel_gpu_top: Do not repeat header lines in non-interactive output
@ 2023-02-08 12:31 ` Kamil Konieczny
0 siblings, 0 replies; 28+ messages in thread
From: Kamil Konieczny @ 2023-02-08 12:31 UTC (permalink / raw)
To: igt-dev; +Cc: Intel-gfx, Caleb Callaway
Hi Tvrtko,
one small nit, see below.
On 2023-02-03 at 11:16:34 +0000, Tvrtko Ursulin wrote:
> From: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
>
> If output is redirected to a file, or a pipe, lets not repeat the headers
> because that can usually mean user is trying to parse the data later and
> so repeated headers are a hindrance.
>
> Signed-off-by: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
> Cc: Caleb Callaway <caleb.callaway@intel.com>
> ---
> tools/intel_gpu_top.c | 19 ++++++++++++++-----
> 1 file changed, 14 insertions(+), 5 deletions(-)
>
> diff --git a/tools/intel_gpu_top.c b/tools/intel_gpu_top.c
> index 0a1de41b3374..e2a7f4753099 100644
> --- a/tools/intel_gpu_top.c
> +++ b/tools/intel_gpu_top.c
> @@ -1391,6 +1391,7 @@ static unsigned int stdout_level;
>
> #define STDOUT_HEADER_REPEAT 20
> static unsigned int stdout_lines = STDOUT_HEADER_REPEAT;
> +static bool stdout_header_repeat;
>
> static void
> stdout_open_struct(const char *name)
> @@ -1580,16 +1581,22 @@ static const struct print_operations term_pops = {
>
> static bool print_groups(struct cnt_group **groups)
> {
> - unsigned int headers = stdout_lines % STDOUT_HEADER_REPEAT + 1;
> + static bool headers_printed = false;
----------------------------------- ^
Remove this initialization (use checkpatch from Linux kernel).
Please correct and resend (you can keep my r-b).
Regards,
Kamil
> bool print_data = true;
>
> - if (output_mode == STDOUT && (headers == 1 || headers == 2)) {
> - for (struct cnt_group **grp = groups; *grp; grp++)
> - print_data = pops->print_group(*grp, headers);
> + if (output_mode == STDOUT &&
> + (stdout_header_repeat || !headers_printed)) {
> + unsigned int headers = stdout_lines % STDOUT_HEADER_REPEAT + 1;
> +
> + if (headers == 1 || headers == 2)
> + for (struct cnt_group **grp = groups; *grp; grp++)
> + print_data = pops->print_group(*grp, headers);
> +
> + headers_printed = print_data;
> }
>
> for (struct cnt_group **grp = groups; print_data && *grp; grp++)
> - pops->print_group(*grp, false);
> + pops->print_group(*grp, 0);
>
> return print_data;
> }
> @@ -2512,6 +2519,8 @@ int main(int argc, char **argv)
> out = stdout;
> }
>
> + stdout_header_repeat = output_mode == STDOUT && isatty(fileno(out));
> +
> if (signal(SIGINT, sigint_handler) == SIG_ERR)
> fprintf(stderr, "Failed to install signal handler!\n");
>
> --
> 2.34.1
>
^ permalink raw reply [flat|nested] 28+ messages in thread
* Re: [Intel-gfx] [PATCH i-g-t 1/3] intel_gpu_top: Do not repeat header lines in non-interactive output
2023-02-08 12:31 ` [igt-dev] " Kamil Konieczny
@ 2023-02-09 8:24 ` Tvrtko Ursulin
-1 siblings, 0 replies; 28+ messages in thread
From: Tvrtko Ursulin @ 2023-02-09 8:24 UTC (permalink / raw)
To: Kamil Konieczny, igt-dev, Intel-gfx, Caleb Callaway
On 08/02/2023 12:31, Kamil Konieczny wrote:
> Hi Tvrtko,
>
> one small nit, see below.
>
> On 2023-02-03 at 11:16:34 +0000, Tvrtko Ursulin wrote:
>> From: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
>>
>> If output is redirected to a file, or a pipe, lets not repeat the headers
>> because that can usually mean user is trying to parse the data later and
>> so repeated headers are a hindrance.
>>
>> Signed-off-by: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
>> Cc: Caleb Callaway <caleb.callaway@intel.com>
>> ---
>> tools/intel_gpu_top.c | 19 ++++++++++++++-----
>> 1 file changed, 14 insertions(+), 5 deletions(-)
>>
>> diff --git a/tools/intel_gpu_top.c b/tools/intel_gpu_top.c
>> index 0a1de41b3374..e2a7f4753099 100644
>> --- a/tools/intel_gpu_top.c
>> +++ b/tools/intel_gpu_top.c
>> @@ -1391,6 +1391,7 @@ static unsigned int stdout_level;
>>
>> #define STDOUT_HEADER_REPEAT 20
>> static unsigned int stdout_lines = STDOUT_HEADER_REPEAT;
>> +static bool stdout_header_repeat;
>>
>> static void
>> stdout_open_struct(const char *name)
>> @@ -1580,16 +1581,22 @@ static const struct print_operations term_pops = {
>>
>> static bool print_groups(struct cnt_group **groups)
>> {
>> - unsigned int headers = stdout_lines % STDOUT_HEADER_REPEAT + 1;
>> + static bool headers_printed = false;
> ----------------------------------- ^
> Remove this initialization (use checkpatch from Linux kernel).
>
> Please correct and resend (you can keep my r-b).
Fixed and pushed, thanks for the review!
Regards,
Tvrtko
^ permalink raw reply [flat|nested] 28+ messages in thread
* Re: [igt-dev] [Intel-gfx] [PATCH i-g-t 1/3] intel_gpu_top: Do not repeat header lines in non-interactive output
@ 2023-02-09 8:24 ` Tvrtko Ursulin
0 siblings, 0 replies; 28+ messages in thread
From: Tvrtko Ursulin @ 2023-02-09 8:24 UTC (permalink / raw)
To: Kamil Konieczny, igt-dev, Intel-gfx, Caleb Callaway
On 08/02/2023 12:31, Kamil Konieczny wrote:
> Hi Tvrtko,
>
> one small nit, see below.
>
> On 2023-02-03 at 11:16:34 +0000, Tvrtko Ursulin wrote:
>> From: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
>>
>> If output is redirected to a file, or a pipe, lets not repeat the headers
>> because that can usually mean user is trying to parse the data later and
>> so repeated headers are a hindrance.
>>
>> Signed-off-by: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
>> Cc: Caleb Callaway <caleb.callaway@intel.com>
>> ---
>> tools/intel_gpu_top.c | 19 ++++++++++++++-----
>> 1 file changed, 14 insertions(+), 5 deletions(-)
>>
>> diff --git a/tools/intel_gpu_top.c b/tools/intel_gpu_top.c
>> index 0a1de41b3374..e2a7f4753099 100644
>> --- a/tools/intel_gpu_top.c
>> +++ b/tools/intel_gpu_top.c
>> @@ -1391,6 +1391,7 @@ static unsigned int stdout_level;
>>
>> #define STDOUT_HEADER_REPEAT 20
>> static unsigned int stdout_lines = STDOUT_HEADER_REPEAT;
>> +static bool stdout_header_repeat;
>>
>> static void
>> stdout_open_struct(const char *name)
>> @@ -1580,16 +1581,22 @@ static const struct print_operations term_pops = {
>>
>> static bool print_groups(struct cnt_group **groups)
>> {
>> - unsigned int headers = stdout_lines % STDOUT_HEADER_REPEAT + 1;
>> + static bool headers_printed = false;
> ----------------------------------- ^
> Remove this initialization (use checkpatch from Linux kernel).
>
> Please correct and resend (you can keep my r-b).
Fixed and pushed, thanks for the review!
Regards,
Tvrtko
^ permalink raw reply [flat|nested] 28+ messages in thread
end of thread, other threads:[~2023-02-09 8:25 UTC | newest]
Thread overview: 28+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-02-03 11:16 [Intel-gfx] [PATCH i-g-t 0/3] More intel_gpu_top improvements Tvrtko Ursulin
2023-02-03 11:16 ` [igt-dev] " Tvrtko Ursulin
2023-02-03 11:16 ` [Intel-gfx] [PATCH i-g-t 1/3] intel_gpu_top: Do not repeat header lines in non-interactive output Tvrtko Ursulin
2023-02-03 11:16 ` [igt-dev] " Tvrtko Ursulin
2023-02-07 13:25 ` [Intel-gfx] " Kamil Konieczny
2023-02-07 13:25 ` [igt-dev] " Kamil Konieczny
2023-02-08 12:31 ` Kamil Konieczny
2023-02-08 12:31 ` [igt-dev] " Kamil Konieczny
2023-02-09 8:24 ` Tvrtko Ursulin
2023-02-09 8:24 ` [igt-dev] " Tvrtko Ursulin
2023-02-03 11:16 ` [Intel-gfx] [PATCH i-g-t 2/3] intel_gpu_top: Rename STDOUT to TEXT Tvrtko Ursulin
2023-02-03 11:16 ` [igt-dev] " Tvrtko Ursulin
2023-02-07 13:15 ` [Intel-gfx] " Kamil Konieczny
2023-02-07 13:15 ` Kamil Konieczny
2023-02-03 11:16 ` [Intel-gfx] [PATCH i-g-t 3/3] intel_gpu_top: Add CVS output format Tvrtko Ursulin
2023-02-03 11:16 ` [igt-dev] " Tvrtko Ursulin
2023-02-03 11:22 ` [Intel-gfx] " Ville Syrjälä
2023-02-03 11:22 ` Ville Syrjälä
2023-02-03 11:27 ` [Intel-gfx] " Tvrtko Ursulin
2023-02-03 11:27 ` Tvrtko Ursulin
2023-02-03 11:30 ` [Intel-gfx] [PATCH i-g-t 3/3] intel_gpu_top: Add CSV " Tvrtko Ursulin
2023-02-03 11:30 ` [igt-dev] " Tvrtko Ursulin
2023-02-03 11:31 ` [Intel-gfx] " Tvrtko Ursulin
2023-02-03 11:31 ` [igt-dev] " Tvrtko Ursulin
2023-02-07 13:29 ` [Intel-gfx] " Kamil Konieczny
2023-02-07 13:29 ` [igt-dev] " Kamil Konieczny
2023-02-03 14:49 ` [igt-dev] ✓ Fi.CI.BAT: success for More intel_gpu_top improvements (rev3) Patchwork
2023-02-04 17:27 ` [igt-dev] ✓ Fi.CI.IGT: " Patchwork
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.