Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

perf kmem: Support using -f to override perf.data file ownership

Enable perf kmem to use perf.data when it is not owned by current user
or root.

Example:

# perf kmem record ls
# chown Yunlong.Song:Yunlong.Song perf.data
# ls -al perf.data
-rw------- 1 Yunlong.Song Yunlong.Song 5315665 Apr 2 10:54 perf.data
# id
uid=0(root) gid=0(root) groups=0(root),64(pkcs11)

Before this patch:

# perf kmem stat
File perf.data not owned by current user or root (use -f to override)
# perf kmem stat -f
Error: unknown switch `f'

usage: perf kmem [<options>] {record|stat}

-i, --input <file> input file name
-v, --verbose be more verbose (show symbol address, etc)
--caller show per-callsite statistics
--alloc show per-allocation statistics
-s, --sort <key[,key2...]>
sort by keys: ptr, call_site, bytes, hit,
pingpong, frag
-l, --line <num> show n lines
--raw-ip show raw ip instead of symbol

As shown above, the -f option does not work at all.

After this patch:

# perf kmem stat
File perf.data not owned by current user or root (use -f to override)
# perf kmem stat -f
SUMMARY
=======
Total bytes requested: 437599
Total bytes allocated: 615472
Total bytes wasted on internal fragmentation: 177873
Internal fragmentation: 28.900259%
Cross CPU allocations: 6/1192

As shown above, the -f option really works now.

Signed-off-by: Yunlong Song <yunlong.song@huawei.com>
Tested-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Wang Nan <wangnan0@huawei.com>
Link: http://lkml.kernel.org/r/1427982439-27388-4-git-send-email-yunlong.song@huawei.com
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>

authored by

Yunlong Song and committed by
Arnaldo Carvalho de Melo
d1eeb77c ccaa474c

+5 -4
+5 -4
tools/perf/builtin-kmem.c
··· 662 662 int cmd_kmem(int argc, const char **argv, const char *prefix __maybe_unused) 663 663 { 664 664 const char * const default_sort_order = "frag,hit,bytes"; 665 + struct perf_data_file file = { 666 + .path = input_name, 667 + .mode = PERF_DATA_MODE_READ, 668 + }; 665 669 const struct option kmem_options[] = { 666 670 OPT_STRING('i', "input", &input_name, "file", "input file name"), 667 671 OPT_INCR('v', "verbose", &verbose, ··· 679 675 parse_sort_opt), 680 676 OPT_CALLBACK('l', "line", NULL, "num", "show n lines", parse_line_opt), 681 677 OPT_BOOLEAN(0, "raw-ip", &raw_ip, "show raw ip instead of symbol"), 678 + OPT_BOOLEAN('f', "force", &file.force, "don't complain, do it"), 682 679 OPT_END() 683 680 }; 684 681 const char *const kmem_subcommands[] = { "record", "stat", NULL }; ··· 688 683 NULL 689 684 }; 690 685 struct perf_session *session; 691 - struct perf_data_file file = { 692 - .path = input_name, 693 - .mode = PERF_DATA_MODE_READ, 694 - }; 695 686 int ret = -1; 696 687 697 688 argc = parse_options_subcommand(argc, argv, kmem_options,