perf/sdt: SDT events listing/probing
v4 cover perf/sdt: SDT events listing/probing
This patchset helps in listing dtrace style markers(SDT) present in user space applications through perf.
Notes/markers are placed at important places by the
developers. They have a negligible overhead when not enabled.
We can enable them and probe at these places and find some important information like the arguments' values, etc.
We have lots of applications which use SDT markers today, like:
Postgresql, MySql, Mozilla, Perl, Python, Java, Ruby, libvirt, QEMU, glib
To add SDT markers into user applications:
We need to have this header sys/sdt.h present.sys/sdt.h used is version 3.
If not present, install systemtap-sdt-devel package (for fedora-20).
With this patchset,
- Use perf sdt-cache --add to add SDT events to a cache.
# perf sdt-cache --add ./user_app
4 SDT events added for /home/user/user_app!- Use perf sdt-cache --del to remove SDT events from the cache>
# perf sdt-cache --del ./user_app
4 events removed for /home/user/user_app!- Dump the cache onto stdout using perf sdt-cache --dump:
# perf sdt-cache --dump
/home/user/user_app :
%user_app:foo_start
%user_app:fun_start- To probe and trace an SDT event :
# perf record -e %user_app:foo_start -aR sleep 10
The support for perf to sdt events has undergone a lot of changes since it was introduced. After a lot of discussions (https://lkml.org/lkml/2014/7/20/284), the patchset is subdivided for ease of review.
Previously, a patchset supporting "perf list sdt" was posted, but it didn't make much sense since, only listing SDT events for an ELF won't help. This patchset aims at adding a sub-command "sdt-cache" to perf to manage a cache for management of the SDT events.
This link shows an example of marker probing with Systemtap:
https://sourceware.org/systemtap/wiki/AddingUserSpaceProbingToApps
This link provides important info regarding SDT notes:
http://sourceware.org/systemtap/wiki/UserSpaceProbeImplementation
- Markers in binaries :
These SDT markers are present in the ELF in the section named ".note.stapsdt".
Here, the name of the marker, its provider, type, location, base address, semaphore address.
We can retrieve these values using the members name_off and desc_off in Nhdr structure. If these are not enabled, they are present in the ELF as nop.
Changes since last series:
- Changed to use the new --quiet option added by Masami to silently add/delete SDT events for "perf record".
- Now, the options are used with 'PARSE_OPT_EXCLUSIVE' added by Namhyung Kim.
- Addressed the other review comments made by Masami and Namhyung.
- Fixed some bugs.
TODO:
- Add support to add most of the SDT events on a system to the cache.
- Recognizing arguments and support to probe on them.
---
Hemant Kumar (5):
perf/sdt: ELF support for SDT
perf/sdt: Add SDT events into a cache perf/sdt: Show SDT cache contents
perf/sdt: Delete SDT events from cache perf/sdt: Add support to perf record to trace SDT events
tools/perf/Documentation/perf-sdt-cache.txt | 36 + tools/perf/Makefile.perf | 4 tools/perf/builtin-probe.c | 5 tools/perf/builtin-record.c | 23 + tools/perf/builtin-sdt-cache.c | 104 +++ tools/perf/builtin.h | 1 tools/perf/command-list.txt | 1 tools/perf/perf.c | 1 tools/perf/util/parse-events.c | 6 tools/perf/util/parse-events.h | 7 tools/perf/util/probe-event.c | 85 ++- tools/perf/util/probe-event.h | 8 tools/perf/util/probe-finder.c | 3 tools/perf/util/sdt.c | 899 +++++++++++++++++++++++++++ tools/perf/util/symbol-elf.c | 252 ++++++++ tools/perf/util/symbol.h | 23 + 16 files changed, 1448 insertions(+), 10 deletions(-) create mode 100644 tools/perf/Documentation/perf-sdt-cache.txt create mode 100644 tools/perf/builtin-sdt-cache.c create mode 100644 tools/perf/util/sdt.c
PATCH v4 1/5 perf/sdt: ELF support for SDT
This patch serves the initial support to identify and list SDT events in binaries. When programs containing SDT markers are compiled, gcc with the help of assembler directives identifies them and places them in the section ".note.stapsdt". To find these markers from the binaries, one needs to traverse through this section and parse the relevant details like the name, type and location of the marker. Also, the original location could be skewed due to the effect of prelinking. If that is the case, the locations need to be adjusted.
The functions in this patch open a given ELF, find out the SDT section, parse the relevant details, adjust the location (if necessary) and populate them in a list.
A typical note entry in ".note.stapsdt" section is as follows :
|--nhdr.n_namesz--|
------------------------------------
| nhdr | "stapsdt" |
----- |----------------------------------|
| | <location> <base_address> |
| | <semaphore> |
nhdr.n_descsize | "provider_name" "note_name" |
| | <args> |
----- |----------------------------------|
| nhdr | "stapsdt" |
|...The above shows an excerpt from the section ".note.stapsdt". 'nhdr' is a structure which has the note name size (n_namesz), note description size (n_desc_sz) and note type (n_type). So, in order to parse the note note info, we need nhdr to tell us where to start from. As can be seen from <sys/sdt.h>, the name of the SDT notes given is "stapsdt". But this is not the identifier of the note.
After that, we go to description of the note to find out its location, the address of the ".stapsdt.base" section and the semaphore address. Then, we find the provider name and the SDT marker name and then follow the arguments.
--- tools/perf/util/symbol-elf.c | 252 ++++++++++++++++++++++++++++++++++++++++++ tools/perf/util/symbol.h | 21 ++++ 2 files changed, 273 insertions(+)
tools/perf/util/symbol-elf.c +252 -0
@@ -1677,6 +1677,258 @@ void kcore_extract__delete(struct kcore_extract *kce)unlink (kce->extract_filename); } +/** +* populate_sdt_note : Parse raw data and identify SDT note +* @elf: elf of the opened file +* @data: raw data of a section with description offset applied +* @len: note description size +* @type: type of the note +* @sdt_notes: List to add the SDT note +* +* Responsible for parsing the @data in section .note.stapsdt in @elf and +* if its an SDT note, it appends to @sdt_notes list. +*/ +static int populate_sdt_note (Elf **elf,const char *data,size_t len, +struct list_head *sdt_notes) +{ +const char *provider, *name; +struct sdt_note *tmp =NULL ; +GElf_Ehdr ehdr; +GElf_Addr base_off =0 ; +GElf_Shdr shdr; +int ret = -EINVAL ; + +union { +Elf64_Addr a64[NR_ADDR ]; +Elf32_Addr a32[NR_ADDR ]; + } buf; + +Elf_Data dst = { + .d_buf = &buf, .d_type =ELF_T_ADDR , .d_version =EV_CURRENT , + .d_size =gelf_fsize ((*elf),ELF_T_ADDR ,NR_ADDR ,EV_CURRENT ), + .d_off =0 , .d_align =0 + }; +Elf_Data src = { + .d_buf = (void *) data, .d_type =ELF_T_ADDR , + .d_version =EV_CURRENT , .d_size = dst.d_size, .d_off =0 , + .d_align =0 + }; + + tmp = (struct sdt_note *)calloc (1 ,sizeof (struct sdt_note )); +if (!tmp) { + ret = -ENOMEM ; + goto out_err; + } + +INIT_LIST_HEAD (&tmp->note_list); + +if (len < dst.d_size +3 ) + goto out_free_note; + +/* Translation from file representation to memory representation */ +if (gelf_xlatetom (*elf, &dst, &src, +elf_getident (*elf,NULL )[EI_DATA ]) ==NULL ) { +pr_err ("gelf_xlatetom : %s\n" ,elf_errmsg (-1 )); + goto out_free_note; + } + +/* Populate the fields of sdt_note */ + provider = data + dst.d_size; + + name = (const char *)memchr (provider,'\0' , data + len - provider); +if (name++ ==NULL ) + goto out_free_note; + + tmp->provider =strdup (provider); +if (!tmp->provider) { + ret = -ENOMEM ; + goto out_free_note; + } + tmp->name =strdup (name); +if (!tmp->name) { + ret = -ENOMEM ; + goto out_free_prov; + } + +if (gelf_getclass (*elf) ==ELFCLASS32 ) { +memcpy (&tmp->addr, &buf,3 *sizeof (Elf32_Addr)); + tmp->bit32 = true; + }else { +memcpy (&tmp->addr, &buf,3 *sizeof (Elf64_Addr)); + tmp->bit32 = false; + } + +if (!gelf_getehdr (*elf, &ehdr)) { +pr_debug ("%s : cannot get elf header.\n" , __func__); + ret = -EBADF ; + goto out_free_name; + } + +/* Adjust the prelink effect : +* Find out the .stapsdt.base section. +* This scn will help us to handle prelinking (if present). +* Compare the retrieved file offset of the base section with the +* base address in the description of the SDT note. If its different, +* then accordingly, adjust the note location. +*/ +if (elf_section_by_name (*elf, &ehdr, &shdr,SDT_BASE_SCN ,NULL )) { + base_off = shdr.sh_offset; +if (base_off) { +if (tmp->bit32) + tmp->addr.a32[0 ] = tmp->addr.a32[0 ] + base_off - + tmp->addr.a32[1 ]; +else + tmp->addr.a64[0 ] = tmp->addr.a64[0 ] + base_off - + tmp->addr.a64[1 ]; + } + } + +list_add_tail (&tmp->note_list, sdt_notes); +return 0 ; + +out_free_name: +free (tmp->name); +out_free_prov: +free (tmp->provider); +out_free_note: +free (tmp); +out_err: +return ret; +} + +/** +* construct_sdt_notes_list : constructs a list of SDT notes +* @elf : elf to look into +* @sdt_notes : empty list_head +* +* Scans the sections in 'elf' for the section +* .note.stapsdt. It, then calls populate_sdt_note to find +* out the SDT events and populates the 'sdt_notes'. +*/ +static int construct_sdt_notes_list (Elf *elf,struct list_head *sdt_notes) +{ +GElf_Ehdr ehdr; +Elf_Scn *scn =NULL ; +Elf_Data *data; +GElf_Shdr shdr; +size_t shstrndx, next; +GElf_Nhdr nhdr; +size_t name_off, desc_off, offset; +int ret =0 ; + +if (gelf_getehdr (elf, &ehdr) ==NULL ) { + ret = -EBADF ; + goto out_ret; + } +if (elf_getshdrstrndx (elf, &shstrndx) !=0 ) { + ret = -EBADF ; + goto out_ret; + } + +/* Look for the required section */ + scn =elf_section_by_name (elf, &ehdr, &shdr,SDT_NOTE_SCN ,NULL ); +if (!scn) { + ret = -ENOENT ; + goto out_ret; + } + +if ((shdr.sh_type !=SHT_NOTE ) || (shdr.sh_flags &SHF_ALLOC )) { + ret = -ENOENT ; + goto out_ret; + } + + data =elf_getdata (scn,NULL ); + +/* Get the SDT notes */ +for (offset =0 ; (next =gelf_getnote (data, offset, &nhdr, &name_off, + &desc_off)) >0 ; offset = next) { +if (nhdr.n_namesz ==sizeof (SDT_NOTE_NAME ) && + !memcmp (data->d_buf + name_off,SDT_NOTE_NAME , +sizeof (SDT_NOTE_NAME ))) { +/* Check the type of the note */ +if (nhdr.n_type !=SDT_NOTE_TYPE ) + goto out_ret; + + ret =populate_sdt_note (&elf, ((data->d_buf) + desc_off), + nhdr.n_descsz, sdt_notes); +if (ret <0 ) + goto out_ret; + } + } +if (list_empty (sdt_notes)) + ret = -ENOENT ; + +out_ret: +return ret; +} + +/** +* get_sdt_note_list : Wrapper to construct a list of sdt notes +* @head : empty list_head +* @target : file to find SDT notes from +* +* This opens the file, initializes +* the ELF and then calls construct_sdt_notes_list. +*/ +int get_sdt_note_list (struct list_head *head,const char *target) +{ +Elf *elf; +int fd, ret; + + fd =open (target,O_RDONLY ); +if (fd <0 ) +return -EBADF ; + + elf =elf_begin (fd,PERF_ELF_C_READ_MMAP ,NULL ); +if (!elf) { + ret = -EBADF ; + goto out_close; + } + ret =construct_sdt_notes_list (elf, head); +elf_end (elf); +out_close: +close (fd); +return ret; +} + +/** +* cleanup_sdt_note_list : free the sdt notes' list +* @sdt_notes: sdt notes' list +* +* Free up the SDT notes in @sdt_notes. +* Returns the number of SDT notes free'd. +*/ +int cleanup_sdt_note_list (struct list_head *sdt_notes) +{ +struct sdt_note *tmp, *pos; +int nr_free =0 ; + +list_for_each_entry_safe (pos, tmp, sdt_notes, note_list) { +list_del (&pos->note_list); +free (pos->name); +free (pos->provider); +free (pos); + nr_free++; + } +return nr_free; +} + +/** +* sdt_notes__get_count: Counts the number of sdt events +* @start: list_head to sdt_notes list +* +* Returns the number of SDT notes in a list +*/ +int sdt_notes__get_count (struct list_head *start) +{ +struct sdt_note *sdt_ptr; +int count =0 ; + +list_for_each_entry (sdt_ptr, start, note_list) + count++; +return count; +} +void symbol__elf_init (void ) {elf_version (EV_CURRENT );
tools/perf/util/symbol.h +21 -0
@@ -313,4 +313,25 @@ int compare_proc_modules(const char *from, const char *to);int setup_list (struct strlist **list,const char *list_str,const char *list_name); +/* structure containing an SDT note's info */ +struct sdt_note { +char *name;/* name of the note*/ +char *provider;/* provider name */ +bool bit32;/* whether the location is 32 bits? */ +union {/* location, base and semaphore addrs */ +Elf64_Addr a64[3 ]; +Elf32_Addr a32[3 ]; + } addr; +struct list_head note_list;/* SDT notes' list */ +}; + +int get_sdt_note_list (struct list_head *head,const char *target); +int cleanup_sdt_note_list (struct list_head *sdt_notes); +int sdt_notes__get_count (struct list_head *start); + +#define SDT_BASE_SCN ".stapsdt.base" +#define SDT_NOTE_SCN ".note.stapsdt" +#define SDT_NOTE_TYPE 3 +#define SDT_NOTE_NAME "stapsdt" +#define NR_ADDR 3#endif /* __PERF_SYMBOL */
PATCH v4 2/5 perf/sdt: Add SDT events into a cache
In reply to Hemant KumarThis patch adds a new sub-command to perf : sdt-cache. sdt-cache command can be used to add SDT events.
When user invokes "perf sdt-cache add <file-name>", a hash table/list is created named as file_hash list. A typical entry in a file_hash table looks like:
file hash file_sdt_ent file_sdt_ent
|---------| --------------- -------------
| hlist ==|===|=>file_list =|===|=>file_list=|==..
key = 644 =>| | | sbuild_id | | sbuild_id |
|---------| | name | | name |
| | | sdt_list | | sdt_list |
key = 645 =>| hlist | | || | | || |
|---------| --------------- -------------- || || || Connected to SDT notes
---------------
| note_list |
| name |sdt_note
| provider |
-----||--------
connected to other SDT notes
Each entry of the file_hash table is an hlist which connects to file_list in file_sdt_ent. file_sdt_ent is allocated per file whenever a file is mapped to file_hash list. File name serves as the key to this hash table. If a file is added to this hash list, a file_sdt_ent is allocated and a list of SDT events in that file is created and assigned to sdt_list of file_sdt_ent.
Example usage :
# ./perf sdt-cache --add /home/user_app
4 events added for /home/user_app
# ./perf sdt-cache --add /lib64/libc.so.6
8 events added for /usr/lib64/libc-2.16.so
--- tools/perf/Documentation/perf-sdt-cache.txt | 27 + tools/perf/Makefile.perf | 4 tools/perf/builtin-sdt-cache.c | 59 +++ tools/perf/builtin.h | 1 tools/perf/command-list.txt | 1 tools/perf/perf.c | 1 tools/perf/util/parse-events.h | 2 tools/perf/util/sdt.c | 615 +++++++++++++++++++++++++++ 8 files changed, 710 insertions(+) create mode 100644 tools/perf/Documentation/perf-sdt-cache.txt create mode 100644 tools/perf/builtin-sdt-cache.c create mode 100644 tools/perf/util/sdt.c
tools/perf/Documentation/perf-sdt-cache.txt new file +27 -0
@@ -0,0 +1,27 @@ +perf-sdt-cache(1) +===================== + +NAME +---- +perf-sdt-cache - Manage SDT events' cache. + +SYNOPSIS +-------- +[verse] +'perf sdt-cache --add <file_name>' + +DESCRIPTION +----------- +This command manages the SDT events cache. It can add/remove SDT events +associated with an ELF to the cache. + +OPTIONS +------- +-a:: +--add:: + Add SDT events in the specified file to the cache. Takes file name + as an argument. + +SEE ALSO +-------- +linkperf:perf-record[1], linkperf:perf-report[1]
tools/perf/Makefile.perf +4 -0
@@ -353,6 +353,7 @@ LIB_OBJS += $(OUTPUT)util/sigchain.o LIB_OBJS += $(OUTPUT)util/dso.o LIB_OBJS += $(OUTPUT)util/symbol.o LIB_OBJS += $(OUTPUT)util/symbol-elf.o +LIB_OBJS += $(OUTPUT)util/sdt.o LIB_OBJS += $(OUTPUT)util/color.o LIB_OBJS += $(OUTPUT)util/pager.o LIB_OBJS += $(OUTPUT)util/header.o
@@ -472,6 +473,7 @@ BUILTIN_OBJS += $(OUTPUT)builtin-timechart.o BUILTIN_OBJS += $(OUTPUT)builtin-top.o BUILTIN_OBJS += $(OUTPUT)builtin-script.o BUILTIN_OBJS += $(OUTPUT)builtin-probe.o +BUILTIN_OBJS += $(OUTPUT)builtin-sdt-cache.o BUILTIN_OBJS += $(OUTPUT)builtin-kmem.o BUILTIN_OBJS += $(OUTPUT)builtin-lock.o BUILTIN_OBJS += $(OUTPUT)builtin-kvm.o
@@ -499,8 +501,10 @@ LIB_OBJS := $(filter-out $(OUTPUT)util/symbol-elf.o,$(LIB_OBJS)) LIB_OBJS := $(filter-out $(OUTPUT)util/dwarf-aux.o,$(LIB_OBJS)) LIB_OBJS := $(filter-out $(OUTPUT)util/probe-event.o,$(LIB_OBJS)) LIB_OBJS := $(filter-out $(OUTPUT)util/probe-finder.o,$(LIB_OBJS)) +LIB_OBJS := $(filter-out $(OUTPUT)util/sdt.o,$(LIB_OBJS)) BUILTIN_OBJS := $(filter-out $(OUTPUT)builtin-probe.o,$(BUILTIN_OBJS)) +BUILTIN_OBJS := $(filter-out $(OUTPUT)builtin-sdt-cache.o,$(BUILTIN_OBJS)) # Use minimal symbol handling LIB_OBJS += $(OUTPUT)util/symbol-minimal.o
tools/perf/builtin-sdt-cache.c new file +59 -0
59 lines not on this page · raw message
tools/perf/builtin.h +1 -0
@@ -37,6 +37,7 @@ extern int cmd_test(int argc, const char **argv, const char *prefix);extern int cmd_trace (int argc,const char **argv,const char *prefix);extern int cmd_inject (int argc,const char **argv,const char *prefix);extern int cmd_mem (int argc,const char **argv,const char *prefix); +extern int cmd_sdt_cache (int argc,const char **argv,const char *prefix);extern int find_scripts (char **scripts_array,char **scripts_path_array);#endif
tools/perf/command-list.txt +1 -0
@@ -25,3 +25,4 @@ perf-test mainporcelain common perf-timechart mainporcelain common perf-top mainporcelain common perf-trace mainporcelain common +perf-sdt-cache mainporcelain full
tools/perf/perf.c +1 -0
@@ -52,6 +52,7 @@ static struct cmd_struct commands[] = { { "sched", cmd_sched, 0 }, #ifdef HAVE_LIBELF_SUPPORT { "probe", cmd_probe, 0 }, + { "sdt-cache", cmd_sdt_cache, 0 }, #endif { "kmem", cmd_kmem, 0 }, { "lock", cmd_lock, 0 },
tools/perf/util/parse-events.h +2 -0
@@ -123,4 +123,6 @@ extern int is_valid_tracepoint(const char *event_string);extern int valid_debugfs_mount (const char *debugfs); +int add_sdt_events (const char *file); +#endif /* __PERF_PARSE_EVENTS_H */
tools/perf/util/sdt.c new file +615 -0
615 lines not on this page · raw message
PATCH v4 3/5 perf/sdt: Show SDT cache contents
In reply to Hemant KumarThis patch adds support to dump the SDT cache onto sdtout. The cache data is read into a hash_list and then, it iterates through the hash_list to dump the data onto stdout.
# ./perf sdt-cache --dump /usr/lib64/libc-2.16.so: %libc:lll_futex_wake %libc:longjmp_target %libc:longjmp %libc:lll_lock_wait_private %libc:lll_futex_wake %libc:longjmp_target %libc:longjmp %libc:setjmp
--- tools/perf/Documentation/perf-sdt-cache.txt | 7 +++- tools/perf/builtin-sdt-cache.c | 28 +++++++++++++++- tools/perf/util/parse-events.h | 1 + tools/perf/util/sdt.c | 48 +++++++++++++++++++++++++++ 4 files changed, 82 insertions(+), 2 deletions(-)
tools/perf/Documentation/perf-sdt-cache.txt +6 -1
@@ -9,11 +9,13 @@ SYNOPSIS -------- [verse] 'perf sdt-cache --add <file_name>' +'perf sdt-cache --dump' DESCRIPTION ----------- This command manages the SDT events cache. It can add/remove SDT events -associated with an ELF to the cache. +associated with an ELF to the cache. It can also dump the SDT events' cache +onto stdout. OPTIONS -------
@@ -21,6 +23,9 @@ OPTIONS --add:: Add SDT events in the specified file to the cache. Takes file name as an argument. +-D:: +--dump:: + Dump the contents of SDT events cache onto stdout. SEE ALSO --------
tools/perf/builtin-sdt-cache.c +27 -1
@@ -16,6 +16,7 @@/* Session management structure */ static struct {bool add; +bool dump;const char *target; } params;
@@ -28,20 +29,37 @@ static int opt_add_sdt_events(const struct option *opt __maybe_unused,return 0 ; } +static int opt_show_sdt_events (const struct option *opt__maybe_unused , +const char *str,int unset__maybe_unused ) +{ +if (str) +pr_err ("Unknown option %s\n" , str); + params.dump = true; +return 0 ; +} +int cmd_sdt_cache (int argc,const char **argv,const char *prefix__maybe_unused ) {int ret; -const struct option sdt_cache_options[] = { +struct option sdt_cache_options[] = {OPT_CALLBACK ('a' ,"add" ,NULL ,"filename" ,"add SDT events from a file." , opt_add_sdt_events), +OPT_CALLBACK_NOOPT ('D' ,"dump" ,NULL ,"show SDT events" , +"Read SDT events from cache and display." , + opt_show_sdt_events),OPT_END () }; +const char *const sdt_cache_usage[] = {"perf sdt-cache --add filename" , +"perf sdt-cache --dump" ,NULL }; +set_option_flag (sdt_cache_options,'a' ,"add" ,PARSE_OPT_EXCLUSIVE ); +set_option_flag (sdt_cache_options,'D' ,"dump" ,PARSE_OPT_EXCLUSIVE ); + argc =parse_options (argc, argv, sdt_cache_options, sdt_cache_usage,PARSE_OPT_STOP_AT_NON_OPTION );
@@ -53,6 +71,14 @@ int cmd_sdt_cache(int argc, const char **argv, const char *prefix __maybe_unused ret =add_sdt_events (params.target);if (ret <0 )pr_err ("Cannot add SDT events to cache\n" ); + }else if (params.dump) { +if (argc ==0 ) { + ret =dump_sdt_events (); +if (ret <0 ) +pr_err ("Cannot dump SDT event cache\n" ); + }else +usage_with_options (sdt_cache_usage, sdt_cache_options); + }else usage_with_options (sdt_cache_usage, sdt_cache_options);return 0 ;
tools/perf/util/parse-events.h +1 -0
@@ -124,5 +124,6 @@ extern int is_valid_tracepoint(const char *event_string);extern int valid_debugfs_mount (const char *debugfs);int add_sdt_events (const char *file); +int dump_sdt_events (void );#endif /* __PERF_PARSE_EVENTS_H */
tools/perf/util/sdt.c +48 -0
51 lines not on this page · raw message
PATCH v4 4/5 perf/sdt: Delete SDT events from cache
In reply to Hemant KumarThis patch adds the support to delete SDT events from the cache. To delete an event corresponding to a file, first the cache is read into the file_hash list. The key is calculated from the file name.
And then, the file_list for that file_hash entry is traversed to find out the target file_list entry. Once, it is found, its contents are all freed up.
# ./perf sdt-cache --del /usr/lib64/libc-2.16.so 8 event(s) removed for /usr/lib64/libc-2.16.so
--- tools/perf/Documentation/perf-sdt-cache.txt | 6 +++- tools/perf/builtin-sdt-cache.c | 21 +++++++++++++- tools/perf/util/parse-events.h | 1 + tools/perf/util/sdt.c | 41 +++++++++++++++++++++++++++ 4 files changed, 67 insertions(+), 2 deletions(-)
tools/perf/Documentation/perf-sdt-cache.txt +5 -1
@@ -8,7 +8,7 @@ perf-sdt-cache - Manage SDT events' cache. SYNOPSIS -------- [verse] -'perf sdt-cache --add <file_name>' +'perf sdt-cache [--add | --del] <file_name>' 'perf sdt-cache --dump' DESCRIPTION
@@ -23,6 +23,10 @@ OPTIONS --add:: Add SDT events in the specified file to the cache. Takes file name as an argument. +-d:: +--del:: + Remove SDT events in the specified file from the cache. Takes file as an + argument. -D:: --dump:: Dump the contents of SDT events cache onto stdout.
tools/perf/builtin-sdt-cache.c +20 -1
@@ -16,6 +16,7 @@/* Session management structure */ static struct {bool add; +bool del;bool dump;const char *target; } params;
@@ -29,6 +30,16 @@ static int opt_add_sdt_events(const struct option *opt __maybe_unused,return 0 ; } +static int opt_del_sdt_events (const struct option *opt__maybe_unused , +const char *str,int unset__maybe_unused ) +{ + params.del = true; + params.target = str; + +return 0 ; +} + +static int opt_show_sdt_events (const struct option *opt__maybe_unused ,const char *str,int unset__maybe_unused ) {
@@ -45,6 +56,9 @@ int cmd_sdt_cache(int argc, const char **argv, const char *prefix __maybe_unusedOPT_CALLBACK ('a' ,"add" ,NULL ,"filename" ,"add SDT events from a file." , opt_add_sdt_events), +OPT_CALLBACK ('d' ,"del" ,NULL ,"filename" , +"Remove SDT events corresponding to a file from the sdt cache." , + opt_del_sdt_events),OPT_CALLBACK_NOOPT ('D' ,"dump" ,NULL ,"show SDT events" ,"Read SDT events from cache and display." , opt_show_sdt_events),
@@ -52,13 +66,14 @@ int cmd_sdt_cache(int argc, const char **argv, const char *prefix __maybe_unused };const char *const sdt_cache_usage[] = { -"perf sdt-cache --add filename" , +"perf sdt-cache [--add | --del] filename" ,"perf sdt-cache --dump" ,NULL };set_option_flag (sdt_cache_options,'a' ,"add" ,PARSE_OPT_EXCLUSIVE );set_option_flag (sdt_cache_options,'D' ,"dump" ,PARSE_OPT_EXCLUSIVE ); +set_option_flag (sdt_cache_options,'d' ,"del" ,PARSE_OPT_EXCLUSIVE ); argc = parse_options(argc, argv, sdt_cache_options, sdt_cache_usage,
@@ -71,6 +86,10 @@ int cmd_sdt_cache(int argc, const char **argv, const char *prefix __maybe_unused ret =add_sdt_events (params.target);if (ret <0 )pr_err ("Cannot add SDT events to cache\n" ); + }else if (params.del) { + ret =remove_sdt_events (params.target); +if (ret <0 ) +pr_err ("Cannot remove SDT events from cache\n" ); }else if (params.dump) {if (argc ==0 ) { ret =dump_sdt_events ();
tools/perf/util/parse-events.h +1 -0
@@ -125,5 +125,6 @@ extern int valid_debugfs_mount(const char *debugfs);int add_sdt_events (const char *file);int dump_sdt_events (void ); +int remove_sdt_events (const char *str);#endif /* __PERF_PARSE_EVENTS_H */
tools/perf/util/sdt.c +41 -0
50 lines not on this page · raw message
PATCH v4 5/5 perf/sdt: Add support to perf record to trace SDT events
In reply to Hemant KumarThis patch adds support to perf to record SDT events. When invoked, the SDT event is looked up in the sdt-cache. If its found, an entry is made silently to uprobe_events file and then recording is invoked, and then the entry for the SDT event in uprobe_events is silently discarded.
The SDT events are already stored in a cache file (/var/cache/perf/perf-sdt-file.cache).
Although the file_hash table helps in addition or deletion of SDT events from the cache, its not of much use when it comes to probing the actual SDT event, because the key to this hash list is a file name and not the SDT event name (which is given as an argument to perf record). So, we won't be able to hash into it.
To avoid this problem, we can create another hash list "event_hash" list which will be maintained along with the file_hash list. Whenever a user invokes 'perf record -e %provider:event, perf should initialize the event_hash list and the file_hash list.
The key to event_hash list is calculated from the event name and its provider name.
event_hash sdt_note
|---------| ----------------
| | | file_ptr |==> container file_sdt_ent
key = 129 =>| hlist ==|===|=> event_list=|==> to sdt notes hashed to
| | | name | same entry
|---------| | provider |
| | | note_list==|==> to other notes in the
key = 130 =>| hlist | --------------- same file
|---------|The entry at that key in event_hash contains a list of SDT notes hashed to the same entry. It compares the name and provider to see if that is the SDT note we are looking for. If yes, find out the file that contains this SDT note. There is a file_ptr pointer embedded in this note which points to the struct file_sdt_ent contained in the file_hash. From "file_sdt_ent" we will find out the file name.
Convert this sdt note into a perf event and then write this into uprobe_events file to be able to record the event.
Then, corresponding entries are added to uprobe_events file for the SDT events.
After recording is done, these events are silently deleted from uprobe_events file. The uprobe_events file is present in debugfs/tracing directory.
To support the addition and deletion of SDT events to/from uprobe_events file, a record_sdt struct is maintained which has the event data.
An example usage:
# perf record -e %libc:setjmp -aR sleep 10 [ perf record: Woken up 1 times to write data ] [ perf record: Captured and wrote 0.277 MB perf.data (~12103 samples) ]
# perf report --stdio # To display the perf.data header info, please use --header/--header-only # # Samples: 1 of event 'libc:setjmp' # Event count (approx.): 1 # # Overhead Command Shared Object Symbol # ........ ....... ............. ............... # 100.00% sleep libc-2.16.so [.] __sigsetjmp
--- tools/perf/builtin-probe.c | 5 + tools/perf/builtin-record.c | 23 ++++ tools/perf/util/parse-events.c | 6 + tools/perf/util/parse-events.h | 3 + tools/perf/util/probe-event.c | 85 ++++++++++++++-- tools/perf/util/probe-event.h | 8 ++ tools/perf/util/probe-finder.c | 3 + tools/perf/util/sdt.c | 213 ++++++++++++++++++++++++++++++++++++++-- tools/perf/util/symbol.h | 2 9 files changed, 329 insertions(+), 19 deletions(-)
tools/perf/builtin-probe.c +5 -0
@@ -509,3 +509,8 @@ int cmd_probe(int argc, const char **argv, const char *prefix)return ret; } + +void goto_quiet_mode (void ) +{ + verbose =-1 ; +}
tools/perf/builtin-record.c +23 -0
@@ -47,6 +47,25 @@ struct record {long samples; }; +/* Session specific to SDT tracing */ +struct record_sdt { +bool sdt;/* is this SDT event tracing? */ +char *str;/* hold the event name */ +} rec_sdt; + +int trace_sdt_event (const char *str) +{ +int ret =0 ; + + rec_sdt.sdt = true; + rec_sdt.str =strdup (str); +if (!rec_sdt.str) +return -ENOMEM ; + ret =event_hash_list__lookup (str); +return ret; +} + +static int record__write (struct record *rec,void *bf,size_t size) {if (perf_data_file__write (rec->session->file, bf, size) <0 ) {
@@ -879,6 +898,10 @@ int cmd_record(int argc, const char **argv, const char *prefix __maybe_unused) } err =__cmd_record (&record, argc, argv); +if (rec_sdt.sdt) { + err =remove_perf_sdt_events (rec_sdt.str); +free (rec_sdt.str); + } out_symbol_exit:perf_evlist__delete (rec->evlist);symbol__exit ();
tools/perf/util/parse-events.c +6 -0
@@ -990,6 +990,12 @@ static int parse_events__scanner(const char *str, void *data, int start_token)return ret; buffer =parse_events__scan_string (str, scanner); +/* '%' means it can be an SDT event */ +if (*str =='%' ) +if (strchr (str,':' )) { + ret =trace_sdt_event (str); + str++; + }#ifdef PARSER_DEBUG parse_events_debug =1 ;
tools/perf/util/parse-events.h +3 -0
@@ -126,5 +126,8 @@ extern int valid_debugfs_mount(const char *debugfs);int add_sdt_events (const char *file);int dump_sdt_events (void );int remove_sdt_events (const char *str); +int event_hash_list__lookup (const char *str); +int remove_perf_sdt_events (const char *str); +int trace_sdt_event (const char *str);#endif /* __PERF_PARSE_EVENTS_H */
tools/perf/util/probe-event.c +75 -10
156 lines not on this page · raw message
tools/perf/util/probe-event.h +8 -0
@@ -74,9 +74,15 @@ struct perf_probe_event {struct perf_probe_point point;/* Probe point */ int nargs;/* Number of arguments */ bool uprobes; +bool sdt;/* An SDT event? */ struct perf_probe_arg *args;/* Arguments */ }; +struct perf_sdt_event { +struct sdt_note *note;/* SDT note info */ +char *file_name;/* File name */ +}; +/* Line range */ struct line_range {char *file;/* File name */
@@ -135,7 +141,9 @@ extern int show_available_vars(struct perf_probe_event *pevs, int npevs, struct strfilter *filter, bool externs);extern int show_available_funcs (const char *module,struct strfilter *filter,bool user); +extern int add_perf_sdt_event (struct perf_sdt_event *sev); +void goto_quiet_mode (void );/* Maximum index number of event-name postfix */ #define MAX_EVENT_INDEX 1024
tools/perf/util/probe-finder.c +3 -0
@@ -1197,6 +1197,9 @@ int debuginfo__find_trace_events(struct debuginfo *dbg, tf.tevs = *tevs; tf.ntevs =0 ; +/* Number of trace events for SDT event is 1 */ +if (pev->sdt) +return 1 ; ret =debuginfo__find_probes (dbg, &tf.pf);if (ret <0 ) {zfree (tevs);
tools/perf/util/sdt.c +204 -9
281 lines not on this page · raw message
tools/perf/util/symbol.h +2 -0
@@ -323,6 +323,8 @@ struct sdt_note {Elf32_Addr a32[3 ]; } addr;struct list_head note_list;/* SDT notes' list */ +struct hlist_node event_list;/* Link to event_hash_list entry */ +struct file_sdt_ent *file_ptr;/* ptr to the containing file_sdt_ent */ };int get_sdt_note_list (struct list_head *head,const char *target);
Namhyung Kim
maintainerRe: [PATCH v4 5/5] perf/sdt: Add support to perf record to trace SDT events
Hi Hemant,
As you know, you need to keep an eye on how (kprobes) event cache patchset from Masami settles down. For those who aren't CC'ed, please see the link below:
https://lkml.org/lkml/2014/10/31/207
Quoted 5 lines · Hemant Kumar
This patch adds support to perf to record SDT events. When invoked, the SDT event is looked up in the sdt-cache. If its found, an entry is made silently to
uprobe_eventsfile and then recording is invoked, and then the entry for the SDT event inuprobe_eventsis silently discarded.
Quoted 7 lines
The SDT events are already stored in a cache file (
/var/cache/perf/perf-sdt-file.cache).
Although thefile_hashtable helps in addition or deletion of SDT events from the cache, its not of much use when it comes to probing the actual SDT event, because the key to this hash list is a file name and not the SDT event name (which is given as an argument to perf record). So, we won't be able to hash into it.
It likely to be ended up with per-file or per-buildid cache files under ~/.debug directory. In this case we also need to have the (central) event-to-cache table anyway IMHO.
Quoted 7 lines
To avoid this problem, we can create another hash list "
event_hash" list which will be maintained along with thefile_hashlist. Whenever a user invokes 'perf record -e %provider:event, perf should initialize theevent_hashlist and thefile_hashlist.
The key toevent_hashlist is calculated from the event name and its provider name.
Isn't it enough just to use provide name? I guess the provider names are (should be?) unique among a system although there's no absolute guarantee for that.
Quoted 46 lines
event_hash sdt_note |---------| ---------------- | | | file_ptr |==> container file_sdt_ent key = 129 =>| hlist ==|===|=> event_list=|==> to sdt notes hashed to | | | name | same entry |---------| | provider | | | | note_list==|==> to other notes in the key = 130 =>| hlist | --------------- same file |---------|The entry at that key in
event_hashcontains a list of SDT notes hashed to the same entry. It compares the name and provider to see if that is the SDT note we are looking for. If yes, find out the file that contains this SDT note. There is afile_ptrpointer embedded in this note which points to the structfile_sdt_entcontained in thefile_hash. From "file_sdt_ent" we will find out the file name.
Convert this sdt note into a perf event and then write this intouprobe_eventsfile to be able to record the event.
Then, corresponding entries are added touprobe_eventsfile for the SDT events.
After recording is done, these events are silently deleted fromuprobe_eventsfile. Theuprobe_eventsfile is present in debugfs/tracing directory.To support the addition and deletion of SDT events to/from
uprobe_eventsfile, arecord_sdtstruct is maintained which has the event data.An example usage:
# perf record -e %libc:setjmp -aR sleep 10 [ perf record: Woken up 1 times to write data ] [ perf record: Captured and wrote 0.277 MB perf.data (~12103 samples) ]# perf report --stdio # To display the perf.data header info, please use --header/--header-only # # Samples: 1 of event 'libc:setjmp' # Event count (approx.): 1 # # Overhead Command Shared Object Symbol # ........ ....... ............. ............... # 100.00% sleep libc-2.16.so [.] __sigsetjmpSigned-off-by Hemant Kumar <[email protected]>
[SNIP]
Quoted 7 lines
tools/perf/builtin-record.c +7
-0+/* Session specific to SDT tracing */ +struct record_sdt { +bool sdt;/* is this SDT event tracing? */ +char *str;/* hold the event name */ +} rec_sdt; + +int trace_sdt_event (const char *str)
tools/perf/builtin-record.c struct record { · line 66
Quoted 10 lines
tools/perf/builtin-record.c +10
-0+{ +int ret =0 ; + + rec_sdt.sdt = true; + rec_sdt.str =strdup (str); +if (!rec_sdt.str) +return -ENOMEM ; + ret =event_hash_list__lookup (str); +return ret; +}
Hmm.. does it support multiple SDT events recorded in a session like:
# perf record -e %libc:setjmp -e %libc:longjmp -aR sleep 10
?
[SNIP]
tools/perf/util/probe-event.c static int parse_perf_probe_point(char *arg, struct perf_probe_event *pev) · line 1135
Quoted 13 lines
tools/perf/util/probe-event.c +13
-0+/* Parse an SDT event */ +static int parse_perf_sdt_event (struct perf_sdt_event *sev, +struct perf_probe_event *pev) +{ +struct perf_probe_point *pp = &pev->point; + + pev->uprobes = true; + pev->sdt = true; + pev->event =strdup (sev->note->name); +if (pev->event ==NULL ) +return -ENOMEM ; + pev->group =strdup (sev->note->provider); +if (pev->event ==NULL )
s/event/group/
tools/perf/util/probe-event.c static int parse_perf_probe_point(char *arg, struct perf_probe_event *pev) · line 1142
Quoted 7 lines
tools/perf/util/probe-event.c +7
-0+return -ENOMEM ; + + pp->file =strdup (sev->file_name); +if (pp->file ==NULL ) +return -ENOMEM ; + + pp->function =strdup (sev->note->name);
Missing NULL check. Also you need to free prior allocations in case of error.
Thanks,
Namhyung
Quoted 3 lines
tools/perf/util/probe-event.c +3
-0+ pp->offset = sev->note->addr.a64[0 ]; +return 0 ; +}
Re: [PATCH v4 5/5] perf/sdt: Add support to perf record to trace SDT events
Hi Namhyung,
Quoted 32 lines · Namhyung Kim
Hi Hemant,
As you know, you need to keep an eye on how (kprobes) event cache patchset from Masami settles down. For those who aren't CC'ed, please see the link below:
https://lkml.org/lkml/2014/10/31/207Quoted 5 lines · Hemant Kumar
This patch adds support to perf to record SDT events. When invoked, the SDT event is looked up in the sdt-cache. If its found, an entry is made silently to
uprobe_eventsfile and then recording is invoked, and then the entry for the SDT event inuprobe_eventsis silently discarded.Quoted 7 lines
The SDT events are already stored in a cache file (
/var/cache/perf/perf-sdt-file.cache).
Although thefile_hashtable helps in addition or deletion of SDT events from the cache, its not of much use when it comes to probing the actual SDT event, because the key to this hash list is a file name and not the SDT event name (which is given as an argument to perf record). So, we won't be able to hash into it.It likely to be ended up with per-file or per-buildid cache files under ~/.debug directory. In this case we also need to have the (central) event-to-cache table anyway IMHO.
Quoted 6 lines
To avoid this problem, we can create another hash list "
event_hash" list which will be maintained along with thefile_hashlist. Whenever a user invokes 'perf record -e %provider:event, perf should initialize theevent_hashlist and thefile_hashlist.
The key toevent_hashlist is calculated from the event name and its provider name.
Quoted 4 lines
Isn't it enough just to use provide name? I guess the provider names are (should be?) unique among a system although there's no absolute guarantee for that.
Yes, there is no guarantee for the provider names to be unique.
If we use only provider name with "perf record", then, what if a user wants to trace only a specific SDT event (not all the events for that provider)?
What do you think?
Quoted 66 lines
Quoted 45 lines
event_hash sdt_note |---------| ---------------- | | | file_ptr |==> container file_sdt_ent key = 129 =>| hlist ==|===|=> event_list=|==> to sdt notes hashed to | | | name | same entry |---------| | provider | | | | note_list==|==> to other notes in the key = 130 =>| hlist | --------------- same file |---------|The entry at that key in
event_hashcontains a list of SDT notes hashed to the same entry. It compares the name and provider to see if that is the SDT note we are looking for. If yes, find out the file that contains this SDT note. There is afile_ptrpointer embedded in this note which points to the structfile_sdt_entcontained in thefile_hash. From "file_sdt_ent" we will find out the file name.
Convert this sdt note into a perf event and then write this intouprobe_eventsfile to be able to record the event.
Then, corresponding entries are added touprobe_eventsfile for the SDT events.
After recording is done, these events are silently deleted fromuprobe_eventsfile. Theuprobe_eventsfile is present in debugfs/tracing directory.To support the addition and deletion of SDT events to/from
uprobe_eventsfile, arecord_sdtstruct is maintained which has the event data.An example usage:
# perf record -e %libc:setjmp -aR sleep 10 [ perf record: Woken up 1 times to write data ] [ perf record: Captured and wrote 0.277 MB perf.data (~12103 samples) ]# perf report --stdio # To display the perf.data header info, please use --header/--header-only # # Samples: 1 of event 'libc:setjmp' # Event count (approx.): 1 # # Overhead Command Shared Object Symbol # ........ ....... ............. ............... # 100.00% sleep libc-2.16.so [.] __sigsetjmpSigned-off-by Hemant Kumar <[email protected]>[SNIP]
Quoted 7 lines
tools/perf/builtin-record.c +7
-0+/* Session specific to SDT tracing */ +struct record_sdt { +bool sdt;/* is this SDT event tracing? */ +char *str;/* hold the event name */ +} rec_sdt; + +int trace_sdt_event (const char *str)tools/perf/builtin-record.c struct record { · line 66
Quoted 10 lines
tools/perf/builtin-record.c +10
-0+{ +int ret =0 ; + + rec_sdt.sdt = true; + rec_sdt.str =strdup (str); +if (!rec_sdt.str) +return -ENOMEM ; + ret =event_hash_list__lookup (str); +return ret; +}Hmm.. does it support multiple SDT events recorded in a session like:
Quoted 3 lines
# perf record -e %libc:setjmp -e %libc:longjmp -aR sleep 10?
Yes, it supports multiple SDT events recorded in a session :
# ./perf record -e %libc:lll_lock_wait_private -e %libc:setjmp -aR sleep 10 [ perf record: Woken up 1 times to write data ] [ perf record: Captured and wrote 0.264 MB perf.data (~11526 samples) ]
Quoted 15 lines
[SNIP]
tools/perf/util/probe-event.c static int parse_perf_probe_point(char *arg, struct perf_probe_event *pev) · line 1135
Quoted 13 lines
tools/perf/util/probe-event.c +13
-0+/* Parse an SDT event */ +static int parse_perf_sdt_event (struct perf_sdt_event *sev, +struct perf_probe_event *pev) +{ +struct perf_probe_point *pp = &pev->point; + + pev->uprobes = true; + pev->sdt = true; + pev->event =strdup (sev->note->name); +if (pev->event ==NULL ) +return -ENOMEM ; + pev->group =strdup (sev->note->provider); +if (pev->event ==NULL )s/event/group/
Will fix that.
Quoted 9 lines
tools/perf/util/probe-event.c static int parse_perf_probe_point(char *arg, struct perf_probe_event *pev) · line 1142
Quoted 7 lines
tools/perf/util/probe-event.c +7
-0+return -ENOMEM ; + + pp->file =strdup (sev->file_name); +if (pp->file ==NULL ) +return -ENOMEM ; + + pp->function =strdup (sev->note->name);Missing NULL check. Also you need to free prior allocations in case of error.
Yes, will do that.
Quoted 7 lines
Thanks,
NamhyungQuoted 3 lines
tools/perf/util/probe-event.c +3
-0+ pp->offset = sev->note->addr.a64[0 ]; +return 0 ; +}
Signature · 2 lines
Thanks, Hemant Kumar
Re: Re: [PATCH v4 5/5] perf/sdt: Add support to perf record to trace SDT events
Hi,
Quoted 27 lines · Hemant Kumar
Hi Namhyung,
Quoted 24 lines · Namhyung Kim
Hi Hemant,
As you know, you need to keep an eye on how (kprobes) event cache patchset from Masami settles down. For those who aren't CC'ed, please see the link below:
https://lkml.org/lkml/2014/10/31/207Quoted 5 lines · Hemant Kumar
This patch adds support to perf to record SDT events. When invoked, the SDT event is looked up in the sdt-cache. If its found, an entry is made silently to
uprobe_eventsfile and then recording is invoked, and then the entry for the SDT event inuprobe_eventsis silently discarded.Quoted 7 lines
The SDT events are already stored in a cache file (
/var/cache/perf/perf-sdt-file.cache).
Although thefile_hashtable helps in addition or deletion of SDT events from the cache, its not of much use when it comes to probing the actual SDT event, because the key to this hash list is a file name and not the SDT event name (which is given as an argument to perf record). So, we won't be able to hash into it.It likely to be ended up with per-file or per-buildid cache files under ~/.debug directory. In this case we also need to have the (central) event-to-cache table anyway IMHO.
What we are talking is to make a new caching file with buildid under .debug/.
We already has ~/.debug/.build-id/<build-id> for string the binary symbol maps. I think there are 2 options, one is expanding the current build-id file format to include sdt and probe-event caches. The other is to add ~/.debug/.build-id/<build-id>.probe and ~/.debug/.build-id/<build-id>.sdt for caching probe/sdt information.
And also, user interface is a discussion point. This series defines new sdt-cache command, and we already have buildid-cache command. We should have probe-cache command too? or consolidate those cache managing commands? This question should be involving your series too.
Quoted 11 lines
Quoted 10 lines
Quoted 6 lines
To avoid this problem, we can create another hash list "
event_hash" list which will be maintained along with thefile_hashlist. Whenever a user invokes 'perf record -e %provider:event, perf should initialize theevent_hashlist and thefile_hashlist.
The key toevent_hashlist is calculated from the event name and its provider name.Isn't it enough just to use provide name? I guess the provider names are (should be?) unique among a system although there's no absolute guarantee for that.
Quoted 5 lines
Yes, there is no guarantee for the provider names to be unique. If we use only provider name with "perf record", then, what if a user wants to trace
only a specific SDT event (not all the events for that provider)? What do you think?
How about failing if the provider name is not unique unless user gives the actual binary path?
Thank you,
Signature · 4 lines
Masami HIRAMATSU Software Platform Research Dept. Linux Technology Research Center Hitachi, Ltd., Yokohama Research Laboratory E-mail: [email protected]
A message that is not in the archive (sent off-list or not yet received): [email protected]
Re: Re: Re: [PATCH v4 5/5] perf/sdt: Add support to perf record to trace SDT events
Hi Masami,
Quoted 31 lines
Hi,
Quoted 27 lines · Hemant Kumar
Hi Namhyung,
Quoted 24 lines · Namhyung Kim
Hi Hemant,
As you know, you need to keep an eye on how (kprobes) event cache patchset from Masami settles down. For those who aren't CC'ed, please see the link below:
https://lkml.org/lkml/2014/10/31/207Quoted 5 lines · Hemant Kumar
This patch adds support to perf to record SDT events. When invoked, the SDT event is looked up in the sdt-cache. If its found, an entry is made silently to
uprobe_eventsfile and then recording is invoked, and then the entry for the SDT event inuprobe_eventsis silently discarded.Quoted 7 lines
The SDT events are already stored in a cache file (
/var/cache/perf/perf-sdt-file.cache).
Although thefile_hashtable helps in addition or deletion of SDT events from the cache, its not of much use when it comes to probing the actual SDT event, because the key to this hash list is a file name and not the SDT event name (which is given as an argument to perf record). So, we won't be able to hash into it.It likely to be ended up with per-file or per-buildid cache files under ~/.debug directory. In this case we also need to have the (central) event-to-cache table anyway IMHO.
Quoted 5 lines
What we are talking is to make a new caching file with buildid under .debug/.
We already has ~/.debug/.build-id/<build-id> for string the binary symbol maps. I think there are 2 options, one is expanding the current build-id file format to include sdt and probe-event caches. The other is
Like a single cache to manage all the events for that file? How do we distinguish between the events as we will be having perf record to read SDT events from this cache?
Quoted 3 lines
to add ~/.debug/.build-id/<build-id>.probe and ~/.debug/.build-id/<build-id>.sdt for caching probe/sdt information.
This approach looks convenient.
Quoted 5 lines
And also, user interface is a discussion point. This series defines new sdt-cache command, and we already have buildid-cache command. We should have probe-cache command too? or consolidate those cache managing commands? This question should be involving your series too.
I think, we need not have multiple sub-commands to manage the cache. We can consolidate the cache management of probe events (including SDT events) to a single command.
Quoted 11 lines
Quoted 11 lines
Quoted 10 lines
Quoted 6 lines
To avoid this problem, we can create another hash list "
event_hash" list which will be maintained along with thefile_hashlist. Whenever a user invokes 'perf record -e %provider:event, perf should initialize theevent_hashlist and thefile_hashlist.
The key toevent_hashlist is calculated from the event name and its provider name.Isn't it enough just to use provide name? I guess the provider names are (should be?) unique among a system although there's no absolute guarantee for that.
Quoted 10 lines
Quoted 5 lines
Yes, there is no guarantee for the provider names to be unique. If we use only provider name with "perf record", then, what if a user wants to trace
only a specific SDT event (not all the events for that provider)? What do you think?How about failing if the provider name is not unique unless user gives the actual binary path?
You mean something like this:
# perf record -e %provider @/path/to/file ...?
Signature · 2 lines
Thanks, Hemant Kumar
Re: Re: Re: Re: [PATCH v4 5/5] perf/sdt: Add support to perf record to trace SDT events
Quoted 60 lines · Hemant Kumar
Hi Masami,
Quoted 35 lines
Hi,
Quoted 31 lines · Hemant Kumar
Hi Namhyung,
Quoted 28 lines · Namhyung Kim
Hi Hemant,
As you know, you need to keep an eye on how (kprobes) event cache patchset from Masami settles down. For those who aren't CC'ed, please see the link below:
https://lkml.org/lkml/2014/10/31/207Quoted 6 lines · Hemant Kumar
This patch adds support to perf to record SDT events. When invoked, the SDT event is looked up in the sdt-cache. If its found, an entry is made silently to
uprobe_eventsfile and then recording is invoked, and then the entry for the SDT event inuprobe_eventsis silently discarded.Quoted 10 lines
The SDT events are already stored in a cache file (
/var/cache/perf/perf-sdt-file.cache).
Although thefile_hashtable helps in addition or deletion of SDT events
from the cache, its not of much use when it comes to probing the actual
SDT event, because the key to this hash list is a file name and not the
SDT event name (which is given as an argument to perf record). So, we won't be able to hash into it.It likely to be ended up with per-file or per-buildid cache files under ~/.debug directory. In this case we also need to have the (central) event-to-cache table anyway IMHO.
Quoted 5 lines
What we are talking is to make a new caching file with buildid under .debug/.
We already has ~/.debug/.build-id/<build-id> for string the binary symbol maps. I think there are 2 options, one is expanding the current build-id file format to include sdt and probe-event caches. The other isLike a single cache to manage all the events for that file? How do we distinguish between the events as we will be having perf record to read SDT events from this cache?
Quoted 3 lines
to add ~/.debug/.build-id/<build-id>.probe and ~/.debug/.build-id/<build-id>.sdt for caching probe/sdt information.
This approach looks convenient.
Quoted 6 lines
And also, user interface is a discussion point. This series defines new sdt-cache command, and we already have buildid-cache command. We should have probe-cache command too? or consolidate those cache managing commands?
This question should be involving your series too.
Quoted 3 lines
I think, we need not have multiple sub-commands to manage the cache. We can consolidate the cache management of probe events (including SDT events) to a single command.
Agreed. maybe perf-cache --buildid/--sdt/--probe would be good.
Quoted 18 lines
Quoted 18 lines
Quoted 17 lines
Quoted 11 lines
Quoted 7 lines
To avoid this problem, we can create another hash list "
event_hash" list
which will be maintained along with thefile_hashlist. Whenever a user invokes 'perf record -e %provider:event, perf should initialize theevent_hashlist and thefile_hashlist. The key toevent_hashlist is calculated from the event name and its provider name.Isn't it enough just to use provide name? I guess the provider names are (should be?) unique among a system although there's no absolute guarantee for that.
Yes, there is no guarantee for the provider names to be unique. If we use only provider name with "perf record", then, what if a user wants to trace
only a specific SDT event (not all the events for that provider)? What do you think?
Quoted 7 lines
Quoted 4 lines
How about failing if the provider name is not unique unless user gives the actual binary path?
You mean something like this:
# perf record -e %provider @/path/to/file ...?
Yes, that is what I meant. :)
Thank you,
Signature · 4 lines
Masami HIRAMATSU Software Platform Research Dept. Linux Technology Research Center Hitachi, Ltd., Yokohama Research Laboratory E-mail: [email protected]
Re: Re: Re: Re: [PATCH v4 5/5] perf/sdt: Add support to perf record to trace SDT events
Em Wed, Nov 05, 2014 at 06:07:08PM +0900, Masami Hiramatsu escreveu:
Quoted 7 lines
Quoted 5 lines · Hemant Kumar
Quoted 5 lines
And also, user interface is a discussion point. This series defines new sdt-cache command, and we already have buildid-cache command. We should have probe-cache command too? or consolidate those cache managing commands?
This question should be involving your series too.
Quoted 5 lines
Quoted 3 lines
I think, we need not have multiple sub-commands to manage the cache. We can consolidate the cache management of probe events (including SDT events) to a single command.
Agreed. maybe perf-cache --buildid/--sdt/--probe would be good.
We have it already, its called 'perf buildid-cache':
[root@zoo ~]# perf buildid-cache --hell
Error: unknown option `hell'
usage: perf buildid-cache [<options>]
-a, --add <file list>
file(s) to add
-k, --kcore <file> kcore file to add
-r, --remove <file list>
file(s) to remove
-M, --missing <file> to find missing build ids in the cache
-f, --force don't complain, do it
-u, --update <file list>
file(s) to update
-v, --verbose be more verbose[root@zoo ~]#
We can rename it at some point to 'perf cache', perhaps.
'perf cache --buildid' makes no sense, everything is keyed by build-id (hence the name, which is albeit long, admit), I guess what you meant was 'elf'.
It currently stores content of the form:
- ELF
- kcore (which is also ELF, but has no pathname)
- kallsyms
We would be adding other types of content, from this discussion:
- sdt
- [ku]probes (built from some other content, like ELF or kallsyms)
- Arnaldo
Namhyung Kim
maintainerRe: [PATCH v4 5/5] perf/sdt: Add support to perf record to trace SDT events
In reply to Masami HiramatsuQuoted 27 lines · Masami Hiramatsu
Hi,
Quoted 24 lines · Hemant Kumar
Hi Namhyung,
Quoted 21 lines · Namhyung Kim
Hi Hemant,
As you know, you need to keep an eye on how (kprobes) event cache patchset from Masami settles down. For those who aren't CC'ed, please see the link below:
https://lkml.org/lkml/2014/10/31/207Quoted 12 lines · Hemant Kumar
This patch adds support to perf to record SDT events. When invoked, the SDT event is looked up in the sdt-cache. If its found, an entry is made silently to
uprobe_eventsfile and then recording is invoked, and then the entry for the SDT event inuprobe_eventsis silently discarded.The SDT events are already stored in a cache file (
/var/cache/perf/perf-sdt-file.cache).
Although thefile_hashtable helps in addition or deletion of SDT events from the cache, its not of much use when it comes to probing the actual SDT event, because the key to this hash list is a file name and not the SDT event name (which is given as an argument to perf record). So, we won't be able to hash into it.
Quoted 8 lines
Quoted 3 lines
Quoted 3 lines
It likely to be ended up with per-file or per-buildid cache files under ~/.debug directory. In this case we also need to have the (central) event-to-cache table anyway IMHO.
What we are talking is to make a new caching file with buildid under .debug/.
We already has ~/.debug/.build-id/<build-id> for string the binary symbol maps.
??
The ~/.debug/.build-id/<build-id> (actually first 2 hexdigits are used for directory name) is a symlink to a cached binary.
$ file .debug/.build-id/00/08a6c4028b3826f8905324c770e7aa450e5d3b .debug/.build-id/00/08a6c4028b3826f8905324c770e7aa450e5d3b: symbolic link to `../../usr/lib64/libgtk-3.so.0.400.4/0008a6c4028b3826f8905324c770e7aa450e5d3b'
$ file .debug/usr/lib64/libgtk-3.so.0.400.4/0008a6c4028b3826f8905324c770e7aa450e5d3b .debug/usr/lib64/libgtk-3.so.0.400.4/0008a6c4028b3826f8905324c770e7aa450e5d3b: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, BuildID[sha1]=0xc4a6080026388b02245390f8aae770c73b5d0e45, stripped
Hmm.. it seems the file utility prints the build-id as a sequence of 4 byte little-endian integers.
Quoted 4 lines
I think there are 2 options, one is expanding the current build-id file format to include sdt and probe-event caches. The other is to add ~/.debug/.build-id/<build-id>.probe and ~/.debug/.build-id/<build-id>.sdt for caching probe/sdt information.
I think a single .probe file is enough for this, no?
Quoted 22 lines
And also, user interface is a discussion point. This series defines new sdt-cache command, and we already have buildid-cache command. We should have probe-cache command too? or consolidate those cache managing commands? This question should be involving your series too.
Quoted 16 lines
Quoted 10 lines
Quoted 6 lines
To avoid this problem, we can create another hash list "
event_hash" list which will be maintained along with thefile_hashlist. Whenever a user invokes 'perf record -e %provider:event, perf should initialize theevent_hashlist and thefile_hashlist.
The key toevent_hashlist is calculated from the event name and its provider name.Isn't it enough just to use provide name? I guess the provider names are (should be?) unique among a system although there's no absolute guarantee for that.
Yes, there is no guarantee for the provider names to be unique. If we use only provider name with "perf record", then, what if a user wants to trace
only a specific SDT event (not all the events for that provider)? What do you think?
What I'm saying is for managing cache not the usage of the cached events. IIUC you keep hash entry for all events to find matching file, but I think it can be managed in provider level as events in a single provider will live in a single binary.
Btw, I think we should support such multiple events to like
# perf record -e %provider_xxx:* -e %provider_yyy:prefix_*
Quoted 3 lines
How about failing if the provider name is not unique unless user gives the actual binary path?
It looks like a possible option. :)
Thanks,
Namhyung
Re: Re: [PATCH v4 5/5] perf/sdt: Add support to perf record to trace SDT events
Quoted 45 lines · Namhyung Kim
Quoted 27 lines · Masami Hiramatsu
Hi,
Quoted 24 lines · Hemant Kumar
Hi Namhyung,
Quoted 21 lines · Namhyung Kim
Hi Hemant,
As you know, you need to keep an eye on how (kprobes) event cache patchset from Masami settles down. For those who aren't CC'ed, please see the link below:
https://lkml.org/lkml/2014/10/31/207Quoted 12 lines · Hemant Kumar
This patch adds support to perf to record SDT events. When invoked, the SDT event is looked up in the sdt-cache. If its found, an entry is made silently to
uprobe_eventsfile and then recording is invoked, and then the entry for the SDT event inuprobe_eventsis silently discarded.The SDT events are already stored in a cache file (
/var/cache/perf/perf-sdt-file.cache).
Although thefile_hashtable helps in addition or deletion of SDT events from the cache, its not of much use when it comes to probing the actual SDT event, because the key to this hash list is a file name and not the SDT event name (which is given as an argument to perf record). So, we won't be able to hash into it.Quoted 8 lines
Quoted 3 lines
Quoted 3 lines
It likely to be ended up with per-file or per-buildid cache files under ~/.debug directory. In this case we also need to have the (central) event-to-cache table anyway IMHO.
What we are talking is to make a new caching file with buildid under .debug/.
We already has ~/.debug/.build-id/<build-id> for string the binary symbol maps.??
The ~/.debug/.build-id/<build-id> (actually first 2 hexdigits are used for directory name) is a symlink to a cached binary.
$ file .debug/.build-id/00/08a6c4028b3826f8905324c770e7aa450e5d3b .debug/.build-id/00/08a6c4028b3826f8905324c770e7aa450e5d3b: symbolic link to `../../usr/lib64/libgtk-3.so.0.400.4/0008a6c4028b3826f8905324c770e7aa450e5d3b'
Quoted 6 lines
$ file .debug/usr/lib64/libgtk-3.so.0.400.4/0008a6c4028b3826f8905324c770e7aa450e5d3b .debug/usr/lib64/libgtk-3.so.0.400.4/0008a6c4028b3826f8905324c770e7aa450e5d3b: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, BuildID[sha1]=0xc4a6080026388b02245390f8aae770c73b5d0e45, strippedHmm.. it seems the file utility prints the build-id as a sequence of 4 byte little-endian integers.
Ah, I saw the kernel's build-id file...
Quoted 6 lines
Quoted 4 lines
I think there are 2 options, one is expanding the current build-id file format to include sdt and probe-event caches. The other is to add ~/.debug/.build-id/<build-id>.probe and ~/.debug/.build-id/<build-id>.sdt for caching probe/sdt information.
I think a single .probe file is enough for this, no?
I hope to be so, but SDT is a bit different, that may have a semaphore. Currently we just ignore it. But in some application, SDT events never be hit without enabling the semaphores. I'm not sure how we can enable it. Systemtap enables it by modifying application memory(data) on the fly. Maybe perftools can be done it by using ptrace, but it's not for ftrace.
[Off topic] I really don't like that the current SDT's semaphore. If the user apps see the instruction at the probe point, it is easy to check whether the event is enabled or not. Thus I recommend to change its implementation and update version instead of supporting current semaphore by perftools.
Quoted 22 lines
Quoted 21 lines
And also, user interface is a discussion point. This series defines new sdt-cache command, and we already have buildid-cache command. We should have probe-cache command too? or consolidate those cache managing commands? This question should be involving your series too.
Quoted 16 lines
Quoted 10 lines
Quoted 6 lines
To avoid this problem, we can create another hash list "
event_hash" list which will be maintained along with thefile_hashlist. Whenever a user invokes 'perf record -e %provider:event, perf should initialize theevent_hashlist and thefile_hashlist.
The key toevent_hashlist is calculated from the event name and its provider name.Isn't it enough just to use provide name? I guess the provider names are (should be?) unique among a system although there's no absolute guarantee for that.
Yes, there is no guarantee for the provider names to be unique. If we use only provider name with "perf record", then, what if a user wants to trace
only a specific SDT event (not all the events for that provider)? What do you think?
Quoted 4 lines
What I'm saying is for managing cache not the usage of the cached events. IIUC you keep hash entry for all events to find matching file, but I think it can be managed in provider level as events in a single provider will live in a single binary.
Usually, the SDT provider names are managed by hand, as it is unique.
Quoted 5 lines
Btw, I think we should support such multiple events to like
# perf record -e %provider_xxx:* -e %provider_yyy:prefix_*
what will be placed in the xxx and yyy ?
Thank you,
Quoted 9 lines
Quoted 3 lines
How about failing if the provider name is not unique unless user gives the actual binary path?
It looks like a possible option. :)
Thanks,
Namhyung
Signature · 4 lines
Masami HIRAMATSU Software Platform Research Dept. Linux Technology Research Center Hitachi, Ltd., Yokohama Research Laboratory E-mail: [email protected]
Re: [PATCH v4 5/5] perf/sdt: Add support to perf record to trace SDT events
Quoted 4 lines · Masami Hiramatsu
[Off topic] I really don't like that the current SDT's semaphore. If the user apps see the instruction at the probe point, it is easy to check whether the event is enabled or not. Thus I recommend to change its implementation and update version instead of supporting current semaphore by perftools.
You and I have banged heads on this before, but I don't think checking the instruction is a simple as you seem to think. I invite you to prototype this, and if you get it working we can discuss the tradeoffs.
The good news is that other tools (stap and gdb) won't need to care. If the SDT semaphore goes automatic, then we can just set that note field to zero, unused from the tool's perspective.
Another tactic is to just discourage developers from using the semaphore in the first place, as it's a completely optional feature. The marker is just a NOP, so adding some "if (enabled) {...}" around it is often a useless load and branch. It does make sense if the probe wants to provide some expensively-computed arguments though, like cpython does to prepare a function name string. So if you see a project testing the semaphore around simple arguments, I'd suggest they just probe directly instead.
Thanks,
Josh
Re: Re: [PATCH v4 5/5] perf/sdt: Add support to perf record to trace SDT events
Quoted 9 lines · Josh Stone
Quoted 4 lines · Masami Hiramatsu
[Off topic] I really don't like that the current SDT's semaphore. If the user apps see the instruction at the probe point, it is easy to check whether the event is enabled or not. Thus I recommend to change its implementation and update version instead of supporting current semaphore by perftools.
You and I have banged heads on this before, but I don't think checking the instruction is a simple as you seem to think. I invite you to prototype this, and if you get it working we can discuss the tradeoffs.
Would you have the prototype? I'd like to look :)
Quoted 4 lines
The good news is that other tools (stap and gdb) won't need to care. If the SDT semaphore goes automatic, then we can just set that note field to zero, unused from the tool's perspective.
Quoted 8 lines
Another tactic is to just discourage developers from using the semaphore in the first place, as it's a completely optional feature. The marker is just a NOP, so adding some "if (enabled) {...}" around it is often a useless load and branch. It does make sense if the probe wants to provide some expensively-computed arguments though, like cpython does to prepare a function name string. So if you see a project testing the semaphore around simple arguments, I'd suggest they just probe directly instead.
I see, and we did that on qemu. I consider that someone maybe use it in the future unless we remove it. If we can succeed to discourage people using semaphore, we also should remove it.
Thank you,
Signature · 4 lines
Masami HIRAMATSU Software Platform Research Dept. Linux Technology Research Center Hitachi, Ltd., Yokohama Research Laboratory E-mail: [email protected]
Re: [PATCH v4 5/5] perf/sdt: Add support to perf record to trace SDT events
In reply to Masami HiramatsuQuoted 95 lines · Masami Hiramatsu
Quoted 43 lines · Namhyung Kim
Quoted 27 lines · Masami Hiramatsu
Hi,
Quoted 24 lines · Hemant Kumar
Hi Namhyung,
Quoted 21 lines · Namhyung Kim
Hi Hemant,
As you know, you need to keep an eye on how (kprobes) event cache patchset from Masami settles down. For those who aren't CC'ed, please see the link below:
https://lkml.org/lkml/2014/10/31/207Quoted 12 lines · Hemant Kumar
This patch adds support to perf to record SDT events. When invoked, the SDT event is looked up in the sdt-cache. If its found, an entry is made silently to
uprobe_eventsfile and then recording is invoked, and then the entry for the SDT event inuprobe_eventsis silently discarded.The SDT events are already stored in a cache file (
/var/cache/perf/perf-sdt-file.cache).
Although thefile_hashtable helps in addition or deletion of SDT events from the cache, its not of much use when it comes to probing the actual SDT event, because the key to this hash list is a file name and not the SDT event name (which is given as an argument to perf record). So, we won't be able to hash into it.Quoted 7 lines
Quoted 3 lines
Quoted 3 lines
It likely to be ended up with per-file or per-buildid cache files under ~/.debug directory. In this case we also need to have the (central) event-to-cache table anyway IMHO.
What we are talking is to make a new caching file with buildid under .debug/.
We already has ~/.debug/.build-id/<build-id> for string the binary symbol maps.??
The ~/.debug/.build-id/<build-id> (actually first 2 hexdigits are used for directory name) is a symlink to a cached binary.
$ file .debug/.build-id/00/08a6c4028b3826f8905324c770e7aa450e5d3b .debug/.build-id/00/08a6c4028b3826f8905324c770e7aa450e5d3b: symbolic link to `../../usr/lib64/libgtk-3.so.0.400.4/0008a6c4028b3826f8905324c770e7aa450e5d3b'Quoted 6 lines
$ file .debug/usr/lib64/libgtk-3.so.0.400.4/0008a6c4028b3826f8905324c770e7aa450e5d3b .debug/usr/lib64/libgtk-3.so.0.400.4/0008a6c4028b3826f8905324c770e7aa450e5d3b: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, BuildID[sha1]=0xc4a6080026388b02245390f8aae770c73b5d0e45, strippedHmm.. it seems the file utility prints the build-id as a sequence of 4 byte little-endian integers.
Ah, I saw the kernel's build-id file...
Quoted 5 lines
Quoted 4 lines
I think there are 2 options, one is expanding the current build-id file format to include sdt and probe-event caches. The other is to add ~/.debug/.build-id/<build-id>.probe and ~/.debug/.build-id/<build-id>.sdt for caching probe/sdt information.
I think a single .probe file is enough for this, no?
I hope to be so, but SDT is a bit different, that may have a semaphore. Currently we just ignore it. But in some application, SDT events never be hit without enabling the semaphores. I'm not sure how we can enable it. Systemtap enables it by modifying application memory(data) on the fly. Maybe perftools can be done it by using ptrace, but it's not for ftrace.
[Off topic] I really don't like that the current SDT's semaphore. If the user apps see the instruction at the probe point, it is easy to check whether the event is enabled or not. Thus I recommend to change its implementation and update version instead of supporting current semaphore by perftools.
Quoted 20 lines
Quoted 20 lines
And also, user interface is a discussion point. This series defines new sdt-cache command, and we already have buildid-cache command. We should have probe-cache command too? or consolidate those cache managing commands? This question should be involving your series too.
Quoted 15 lines
Quoted 10 lines
Quoted 6 lines
To avoid this problem, we can create another hash list "
event_hash" list which will be maintained along with thefile_hashlist. Whenever a user invokes 'perf record -e %provider:event, perf should initialize theevent_hashlist and thefile_hashlist.
The key toevent_hashlist is calculated from the event name and its provider name.Isn't it enough just to use provide name? I guess the provider names are (should be?) unique among a system although there's no absolute guarantee for that.
Yes, there is no guarantee for the provider names to be unique. If we use only provider name with "perf record", then, what if a user wants to trace
only a specific SDT event (not all the events for that provider)? What do you think?Quoted 4 lines
What I'm saying is for managing cache not the usage of the cached events. IIUC you keep hash entry for all events to find matching file, but I think it can be managed in provider level as events in a single provider will live in a single binary.
Usually, the SDT provider names are managed by hand, as it is unique.
Quoted 16 lines
Quoted 4 lines
Btw, I think we should support such multiple events to like
# perf record -e %provider_xxx:* -e %provider_yyy:prefix_*what will be placed in the xxx and yyy ?
Thank you,
Quoted 7 lines
Quoted 2 lines
How about failing if the provider name is not unique unless user gives the actual binary path?
It looks like a possible option. :)
Thanks,
Namhyung
So, what should be our way forward here in case of SDT patchset wrt event_cache patchset? Shall we wait for event_cache patchset to be merged and then redesign the sdt_cache patchset according to new event_cache?
Or, we can go ahead with the current sdt patchset (implementing the latest review comments) and we can change the sdt_cache according to the new event_cache design as and when required?
What do you think?
Signature · 2 lines
Thanks, Hemant Kumar
Re: Re: [PATCH v4 5/5] perf/sdt: Add support to perf record to trace SDT events
Quoted 9 lines · Hemant Kumar
So, what should be our way forward here in case of SDT patchset wrt
event_cachepatchset? Shall we wait forevent_cachepatchset to be merged and then redesign thesdt_cachepatchset according to newevent_cache?
Or, we can go ahead with the current sdt patchset (implementing the latest review comments) and we can change thesdt_cacheaccording to the newevent_cachedesign as and when required?What do you think?
Good question :)
In my opinion, we'd better consolidate sdt_cache to new cache subcommand at first, since it is a user-visible change. If we consolidate it after introducing sdt-cache, users will see that option is also banished.
And also, the cache-format may be a problem, since that involves a backward compatibility issue. For now, I'm considering Namhyung's idea of merging SDT and probe caches. If we can use SDT as a kind of probe cache, why do we need to have both SDT cache and probe cache? SDT cache is currently have its own format, but it also could be written as a probe format, as below.
In ~/.debug/probe/bu/ild-id:
%<PROVIDER>:<EVENT> _text+<OFFSET>
This lucks a semaphore location, but who cares? Anyway we can't change the semaphore. We already have reader of this format and also this can have arguments if you get it from sdt.note. :)
Moreover, we can share the cache file with perf-probe! :)
Thank you,
Signature · 4 lines
Masami HIRAMATSU Software Platform Research Dept. Linux Technology Research Center Hitachi, Ltd., Yokohama Research Laboratory E-mail: [email protected]
[RFC] perf-cache command interface design
In reply to Hemant KumarHello,
Here, I've tried to describe my idea of perf-cache subcommand interface. It is just a design review, not implemented yet :)
Please give me your comments/ideas!
Command-line Synopsis
=====================
Current "perf buildid-cache [options]" are directly mapped to "perf cache --buildid [options]".
And adding --sdt for managing SDT caches as below.
Add or update SDT events in <FILES>
perf cache --sdt --add|--update <FILES>
Remove all SDT events for <FILES>
perf cache --sdt --remove <FILES>
List all SDT events
perf cache --sdt --listAnd --probes for managing probe-caches as below.
Add new probe-cache entries for kernel, <PATH> or <MOD>.
perf cache --probe [--exec <PATH>|--module <MOD>] --add <SPEC>
Delete existing probe-cache entries for kernel, <PATH> or/and <BUILDID>.
perf cache --probe --del [<GROUP>:]<EVENT>[@<PATH>][#<BUILDID>]
Or remove all entires for given FILES
perf cache --probe --remove <FILES>
List the probe caches(including SDT) for kernel, <PATH>, or/and <BUILDID>.
perf cache --probe --list [@<PATH>][#<BUILDID>]
Query the probe definitions.
perf cache --probe --query [<GROUP>:]<EVENT>[@<PATH>][#<BUILDID>]
Note that --probes also can be used for managing SDT events, which has % prefix e.g.
Add all SDT events for <PATH>
perf cache --probe --exec <PATH> --add '%*:*'
Remove some SDT events for <PATH>
perf cache --probe --del '%some:events@<PATH>'
Or remove all SDT events for <BUILDID>
perf cache --probe --del '%*:*#<BUILDID>'
File Format
===========
All the cache files are placed under ~/.debug/ by default. The paths of buildid cache of binary/symbols are not changed.
The SDT/probe caches are placed under the ~/.debug/.probes/path/to/bin/bu/ildid and that is linked to ~/.debug/.probes/.buildid/bu/ildid
# To avoid conflict with files under /probes/*, I picked up .probes/.
This SDT/probe caches contain probe-definitions as following format.
----
#buildid:BUILDID
#path:PATH
p:%PROVIDER/EVENT PATH:OFFSET [ARGS]
p:PROBE/EVENT _text+OFFSET [ARGS]
----
Normal probes and SDT cache entries can be mixed in a cache file, we'll load all the entries and filter by % prefixes.
Thank you,
Signature · 4 lines
Masami HIRAMATSU Software Platform Research Dept. Linux Technology Research Center Hitachi, Ltd., Yokohama Research Laboratory E-mail: [email protected]
Peter Zijlstra
maintainerRe: [RFC] perf-cache command interface design
Quoted 1 line · Masami Hiramatsu
The paths of buildid cache of binary/symbols are not changed.
Could we get an option in .perfconfig to disable the buildid cache? Its pointless diskspace wastage for some of us.
Namhyung Kim
maintainerPATCH RESEND 1/2 perf tools: Move disable_buildid_cache() to util/build-id.c
Also move static variable no_buildid_cache and check it in the perf_session_cache_build_ids().
--- tools/perf/util/build-id.c | 11 +++++++++++ tools/perf/util/build-id.h | 1 + tools/perf/util/header.c | 10 +--------- tools/perf/util/util.h | 1 - 4 files changed, 13 insertions(+), 10 deletions(-)
tools/perf/util/build-id.c +11 -0
@@ -18,6 +18,9 @@#include "header.h" #include "vdso.h" + +static bool no_buildid_cache; + int build_id__mark_dso_hit(struct perf_tool *tool __maybe_unused, union perf_event *event, struct perf_sample *sample,
@@ -251,6 +254,11 @@ int dsos__hit_all(struct perf_session *session)return 0 ; } +void disable_buildid_cache (void ) +{ + no_buildid_cache = true; +} +int build_id_cache__add_s (const char *sbuild_id,const char *debugdir,const char *name,bool is_kallsyms,bool is_vdso) {
@@ -404,6 +412,9 @@ int perf_session__cache_build_ids(struct perf_session *session)int ret;char debugdir[PATH_MAX ]; +if (no_buildid_cache) +return 0 ; +snprintf (debugdir,sizeof (debugdir),"%s" , buildid_dir);if (mkdir (debugdir,0755 ) !=0 && errno !=EEXIST )
tools/perf/util/build-id.h +1 -0
@@ -25,5 +25,6 @@ int perf_session__cache_build_ids(struct perf_session *session);int build_id_cache__add_s (const char *sbuild_id,const char *debugdir,const char *name,bool is_kallsyms,bool is_vdso);int build_id_cache__remove_s (const char *sbuild_id,const char *debugdir); +void disable_buildid_cache (void );#endif
tools/perf/util/header.c +1 -9
@@ -24,8 +24,6 @@#include "build-id.h" #include "data.h" -static bool no_buildid_cache = false; -static u32 header_argc;static const char **header_argv;
@@ -191,8 +189,7 @@ static int write_build_id(int fd, struct perf_header *h,pr_debug ("failed to write buildid table\n" );return err; } -if (!no_buildid_cache) -perf_session__cache_build_ids (session); +perf_session__cache_build_ids (session);return 0 ; }
@@ -2790,8 +2787,3 @@ int perf_event__process_build_id(struct perf_tool *tool __maybe_unused, session);return 0 ; } - -void disable_buildid_cache (void ) -{ - no_buildid_cache = true; -}
tools/perf/util/util.h +0 -1
@@ -154,7 +154,6 @@ extern void set_die_routine(void (*routine)(const char *err, va_list params) NORextern int prefixcmp (const char *str,const char *prefix);extern void set_buildid_dir (void ); -extern void disable_buildid_cache (void );static inline const char *skip_prefix (const char *str,const char *prefix) {
Signature · 1 line
2.0.0
Namhyung Kim
maintainerPATCH 2/2 perf tools: Add record.use-buildid-cache config option
Add a new config option for auto-disable buildid-cache.
$ cat ~/.perfconfig [record] use-buildid-cache = false
$ rm -rf ~/.debug $ perf record -av sleep 1 mmap size 528384B [ perf record: Woken up 1 times to write data ] [ perf record: Captured and wrote 0.439 MB perf.data (~19182 samples) ] Looking at the vmlinux_path (7 entries long) Using /proc/kallsyms for symbols
$ tree ~/.debug /home/namhyung/.debug [error opening dir]
0 directories, 0 files
--- tools/perf/builtin-record.c | 6 ++++++ 1 file changed, 6 insertions(+)
tools/perf/builtin-record.c +6 -0
@@ -685,6 +685,12 @@ int record_callchain_opt(const struct option *opt __maybe_unused,static int perf_record_config (const char *var,const char *value,void *cb) { +struct record *rec = cb; + +if (!strcmp (var,"record.use-buildid-cache" )) { + rec->no_buildid_cache = !perf_config_bool (var, value); +return 0 ; + }if (!strcmp (var,"record.call-graph" )) var ="call-graph.record-mode" ;/* fall-through */
Signature · 1 line
2.0.0
tip-bot for Namhyung Kim
merge bot[tip:perf/core] perf build-id: Move disable_buildid_cache() to util/build-id.c
In reply to Namhyung Kimperf build-id: Move disable_buildid_cache() to util/build-id.c
Commit-ID: 73c5d224b4514575abe0dd89b43adbde937429c3 Gitweb: http://git.kernel.org/tip/73c5d224b4514575abe0dd89b43adbde937429c3 Author: Namhyung Kim <[email protected]> AuthorDate: Fri, 7 Nov 2014 22:57:56 +0900 Committer: Arnaldo Carvalho de Melo <[email protected]> CommitDate: Wed, 19 Nov 2014 12:33:46 -0300
perf build-id: Move disable_buildid_cache() to util/build-id.c
Also move static variable no_buildid_cache and check it in the perf_session_cache_build_ids().
--- tools/perf/util/build-id.c | 11 +++++++++++ tools/perf/util/build-id.h | 1 + tools/perf/util/header.c | 10 +--------- tools/perf/util/util.h | 1 - 4 files changed, 13 insertions(+), 10 deletions(-)
tools/perf/util/build-id.c +11 -0
@@ -18,6 +18,9 @@#include "header.h" #include "vdso.h" + +static bool no_buildid_cache; + int build_id__mark_dso_hit(struct perf_tool *tool __maybe_unused, union perf_event *event, struct perf_sample *sample,
@@ -251,6 +254,11 @@ int dsos__hit_all(struct perf_session *session)return 0 ; } +void disable_buildid_cache (void ) +{ + no_buildid_cache = true; +} +int build_id_cache__add_s (const char *sbuild_id,const char *debugdir,const char *name,bool is_kallsyms,bool is_vdso) {
@@ -404,6 +412,9 @@ int perf_session__cache_build_ids(struct perf_session *session)int ret;char debugdir[PATH_MAX ]; +if (no_buildid_cache) +return 0 ; +snprintf (debugdir,sizeof (debugdir),"%s" , buildid_dir);if (mkdir (debugdir,0755 ) !=0 && errno !=EEXIST )
tools/perf/util/build-id.h +1 -0
@@ -25,5 +25,6 @@ int perf_session__cache_build_ids(struct perf_session *session);int build_id_cache__add_s (const char *sbuild_id,const char *debugdir,const char *name,bool is_kallsyms,bool is_vdso);int build_id_cache__remove_s (const char *sbuild_id,const char *debugdir); +void disable_buildid_cache (void );#endif
tools/perf/util/header.c +1 -9
@@ -24,8 +24,6 @@#include "build-id.h" #include "data.h" -static bool no_buildid_cache = false; -static u32 header_argc;static const char **header_argv;
@@ -191,8 +189,7 @@ static int write_build_id(int fd, struct perf_header *h,pr_debug ("failed to write buildid table\n" );return err; } -if (!no_buildid_cache) -perf_session__cache_build_ids (session); +perf_session__cache_build_ids (session);return 0 ; }
@@ -2791,8 +2788,3 @@ int perf_event__process_build_id(struct perf_tool *tool __maybe_unused, session);return 0 ; } - -void disable_buildid_cache (void ) -{ - no_buildid_cache = true; -}
tools/perf/util/util.h +0 -1
@@ -154,7 +154,6 @@ extern void set_die_routine(void (*routine)(const char *err, va_list params) NORextern int prefixcmp (const char *str,const char *prefix);extern void set_buildid_dir (void ); -extern void disable_buildid_cache (void );static inline const char *skip_prefix (const char *str,const char *prefix) {
Re: [RFC] perf-cache command interface design
In reply to Peter ZijlstraQuoted 5 lines · Peter Zijlstra
Quoted 1 line · Masami Hiramatsu
The paths of buildid cache of binary/symbols are not changed.
Could we get an option in .perfconfig to disable the buildid cache? Its pointless diskspace wastage for some of us.
I was going to respond with the same. This:
[buildid]
# Default, disable using /dev/null
dir = /dev/null
disables the build-id cache. Hopefully that extends to all the other caches getting discussed.
David
Re: [RFC] perf-cache command interface design
Em Fri, Nov 07, 2014 at 08:16:09AM -0700, David Ahern escreveu:
Quoted 7 lines · Peter Zijlstra
Quoted 5 lines · Masami Hiramatsu
Quoted 1 line
The paths of buildid cache of binary/symbols are not changed.
Could we get an option in .perfconfig to disable the buildid cache? Its pointless diskspace wastage for some of us.
Quoted 8 lines
I was going to respond with the same. This:
[buildid]
# Default, disable using/dev/null
dir =/dev/nulldisables the build-id cache. Hopefully that extends to all the other caches getting discussed.
I think this can even be something Kconfig'ed, and we can provide a .config file for people like Peter that want as barebone a perf he can get over with :-)
/me needs to try that last perf Kconfig patchkit...
- Arnaldo
Re: [RFC] perf-cache command interface design
In reply to Masami HiramatsuQuoted 5 lines · Masami Hiramatsu
Hello,
Here, I've tried to describe my idea of perf-cache subcommand interface. It is just a design review, not implemented yet :)
Please give me your comments/ideas!
Thanks, I have some comments below.
Quoted 36 lines
Command-line Synopsis
=====================Current "perf buildid-cache [options]" are directly mapped to "perf cache --buildid [options]".
And adding --sdt for managing SDT caches as below.
Add or update SDT events in <FILES>
perf cache --sdt --add|--update <FILES> Remove all SDT events for <FILES> perf cache --sdt --remove <FILES>List all SDT events perf cache --sdt --listAnd --probes for managing probe-caches as below.
Add new probe-cache entries for kernel, <PATH> or <MOD>.
perf cache --probe [--exec <PATH>|--module <MOD>] --add <SPEC>Delete existing probe-cache entries for kernel, <PATH> or/and <BUILDID>.
perf cache --probe --del [<GROUP>:]<EVENT>[@<PATH>][#<BUILDID>]Or remove all entires for given FILES
perf cache --probe --remove <FILES>List the probe caches(including SDT) for kernel, <PATH>, or/and <BUILDID>.
perf cache --probe --list [@<PATH>][#<BUILDID>]Query the probe definitions.
perf cache --probe --query [<GROUP>:]<EVENT>[@<PATH>][#<BUILDID>]Note that --probes also can be used for managing SDT events, which has % prefix e.g.
Add all SDT events for <PATH>
Quoted 7 lines
perf cache --probe --exec <PATH> --add '%*:*'Remove some SDT events for <PATH>
perf cache --probe --del '%some:events@<PATH>'Or remove all SDT events for <BUILDID>
perf cache --probe --del '%*:*#<BUILDID>'
Looks nice to me :)
Quoted 10 lines
File Format
===========
All the cache files are placed under ~/.debug/ by default. The paths of buildid cache of binary/symbols are not changed.The SDT/probe caches are placed under the ~/.debug/.probes/path/to/bin/bu/ildid and that is linked to ~/.debug/.probes/.buildid/bu/ildid
# To avoid conflict with files under /probes/*, I picked up .probes/.
Quoted 5 lines
This SDT/probe caches contain probe-definitions as following format.
----
#buildid:BUILDID
#path:PATH
p:%PROVIDER/EVENT PATH:OFFSET [ARGS]
I think this format isn't accepted by the uprobe_events file (because of the '%') if we want to cat and grep into uprobe_events file directly. Although, in case of perf record, we can process it to remove '%' and then write into uprobe_events file. And, '%' is required as a flag for the SDT entries.
So, either we can modify the uprobe_events file to ignore '%' in the event group name (with an additional patch in the SDT series) or we can leave it to the user to write a script which can do some processing to remove '%' and then echo it to uprobe_events file.
What would you think?
Quoted 9 lines
p:PROBE/EVENT _text+OFFSET [ARGS]
----Normal probes and SDT cache entries can be mixed in a cache file, we'll load all the entries and filter by % prefixes.
Thank you,
Signature · 2 lines
Thanks, Hemant Kumar
Re: [RFC] perf-cache command interface design
Quoted 16 lines · Hemant Kumar
Quoted 10 lines
File Format
===========
All the cache files are placed under ~/.debug/ by default. The paths of buildid cache of binary/symbols are not changed.The SDT/probe caches are placed under the ~/.debug/.probes/path/to/bin/bu/ildid and that is linked to ~/.debug/.probes/.buildid/bu/ildid
# To avoid conflict with files under /probes/*, I picked up .probes/.Quoted 5 lines
This SDT/probe caches contain probe-definitions as following format.
----
#buildid:BUILDID
#path:PATH
p:%PROVIDER/EVENT PATH:OFFSET [ARGS]
Quoted 5 lines
I think this format isn't accepted by the
uprobe_eventsfile (because of the '%') if we want to cat and grep intouprobe_eventsfile directly. Although, in case of perf record, we can process it to remove '%' and then write intouprobe_eventsfile. And, '%' is required as a flag for the SDT entries.
Ah, right...
Quoted 5 lines
So, either we can modify the
uprobe_eventsfile to ignore '%' in the event group name (with an additional patch in the SDT series) or we can leave it to the user to write a script which can do some processing to remove '%' and then echo it touprobe_eventsfile.
What would you think?
Hmm, ok. I think we can unify SDT and probe cache as just an cached event. So replacing % with probe_ prefix is OK I think.
What I mean is if you add a file to cache, perf adds SDTs in the file, and if you add a file with some expressions, like '* $params', perf also adds probe caches. And you can use both events for not only tracing but also profiling.
e.g.
perf cache --add /bin/foo # add foo's SDTs
perf cache --add /bin/foo --probe 'foofunc $params' # add a probe cache for foofunc perf record -e %foo:sdtevent -e %foo:foofunc ... # we can record both SDT and cache
So, % prefix means "recall cached probe/sdt events to record if needed". If you already set up the probe-events on those, you don't need % as below.
perf probe --add "%foo:sdtevent" # add new probe_foo:sdtevent for %foo:sdtevent perf record -e probe_foo:sdtevent ...
Note that to avoid crash with existing event groups, we'll add "probe_" prefix for cached events.
Thank you,
Signature · 4 lines
Masami HIRAMATSU Software Platform Research Dept. Linux Technology Research Center Hitachi, Ltd., Yokohama Research Laboratory E-mail: [email protected]
Re: [RFC] perf-cache command interface design
In reply to Masami HiramatsuEm Fri, Nov 07, 2014 at 05:21:08PM +0900, Masami Hiramatsu escreveu:
Quoted 6 lines
Hello,
Here, I've tried to describe my idea of perf-cache subcommand interface. It is just a design review, not implemented yet :)
Please give me your comments/ideas!
Quoted 7 lines
Command-line Synopsis
=====================Current "perf buildid-cache [options]" are directly mapped to "perf cache --buildid [options]".
And adding --sdt for managing SDT caches as below.
Can't we avoid having to specify the content? I.e. the tool can surely be smart enough to figure that out, no?
We should, as much as possible, to make things more compact yet unambiguous, IMHO.
Quoted 2 lines
Add or update SDT events in <FILES>
perf cache --sdt --add|--update <FILES>
Can automagically figure this out, so, it would become just:
Add or update events in <FILES> perf cache --add/--update <FILES>
Quoted 2 lines
Remove all SDT events for <FILES>
perf cache --sdt --remove <FILES>
Ditto.
Quoted 2 lines
List all SDT events
perf cache --sdt --listThat is ok, since the cache can hold different types of contents, but:
perf cache --list
should show everything, with some marking showing the content type.
Quoted 4 lines
And --probes for managing probe-caches as below.
Add new probe-cache entries for kernel, <PATH> or <MOD>.
perf cache --probe [--exec <PATH>|--module <MOD>] --add <SPEC>
No need to specify --probe
Quoted 2 lines
Delete existing probe-cache entries for kernel, <PATH> or/and <BUILDID>.
perf cache --probe --del [<GROUP>:]<EVENT>[@<PATH>][#<BUILDID>]
Ditto
Quoted 2 lines
Or remove all entires for given FILES
perf cache --probe --remove <FILES>
Ok
Quoted 2 lines
List the probe caches(including SDT) for kernel, <PATH>, or/and <BUILDID>.
perf cache --probe --list [@<PATH>][#<BUILDID>]
Can figure out the kind by the initial character, so no need to specify --probe
Quoted 2 lines
Query the probe definitions.
perf cache --probe --query [<GROUP>:]<EVENT>[@<PATH>][#<BUILDID>]
Ditto
Quoted 4 lines
Note that --probes also can be used for managing SDT events, which has % prefix e.g.
Add all SDT events for <PATH>perf cache --probe --exec <PATH> --add '%*:*'
See? --probe is smart enough to deal with SDT and probe caches, it can disambiguate by looking at the first char.
Quoted 2 lines
Remove some SDT events for <PATH>
perf cache --probe --del '%some:events@<PATH>'
No need for --probe
Quoted 2 lines
Or remove all SDT events for <BUILDID>
perf cache --probe --del '%*:*#<BUILDID>'
Ditto
Quoted 7 lines
File Format
===========
All the cache files are placed under ~/.debug/ by default. The paths of buildid cache of binary/symbols are not changed.The SDT/probe caches are placed under the ~/.debug/.probes/path/to/bin/bu/ildid
Here I think we could group everything related to a /path/to/bin into:
~/.debug/path/to/bin/bu/ild/
With one file per content type:
~/.debug/path/to/bin/bu/ild/elf
~/.debug/path/to/bin/bu/ild/probe
That leaves room for us to add more file formats (CTF anyone? The Dtrace one, Compact C Type Information, I mean).
So that if we wanted to pick everything related to a pathname we could do:
tar cf gcc.debug.tar ~/.debug/usr/bin/gcc/
If we instead wanted to pick all files to a specific gcc build id, we would do:
tar cf gcc.debug.tar ~/.debug/usr/bin/gcc/bu/ild/
Quoted 1 line
and that is linked to ~/.debug/.probes/.buildid/bu/ildid
Since this would break compatibility with the existing cache format, we could as well allow collecting everything related to a build id, by making the link be also in this fashion:
tar cf bu.ildid.tar ~/.debug/.build-id/bu/ildid/
Because we would have:
~/.debug/.build-id/bu/ildid/elf -> ~/.debug/usr/bin/gcc/bu/ild/elf ~/.debug/.build-id/bu/ildid/probe -> ~/.debug/usr/bin/gcc/bu/ild/probe
And also links to the files that have no pathnames:
~/.debug/.build-id/bu/ildid/vdso -> ~/.debug/[vdso]/bu/ild ~/.debug/.build-id/bu/ildid/kallsyms -> ~/.debug/[kernel.kallsyms]/bu/ild ~/.debug/.build-id/bu/ildid/kcore -> ~/.debug/[kcore]/bu/ild
Quoted 10 lines
# To avoid conflict with files under /probes/*, I picked up .probes/.
This SDT/probe caches contain probe-definitions as following format.
----
#buildid:BUILDID
#path:PATH
p:%PROVIDER/EVENT PATH:OFFSET [ARGS]
p:PROBE/EVENT _text+OFFSET [ARGS]
----
Quoted 2 lines
Normal probes and SDT cache entries can be mixed in a cache file, we'll load all the entries and filter by % prefixes.
- Arnaldo
Re: [RFC] perf-cache command interface design
Quoted 13 lines · Arnaldo Carvalho de Melo
Em Fri, Nov 07, 2014 at 05:21:08PM +0900, Masami Hiramatsu escreveu:
Quoted 12 lines
Hello,
Here, I've tried to describe my idea of perf-cache subcommand interface. It is just a design review, not implemented yet :)
Please give me your comments/ideas!Command-line Synopsis
=====================Current "perf buildid-cache [options]" are directly mapped to "perf cache --buildid [options]".
Quoted 7 lines
Quoted 1 line
And adding --sdt for managing SDT caches as below.
Can't we avoid having to specify the content? I.e. the tool can surely be smart enough to figure that out, no?
We should, as much as possible, to make things more compact yet unambiguous, IMHO.
Agreed.
Quoted 9 lines
Quoted 3 lines
Add or update SDT events in <FILES>
perf cache --sdt --add|--update <FILES>Can automagically figure this out, so, it would become just:
Add or update events in <FILES> perf cache --add/--update <FILES>
Ah, nice idea :-)
Quoted 6 lines
Quoted 3 lines
Remove all SDT events for <FILES>
perf cache --sdt --remove <FILES>Ditto.
Quoted 8 lines
Quoted 2 lines
List all SDT events perf cache --sdt --listThat is ok, since the cache can hold different types of contents, but:
perf cache --listshould show everything, with some marking showing the content type.
Yeah, as I replied to Hemant, --sdt/--probe can be unified.
Quoted 16 lines
Quoted 5 lines
And --probes for managing probe-caches as below.
Add new probe-cache entries for kernel, <PATH> or <MOD>.
perf cache --probe [--exec <PATH>|--module <MOD>] --add <SPEC>No need to specify --probe
Quoted 2 lines
Delete existing probe-cache entries for kernel, <PATH> or/and <BUILDID>.
perf cache --probe --del [<GROUP>:]<EVENT>[@<PATH>][#<BUILDID>]Ditto
Quoted 2 lines
Or remove all entires for given FILES
perf cache --probe --remove <FILES>
Quoted 7 lines
Ok
Quoted 2 lines
List the probe caches(including SDT) for kernel, <PATH>, or/and <BUILDID>.
perf cache --probe --list [@<PATH>][#<BUILDID>]Can figure out the kind by the initial character, so no need to specify --probe
OK.
Quoted 5 lines
Quoted 2 lines
Query the probe definitions.
perf cache --probe --query [<GROUP>:]<EVENT>[@<PATH>][#<BUILDID>]Ditto
Quoted 7 lines
Quoted 4 lines
Note that --probes also can be used for managing SDT events, which has % prefix e.g.
Add all SDT events for <PATH>perf cache --probe --exec <PATH> --add '%*:*'See? --probe is smart enough to deal with SDT and probe caches, it can disambiguate by looking at the first char.
OK, but --add already have FILES arguments (according to buildid-cache) So I'd like to move that pattern argument to --probe as I've described in previous reply to Hemant.
Quoted 19 lines
Quoted 3 lines
Remove some SDT events for <PATH>
perf cache --probe --del '%some:events@<PATH>'No need for --probe
Quoted 2 lines
Or remove all SDT events for <BUILDID>
perf cache --probe --del '%*:*#<BUILDID>'Ditto
Quoted 7 lines
File Format
===========
All the cache files are placed under ~/.debug/ by default. The paths of buildid cache of binary/symbols are not changed.The SDT/probe caches are placed under the ~/.debug/.probes/path/to/bin/bu/ildid
Quoted 8 lines
Here I think we could group everything related to a /path/to/bin into:
~/.debug/path/to/bin/bu/ild/
With one file per content type:
~/.debug/path/to/bin/bu/ild/elf
~/.debug/path/to/bin/bu/ild/probe
Ah, OK, this is good for me too. :)
Quoted 3 lines
That leaves room for us to add more file formats (CTF anyone? The Dtrace one, Compact C Type Information, I mean).
Perhaps.
Quoted 9 lines
So that if we wanted to pick everything related to a pathname we could do:
tar cf gcc.debug.tar ~/.debug/usr/bin/gcc/
If we instead wanted to pick all files to a specific gcc build id, we would do:
tar cf gcc.debug.tar ~/.debug/usr/bin/gcc/bu/ild/
OK.
Quoted 10 lines
Quoted 1 line
and that is linked to ~/.debug/.probes/.buildid/bu/ildid
Since this would break compatibility with the existing cache format, we could as well allow collecting everything related to a build id, by making the link be also in this fashion:
tar cf bu.ildid.tar ~/.debug/.build-id/bu/ildid/
Because we would have:
Quoted 8 lines
~/.debug/.build-id/bu/ildid/elf -> ~/.debug/usr/bin/gcc/bu/ild/elf ~/.debug/.build-id/bu/ildid/probe -> ~/.debug/usr/bin/gcc/bu/ild/probe
And also links to the files that have no pathnames:
~/.debug/.build-id/bu/ildid/vdso -> ~/.debug/[vdso]/bu/ild ~/.debug/.build-id/bu/ildid/kallsyms -> ~/.debug/[kernel.kallsyms]/bu/ild ~/.debug/.build-id/bu/ildid/kcore -> ~/.debug/[kcore]/bu/ild
OK, so let's make bu/ildid to a directory :)
Thank you!
Signature · 4 lines
Masami HIRAMATSU Software Platform Research Dept. Linux Technology Research Center Hitachi, Ltd., Yokohama Research Laboratory E-mail: [email protected]
Namhyung Kim
maintainerRe: [RFC] perf-cache command interface design
In reply to Masami HiramatsuHi Masami,
2014-11-07 (금), 17:21 +0900, Masami Hiramatsu:
Quoted 43 lines
Hello,
Here, I've tried to describe my idea of perf-cache subcommand interface. It is just a design review, not implemented yet :)
Please give me your comments/ideas!Command-line Synopsis
=====================Current "perf buildid-cache [options]" are directly mapped to "perf cache --buildid [options]".
And adding --sdt for managing SDT caches as below.
Add or update SDT events in <FILES>
perf cache --sdt --add|--update <FILES>Remove all SDT events for <FILES>
perf cache --sdt --remove <FILES>List all SDT events perf cache --sdt --listAnd --probes for managing probe-caches as below.
Add new probe-cache entries for kernel, <PATH> or <MOD>.
perf cache --probe [--exec <PATH>|--module <MOD>] --add <SPEC>Delete existing probe-cache entries for kernel, <PATH> or/and <BUILDID>.
perf cache --probe --del [<GROUP>:]<EVENT>[@<PATH>][#<BUILDID>]Or remove all entires for given FILES
perf cache --probe --remove <FILES>List the probe caches(including SDT) for kernel, <PATH>, or/and <BUILDID>.
perf cache --probe --list [@<PATH>][#<BUILDID>]Query the probe definitions.
perf cache --probe --query [<GROUP>:]<EVENT>[@<PATH>][#<BUILDID>]Note that --probes also can be used for managing SDT events, which has % prefix e.g.
Add all SDT events for <PATH>
Quoted 7 lines
perf cache --probe --exec <PATH> --add '%*:*'Remove some SDT events for <PATH>
perf cache --probe --del '%some:events@<PATH>'Or remove all SDT events for <BUILDID>
perf cache --probe --del '%*:*#<BUILDID>'
I'd prefer sub-command to option for this mandatory (and exclusive) behavior. What about like this?
perf cache kprobe add [-m <module>] <spec> [<spec>...] perf cache kprobe del [<group>:]<event> [<event>...] perf cache kprobe list [-m <module>]
perf cache uprobe add -x <path> <spec> [<spec>...] perf cache uprobe del [<group>:]<event> [<event>...] perf cache uprobe list [-x <path>]
perf cache sdt [add|del|update] <file> [<file>...] perf cache sdt list [-b <build-id>] [<file>...]
Quoted 10 lines
File Format
===========
All the cache files are placed under ~/.debug/ by default. The paths of buildid cache of binary/symbols are not changed.The SDT/probe caches are placed under the ~/.debug/.probes/path/to/bin/bu/ildid and that is linked to ~/.debug/.probes/.buildid/bu/ildid
# To avoid conflict with files under /probes/*, I picked up .probes/.
However, to be used with perf record, we need a way to find a matching probe cache file from a event name (or group/provider name, preferably). What about having something like below:
$ cat ~/.debug/.probes/event.map PROVIDER1 /path/to/some/where PROVIDER2 /path/to/other/place
When perf record see a cached event used, it first searches its provider/group name from the event.map file. And then read bulid-id from the matching file on the path and finally find a cached event definition from ~/.debug/.probes/.buildid/bu/ildid file.
Quoted 6 lines
This SDT/probe caches contain probe-definitions as following format.
----
#buildid:BUILDID
#path:PATH
p:%PROVIDER/EVENT PATH:OFFSET [ARGS]
It seems PATH is redundant and we don't need to repeat it everyline IMHO. Since it need post-processing anyway, maybe it's better to just make it simpler, like:
%:PROVIDER/EVENT OFFSET [ARGS]
Thanks,
Namhyung
Quoted 9 lines
p:PROBE/EVENT _text+OFFSET [ARGS]
----Normal probes and SDT cache entries can be mixed in a cache file, we'll load all the entries and filter by % prefixes.
Thank you,
Re: [RFC] perf-cache command interface design
Quoted 48 lines · Namhyung Kim
Hi Masami,
2014-11-07 (금), 17:21 +0900, Masami Hiramatsu:
Quoted 45 lines
Hello,
Here, I've tried to describe my idea of perf-cache subcommand interface. It is just a design review, not implemented yet :)
Please give me your comments/ideas!Command-line Synopsis
=====================Current "perf buildid-cache [options]" are directly mapped to "perf cache --buildid [options]".
And adding --sdt for managing SDT caches as below.
Add or update SDT events in <FILES>
perf cache --sdt --add|--update <FILES>Remove all SDT events for <FILES>
perf cache --sdt --remove <FILES>List all SDT events perf cache --sdt --listAnd --probes for managing probe-caches as below.
Add new probe-cache entries for kernel, <PATH> or <MOD>.
perf cache --probe [--exec <PATH>|--module <MOD>] --add <SPEC>Delete existing probe-cache entries for kernel, <PATH> or/and <BUILDID>.
perf cache --probe --del [<GROUP>:]<EVENT>[@<PATH>][#<BUILDID>]Or remove all entires for given FILES
perf cache --probe --remove <FILES>List the probe caches(including SDT) for kernel, <PATH>, or/and <BUILDID>.
perf cache --probe --list [@<PATH>][#<BUILDID>]Query the probe definitions.
perf cache --probe --query [<GROUP>:]<EVENT>[@<PATH>][#<BUILDID>]Note that --probes also can be used for managing SDT events, which has % prefix e.g.
Add all SDT events for <PATH>perf cache --probe --exec <PATH> --add '%*:*'
Quoted 8 lines
Quoted 5 lines
Remove some SDT events for <PATH>
perf cache --probe --del '%some:events@<PATH>'Or remove all SDT events for <BUILDID>
perf cache --probe --del '%*:*#<BUILDID>'I'd prefer sub-command to option for this mandatory (and exclusive) behavior. What about like this?
I consider this will also confusing users because it's different from other subcommands. And Arnaldo gives us a better solution :)
Quoted 8 lines
perf cache kprobe add [-m <module>] <spec> [<spec>...] perf cache kprobe del [<group>:]<event> [<event>...] perf cache kprobe list [-m <module>]
perf cache uprobe add -x <path> <spec> [<spec>...] perf cache uprobe del [<group>:]<event> [<event>...] perf cache uprobe list [-x <path>]
Since perf has only "probe" subcommand, we shouldn't separate uprobe and kprobe.
Quoted 16 lines
perf cache sdt [add|del|update] <file> [<file>...] perf cache sdt list [-b <build-id>] [<file>...]
Quoted 10 lines
File Format
===========
All the cache files are placed under ~/.debug/ by default. The paths of buildid cache of binary/symbols are not changed.The SDT/probe caches are placed under the ~/.debug/.probes/path/to/bin/bu/ildid and that is linked to ~/.debug/.probes/.buildid/bu/ildid
# To avoid conflict with files under /probes/*, I picked up .probes/.
Quoted 7 lines
However, to be used with perf record, we need a way to find a matching probe cache file from a event name (or group/provider name, preferably). What about having something like below:
$ cat ~/.debug/.probes/event.map PROVIDER1 /path/to/some/where PROVIDER2 /path/to/other/place
Hmm, agreed. We'd better have this kind of provider index file to accelerate searching.
Quoted 13 lines
When perf record see a cached event used, it first searches its provider/group name from the event.map file. And then read bulid-id from the matching file on the path and finally find a cached event definition from ~/.debug/.probes/.buildid/bu/ildid file.
Quoted 6 lines
This SDT/probe caches contain probe-definitions as following format.
----
#buildid:BUILDID
#path:PATH
p:%PROVIDER/EVENT PATH:OFFSET [ARGS]
Quoted 5 lines
It seems PATH is redundant and we don't need to repeat it everyline IMHO. Since it need post-processing anyway, maybe it's better to just make it simpler, like:
%:PROVIDER/EVENT OFFSET [ARGS]
Hmm, this is not good because this line will not be able to pass to tracing/uprobe_events...
And also, I think we can compress this cache with gzip, then such redundancy will not be a problem.
Thank you,
Signature · 4 lines
Masami HIRAMATSU Software Platform Research Dept. Linux Technology Research Center Hitachi, Ltd., Yokohama Research Laboratory E-mail: [email protected]
Re: [RFC] perf-cache command interface design
In reply to Masami HiramatsuHello,
Here is the second try for the probe-cache. This version simplifies the synopsis, and unifies the SDT and probe caches. Please give me your comments/ideas!
Command-line Synopsis
=====================
Add elf(or symbols) and probe-caches of SDT if exists in <FILES>
perf cache --add <FILES> [--probe <SPEC>] # for user programs
perf cache --kcore <FILE> [--probe <SPEC>] # for kcore ?
perf cache --probe <SPEC> # for the current kernel
Remove caches related to <FILES> or <BUILDIDS>
perf cache --remove <FILES>|<BUILDIDS>
Show all probe caches(including SDT) or buildids
perf cache --list [probe|buildid]
Delete existing probe-cache entries for kernel, <PATH> or/and <BUILDID>.
perf cache --probe-del [<GROUP>:]<EVENT>[@<PATH>][#<BUILDID>]
Query the probe definitions.
perf cache --query [<GROUP>:]<EVENT>[@<PATH>][#<BUILDID>]
File Format
===========
All the cache files are placed under ~/.debug/ by default.
Elf caches are ~/.debug/path/to/file/bu/ildid/elf
Symbols caches are ~/.debug/path/to/file/bu/ildid/syms Probes(and SDT) are ~/.debug/path/to/file/bu/ildid/probes
And ~/.debug/path/to/file/bu/ildid/ is linked to ~/.debug/.buildid/bu/ildid Optionally, we can gzip the probes file.
This probe caches contain probe-definitions as following format.
----
#buildid:BUILDID
#spec:SDT
p:sdt_<PROVIDER>/<EVENT> PATH:OFFSET [ARGS]
...
#spec:* $params
p:probe_<GROUP>/<EVENT> _text+OFFSET [ARGS]
...
----
So the #spec: line gives the information what probe spec has been given. This will be used for updating.
And all the "probe_" and "sdt_" prefix will be replaced by % in the command line, e.g.
perf record -e %<PROVIDER>/<EVENT> -> this records sdt_PROVIDER/EVENT
Thank you,
Signature · 4 lines
Masami HIRAMATSU Software Platform Research Dept. Linux Technology Research Center Hitachi, Ltd., Yokohama Research Laboratory E-mail: [email protected]
Re: [RFC] perf-cache command interface design
Em Mon, Nov 10, 2014 at 07:59:24PM +0900, Masami Hiramatsu escreveu:
Quoted 11 lines
Hello,
Here is the second try for the probe-cache. This version simplifies the synopsis, and unifies the SDT and probe caches. Please give me your comments/ideas!
Command-line Synopsis
=====================Add elf(or symbols) and probe-caches of SDT if exists in <FILES>
perf cache --add <FILES> [--probe <SPEC>] # for user programs
Why the --probe above? Shouldn't this be just (if you are talking about ELF files only):
perf cache --add <FILES>
Quoted 1 line
perf cache --kcore <FILE> [--probe <SPEC>] # for kcore ?
Adrian, aren't kcore files easily identifiable as such and thus could be added as:
perf cache --add <FILES>
Quoted 1 line
perf cache --probe <SPEC> # for the current kernel
Why do we need a --probe here? Don't they always start with a character that is seldomly used in ELF file names and thus we could get away with not requiring --probe?
Quoted 8 lines
Remove caches related to <FILES> or <BUILDIDS>
perf cache --remove <FILES>|<BUILDIDS>Show all probe caches(including SDT) or buildids
perf cache --list [probe|buildid]Delete existing probe-cache entries for kernel, <PATH> or/and <BUILDID>.
perf cache --probe-del [<GROUP>:]<EVENT>[@<PATH>][#<BUILDID>]
Ditto, i.e. can't we just use:
perf cache --remove [<GROUP>:]<EVENT>[@<PATH>][#<BUILDID>]
And it figure out that this is a probe that is being removed?
Quoted 2 lines
Query the probe definitions.
perf cache --query [<GROUP>:]<EVENT>[@<PATH>][#<BUILDID>]
Replace --query with --show?
Quoted 8 lines
File Format
===========
All the cache files are placed under ~/.debug/ by default.
Elf caches are ~/.debug/path/to/file/bu/ildid/elf
Symbols caches are ~/.debug/path/to/file/bu/ildid/syms Probes(and SDT) are ~/.debug/path/to/file/bu/ildid/probes
And ~/.debug/path/to/file/bu/ildid/ is linked to ~/.debug/.buildid/bu/ildid Optionally, we can gzip the probes file.
Ok!
Quoted 26 lines
This probe caches contain probe-definitions as following format.
----
#buildid:BUILDID
#spec:SDT
p:sdt_<PROVIDER>/<EVENT> PATH:OFFSET [ARGS]
...
#spec:* $params
p:probe_<GROUP>/<EVENT> _text+OFFSET [ARGS]
...
----
So the #spec: line gives the information what probe spec has been given. This will be used for updating.And all the "
probe_" and "sdt_" prefix will be replaced by % in the command line, e.g.perf record -e %<PROVIDER>/<EVENT> -> this records sdt_PROVIDER/EVENT
Thank you,
Signature · 4 lines
Masami HIRAMATSU Software Platform Research Dept. Linux Technology Research Center Hitachi, Ltd., Yokohama Research Laboratory E-mail: [email protected]
Re: [RFC] perf-cache command interface design
Quoted 10 lines · Arnaldo Carvalho de Melo
Em Mon, Nov 10, 2014 at 07:59:24PM +0900, Masami Hiramatsu escreveu:
Quoted 9 lines
Hello,
Here is the second try for the probe-cache. This version simplifies the synopsis, and unifies the SDT and probe caches. Please give me your comments/ideas!
Command-line Synopsis
=====================
Quoted 7 lines
Quoted 2 lines
Add elf(or symbols) and probe-caches of SDT if exists in <FILES>
perf cache --add <FILES> [--probe <SPEC>] # for user programsWhy the --probe above? Shouldn't this be just (if you are talking about ELF files only):
perf cache --add <FILES>
Yes, for the elf and sdt cache, we don't need --probe.
Note that "[]" means optional. If we would like to add some probe cache, we need a spec of probe definition.
Quoted 5 lines
Quoted 1 line
perf cache --kcore <FILE> [--probe <SPEC>] # for kcore ?
Adrian, aren't kcore files easily identifiable as such and thus could be added as:
Quoted 7 lines
perf cache --add <FILES>
Quoted 1 line
perf cache --probe <SPEC> # for the current kernel
Why do we need a --probe here? Don't they always start with a character that is seldomly used in ELF file names and thus we could get away with not requiring --probe?
This is only for adding the probe cache (not elf, nor sdt), which requires a probe definition. Moreover, I'd like to unify the specification of the probe definition with perf-probe. In that case, --probe is more natural.
Quoted 6 lines
Quoted 6 lines
Remove caches related to <FILES> or <BUILDIDS>
perf cache --remove <FILES>|<BUILDIDS>Show all probe caches(including SDT) or buildids
perf cache --list [probe|buildid]
Quoted 8 lines
Quoted 2 lines
Delete existing probe-cache entries for kernel, <PATH> or/and <BUILDID>.
perf cache --probe-del [<GROUP>:]<EVENT>[@<PATH>][#<BUILDID>]Ditto, i.e. can't we just use:
perf cache --remove [<GROUP>:]<EVENT>[@<PATH>][#<BUILDID>]
And it figure out that this is a probe that is being removed?
In most cases, it may be OK, but it is also possible to cause unexpected result when mis-typing. I think if <FILE> is always starting at '/', it is easy to identify.
Quoted 4 lines
Quoted 2 lines
Query the probe definitions.
perf cache --query [<GROUP>:]<EVENT>[@<PATH>][#<BUILDID>]Replace --query with --show?
OK.
Thank you,
Quoted 39 lines
Quoted 9 lines
File Format
===========
All the cache files are placed under ~/.debug/ by default.
Elf caches are ~/.debug/path/to/file/bu/ildid/elf
Symbols caches are ~/.debug/path/to/file/bu/ildid/syms Probes(and SDT) are ~/.debug/path/to/file/bu/ildid/probes
And ~/.debug/path/to/file/bu/ildid/ is linked to ~/.debug/.buildid/bu/ildid Optionally, we can gzip the probes file.Ok!
Quoted 26 lines
This probe caches contain probe-definitions as following format.
----
#buildid:BUILDID
#spec:SDT
p:sdt_<PROVIDER>/<EVENT> PATH:OFFSET [ARGS]
...
#spec:* $params
p:probe_<GROUP>/<EVENT> _text+OFFSET [ARGS]
...
----
So the #spec: line gives the information what probe spec has been given. This will be used for updating.And all the "
probe_" and "sdt_" prefix will be replaced by % in the command line, e.g.perf record -e %<PROVIDER>/<EVENT> -> this records sdt_PROVIDER/EVENT
Thank you,
Signature · 4 lines
Masami HIRAMATSU Software Platform Research Dept. Linux Technology Research Center Hitachi, Ltd., Yokohama Research Laboratory E-mail: [email protected]
Signature · 4 lines
Masami HIRAMATSU Software Platform Research Dept. Linux Technology Research Center Hitachi, Ltd., Yokohama Research Laboratory E-mail: [email protected]
Re: [RFC] perf-cache command interface design
Em Tue, Nov 11, 2014 at 03:53:42PM +0900, Masami Hiramatsu escreveu:
Quoted 12 lines
Quoted 10 lines · Arnaldo Carvalho de Melo
Em Mon, Nov 10, 2014 at 07:59:24PM +0900, Masami Hiramatsu escreveu:
Quoted 9 lines
Here is the second try for the probe-cache. This version simplifies the synopsis, and unifies the SDT and probe caches. Please give me your comments/ideas!
Command-line Synopsis
=====================Add elf(or symbols) and probe-caches of SDT if exists in <FILES>
perf cache --add <FILES> [--probe <SPEC>] # for user programs
Quoted 8 lines
Quoted 4 lines
Why the --probe above? Shouldn't this be just (if you are talking about ELF files only):
perf cache --add <FILES>
Yes, for the elf and sdt cache, we don't need --probe.
Note that "[]" means optional. If we would like to add some probe cache, we need a spec of probe definition.
I understand that, its just that it looked superfluous at that specific place, where you are explaining how to add ELF files.
Quoted 9 lines
Quoted 8 lines
Quoted 1 line
perf cache --kcore <FILE> [--probe <SPEC>] # for kcore ?
Adrian, aren't kcore files easily identifiable as such and thus could be added as:
perf cache --add <FILES>
Quoted 1 line
perf cache --probe <SPEC> # for the current kernel
Quoted 7 lines
Quoted 3 lines
Why do we need a --probe here? Don't they always start with a character that is seldomly used in ELF file names and thus we could get away with not requiring --probe?
This is only for adding the probe cache (not elf, nor sdt), which requires a probe definition. Moreover, I'd like to unify the specification of the probe definition with perf-probe. In that case, --probe is more natural.
What I meant was, what is wrong with replacing:
perf cache --probe <SPEC> # for the current kernel
With:
perf cache --add <PROBE-SPEC> # for the current kernel
And have it figure out that what is being added is a probe and do the right thing?
Quoted 11 lines
Quoted 11 lines
Quoted 8 lines
Remove caches related to <FILES> or <BUILDIDS>
perf cache --remove <FILES>|<BUILDIDS>Show all probe caches(including SDT) or buildids
perf cache --list [probe|buildid]Delete existing probe-cache entries for kernel, <PATH> or/and <BUILDID>.
perf cache --probe-del [<GROUP>:]<EVENT>[@<PATH>][#<BUILDID>]Ditto, i.e. can't we just use:
Quoted 7 lines
Quoted 3 lines
perf cache --remove [<GROUP>:]<EVENT>[@<PATH>][#<BUILDID>]
And it figure out that this is a probe that is being removed?
In most cases, it may be OK, but it is also possible to cause unexpected result when mis-typing. I think if <FILE> is always starting at '/', it is easy to identify.
We can keep the explicit switch (--probe-del) perhaps to resolve ambiguities, if they happen, but make it so that it is not strictly required for the common case.
- Thanks,
- Arnaldo
Re: [RFC] perf-cache command interface design
Quoted 44 lines · Arnaldo Carvalho de Melo
Em Tue, Nov 11, 2014 at 03:53:42PM +0900, Masami Hiramatsu escreveu:
Quoted 12 lines
Quoted 10 lines · Arnaldo Carvalho de Melo
Em Mon, Nov 10, 2014 at 07:59:24PM +0900, Masami Hiramatsu escreveu:
Quoted 9 lines
Here is the second try for the probe-cache. This version simplifies the synopsis, and unifies the SDT and probe caches. Please give me your comments/ideas!
Command-line Synopsis
=====================Add elf(or symbols) and probe-caches of SDT if exists in <FILES>
perf cache --add <FILES> [--probe <SPEC>] # for user programsQuoted 8 lines
Quoted 4 lines
Why the --probe above? Shouldn't this be just (if you are talking about ELF files only):
perf cache --add <FILES>
Yes, for the elf and sdt cache, we don't need --probe.
Note that "[]" means optional. If we would like to add some probe cache, we need a spec of probe definition.I understand that, its just that it looked superfluous at that specific place, where you are explaining how to add ELF files.
Quoted 9 lines
Quoted 8 lines
Quoted 1 line
perf cache --kcore <FILE> [--probe <SPEC>] # for kcore ?
Adrian, aren't kcore files easily identifiable as such and thus could be added as:
perf cache --add <FILES>
Quoted 1 line
perf cache --probe <SPEC> # for the current kernel
Quoted 7 lines
Quoted 3 lines
Why do we need a --probe here? Don't they always start with a character that is seldomly used in ELF file names and thus we could get away with not requiring --probe?
This is only for adding the probe cache (not elf, nor sdt), which requires a probe definition. Moreover, I'd like to unify the specification of the probe definition with perf-probe. In that case, --probe is more natural.
What I meant was, what is wrong with replacing:
Quoted 8 lines
perf cache --probe <SPEC> # for the current kernel
With:
perf cache --add <PROBE-SPEC> # for the current kernel
And have it figure out that what is being added is a probe and do the right thing?
As I've said previously, PROBE-SPEC can be same as FILES (imagine that a binary file which has same name function in the kernel.)
Moreover, PROBE-SPEC requires the target binary(or kernel module) except for kernel probes. In that case, anyway we need -x or -m options with file-path for --add, that is very strange.
e.g.
For me,
perf cache --add ./binary --probe '*'
looks more natural than
perf cache --add '*' -exec ./binary
since in other cases(sdt/elf), we'll just do
perf cache --add ./binary
:-/
Quoted 15 lines
Quoted 15 lines
Quoted 14 lines
Quoted 8 lines
Remove caches related to <FILES> or <BUILDIDS>
perf cache --remove <FILES>|<BUILDIDS>Show all probe caches(including SDT) or buildids
perf cache --list [probe|buildid]Delete existing probe-cache entries for kernel, <PATH> or/and <BUILDID>.
perf cache --probe-del [<GROUP>:]<EVENT>[@<PATH>][#<BUILDID>]Ditto, i.e. can't we just use:
perf cache --remove [<GROUP>:]<EVENT>[@<PATH>][#<BUILDID>]
And it figure out that this is a probe that is being removed?
Quoted 7 lines
Quoted 3 lines
In most cases, it may be OK, but it is also possible to cause unexpected result when mis-typing. I think if <FILE> is always starting at '/', it is easy to identify.
We can keep the explicit switch (--probe-del) perhaps to resolve ambiguities, if they happen, but make it so that it is not strictly required for the common case.
OK, it'll take a longer time to remove, since we need to load all caches to find matching entries of probe caches, but is feasible.
Thank you!
Signature · 4 lines
Masami HIRAMATSU Software Platform Research Dept. Linux Technology Research Center Hitachi, Ltd., Yokohama Research Laboratory E-mail: [email protected]
Namhyung Kim
maintainerRe: [RFC] perf-cache command interface design
Hi Masami,
Quoted 24 lines · Masami Hiramatsu
Quoted 10 lines · Arnaldo Carvalho de Melo
What I meant was, what is wrong with replacing:
perf cache --probe <SPEC> # for the current kernel
With:
perf cache --add <PROBE-SPEC> # for the current kernel
And have it figure out that what is being added is a probe and do the right thing?
As I've said previously, PROBE-SPEC can be same as FILES (imagine that a binary file which has same name function in the kernel.)
Moreover, PROBE-SPEC requires the target binary(or kernel module) except for kernel probes. In that case, anyway we need -x or -m options with file-path for --add, that is very strange.e.g.
For me,
perf cache --add ./binary --probe '*'
Quoted 7 lines
looks more natural than
perf cache --add '*' -exec ./binary
since in other cases(sdt/elf), we'll just do
perf cache --add ./binary
I prefer this too. But I'd like make the 'add' part a subcommand rather than option like we do in perf kmem/kvm/list/lock/mem/sched ... And it can handle multiple files at once. What about this?
perf cache add [--elf|--sdt|--probe <spec>] <binary> [<binary>...]
Thanks,
Namhyung
Re: Re: [RFC] perf-cache command interface design
Quoted 33 lines · Namhyung Kim
Hi Masami,
Quoted 30 lines · Masami Hiramatsu
Quoted 10 lines · Arnaldo Carvalho de Melo
What I meant was, what is wrong with replacing:
perf cache --probe <SPEC> # for the current kernel
With:
perf cache --add <PROBE-SPEC> # for the current kernel
And have it figure out that what is being added is a probe and do the right thing?
As I've said previously, PROBE-SPEC can be same as FILES (imagine that a binary file which has same name function in the kernel.)
Moreover, PROBE-SPEC requires the target binary(or kernel module) except for kernel probes. In that case, anyway we need -x or -m options with file-path for --add, that is very strange.e.g.
For me,
perf cache --add ./binary --probe '*'
looks more natural than
perf cache --add '*' -exec ./binary
since in other cases(sdt/elf), we'll just do
Quoted 7 lines
Quoted 1 line
perf cache --add ./binary
I prefer this too. But I'd like make the 'add' part a subcommand rather than option like we do in perf kmem/kvm/list/lock/mem/sched ... And it can handle multiple files at once. What about this?
perf cache add [--elf|--sdt|--probe <spec>] <binary> [<binary>...]
OK, that's good to me. And I think --elf/--sdt is meaningless. Only --probe option is required, since we can scan the elf file to add sdt cache when adding elf binary :)
Thank you,
Signature · 4 lines
Masami HIRAMATSU Software Platform Research Dept. Linux Technology Research Center Hitachi, Ltd., Yokohama Research Laboratory E-mail: [email protected]
Re: Re: Re: [RFC] perf-cache command interface design
Quoted 40 lines · Masami Hiramatsu
Quoted 39 lines · Namhyung Kim
Hi Masami,
Quoted 24 lines · Masami Hiramatsu
Quoted 10 lines · Arnaldo Carvalho de Melo
What I meant was, what is wrong with replacing:
perf cache --probe <SPEC> # for the current kernel
With:
perf cache --add <PROBE-SPEC> # for the current kernel
And have it figure out that what is being added is a probe and do the right thing?
As I've said previously, PROBE-SPEC can be same as FILES (imagine that a binary file which has same name function in the kernel.)
Moreover, PROBE-SPEC requires the target binary(or kernel module) except for kernel probes. In that case, anyway we need -x or -m options with file-path for --add, that is very strange.e.g.
For me,
perf cache --add ./binary --probe '*'
Quoted 7 lines
looks more natural than
perf cache --add '*' -exec ./binary
since in other cases(sdt/elf), we'll just do
perf cache --add ./binary
I prefer this too. But I'd like make the 'add' part a subcommand rather than option like we do in perf kmem/kvm/list/lock/mem/sched ... And it can handle multiple files at once. What about this?
Quoted 5 lines
Quoted 1 line
perf cache add [--elf|--sdt|--probe <spec>] <binary> [<binary>...]
OK, that's good to me. And I think --elf/--sdt is meaningless. Only --probe option is required, since we can scan the elf file to add sdt cache when adding elf binary :)
BTW, what should we do if we put the probe cache on current running kernel?
perf cache add --probe <probe-spec>
and have no binary argument, is it OK?
Thanks,
Signature · 4 lines
Masami HIRAMATSU Software Platform Research Dept. Linux Technology Research Center Hitachi, Ltd., Yokohama Research Laboratory E-mail: [email protected]
Namhyung Kim
maintainerRe: [RFC] perf-cache command interface design
Quoted 12 lines · Masami Hiramatsu
Quoted 10 lines · Masami Hiramatsu
Quoted 5 lines · Namhyung Kim
I prefer this too. But I'd like make the 'add' part a subcommand rather than option like we do in perf kmem/kvm/list/lock/mem/sched ... And it can handle multiple files at once. What about this?
perf cache add [--elf|--sdt|--probe <spec>] <binary> [<binary>...]
OK, that's good to me. And I think --elf/--sdt is meaningless. Only --probe option is required, since we can scan the elf file to add sdt cache when adding elf binary :)
Quoted 5 lines
BTW, what should we do if we put the probe cache on current running kernel?
perf cache add --probe <probe-spec>
and have no binary argument, is it OK?
Hmm.. what about passing /proc/kallsyms and/or /boot/vmlinux for that? Now I found that we need to special-case the kallsyms non-ELF file :)
Thanks,
Namhyung
Re: [RFC] perf-cache command interface design
Quoted 13 lines · Namhyung Kim
Quoted 12 lines · Masami Hiramatsu
Quoted 10 lines · Masami Hiramatsu
Quoted 5 lines · Namhyung Kim
I prefer this too. But I'd like make the 'add' part a subcommand rather than option like we do in perf kmem/kvm/list/lock/mem/sched ... And it can handle multiple files at once. What about this?
perf cache add [--elf|--sdt|--probe <spec>] <binary> [<binary>...]
OK, that's good to me. And I think --elf/--sdt is meaningless. Only --probe option is required, since we can scan the elf file to add sdt cache when adding elf binary :)
Quoted 7 lines
Quoted 5 lines
BTW, what should we do if we put the probe cache on current running kernel?
perf cache add --probe <probe-spec>
and have no binary argument, is it OK?
Hmm.. what about passing
/proc/kallsymsand/or/boot/vmlinuxfor that?
Yeah, but I think it is just optional (as same as perf probe's -k option), we can skip that too.
Quoted 1 line
Now I found that we need to special-case the kallsyms non-ELF file :)
So, I wonder that we'd better use "bu/ildid/dso" instead of "bu/ildid/elf".
Thank you,
Signature · 4 lines
Masami HIRAMATSU Software Platform Research Dept. Linux Technology Research Center Hitachi, Ltd., Yokohama Research Laboratory E-mail: [email protected]
Namhyung Kim
maintainerRe: [RFC] perf-cache command interface design
In reply to Masami HiramatsuHi Masami,
Quoted 8 lines · Masami Hiramatsu
Quoted 5 lines · Namhyung Kim
I prefer this too. But I'd like make the 'add' part a subcommand rather than option like we do in perf kmem/kvm/list/lock/mem/sched ... And it can handle multiple files at once. What about this?
perf cache add [--elf|--sdt|--probe <spec>] <binary> [<binary>...]
OK, that's good to me. And I think --elf/--sdt is meaningless.
Maybe not :)
I'm considering the opposite side - by providing the options, we also support the negative ones too. So --no-elf and/or --no-sdt options are possible. Also the positive options can be used with del(ete) subcommand to remove some contents selectively.
I think it'd be helpful as we sometimes don't want to do that for some reason. For example, current perf record adds binary (elf) files to the cache automatically iff it's accessed. But what about SDTs? Should we add SDTs at the same time? If not, what if we try to add existing elf files only for SDTs?
Thanks,
Namhyung
Quoted 2 lines
Only --probe option is required, since we can scan the elf file to add sdt cache when adding elf binary :)
Re: Re: [RFC] perf-cache command interface design
Quoted 19 lines · Namhyung Kim
Hi Masami,
Quoted 8 lines · Masami Hiramatsu
Quoted 5 lines · Namhyung Kim
I prefer this too. But I'd like make the 'add' part a subcommand rather than option like we do in perf kmem/kvm/list/lock/mem/sched ... And it can handle multiple files at once. What about this?
perf cache add [--elf|--sdt|--probe <spec>] <binary> [<binary>...]
OK, that's good to me. And I think --elf/--sdt is meaningless.
Maybe not :)
I'm considering the opposite side - by providing the options, we also support the negative ones too. So --no-elf and/or --no-sdt options are possible. Also the positive options can be used with del(ete) subcommand to remove some contents selectively.
Quoted 5 lines
I think it'd be helpful as we sometimes don't want to do that for some reason. For example, current perf record adds binary (elf) files to the cache automatically iff it's accessed. But what about SDTs? Should we add SDTs at the same time? If not, what if we try to add existing elf files only for SDTs?
Ah, I see. Indeed, in this case we'd better have perf cache add --sdt <bin> for explicitly adding SDTs. (Of course perf cache add <bin> can also add SDTs automagically, but adding --sdt is more natural)
Thank you,
Signature · 4 lines
Masami HIRAMATSU Software Platform Research Dept. Linux Technology Research Center Hitachi, Ltd., Yokohama Research Laboratory E-mail: [email protected]
Re: [RFC] perf-cache command interface design
In reply to Namhyung KimEm Mon, Nov 17, 2014 at 12:08:59PM +0900, Namhyung Kim escreveu:
Quoted 31 lines · Masami Hiramatsu
Quoted 29 lines
Quoted 10 lines · Arnaldo Carvalho de Melo
What I meant was, what is wrong with replacing:
perf cache --probe <SPEC> # for the current kernel
With:
perf cache --add <PROBE-SPEC> # for the current kernel
And have it figure out that what is being added is a probe and do the right thing?
As I've said previously, PROBE-SPEC can be same as FILES (imagine that a binary file which has same name function in the kernel.)
Moreover, PROBE-SPEC requires the target binary(or kernel module) except for kernel probes. In that case, anyway we need -x or -m options with file-path for --add, that is very strange.e.g.
For me,
perf cache --add ./binary --probe '*'
looks more natural than
perf cache --add '*' -exec ./binary
since in other cases(sdt/elf), we'll just do
Quoted 7 lines
Quoted 1 line
perf cache --add ./binary
I prefer this too. But I'd like make the 'add' part a subcommand rather than option like we do in perf kmem/kvm/list/lock/mem/sched ... And it can handle multiple files at once. What about this?
perf cache add [--elf|--sdt|--probe <spec>] <binary> [<binary>...]
In the end we can have it both ways, i.e. if the user does just:
perf cache add something
or:
perf cache add --elf something
And 'something' is an ELF file, then in the first case (no --elf specified) it will figure it out (checking the magic number, etc) and do the right thing.
In the second case since we're being more verbose and think we know what 'something' is (an ELF file) the tool can check if it indeed is an ELF file and if not, bail out.
- Arnaldo
Namhyung Kim
maintainerRe: [RFC] perf-cache command interface design
Hi Arnaldo,
Quoted 15 lines · Arnaldo Carvalho de Melo
Em Mon, Nov 17, 2014 at 12:08:59PM +0900, Namhyung Kim escreveu:
Quoted 5 lines
I prefer this too. But I'd like make the 'add' part a subcommand rather than option like we do in perf kmem/kvm/list/lock/mem/sched ... And it can handle multiple files at once. What about this?
perf cache add [--elf|--sdt|--probe <spec>] <binary> [<binary>...]
In the end we can have it both ways, i.e. if the user does just:
perf cache add something
or:
perf cache add --elf something
Quoted 7 lines
And 'something' is an ELF file, then in the first case (no --elf specified) it will figure it out (checking the magic number, etc) and do the right thing.
In the second case since we're being more verbose and think we know what 'something' is (an ELF file) the tool can check if it indeed is an ELF file and if not, bail out.
Ah, that's possible.
I'm not sure what we can do if it's not an ELF file though. :)
Thanks,
Namhyung
Re: [RFC] perf-cache command interface design
In reply to Masami HiramatsuQuoted 8 lines · Masami Hiramatsu
File Format
===========
All the cache files are placed under ~/.debug/ by default. The paths of buildid cache of binary/symbols are not changed.The SDT/probe caches are placed under the ~/.debug/.probes/path/to/bin/bu/ildid and that is linked to ~/.debug/.probes/.buildid/bu/ildid
# To avoid conflict with files under /probes/*, I picked up .probes/.
A little bit late: but why ~/.debug? Why not $XDG_CACHE_HOME/perf/ as the root for all perf related files? debug is not unique nor is it sufficient to meet file hierarchy: man file-hierarchy(8)
Hagen
Re: [RFC] perf-cache command interface design
Em Mon, Nov 10, 2014 at 01:05:45PM +0100, Hagen Paul Pfeifer escreveu:
Quoted 8 lines
Quoted 5 lines · Masami Hiramatsu
File Format
===========
All the cache files are placed under ~/.debug/ by default. The paths of buildid cache of binary/symbols are not changed.
Quoted 5 lines
Quoted 3 lines
The SDT/probe caches are placed under the ~/.debug/.probes/path/to/bin/bu/ildid and that is linked to ~/.debug/.probes/.buildid/bu/ildid
# To avoid conflict with files under /probes/*, I picked up .probes/.A little bit late: but why ~/.debug? Why not $XDG_CACHE_HOME/perf/ as
Why "perf"?
Quoted 1 line
the root for all perf related files? debug is not unique nor is it sufficient
Probably should be some other name then, but ~/.debug/ is there since the build-id cache was introduced, guess this is why it is being kept so far in Masami's proposal.
Quoted 1 line
to meet file hierarchy: man file-hierarchy(8)
Humm,
It starts in $HOME/.debug/ because this is not supposed to be a system wide cache, a developer can, for instance:
1. perf record myapp
2. edit myapp.c
3. rebuild it
4. perf record myapp
5. perf diff
And it will show the difference from the previous version, for which it stored a copy of its binary on its private, keyed by build-id, cache.
So this is not merely a place where we will read stuff from.
If somebody decides to have it in a place accessible by multiple users on the same system, then, yes, some more suitable place outside its $HOME is needed, and then tooling should look there as well as on the places it already looks for such files, i.e. $HOME/.debug/, /usr/lib/debug (where foo-debuginfo packages store stuff, also keyed by build-id), /lib/modules/$KVR/, etc.
- Arnaldo
Peter Zijlstra
maintainerRe: [RFC] perf-cache command interface design
In reply to Hagen Paul PfeiferQuoted 8 lines · Hagen Paul Pfeifer
Quoted 5 lines · Masami Hiramatsu
File Format
===========
All the cache files are placed under ~/.debug/ by default. The paths of buildid cache of binary/symbols are not changed.
Quoted 7 lines
Quoted 3 lines
The SDT/probe caches are placed under the ~/.debug/.probes/path/to/bin/bu/ildid and that is linked to ~/.debug/.probes/.buildid/bu/ildid
# To avoid conflict with files under /probes/*, I picked up .probes/.A little bit late: but why ~/.debug? Why not $XDG_CACHE_HOME/perf/ as the root for all perf related files? debug is not unique nor is it sufficient to meet file hierarchy: man file-hierarchy(8)
# env | grep XDG | wc -l 0
Which renders it useless crap in my book.
I agree on the .debug name being somewhat generic, also, it would be:
man 8 file-hierarchy, but that too fails:
$ man file-hierarchy No manual entry for file-hierarchy
Re: [RFC] perf-cache command interface design
Quoted 10 lines · Peter Zijlstra
# env | grep XDG | wc -l 0Which renders it useless crap in my book.
I agree on the .debug name being somewhat generic, also, it would be:
man 8 file-hierarchy, but that too fails:$ man file-hierarchy No manual entry for file-hierarchy
Ok, but then we are not even consistent to ourself, see "perf: Add support for full Intel event lists" which download already to $XDG_CACHE_HOME [1]. It is not useless to agree on one standard. Reinvent the place where caches and configurations are stored again and again is somewhat stupid. E.g. ~/.cache (or $XDG_CACHE_HOME) can be deleted without problems, ~/.config not, and so on. Someone (Rusty?) thought about this several years ago, IMHO we should give at least a try.
Hagen
Re: [PATCH v4 5/5] perf/sdt: Add support to perf record to trace SDT events
In reply to Namhyung KimQuoted 78 lines · Namhyung Kim
Quoted 27 lines · Masami Hiramatsu
Hi,
Quoted 24 lines · Hemant Kumar
Hi Namhyung,
Quoted 21 lines · Namhyung Kim
Hi Hemant,
As you know, you need to keep an eye on how (kprobes) event cache patchset from Masami settles down. For those who aren't CC'ed, please see the link below:
https://lkml.org/lkml/2014/10/31/207Quoted 12 lines · Hemant Kumar
This patch adds support to perf to record SDT events. When invoked, the SDT event is looked up in the sdt-cache. If its found, an entry is made silently to
uprobe_eventsfile and then recording is invoked, and then the entry for the SDT event inuprobe_eventsis silently discarded.The SDT events are already stored in a cache file (
/var/cache/perf/perf-sdt-file.cache).
Although thefile_hashtable helps in addition or deletion of SDT events from the cache, its not of much use when it comes to probing the actual SDT event, because the key to this hash list is a file name and not the SDT event name (which is given as an argument to perf record). So, we won't be able to hash into it.Quoted 7 lines
Quoted 3 lines
Quoted 3 lines
It likely to be ended up with per-file or per-buildid cache files under ~/.debug directory. In this case we also need to have the (central) event-to-cache table anyway IMHO.
What we are talking is to make a new caching file with buildid under .debug/.
We already has ~/.debug/.build-id/<build-id> for string the binary symbol maps.??
The ~/.debug/.build-id/<build-id> (actually first 2 hexdigits are used for directory name) is a symlink to a cached binary.
$ file .debug/.build-id/00/08a6c4028b3826f8905324c770e7aa450e5d3b .debug/.build-id/00/08a6c4028b3826f8905324c770e7aa450e5d3b: symbolic link to `../../usr/lib64/libgtk-3.so.0.400.4/0008a6c4028b3826f8905324c770e7aa450e5d3b'$ file .debug/usr/lib64/libgtk-3.so.0.400.4/0008a6c4028b3826f8905324c770e7aa450e5d3b .debug/usr/lib64/libgtk-3.so.0.400.4/0008a6c4028b3826f8905324c770e7aa450e5d3b: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, BuildID[sha1]=0xc4a6080026388b02245390f8aae770c73b5d0e45, strippedHmm.. it seems the file utility prints the build-id as a sequence of 4 byte little-endian integers.
Quoted 4 lines
I think there are 2 options, one is expanding the current build-id file format to include sdt and probe-event caches. The other is to add ~/.debug/.build-id/<build-id>.probe and ~/.debug/.build-id/<build-id>.sdt for caching probe/sdt information.
I think a single .probe file is enough for this, no?
Quoted 20 lines
And also, user interface is a discussion point. This series defines new sdt-cache command, and we already have buildid-cache command. We should have probe-cache command too? or consolidate those cache managing commands? This question should be involving your series too.
Quoted 15 lines
Quoted 10 lines
Quoted 6 lines
To avoid this problem, we can create another hash list "
event_hash" list which will be maintained along with thefile_hashlist. Whenever a user invokes 'perf record -e %provider:event, perf should initialize theevent_hashlist and thefile_hashlist.
The key toevent_hashlist is calculated from the event name and its provider name.Isn't it enough just to use provide name? I guess the provider names are (should be?) unique among a system although there's no absolute guarantee for that.
Yes, there is no guarantee for the provider names to be unique. If we use only provider name with "perf record", then, what if a user wants to trace
only a specific SDT event (not all the events for that provider)? What do you think?
Quoted 4 lines
What I'm saying is for managing cache not the usage of the cached events. IIUC you keep hash entry for all events to find matching file, but I think it can be managed in provider level as events in a single provider will live in a single binary.
Oh! I see.
So, the events should be mapped to their respective files based on only the provider names. And in case of any ambiguity, it should fail and ask for the binary path as Masami suggested below. Yeah, that's a nice idea. :)
Quoted 8 lines
Btw, I think we should support such multiple events to like
# perf record -e %provider_xxx:* -e %provider_yyy:prefix_*Quoted 2 lines
How about failing if the provider name is not unique unless user gives the actual binary path?
It looks like a possible option. :)
Agreed.
Signature · 2 lines
Thanks, Hemant Kumar