perf script: Add 'cgroup' field for output

Message ID 20230126194230.3339019-1-namhyung@kernel.org
State New
Headers
Series perf script: Add 'cgroup' field for output |

Commit Message

Namhyung Kim Jan. 26, 2023, 7:42 p.m. UTC
  There's no field for the cgroup, let's add one.  To do that, users need to
specify --all-cgroup option for perf record to capture the cgroup info.

  $ perf record --all-cgroups -- true

  $ perf script -F comm,pid,cgroup
            true 337112  /user.slice/user-657345.slice/user@657345.service/...
            true 337112  /user.slice/user-657345.slice/user@657345.service/...
            true 337112  /user.slice/user-657345.slice/user@657345.service/...
            true 337112  /user.slice/user-657345.slice/user@657345.service/...

Signed-off-by: Namhyung Kim <namhyung@kernel.org>
---
 tools/perf/Documentation/perf-script.txt |  2 +-
 tools/perf/builtin-script.c              | 16 +++++++++++++++-
 2 files changed, 16 insertions(+), 2 deletions(-)
  

Comments

Arnaldo Carvalho de Melo Jan. 26, 2023, 8:06 p.m. UTC | #1
On January 26, 2023 4:42:30 PM GMT-03:00, Namhyung Kim <namhyung@kernel.org> wrote:
>There's no field for the cgroup, let's add one.  To do that, users need to
>specify --all-cgroup option for perf record to capture the cgroup info.


This information about the new field being only available when --all-cgroup is specified should be in the documentation (man page) and probably in the tool itself, refusing it when the needed command line isn't present.

- Arnaldo 

