From patchwork Fri Feb 3 11:16:34 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tvrtko Ursulin X-Patchwork-Id: 13127390 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id B9713C61DA4 for ; Fri, 3 Feb 2023 11:16:55 +0000 (UTC) Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id 3432F10E776; Fri, 3 Feb 2023 11:16:52 +0000 (UTC) Received: from mga12.intel.com (mga12.intel.com [192.55.52.136]) by gabe.freedesktop.org (Postfix) with ESMTPS id 09FCC10E763; Fri, 3 Feb 2023 11:16:46 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1675423006; x=1706959006; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=P2waiUjSSpkxcxmZPg8GNGr5X5DhoLCZaXfAXxFMtss=; b=lVr5vvp9EdDzbimLk9K4aM6/mLvgBhxrBNewrhtGn3bwoXJX4LrjNXtV 3X3ir1aXJaOSk67BzAPYakEq7QxB1WPjA7kUZOePxeXNlewLU/WxxRT/f WjejjwGTySem1WJa9r5lNgJJkWIWcZxweVHqZfCZpIwnuzZ+W7tryv4qJ suCtOPNzhziFSqgzogqgl2q8SkjVsybeivSEx+HFiEwLgTqvIkWqAI4oD 6G/b8QP+JfQmdXucPHLGVBFpfKXGeHr1gLzpl6LVETIUhWViz8pDrFa7+ L7PLF/tgpjiCUSa+V0EuPrcxVvsooAf3rDl5c5aiSWNuZsqCdjIRKMJo2 w==; X-IronPort-AV: E=McAfee;i="6500,9779,10609"; a="308363118" X-IronPort-AV: E=Sophos;i="5.97,270,1669104000"; d="scan'208";a="308363118" Received: from orsmga001.jf.intel.com ([10.7.209.18]) by fmsmga106.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 03 Feb 2023 03:16:45 -0800 X-IronPort-AV: E=McAfee;i="6500,9779,10609"; a="698036038" X-IronPort-AV: E=Sophos;i="5.97,270,1669104000"; d="scan'208";a="698036038" Received: from lhime-mobl1.ger.corp.intel.com (HELO localhost.localdomain) ([10.213.220.100]) by orsmga001-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 03 Feb 2023 03:16:44 -0800 From: Tvrtko Ursulin To: igt-dev@lists.freedesktop.org, Intel-gfx@lists.freedesktop.org Date: Fri, 3 Feb 2023 11:16:34 +0000 Message-Id: <20230203111636.4138202-2-tvrtko.ursulin@linux.intel.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20230203111636.4138202-1-tvrtko.ursulin@linux.intel.com> References: <20230203111636.4138202-1-tvrtko.ursulin@linux.intel.com> MIME-Version: 1.0 Subject: [Intel-gfx] [PATCH i-g-t 1/3] intel_gpu_top: Do not repeat header lines in non-interactive output X-BeenThere: intel-gfx@lists.freedesktop.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Intel graphics driver community testing & development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Caleb Callaway Errors-To: intel-gfx-bounces@lists.freedesktop.org Sender: "Intel-gfx" From: Tvrtko Ursulin 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 Cc: Caleb Callaway Reviewed-by: Kamil Konieczny --- 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"); From patchwork Fri Feb 3 11:16:35 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tvrtko Ursulin X-Patchwork-Id: 13127389 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id B9468C636CC for ; Fri, 3 Feb 2023 11:16:52 +0000 (UTC) Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id 1788E10E76A; Fri, 3 Feb 2023 11:16:50 +0000 (UTC) Received: from mga12.intel.com (mga12.intel.com [192.55.52.136]) by gabe.freedesktop.org (Postfix) with ESMTPS id 99D9610E76A; Fri, 3 Feb 2023 11:16:47 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1675423007; x=1706959007; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=L+5jAttLtUyThM3zKuHeqfl56HJxXiZWKMJ4GdOLkeY=; b=naRwjdCcbhLjhnR/1v0DcQtO0C5gtRVKutY8LR4n0HmYqGA1B9LQzxYn BjmVE5pyf26Wgh/E+SCZby1p1F+48e5csJ+ntiNEyY2Z3RItt+h3fv2NH Z6GfRvt0pSxLz4mtsAe3J15OBO8DFAoinPH5uYIkbhquN0+hwuvBPx4IN 4zpq73VbJyVtEDydJwS/336Z0LD7a18wvsPEuCKxdrPfbMxU3HbIP7bOQ N+3v6lrN8ypcf+Xjuind25PfaQaawjWx3s35jcLzQi2Er/k9D/G+yxm+h 6PDtPN11AOyrwLeqseufiGUzCq8RxdUBBv9T992kjUUCZRruDuwp5o5f+ Q==; X-IronPort-AV: E=McAfee;i="6500,9779,10609"; a="308363121" X-IronPort-AV: E=Sophos;i="5.97,270,1669104000"; d="scan'208";a="308363121" Received: from orsmga001.jf.intel.com ([10.7.209.18]) by fmsmga106.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 03 Feb 2023 03:16:47 -0800 X-IronPort-AV: E=McAfee;i="6500,9779,10609"; a="698036042" X-IronPort-AV: E=Sophos;i="5.97,270,1669104000"; d="scan'208";a="698036042" Received: from lhime-mobl1.ger.corp.intel.com (HELO localhost.localdomain) ([10.213.220.100]) by orsmga001-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 03 Feb 2023 03:16:45 -0800 From: Tvrtko Ursulin To: igt-dev@lists.freedesktop.org, Intel-gfx@lists.freedesktop.org Date: Fri, 3 Feb 2023 11:16:35 +0000 Message-Id: <20230203111636.4138202-3-tvrtko.ursulin@linux.intel.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20230203111636.4138202-1-tvrtko.ursulin@linux.intel.com> References: <20230203111636.4138202-1-tvrtko.ursulin@linux.intel.com> MIME-Version: 1.0 Subject: [Intel-gfx] [PATCH i-g-t 2/3] intel_gpu_top: Rename STDOUT to TEXT X-BeenThere: intel-gfx@lists.freedesktop.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Intel graphics driver community testing & development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Caleb Callaway Errors-To: intel-gfx-bounces@lists.freedesktop.org Sender: "Intel-gfx" From: Tvrtko Ursulin Internal cleanup only - the name text is more accurate given the output can also go to a file. Signed-off-by: Tvrtko Ursulin Cc: Caleb Callaway Reviewed-by: Kamil Konieczny --- 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; From patchwork Fri Feb 3 11:16:36 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tvrtko Ursulin X-Patchwork-Id: 13127391 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 18025C636CC for ; Fri, 3 Feb 2023 11:16:57 +0000 (UTC) Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id 93B0C10E777; Fri, 3 Feb 2023 11:16:52 +0000 (UTC) Received: from mga12.intel.com (mga12.intel.com [192.55.52.136]) by gabe.freedesktop.org (Postfix) with ESMTPS id 2D7B110E76A; Fri, 3 Feb 2023 11:16:49 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1675423009; x=1706959009; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=PsFkMQxTBEHuR5xSp9/k5A9CTUsRBWSnZyvCfAcSt2Y=; b=mtbdwh1Xe3zbODcIaq9z2CCGXCrvc7Wmn2DsvaJMDDwppHz1jzBWEtGw c4T+mGbTLpFtxqj9fpM/CwPlzXcWM9h0fO8GVnJiw9WNzwN7yiX1UouK2 xQGf7FM1hmAiqSMq2GcdmJUAEjgj13fnA3866h6Gcbm1d4brkycfRDzHH 2B28z3ZFmQTaI+/v0tw84zFe5y2jGwJ79JfjpsxFbEqV2fsSN5HG95QiE SGT03X/SdMwG2sBcvsCZ/MyUXNBEgUROEWrcJYhbtTQIOxqIxX9TOjgJa RXr5ZTytfSVkbLKwWUWMNJEJqzv8fJ79oH/AmGRCKQDCnRSmZxK7paapM A==; X-IronPort-AV: E=McAfee;i="6500,9779,10609"; a="308363123" X-IronPort-AV: E=Sophos;i="5.97,270,1669104000"; d="scan'208";a="308363123" Received: from orsmga001.jf.intel.com ([10.7.209.18]) by fmsmga106.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 03 Feb 2023 03:16:48 -0800 X-IronPort-AV: E=McAfee;i="6500,9779,10609"; a="698036045" X-IronPort-AV: E=Sophos;i="5.97,270,1669104000"; d="scan'208";a="698036045" Received: from lhime-mobl1.ger.corp.intel.com (HELO localhost.localdomain) ([10.213.220.100]) by orsmga001-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 03 Feb 2023 03:16:47 -0800 From: Tvrtko Ursulin To: igt-dev@lists.freedesktop.org, Intel-gfx@lists.freedesktop.org Date: Fri, 3 Feb 2023 11:16:36 +0000 Message-Id: <20230203111636.4138202-4-tvrtko.ursulin@linux.intel.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20230203111636.4138202-1-tvrtko.ursulin@linux.intel.com> References: <20230203111636.4138202-1-tvrtko.ursulin@linux.intel.com> MIME-Version: 1.0 Subject: [Intel-gfx] [PATCH i-g-t 3/3] intel_gpu_top: Add CVS output format X-BeenThere: intel-gfx@lists.freedesktop.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Intel graphics driver community testing & development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Caleb Callaway Errors-To: intel-gfx-bounces@lists.freedesktop.org Sender: "Intel-gfx" From: Tvrtko Ursulin Add CVS output mode. Signed-off-by: Tvrtko Ursulin Cc: Caleb Callaway --- 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 ] 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;