>
>  $ perf record --all-cgroups -- true
>
>  $ perf script -F comm,pid,cgroup
>            true 337112  /user.slice/user-657345.slice/user@657345.service/...
>            true 337112  /user.slice/user-657345.slice/user@657345.service/...
>            true 337112  /user.slice/user-657345.slice/user@657345.service/...
>            true 337112  /user.slice/user-657345.slice/user@657345.service/...
>
>Signed-off-by: Namhyung Kim <namhyung@kernel.org>
>---
> tools/perf/Documentation/perf-script.txt |  2 +-
> tools/perf/builtin-script.c              | 16 +++++++++++++++-
> 2 files changed, 16 insertions(+), 2 deletions(-)
>
>diff --git a/tools/perf/Documentation/perf-script.txt b/tools/perf/Documentation/perf-script.txt
>index 8d77182fbf31..82c4dcb9c42e 100644
>--- a/tools/perf/Documentation/perf-script.txt
>+++ b/tools/perf/Documentation/perf-script.txt
>@@ -134,7 +134,7 @@ OPTIONS
>         srcline, period, iregs, uregs, brstack, brstacksym, flags, bpf-output,
>         brstackinsn, brstackinsnlen, brstackoff, callindent, insn, insnlen, synth,
>         phys_addr, metric, misc, srccode, ipc, data_page_size, code_page_size, ins_lat,
>-        machine_pid, vcpu.
>+        machine_pid, vcpu, cgroup.
>         Field list can be prepended with the type, trace, sw or hw,
>         to indicate to which event type the field list applies.
>         e.g., -F sw:comm,tid,time,ip,sym  and -F trace:time,cpu,trace
>diff --git a/tools/perf/builtin-script.c b/tools/perf/builtin-script.c
>index 69394ac0a20d..79976dde99b3 100644
>--- a/tools/perf/builtin-script.c
>+++ b/tools/perf/builtin-script.c
>@@ -59,6 +59,7 @@
> #include "util/dlfilter.h"
> #include "util/record.h"
> #include "util/util.h"
>+#include "util/cgroup.h"
> #include "perf.h"
> 
> #include <linux/ctype.h>
>@@ -130,6 +131,7 @@ enum perf_output_field {
> 	PERF_OUTPUT_BRSTACKINSNLEN  = 1ULL << 36,
> 	PERF_OUTPUT_MACHINE_PID     = 1ULL << 37,
> 	PERF_OUTPUT_VCPU            = 1ULL << 38,
>+	PERF_OUTPUT_CGROUP          = 1ULL << 39,
> };
> 
> struct perf_script {
>@@ -200,6 +202,7 @@ struct output_option {
> 	{.str = "brstackinsnlen", .field = PERF_OUTPUT_BRSTACKINSNLEN},
> 	{.str = "machine_pid", .field = PERF_OUTPUT_MACHINE_PID},
> 	{.str = "vcpu", .field = PERF_OUTPUT_VCPU},
>+	{.str = "cgroup", .field = PERF_OUTPUT_CGROUP},
> };
> 
> enum {
>@@ -2220,6 +2223,17 @@ static void process_event(struct perf_script *script,
> 	if (PRINT_FIELD(CODE_PAGE_SIZE))
> 		fprintf(fp, " %s", get_page_size_name(sample->code_page_size, str));
> 
>+	if (PRINT_FIELD(CGROUP)) {
>+		const char *cgrp_name;
>+		struct cgroup *cgrp = cgroup__find(machine->env,
>+						   sample->cgroup);
>+		if (cgrp != NULL)
>+			cgrp_name = cgrp->name;
>+		else
>+			cgrp_name = "unknown";
>+		fprintf(fp, " %s", cgrp_name);
>+	}
>+
> 	perf_sample__fprintf_ipc(sample, attr, fp);
> 
> 	fprintf(fp, "\n");
>@@ -3856,7 +3870,7 @@ int cmd_script(int argc, const char **argv)
> 		     "brstacksym,flags,data_src,weight,bpf-output,brstackinsn,"
> 		     "brstackinsnlen,brstackoff,callindent,insn,insnlen,synth,"
> 		     "phys_addr,metric,misc,srccode,ipc,tod,data_page_size,"
>-		     "code_page_size,ins_lat",
>+		     "code_page_size,ins_lat,machine_pid,vcpu,cgroup",
> 		     parse_output_fields),
> 	OPT_BOOLEAN('a', "all-cpus", &system_wide,
> 		    "system-wide collection from all CPUs"),
  
Namhyung Kim Jan. 26, 2023, 8:34 p.m. UTC | #2
Hi Arnaldo,

On Thu, Jan 26, 2023 at 12:06 PM Arnaldo Carvalho de Melo
<arnaldo.melo@gmail.com> wrote:
>
>
>
> On January 26, 2023 4:42:30 PM GMT-03:00, Namhyung Kim <namhyung@kernel.org> wrote:
> >There's no field for the cgroup, let's add one.  To do that, users need to
> >specify --all-cgroup option for perf record to capture the cgroup info.
>
>
> This information about the new field being only available when --all-cgroup is specified should be in the documentation (man page) and probably in the tool itself, refusing it when the needed command line isn't present.

Ok, will update.

Thanks,
Namhyung
  

Patch

diff --git a/tools/perf/Documentation/perf-script.txt b/tools/perf/Documentation/perf-script.txt
index 8d77182fbf31..82c4dcb9c42e 100644
--- a/tools/perf/Documentation/perf-script.txt
+++ b/tools/perf/Documentation/perf-script.txt
@@ -134,7 +134,7 @@  OPTIONS
         srcline, period, iregs, uregs, brstack, brstacksym, flags, bpf-output,
         brstackinsn, brstackinsnlen, brstackoff, callindent, insn, insnlen, synth,
         phys_addr, metric, misc, srccode, ipc, data_page_size, code_page_size, ins_lat,
-        machine_pid, vcpu.
+        machine_pid, vcpu, cgroup.
         Field list can be prepended with the type, trace, sw or hw,
         to indicate to which event type the field list applies.
         e.g., -F sw:comm,tid,time,ip,sym  and -F trace:time,cpu,trace
diff --git a/tools/perf/builtin-script.c b/tools/perf/builtin-script.c
index 69394ac0a20d..79976dde99b3 100644
--- a/tools/perf/builtin-script.c
+++ b/tools/perf/builtin-script.c
@@ -59,6 +59,7 @@ 
 #include "util/dlfilter.h"
 #include "util/record.h"
 #include "util/util.h"
+#include "util/cgroup.h"
 #include "perf.h"
 
 #include <linux/ctype.h>
@@ -130,6 +131,7 @@  enum perf_output_field {
 	PERF_OUTPUT_BRSTACKINSNLEN  = 1ULL << 36,
 	PERF_OUTPUT_MACHINE_PID     = 1ULL << 37,
 	PERF_OUTPUT_VCPU            = 1ULL << 38,
+	PERF_OUTPUT_CGROUP          = 1ULL << 39,
 };
 
 struct perf_script {
@@ -200,6 +202,7 @@  struct output_option {
 	{.str = "brstackinsnlen", .field = PERF_OUTPUT_BRSTACKINSNLEN},
 	{.str = "machine_pid", .field = PERF_OUTPUT_MACHINE_PID},
 	{.str = "vcpu", .field = PERF_OUTPUT_VCPU},
+	{.str = "cgroup", .field = PERF_OUTPUT_CGROUP},
 };
 
 enum {
@@ -2220,6 +2223,17 @@  static void process_event(struct perf_script *script,
 	if (PRINT_FIELD(CODE_PAGE_SIZE))
 		fprintf(fp, " %s", get_page_size_name(sample->code_page_size, str));
 
+	if (PRINT_FIELD(CGROUP)) {
+		const char *cgrp_name;
+		struct cgroup *cgrp = cgroup__find(machine->env,
+						   sample->cgroup);
+		if (cgrp != NULL)
+			cgrp_name = cgrp->name;
+		else
+			cgrp_name = "unknown";
+		fprintf(fp, " %s", cgrp_name);
+	}
+
 	perf_sample__fprintf_ipc(sample, attr, fp);
 
 	fprintf(fp, "\n");
@@ -3856,7 +3870,7 @@  int cmd_script(int argc, const char **argv)
 		     "brstacksym,flags,data_src,weight,bpf-output,brstackinsn,"
 		     "brstackinsnlen,brstackoff,callindent,insn,insnlen,synth,"
 		     "phys_addr,metric,misc,srccode,ipc,tod,data_page_size,"
-		     "code_page_size,ins_lat",
+		     "code_page_size,ins_lat,machine_pid,vcpu,cgroup",
 		     parse_output_fields),
 	OPT_BOOLEAN('a', "all-cpus", &system_wide,
 		    "system-wide collection from all CPUs"),