perf/core improvements and changes
Arnaldo Carvalho de Melo
maintainerPATCH 31/43 perf tools: Add decoder mechanic to support dumping trace data
In reply to Arnaldo Carvalho de MeloFrom: Mathieu Poirier <[email protected]>
This patch adds the required interface to the openCSD library to support dumping CoreSight trace packet using the "report --dump" command. The information conveyed is related to the type of packets gathered by a trace session rather than full decoding.
--- tools/perf/util/Build | 1 + tools/perf/util/cs-etm-decoder/Build | 1 + tools/perf/util/cs-etm-decoder/cs-etm-decoder.c | 334 ++++++++++++++++++++++++ tools/perf/util/cs-etm-decoder/cs-etm-decoder.h | 96 +++++++ tools/perf/util/cs-etm.c | 108 +++++++- 5 files changed, 536 insertions(+), 4 deletions(-) create mode 100644 tools/perf/util/cs-etm-decoder/Build create mode 100644 tools/perf/util/cs-etm-decoder/cs-etm-decoder.c create mode 100644 tools/perf/util/cs-etm-decoder/cs-etm-decoder.h
tools/perf/util/Build +1 -0
@@ -91,6 +91,7 @@ libperf-$(CONFIG_AUXTRACE) += arm-spe-pkt-decoder.o ifdef CONFIG_LIBOPENCSD libperf-$(CONFIG_AUXTRACE) += cs-etm.o +libperf-$(CONFIG_AUXTRACE) += cs-etm-decoder/ endif libperf-y += parse-branch-options.o
tools/perf/util/cs-etm-decoder/Build new file +1 -0
@@ -0,0 +1 @@ +libperf-$(CONFIG_AUXTRACE) += cs-etm-decoder.o
tools/perf/util/cs-etm-decoder/cs-etm-decoder.c new file +334 -0
334 lines not on this page · raw message
tools/perf/util/cs-etm-decoder/cs-etm-decoder.h new file +96 -0
96 lines not on this page · raw message
tools/perf/util/cs-etm.c +104 -4
127 lines not on this page · raw message
Signature · 1 line
2.14.3
Arnaldo Carvalho de Melo
maintainerPATCH 32/43 perf tools: Add support for decoding CoreSight trace data
In reply to Arnaldo Carvalho de MeloFrom: Mathieu Poirier <[email protected]>
Adding functionality to create a CoreSight trace decoder capable of decoding trace data pushed by a client application.
--- tools/perf/util/cs-etm-decoder/cs-etm-decoder.c | 119 ++++++++++++++++++++++++ 1 file changed, 119 insertions(+)
tools/perf/util/cs-etm-decoder/cs-etm-decoder.c +119 -0
@@ -200,6 +200,121 @@ static void cs_etm_decoder__clear_buffer(struct cs_etm_decoder *decoder) } } +static ocsd_datapath_resp_t +cs_etm_decoder__buffer_packet (struct cs_etm_decoder *decoder, +const ocsd_generic_trace_elem *elem, +const u8 trace_chan_id, +enum cs_etm_sample_type sample_type) +{ +u32 et =0 ; +struct int_node *inode =NULL ; + +if (decoder->packet_count >=MAX_BUFFER -1 ) +return OCSD_RESP_FATAL_SYS_ERR ; + +/* Search the RB tree for the cpu associated with this traceID */ + inode =intlist__find (traceid_list, trace_chan_id); +if (!inode) +return OCSD_RESP_FATAL_SYS_ERR ; + + et = decoder->tail; + decoder->packet_buffer[et].sample_type = sample_type; + decoder->packet_buffer[et].start_addr = elem->st_addr; + decoder->packet_buffer[et].end_addr = elem->en_addr; + decoder->packet_buffer[et].exc = false; + decoder->packet_buffer[et].exc_ret = false; + decoder->packet_buffer[et].cpu = *((int *)inode->priv); + +/* Wrap around if need be */ + et = (et +1 ) & (MAX_BUFFER -1 ); + + decoder->tail = et; + decoder->packet_count++; + +if (decoder->packet_count ==MAX_BUFFER -1 ) +return OCSD_RESP_WAIT ; + +return OCSD_RESP_CONT ; +} + +static ocsd_datapath_resp_t cs_etm_decoder__gen_trace_elem_printer ( +const void *context, +const ocsd_trc_index_t indx__maybe_unused , +const u8 trace_chan_id__maybe_unused , +const ocsd_generic_trace_elem *elem) +{ +ocsd_datapath_resp_t resp =OCSD_RESP_CONT ; +struct cs_etm_decoder *decoder = (struct cs_etm_decoder *) context; + +switch (elem->elem_type) { +case OCSD_GEN_TRC_ELEM_UNKNOWN : +break ; +case OCSD_GEN_TRC_ELEM_NO_SYNC : + decoder->trace_on = false; +break ; +case OCSD_GEN_TRC_ELEM_TRACE_ON : + decoder->trace_on = true; +break ; +case OCSD_GEN_TRC_ELEM_INSTR_RANGE : + resp =cs_etm_decoder__buffer_packet (decoder, elem, + trace_chan_id, +CS_ETM_RANGE ); +break ; +case OCSD_GEN_TRC_ELEM_EXCEPTION : + decoder->packet_buffer[decoder->tail].exc = true; +break ; +case OCSD_GEN_TRC_ELEM_EXCEPTION_RET : + decoder->packet_buffer[decoder->tail].exc_ret = true; +break ; +case OCSD_GEN_TRC_ELEM_PE_CONTEXT : +case OCSD_GEN_TRC_ELEM_EO_TRACE : +case OCSD_GEN_TRC_ELEM_ADDR_NACC : +case OCSD_GEN_TRC_ELEM_TIMESTAMP : +case OCSD_GEN_TRC_ELEM_CYCLE_COUNT : +case OCSD_GEN_TRC_ELEM_ADDR_UNKNOWN : +case OCSD_GEN_TRC_ELEM_EVENT : +case OCSD_GEN_TRC_ELEM_SWTRACE : +case OCSD_GEN_TRC_ELEM_CUSTOM : +default : +break ; + } + +return resp; +} + +static int cs_etm_decoder__create_etm_packet_decoder ( +struct cs_etm_trace_params *t_params, +struct cs_etm_decoder *decoder) +{ +const char *decoder_name; +ocsd_etmv4_cfg trace_config_etmv4; +void *trace_config; +u8 csid; + +switch (t_params->protocol) { +case CS_ETM_PROTO_ETMV4i: +cs_etm_decoder__gen_etmv4_config (t_params, &trace_config_etmv4); + decoder_name =OCSD_BUILTIN_DCD_ETMV4I ; + trace_config = &trace_config_etmv4; +break ; +default : +return -1 ; + } + +if (ocsd_dt_create_decoder (decoder->dcd_tree, + decoder_name, +OCSD_CREATE_FLG_FULL_DECODER , + trace_config, &csid)) +return -1 ; + +if (ocsd_dt_set_gen_elem_outfn (decoder->dcd_tree, + cs_etm_decoder__gen_trace_elem_printer, + decoder)) +return -1 ; + +return 0 ; +} + static int cs_etm_decoder__create_etm_decoder(struct cs_etm_decoder_params *d_params, struct cs_etm_trace_params *t_params,
@@ -208,6 +323,10 @@ cs_etm_decoder__create_etm_decoder(struct cs_etm_decoder_params *d_params,if (d_params->operation ==CS_ETM_OPERATION_PRINT )return cs_etm_decoder__create_etm_packet_printer (t_params, decoder); +else if (d_params->operation ==CS_ETM_OPERATION_DECODE ) +return cs_etm_decoder__create_etm_packet_decoder (t_params, + decoder); +return -1 ; }
Signature · 1 line
2.14.3
Arnaldo Carvalho de Melo
maintainerPATCH 33/43 perf tools: Add functionality to communicate with the openCSD decoder
In reply to Arnaldo Carvalho de MeloFrom: Mathieu Poirier <[email protected]>
This patch adds functions to communicate with the openCSD trace decoder, more specifically to access program memory, fetch trace packets and reset the decoder.
--- tools/perf/util/cs-etm-decoder/cs-etm-decoder.c | 60 +++++++++++++++++++++++++ tools/perf/util/cs-etm-decoder/cs-etm-decoder.h | 9 ++++ 2 files changed, 69 insertions(+)
tools/perf/util/cs-etm-decoder/cs-etm-decoder.c +60 -0
@@ -45,6 +45,66 @@ struct cs_etm_decoder {struct cs_etm_packet packet_buffer[MAX_BUFFER ]; }; +static u32 +cs_etm_decoder__mem_access (const void *context, +const ocsd_vaddr_t address, +const ocsd_mem_space_acc_t mem_space__maybe_unused , +const u32 req_size, +u8 *buffer) +{ +struct cs_etm_decoder *decoder = (struct cs_etm_decoder *) context; + +return decoder->mem_access (decoder->data, + address, + req_size, + buffer); +} + +int cs_etm_decoder__add_mem_access_cb (struct cs_etm_decoder *decoder, +u64 start,u64 end, +cs_etm_mem_cb_type cb_func) +{ + decoder->mem_access = cb_func; + +if (ocsd_dt_add_callback_mem_acc (decoder->dcd_tree, start, end, +OCSD_MEM_SPACE_ANY , + cs_etm_decoder__mem_access, decoder)) +return -1 ; + +return 0 ; +} + +int cs_etm_decoder__reset (struct cs_etm_decoder *decoder) +{ +ocsd_datapath_resp_t dp_ret; + + dp_ret =ocsd_dt_process_data (decoder->dcd_tree,OCSD_OP_RESET , +0 ,0 ,NULL ,NULL ); +if (OCSD_DATA_RESP_IS_FATAL (dp_ret)) +return -1 ; + +return 0 ; +} + +int cs_etm_decoder__get_packet (struct cs_etm_decoder *decoder, +struct cs_etm_packet *packet) +{ +if (!decoder || !packet) +return -EINVAL ; + +/* Nothing to do, might as well just return */ +if (decoder->packet_count ==0 ) +return 0 ; + + *packet = decoder->packet_buffer[decoder->head]; + + decoder->head = (decoder->head +1 ) & (MAX_BUFFER -1 ); + + decoder->packet_count--; + +return 1 ; +} +static void cs_etm_decoder__gen_etmv4_config (struct cs_etm_trace_params *params,ocsd_etmv4_cfg *config) {
tools/perf/util/cs-etm-decoder/cs-etm-decoder.h +9 -0
@@ -93,4 +93,13 @@ cs_etm_decoder__new(int num_cpu,void cs_etm_decoder__free (struct cs_etm_decoder *decoder); +int cs_etm_decoder__add_mem_access_cb (struct cs_etm_decoder *decoder, +u64 start,u64 end, +cs_etm_mem_cb_type cb_func); + +int cs_etm_decoder__get_packet (struct cs_etm_decoder *decoder, +struct cs_etm_packet *packet); + +int cs_etm_decoder__reset (struct cs_etm_decoder *decoder); +#endif /* INCLUDE__CS_ETM_DECODER_H__ */
Signature · 1 line
2.14.3
Arnaldo Carvalho de Melo
maintainerPATCH 34/43 pert tools: Add queue management functionality
In reply to Arnaldo Carvalho de MeloFrom: Mathieu Poirier <[email protected]>
Add functionatlity to setup trace queues so that traces associated with CoreSight auxtrace events found in the perf.data file can be classified properly. The decoder and memory callback associated with each queue are then used to decode the traces that have been assigned to that queue.
--- tools/perf/util/cs-etm.c | 208 ++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 204 insertions(+), 4 deletions(-)
tools/perf/util/cs-etm.c +204 -4
@@ -196,15 +196,215 @@ static void cs_etm__free(struct perf_session *session)zfree (&aux); } +static u32 cs_etm__mem_access (struct cs_etm_queue *etmq,u64 address, +size_t size,u8 *buffer) +{ +u8 cpumode; +u64 offset; +int len; +struct thread *thread; +struct machine *machine; +struct addr_location al; + +if (!etmq) +return -1 ; + + machine = etmq->etm->machine; +if (address >= etmq->etm->kernel_start) + cpumode =PERF_RECORD_MISC_KERNEL ; +else + cpumode =PERF_RECORD_MISC_USER ; + + thread = etmq->thread; +if (!thread) { +if (cpumode !=PERF_RECORD_MISC_KERNEL ) +return -EINVAL ; + thread = etmq->etm->unknown_thread; + } + +thread__find_addr_map (thread, cpumode,MAP__FUNCTION , address, &al); + +if (!al.map || !al.map->dso) +return 0 ; + +if (al.map->dso->data.status ==DSO_DATA_STATUS_ERROR && +dso__data_status_seen (al.map->dso,DSO_DATA_STATUS_SEEN_ITRACE )) +return 0 ; + + offset = al.map->map_ip (al.map, address); + +map__load (al.map); + + len =dso__data_read_offset (al.map->dso, machine, offset, buffer, size); + +if (len <=0 ) +return 0 ; + +return len; +} + +static struct cs_etm_queue *cs_etm__alloc_queue (struct cs_etm_auxtrace *etm, +unsigned int queue_nr) +{ +int i; +struct cs_etm_decoder_params d_params; +struct cs_etm_trace_params *t_params; +struct cs_etm_queue *etmq; + + etmq =zalloc (sizeof (*etmq)); +if (!etmq) +return NULL ; + + etmq->event_buf =malloc (PERF_SAMPLE_MAX_SIZE ); +if (!etmq->event_buf) + goto out_free; + + etmq->etm = etm; + etmq->queue_nr = queue_nr; + etmq->pid =-1 ; + etmq->tid =-1 ; + etmq->cpu =-1 ; + +/* Use metadata to fill in trace parameters for trace decoder */ + t_params =zalloc (sizeof (*t_params) * etm->num_cpu); + +if (!t_params) + goto out_free; + +for (i =0 ; i < etm->num_cpu; i++) { + t_params[i].protocol = CS_ETM_PROTO_ETMV4i; + t_params[i].etmv4.reg_idr0 = etm->metadata[i][CS_ETMV4_TRCIDR0 ]; + t_params[i].etmv4.reg_idr1 = etm->metadata[i][CS_ETMV4_TRCIDR1 ]; + t_params[i].etmv4.reg_idr2 = etm->metadata[i][CS_ETMV4_TRCIDR2 ]; + t_params[i].etmv4.reg_idr8 = etm->metadata[i][CS_ETMV4_TRCIDR8 ]; + t_params[i].etmv4.reg_configr = + etm->metadata[i][CS_ETMV4_TRCCONFIGR ]; + t_params[i].etmv4.reg_traceidr = + etm->metadata[i][CS_ETMV4_TRCTRACEIDR ]; + } + +/* Set decoder parameters to simply print the trace packets */ + d_params.packet_printer = cs_etm__packet_dump; + d_params.operation =CS_ETM_OPERATION_DECODE ; + d_params.formatted = true; + d_params.fsyncs = false; + d_params.hsyncs = false; + d_params.frame_aligned = true; + d_params.data = etmq; + + etmq->decoder =cs_etm_decoder__new (etm->num_cpu, &d_params, t_params); + +zfree (&t_params); + +if (!etmq->decoder) + goto out_free; + +/* +* Register a function to handle all memory accesses required by +* the trace decoder library. +*/ +if (cs_etm_decoder__add_mem_access_cb (etmq->decoder, +0x0L , ((u64) -1L ), + cs_etm__mem_access)) + goto out_free_decoder; + + etmq->offset =0 ; + +return etmq; + +out_free_decoder: +cs_etm_decoder__free (etmq->decoder); +out_free: +zfree (&etmq->event_buf); +free (etmq); + +return NULL ; +} + +static int cs_etm__setup_queue (struct cs_etm_auxtrace *etm, +struct auxtrace_queue *queue, +unsigned int queue_nr) +{ +struct cs_etm_queue *etmq = queue->priv; + +if (list_empty (&queue->head) || etmq) +return 0 ; + + etmq =cs_etm__alloc_queue (etm, queue_nr); + +if (!etmq) +return -ENOMEM ; + + queue->priv = etmq; + +if (queue->cpu !=-1 ) + etmq->cpu = queue->cpu; + + etmq->tid = queue->tid; + +return 0 ; +} + +static int cs_etm__setup_queues (struct cs_etm_auxtrace *etm) +{ +unsigned int i; +int ret; + +for (i =0 ; i < etm->queues.nr_queues; i++) { + ret =cs_etm__setup_queue (etm, &etm->queues.queue_array[i], i); +if (ret) +return ret; + } + +return 0 ; +} + +static int cs_etm__update_queues (struct cs_etm_auxtrace *etm) +{ +if (etm->queues.new_data) { + etm->queues.new_data = false; +return cs_etm__setup_queues (etm); + } + +return 0 ; +} +static int cs_etm__process_event (struct perf_session *session,union perf_event *event,struct perf_sample *sample,struct perf_tool *tool) { - (void ) session; - (void ) event; - (void ) sample; - (void ) tool; +int err =0 ; +u64 timestamp; +struct cs_etm_auxtrace *etm =container_of (session->auxtrace, + struct cs_etm_auxtrace, + auxtrace); + +/* Keep compiler happy */ + (void )event; + +if (dump_trace) +return 0 ; + +if (!tool->ordered_events) { +pr_err ("CoreSight ETM Trace requires ordered events\n" ); +return -EINVAL ; + } + +if (!etm->timeless_decoding) +return -EINVAL ; + +if (sample->time && (sample->time != (u64) -1 )) + timestamp = sample->time; +else + timestamp =0 ; + +if (timestamp || etm->timeless_decoding) { + err =cs_etm__update_queues (etm); +if (err) +return err; + } +return 0 ; }
Signature · 1 line
2.14.3
Arnaldo Carvalho de Melo
maintainerPATCH 35/43 perf tools: Add full support for CoreSight trace decoding
In reply to Arnaldo Carvalho de MeloFrom: Mathieu Poirier <[email protected]>
This patch adds support for complete packet decoding, allowing traces collected during a trace session to be decoder from the "report" infrastructure.
--- tools/perf/util/cs-etm.c | 166 +++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 160 insertions(+), 6 deletions(-)
tools/perf/util/cs-etm.c +160 -6
@@ -70,6 +70,10 @@ struct cs_etm_queue {u64 offset; }; +static int cs_etm__update_queues (struct cs_etm_auxtrace *etm); +static int cs_etm__process_timeless_queues (struct cs_etm_auxtrace *etm, +pid_t tid,u64 time_); +static void cs_etm__packet_dump (const char *pkt_string) {const char *color =PERF_COLOR_BLUE ;
@@ -145,9 +149,25 @@ static void cs_etm__dump_event(struct cs_etm_auxtrace *etm,static int cs_etm__flush_events (struct perf_session *session,struct perf_tool *tool) { - (void ) session; - (void ) tool; -return 0 ; +int ret; +struct cs_etm_auxtrace *etm =container_of (session->auxtrace, + struct cs_etm_auxtrace, + auxtrace); +if (dump_trace) +return 0 ; + +if (!tool->ordered_events) +return -EINVAL ; + +if (!etm->timeless_decoding) +return -EINVAL ; + + ret =cs_etm__update_queues (etm); + +if (ret <0 ) +return ret; + +return cs_etm__process_timeless_queues (etm,-1 ,MAX_TIMESTAMP -1 ); }static void cs_etm__free_queue (void *priv)
@@ -369,6 +389,138 @@ static int cs_etm__update_queues(struct cs_etm_auxtrace *etm)return 0 ; } +static int +cs_etm__get_trace (struct cs_etm_buffer *buff,struct cs_etm_queue *etmq) +{ +struct auxtrace_buffer *aux_buffer = etmq->buffer; +struct auxtrace_buffer *old_buffer = aux_buffer; +struct auxtrace_queue *queue; + + queue = &etmq->etm->queues.queue_array[etmq->queue_nr]; + + aux_buffer =auxtrace_buffer__next (queue, aux_buffer); + +/* If no more data, drop the previous auxtrace_buffer and return */ +if (!aux_buffer) { +if (old_buffer) +auxtrace_buffer__drop_data (old_buffer); + buff->len =0 ; +return 0 ; + } + + etmq->buffer = aux_buffer; + +/* If the aux_buffer doesn't have data associated, try to load it */ +if (!aux_buffer->data) { +/* get the file desc associated with the perf data file */ +int fd =perf_data__fd (etmq->etm->session->data); + + aux_buffer->data =auxtrace_buffer__get_data (aux_buffer, fd); +if (!aux_buffer->data) +return -ENOMEM ; + } + +/* If valid, drop the previous buffer */ +if (old_buffer) +auxtrace_buffer__drop_data (old_buffer); + + buff->offset = aux_buffer->offset; + buff->len = aux_buffer->size; + buff->buf = aux_buffer->data; + + buff->ref_timestamp = aux_buffer->reference; + +return buff->len; +} + +static void cs_etm__set_pid_tid_cpu (struct cs_etm_auxtrace *etm, +struct auxtrace_queue *queue) +{ +struct cs_etm_queue *etmq = queue->priv; + +/* CPU-wide tracing isn't supported yet */ +if (queue->tid ==-1 ) +return ; + +if ((!etmq->thread) && (etmq->tid !=-1 )) + etmq->thread =machine__find_thread (etm->machine,-1 , + etmq->tid); + +if (etmq->thread) { + etmq->pid = etmq->thread->pid_; +if (queue->cpu ==-1 ) + etmq->cpu = etmq->thread->cpu; + } +} + +static int cs_etm__run_decoder (struct cs_etm_queue *etmq) +{ +struct cs_etm_auxtrace *etm = etmq->etm; +struct cs_etm_buffer buffer; +size_t buffer_used, processed; +int err =0 ; + +if (!etm->kernel_start) + etm->kernel_start =machine__kernel_start (etm->machine); + +/* Go through each buffer in the queue and decode them one by one */ +more: + buffer_used =0 ; +memset (&buffer,0 ,sizeof (buffer)); + err =cs_etm__get_trace (&buffer, etmq); +if (err <=0 ) +return err; +/* +* We cannot assume consecutive blocks in the data file are contiguous, +* reset the decoder to force re-sync. +*/ + err =cs_etm_decoder__reset (etmq->decoder); +if (err !=0 ) +return err; + +/* Run trace decoder until buffer consumed or end of trace */ +do { + processed =0 ; + + err =cs_etm_decoder__process_data_block ( + etmq->decoder, + etmq->offset, + &buffer.buf[buffer_used], + buffer.len - buffer_used, + &processed); + +if (err) +return err; + + etmq->offset += processed; + buffer_used += processed; + }while (buffer.len > buffer_used); + +goto more; + +return err; +} + +static int cs_etm__process_timeless_queues (struct cs_etm_auxtrace *etm, +pid_t tid,u64 time_) +{ +unsigned int i; +struct auxtrace_queues *queues = &etm->queues; + +for (i =0 ; i < queues->nr_queues; i++) { +struct auxtrace_queue *queue = &etm->queues.queue_array[i]; +struct cs_etm_queue *etmq = queue->priv; + +if (etmq && ((tid ==-1 ) || (etmq->tid == tid))) { + etmq->time = time_; +cs_etm__set_pid_tid_cpu (etm, queue); +cs_etm__run_decoder (etmq); + } + } + +return 0 ; +} + static int cs_etm__process_event(struct perf_session *session, union perf_event *event, struct perf_sample *sample,
@@ -380,9 +532,6 @@ static int cs_etm__process_event(struct perf_session *session, struct cs_etm_auxtrace, auxtrace); -/* Keep compiler happy */ - (void )event; -if (dump_trace)return 0 ;
@@ -405,6 +554,11 @@ static int cs_etm__process_event(struct perf_session *session,return err; } +if (event->header.type ==PERF_RECORD_EXIT ) +return cs_etm__process_timeless_queues (etm, + event->fork.tid, + sample->time); +return 0 ; }
Signature · 1 line
2.14.3
Arnaldo Carvalho de Melo
maintainerPATCH 36/43 perf tools: Add mechanic to synthesise CoreSight trace packets
In reply to Arnaldo Carvalho de MeloFrom: Mathieu Poirier <[email protected]>
Once decoded from trace packets information on trace range needs to be communicated to the perf synthesis infrastructure so that it is available to the perf tools built-in rendering tools and scripts.
--- tools/perf/util/cs-etm.c | 168 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 168 insertions(+)
tools/perf/util/cs-etm.c +168 -0
@@ -453,6 +453,157 @@ static void cs_etm__set_pid_tid_cpu(struct cs_etm_auxtrace *etm, } } +/* +* The cs etm packet encodes an instruction range between a branch target +* and the next taken branch. Generate sample accordingly. +*/ +static int cs_etm__synth_branch_sample (struct cs_etm_queue *etmq, +struct cs_etm_packet *packet) +{ +int ret =0 ; +struct cs_etm_auxtrace *etm = etmq->etm; +struct perf_sample sample = {.ip =0 ,}; +union perf_event *event = etmq->event_buf; +u64 start_addr = packet->start_addr; +u64 end_addr = packet->end_addr; + + event->sample.header.type =PERF_RECORD_SAMPLE ; + event->sample.header.misc =PERF_RECORD_MISC_USER ; + event->sample.header.size =sizeof (struct perf_event_header ); + + sample.ip = start_addr; + sample.pid = etmq->pid; + sample.tid = etmq->tid; + sample.addr = end_addr; + sample.id = etmq->etm->branches_id; + sample.stream_id = etmq->etm->branches_id; + sample.period =1 ; + sample.cpu = packet->cpu; + sample.flags =0 ; + sample.cpumode =PERF_RECORD_MISC_USER ; + + ret =perf_session__deliver_synth_event (etm->session, event, &sample); + +if (ret) +pr_err ( +"CS ETM Trace: failed to deliver instruction event, error %d\n" , + ret); + +return ret; +} + +struct cs_etm_synth { +struct perf_tool dummy_tool; +struct perf_session *session; +}; + +static int cs_etm__event_synth (struct perf_tool *tool, +union perf_event *event, +struct perf_sample *sample__maybe_unused , +struct machine *machine__maybe_unused ) +{ +struct cs_etm_synth *cs_etm_synth = + container_of(tool, struct cs_etm_synth, dummy_tool); + +return perf_session__deliver_synth_event (cs_etm_synth->session, + event,NULL ); +} + +static int cs_etm__synth_event (struct perf_session *session, +struct perf_event_attr *attr,u64 id) +{ +struct cs_etm_synth cs_etm_synth; + +memset (&cs_etm_synth,0 ,sizeof (struct cs_etm_synth )); + cs_etm_synth.session = session; + +return perf_event__synthesize_attr (&cs_etm_synth.dummy_tool, attr,1 , + &id, cs_etm__event_synth); +} + +static int cs_etm__synth_events (struct cs_etm_auxtrace *etm, +struct perf_session *session) +{ +struct perf_evlist *evlist = session->evlist; +struct perf_evsel *evsel; +struct perf_event_attr attr; +bool found = false; +u64 id; +int err; + +evlist__for_each_entry (evlist, evsel) { +if (evsel->attr.type == etm->pmu_type) { + found = true; +break ; + } + } + +if (!found) { +pr_debug ("No selected events with CoreSight Trace data\n" ); +return 0 ; + } + +memset (&attr,0 ,sizeof (struct perf_event_attr )); + attr.size =sizeof (struct perf_event_attr ); + attr.type =PERF_TYPE_HARDWARE ; + attr.sample_type = evsel->attr.sample_type &PERF_SAMPLE_MASK ; + attr.sample_type |=PERF_SAMPLE_IP |PERF_SAMPLE_TID | +PERF_SAMPLE_PERIOD ; +if (etm->timeless_decoding) + attr.sample_type &= ~(u64 )PERF_SAMPLE_TIME ; +else + attr.sample_type |=PERF_SAMPLE_TIME ; + + attr.exclude_user = evsel->attr.exclude_user; + attr.exclude_kernel = evsel->attr.exclude_kernel; + attr.exclude_hv = evsel->attr.exclude_hv; + attr.exclude_host = evsel->attr.exclude_host; + attr.exclude_guest = evsel->attr.exclude_guest; + attr.sample_id_all = evsel->attr.sample_id_all; + attr.read_format = evsel->attr.read_format; + +/* create new id val to be a fixed offset from evsel id */ + id = evsel->id[0 ] +1000000000 ; + +if (!id) + id =1 ; + +if (etm->synth_opts.branches) { + attr.config =PERF_COUNT_HW_BRANCH_INSTRUCTIONS ; + attr.sample_period =1 ; + attr.sample_type |=PERF_SAMPLE_ADDR ; + err =cs_etm__synth_event (session, &attr, id); +if (err) +return err; + etm->sample_branches = true; + etm->branches_sample_type = attr.sample_type; + etm->branches_id = id; + } + +return 0 ; +} + +static int cs_etm__sample (struct cs_etm_queue *etmq) +{ +int ret; +struct cs_etm_packet packet; + +while (1 ) { + ret =cs_etm_decoder__get_packet (etmq->decoder, &packet); +if (ret <=0 ) +return ret; + +/* +* If the packet contains an instruction range, generate an +* instruction sequence event. +*/ +if (packet.sample_type &CS_ETM_RANGE ) +cs_etm__synth_branch_sample (etmq, &packet); + } + +return 0 ; +} +static int cs_etm__run_decoder (struct cs_etm_queue *etmq) {struct cs_etm_auxtrace *etm = etmq->etm;
@@ -494,6 +645,12 @@ static int cs_etm__run_decoder(struct cs_etm_queue *etmq) etmq->offset += processed; buffer_used += processed; + +/* +* Nothing to do with an error condition, let's hope the next +* chunk will be better. +*/ + err =cs_etm__sample (etmq); }while (buffer.len > buffer_used); goto more;
@@ -828,6 +985,17 @@ int cs_etm__process_auxtrace_info(union perf_event *event,return 0 ; } +if (session->itrace_synth_opts && session->itrace_synth_opts->set) { + etm->synth_opts = *session->itrace_synth_opts; + }else { +itrace_synth_opts__set_default (&etm->synth_opts); + etm->synth_opts.callchain = false; + } + + err =cs_etm__synth_events (etm, session); +if (err) + goto err_free_queues; + err =auxtrace_queues__process_index (&etm->queues, session);if (err) goto err_free_queues;
Signature · 1 line
2.14.3
Arnaldo Carvalho de Melo
maintainerPATCH 37/43 MAINTAINERS: Adding entry for CoreSight trace decoding
In reply to Arnaldo Carvalho de MeloFrom: Tor Jeremiassen <[email protected]>
Adding maintainers for Coresight trace decoding via perf tools.
--- MAINTAINERS | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
MAINTAINERS +2 -1
@@ -1313,7 +1313,8 @@ F: tools/perf/arch/arm/util/pmu.c F: tools/perf/arch/arm/util/auxtrace.c F: tools/perf/arch/arm/util/cs-etm.c F: tools/perf/arch/arm/util/cs-etm.h -F: tools/perf/util/cs-etm.h +F: tools/perf/util/cs-etm.* +F: tools/perf/util/cs-etm-decoder/* ARM/CORGI MACHINE SUPPORT M: Richard Purdie <[email protected]>
Signature · 1 line
2.14.3
Arnaldo Carvalho de Melo
maintainerPATCH 38/43 perf bpf: Remove misplaced __maybe_unused attribute
In reply to Arnaldo Carvalho de MeloFrom: Arnaldo Carvalho de Melo <[email protected]>
The bpf__setup_stdout() function uses that evlist argument, remove the misleading __maybe_unused attribute.
--- tools/perf/util/bpf-loader.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
tools/perf/util/bpf-loader.c +1 -1
@@ -1533,7 +1533,7 @@ int bpf__apply_obj_config(void) (strcmp("__bpf_stdout__", \ bpf_map__name(pos)) == 0)) -int bpf__setup_stdout (struct perf_evlist *evlist__maybe_unused ) +int bpf__setup_stdout (struct perf_evlist *evlist) {struct bpf_map_priv *tmpl_priv =NULL ;struct bpf_object *obj, *tmp;
Signature · 1 line
2.14.3
Arnaldo Carvalho de Melo
maintainerPATCH 39/43 perf trace: Add --print-sample
In reply to Arnaldo Carvalho de MeloFrom: Arnaldo Carvalho de Melo <[email protected]>
To help with debugging, like the interrupted out of order issue that will be dealt with in the next patch in this series, changing the code to deal with:
raw_syscalls:sys_enter 411967179.269 Timer 9609/9626 [2] raw_syscalls:sys_enter 411967179.213 file:// Content 9609/9609 [3]
328.038 (18446744073709.496 ms): Timer/9626 futex(uaddr: 0x7fc0d4027044, op: WAIT|PRIV, utime: 0x7fc0b0ffdb50 ) ...
raw_syscalls:sys_exit 411967179.225 file:// Content 9609/9609 [3]
327.982 ( 0.012 ms): file:// Conten/9609 futex(uaddr: 0x7fc0d4027040, op: WAKE|PRIV, val: 1 ) = 1
That long duration is the bug.
--- tools/perf/Documentation/perf-trace.txt | 4 ++++ tools/perf/builtin-trace.c | 24 ++++++++++++++++++++++++ 2 files changed, 28 insertions(+)
tools/perf/Documentation/perf-trace.txt +4 -0
@@ -163,6 +163,10 @@ the thread executes on the designated CPUs. Default is to monitor all CPUs. Implies '--call-graph dwarf' when --call-graph not present on the command line, on systems where DWARF unwinding was built in. +--print-sample:: + Print the PERF_RECORD_SAMPLE PERF_SAMPLE_ info for the + raw_syscalls:sys_{enter,exit} tracepoints, for debugging. + --proc-map-timeout:: When processing pre-existing threads /proc/XXX/mmap, it may take a long time, because the file may be huge. A time out is needed in such cases.
tools/perf/builtin-trace.c +24 -0
@@ -110,6 +110,7 @@ struct trace {bool summary;bool summary_only;bool show_comm; +bool print_sample;bool show_tool_stats;bool trace_syscalls;bool kernel_syscallchains;
@@ -1578,6 +1579,23 @@ static int trace__printf_interrupted_entry(struct trace *trace, struct perf_sampreturn printed; } +static int trace__fprintf_sample (struct trace *trace,struct perf_evsel *evsel, +struct perf_sample *sample,struct thread *thread) +{ +int printed =0 ; + +if (trace->print_sample) { +double ts = (double )sample->time /NSEC_PER_MSEC ; + + printed +=fprintf (trace->output,"%22s %10.3f %s %d/%d [%d]\n" , +perf_evsel__name (evsel), ts, +thread__comm_str (thread), + sample->pid, sample->tid, sample->cpu); + } + +return printed; +} +static int trace__sys_enter (struct trace *trace,struct perf_evsel *evsel,union perf_event *event__maybe_unused ,struct perf_sample *sample)
@@ -1598,6 +1616,8 @@ static int trace__sys_enter(struct trace *trace, struct perf_evsel *evsel,if (ttrace ==NULL ) goto out_put; +trace__fprintf_sample (trace, evsel, sample, thread); + args =perf_evsel__sc_tp_ptr (evsel, args, sample);if (ttrace->entry_str ==NULL ) {
@@ -1688,6 +1708,8 @@ static int trace__sys_exit(struct trace *trace, struct perf_evsel *evsel,if (ttrace ==NULL ) goto out_put; +trace__fprintf_sample (trace, evsel, sample, thread); +if (trace->summary)thread__update_stats (ttrace, id, sample);
@@ -3034,6 +3056,8 @@ int cmd_trace(int argc, const char **argv)"Set the maximum stack depth when parsing the callchain, " "anything beyond the specified depth will be ignored. " "Default: kernel.perf_event_max_stack or " __stringify(PERF_MAX_STACK_DEPTH)), +OPT_BOOLEAN (0 ,"print-sample" , &trace.print_sample, +"print the PERF_RECORD_SAMPLE PERF_SAMPLE_ info, for debugging" ),OPT_UINTEGER (0 ,"proc-map-timeout" , &trace.opts.proc_map_timeout,"per thread proc mmap processing timeout in ms" ), OPT_UINTEGER('D', "delay", &trace.opts.initial_delay,
Signature · 1 line
2.14.3
Arnaldo Carvalho de Melo
maintainerPATCH 40/43 perf trace: Do not print from time delta for interrupted syscall lines
In reply to Arnaldo Carvalho de MeloFrom: Arnaldo Carvalho de Melo <[email protected]>
We were calculating the delta from a in-flight syscall that got its output interrupted by another syscall, which doesn't seem like useful information, we will print the syscall duration (sys_exit - sys_enter) when the raw_syscalls:sys_exit event happens.
The problem here is how we're consuming the multiple ring buffers, without using the ordered_events code used by perf_session, which may cause some reordering of syscalls for diferent CPUs, so just stop printing that delta, to avoid things like:
# trace --print-sample -p 9626 -e futex
raw_syscalls:sys_enter 411967179.269 Timer 9609/9626 [2]
raw_syscalls:sys_enter 411967179.213 file:// Content 9609/9609 [3]
328.038 (18446744073709.496 ms): Timer/9626 futex(uaddr: 0x7fc0d4027044, op: WAIT|PRIV, utime: 0x7fc0b0ffdb50 ) ...
raw_syscalls:sys_exit 411967179.225 file:// Content 9609/9609 [3]
327.982 ( 0.012 ms): file:// Conten/9609 futex(uaddr: 0x7fc0d4027040, op: WAKE|PRIV, val: 1 ) = 1This is a bandaid, we should better try and use the ordered_events code, possibly with some refactoring prep work, but for now at least we don't show those false long deltas for the lines ending in '...'.
--- tools/perf/builtin-trace.c | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-)
tools/perf/builtin-trace.c +5 -8
@@ -821,7 +821,7 @@ static size_t fprintf_duration(unsigned long t, bool calculated, FILE *fp)size_t printed =fprintf (fp,"(" );if (!calculated) - printed +=fprintf (fp," ? " ); + printed +=fprintf (fp," " );else if (duration >=1.0 ) printed +=color_fprintf (fp,PERF_COLOR_RED ,"%6.3f ms" , duration);else if (duration >=0.01 )
@@ -1556,10 +1556,9 @@ static void thread__update_stats(struct thread_trace *ttrace,update_stats (stats, duration); } -static int trace__printf_interrupted_entry (struct trace *trace,struct perf_sample *sample) +static int trace__printf_interrupted_entry (struct trace *trace) {struct thread_trace *ttrace; -u64 duration;size_t printed;if (trace->current ==NULL )
@@ -1570,9 +1569,7 @@ static int trace__printf_interrupted_entry(struct trace *trace, struct perf_sampif (!ttrace->entry_pending)return 0 ; - duration = sample->time - ttrace->entry_time; - - printed =trace__fprintf_entry_head (trace, trace->current, duration, true, ttrace->entry_time, trace->output); + printed =trace__fprintf_entry_head (trace, trace->current,0 , false, ttrace->entry_time, trace->output); printed +=fprintf (trace->output,"%-70s) ...\n" , ttrace->entry_str); ttrace->entry_pending = false;
@@ -1627,7 +1624,7 @@ static int trace__sys_enter(struct trace *trace, struct perf_evsel *evsel, }if (!(trace->duration_filter || trace->summary_only || trace->min_stack)) -trace__printf_interrupted_entry (trace, sample); +trace__printf_interrupted_entry (trace); ttrace->entry_time = sample->time; msg = ttrace->entry_str;
@@ -1941,7 +1938,7 @@ static int trace__event_handler(struct trace *trace, struct perf_evsel *evsel, } } -trace__printf_interrupted_entry (trace, sample); +trace__printf_interrupted_entry (trace);trace__fprintf_tstamp (trace, sample->time, trace->output);if (trace->trace_syscalls)
Signature · 1 line
2.14.3
Arnaldo Carvalho de Melo
maintainerPATCH 41/43 perf trace beauty futex: Beautify FUTEX_BITSET_MATCH_ANY
In reply to Arnaldo Carvalho de MeloFrom: Arnaldo Carvalho de Melo <[email protected]>
E.g.:
# strace -e futex -p 14437
strace: Process 14437 attached
futex(0x7f46f4808d70, FUTEX_WAKE_PRIVATE, 1) = 0
futex(0x7f46f24e68b0, FUTEX_WAIT_BITSET_PRIVATE|FUTEX_CLOCK_REALTIME, 0, {tv_sec=1516636744, tv_nsec=221969000}, 0xffffffff) = -1 ETIMEDOUT (Connection timed out)
<detached ...>
#Should pretty print that 0xffffffff value, like:
# trace -e futex --tid 14437
0.028 ( 0.005 ms): futex(uaddr: 0x7f46f4808d70, op: WAKE|PRIV, val: 1 ) = 0
0.037 (1000.092 ms): futex(uaddr: 0x7f46f24e68b0, op: WAIT_BITSET|PRIV|CLKRT, utime: 0x7f46f23fedf0, val3: MATCH_ANY) = -1 ETIMEDOUT Connection timed out
^C#--- tools/perf/builtin-trace.c | 4 +++- tools/perf/trace/beauty/futex_val3.c | 18 ++++++++++++++++++ 2 files changed, 21 insertions(+), 1 deletion(-) create mode 100644 tools/perf/trace/beauty/futex_val3.c
tools/perf/builtin-trace.c +3 -1
@@ -549,6 +549,7 @@ static size_t syscall_arg__scnprintf_getrandom_flags(char *bf, size_t size,#include "trace/beauty/eventfd.c" #include "trace/beauty/flock.c" #include "trace/beauty/futex_op.c" +#include "trace/beauty/futex_val3.c" #include "trace/beauty/mmap.c" #include "trace/beauty/mode_t.c" #include "trace/beauty/msg_flags.c"
@@ -611,7 +612,8 @@ static struct syscall_fmt { { .name = "fstat", .alias = "newfstat", }, { .name = "fstatat", .alias = "newfstatat", }, { .name = "futex", - .arg = { [1] = { .scnprintf = SCA_FUTEX_OP, /* op */ }, }, }, + .arg = { [1] = { .scnprintf = SCA_FUTEX_OP, /* op */ }, + [5] = { .scnprintf = SCA_FUTEX_VAL3, /* val3 */ }, }, }, { .name = "futimesat", .arg = { [0] = { .scnprintf = SCA_FDAT, /* fd */ }, }, }, { .name = "getitimer",
tools/perf/trace/beauty/futex_val3.c new file +18 -0
@@ -0,0 +1,18 @@ +// SPDX-License-Identifier: GPL-2.0 +#include <linux/futex.h> + +#ifndef FUTEX_BITSET_MATCH_ANY +#define FUTEX_BITSET_MATCH_ANY 0xffffffff +#endif + +static size_t syscall_arg__scnprintf_futex_val3 (char *bf,size_t size,struct syscall_arg *arg) +{ +unsigned int bitset = arg->val; + +if (bitset ==FUTEX_BITSET_MATCH_ANY ) +return scnprintf (bf, size,"MATCH_ANY" ); + +return scnprintf (bf, size,"%#xd" , bitset); +} + +#define SCA_FUTEX_VAL3 syscall_arg__scnprintf_futex_val3
Signature · 1 line
2.14.3
Arnaldo Carvalho de Melo
maintainerPATCH 42/43 perf evlist: Remove fcntl.h from evlist.h
In reply to Arnaldo Carvalho de MeloFrom: Arnaldo Carvalho de Melo <[email protected]>
Not needed there, fixup the places where it is needed and was getting only by luck via evlist.h.
--- tools/perf/builtin-kvm.c | 3 +++ tools/perf/builtin-script.c | 1 + tools/perf/builtin-trace.c | 1 + tools/perf/tests/bpf.c | 1 + tools/perf/tests/openat-syscall-tp-fields.c | 3 +++ tools/perf/util/cgroup.c | 3 +++ tools/perf/util/evlist.c | 1 + tools/perf/util/evlist.h | 1 - tools/perf/util/parse-events.c | 3 +++ 9 files changed, 16 insertions(+), 1 deletion(-)
tools/perf/builtin-kvm.c +3 -0
@@ -26,6 +26,9 @@#include <sys/timerfd.h> #endif #include <sys/time.h> +#include <sys/types.h> +#include <sys/stat.h> +#include <fcntl.h> #include <linux/kernel.h> #include <linux/time64.h>
tools/perf/builtin-script.c +1 -0
@@ -42,6 +42,7 @@#include <sys/param.h> #include <sys/types.h> #include <sys/stat.h> +#include <fcntl.h> #include <unistd.h> #include "sane_ctype.h"
tools/perf/builtin-trace.c +1 -0
@@ -56,6 +56,7 @@#include <linux/random.h> #include <linux/stringify.h> #include <linux/time64.h> +#include <fcntl.h> #include "sane_ctype.h"
tools/perf/tests/bpf.c +1 -0
@@ -3,6 +3,7 @@#include <sys/epoll.h> #include <sys/types.h> #include <sys/stat.h> +#include <fcntl.h> #include <util/util.h> #include <util/bpf-loader.h> #include <util/evlist.h>
tools/perf/tests/openat-syscall-tp-fields.c +3 -0
@@ -1,5 +1,8 @@// SPDX-License-Identifier: GPL-2.0 #include <linux/err.h> +#include <sys/types.h> +#include <sys/stat.h> +#include <fcntl.h> #include "perf.h" #include "evlist.h" #include "evsel.h"
tools/perf/util/cgroup.c +3 -0
@@ -6,6 +6,9 @@#include "cgroup.h" #include "evlist.h" #include <linux/stringify.h> +#include <sys/types.h> +#include <sys/stat.h> +#include <fcntl.h> int nr_cgroups;
tools/perf/util/evlist.c +1 -0
@@ -25,6 +25,7 @@#include "parse-events.h" #include <subcmd/parse-options.h> +#include <fcntl.h> #include <sys/ioctl.h> #include <sys/mman.h>
tools/perf/util/evlist.h +0 -1
@@ -7,7 +7,6 @@#include <linux/refcount.h> #include <linux/list.h> #include <api/fd/array.h> -#include <fcntl.h> #include <stdio.h> #include "../perf.h" #include "event.h"
tools/perf/util/parse-events.c +3 -0
@@ -4,6 +4,9 @@#include <dirent.h> #include <errno.h> #include <sys/ioctl.h> +#include <sys/types.h> +#include <sys/stat.h> +#include <fcntl.h> #include <sys/param.h> #include "term.h" #include "../perf.h"
Signature · 1 line
2.14.3
Arnaldo Carvalho de Melo
maintainerPATCH 43/43 perf trace beauty flock: Move to separate object file
In reply to Arnaldo Carvalho de MeloFrom: Arnaldo Carvalho de Melo <[email protected]>
To resolve some header conflicts that were preventing the build to succeed in the Alpine Linux distribution.
--- tools/perf/builtin-trace.c | 1 - tools/perf/trace/beauty/Build | 1 + tools/perf/trace/beauty/beauty.h | 3 +++ tools/perf/trace/beauty/flock.c | 10 +++++----- 4 files changed, 9 insertions(+), 6 deletions(-)
tools/perf/builtin-trace.c +0 -1
@@ -548,7 +548,6 @@ static size_t syscall_arg__scnprintf_getrandom_flags(char *bf, size_t size,#include "trace/beauty/arch_errno_names.c" #include "trace/beauty/eventfd.c" -#include "trace/beauty/flock.c" #include "trace/beauty/futex_op.c" #include "trace/beauty/futex_val3.c" #include "trace/beauty/mmap.c"
tools/perf/trace/beauty/Build +1 -0
@@ -1,5 +1,6 @@ libperf-y += clone.o libperf-y += fcntl.o +libperf-y += flock.o ifeq ($(SRCARCH),$(filter $(SRCARCH),x86)) libperf-y += ioctl.o endif
tools/perf/trace/beauty/beauty.h +3 -0
@@ -79,6 +79,9 @@ size_t syscall_arg__scnprintf_fcntl_cmd(char *bf, size_t size, struct syscall_arsize_t syscall_arg__scnprintf_fcntl_arg (char *bf,size_t size,struct syscall_arg *arg);#define SCA_FCNTL_ARG syscall_arg__scnprintf_fcntl_arg +size_t syscall_arg__scnprintf_flock (char *bf,size_t size,struct syscall_arg *arg); +#define SCA_FLOCK syscall_arg__scnprintf_flock +size_t syscall_arg__scnprintf_ioctl_cmd (char *bf,size_t size,struct syscall_arg *arg);#define SCA_IOCTL_CMD syscall_arg__scnprintf_ioctl_cmd
tools/perf/trace/beauty/flock.c +5 -5
@@ -1,5 +1,8 @@// SPDX-License-Identifier: GPL-2.0 -#include <fcntl.h> + +#include "trace/beauty/beauty.h" +#include <linux/kernel.h> +#include <uapi/linux/fcntl.h> #ifndef LOCK_MAND #define LOCK_MAND 32
@@ -17,8 +20,7 @@#define LOCK_RW 192#endif -static size_t syscall_arg__scnprintf_flock (char *bf,size_t size, -struct syscall_arg *arg) +size_t syscall_arg__scnprintf_flock (char *bf,size_t size,struct syscall_arg *arg) {int printed =0 , op = arg->val;
@@ -45,5 +47,3 @@ static size_t syscall_arg__scnprintf_flock(char *bf, size_t size,return printed; } - -#define SCA_FLOCK syscall_arg__scnprintf_flock
Signature · 1 line
2.14.3
Quoted 258 lines · Arnaldo Carvalho de Melo
Hi Ingo,
Please consider pulling,
- Arnaldo
Test results at the end of this message, as usual.
The following changes since commit
a72594ca5c70ef4a94fab8ad541beda0d0a94139:Merge tag 'perf-core-for-mingo-4.16-20180117' of
git://git.kernel.org/pub/scm/linux/kernel/git/acme/linuxinto perf/core (2018-01-17 17:20:24 +0100)are available in the Git repository at:
git://git.kernel.org/pub/scm/linux/kernel/git/acme/linux.gittags/perf-core-for-mingo-4.16-20180123for you to fetch changes up to
0d916ef4ce35ee5ff6255d3f0622faccab696d3f:perf trace beauty flock: Move to separate object file (2018-01-23 09:51:52 -0300)
----------------------------------------------------------------
perf/core improvements and fixes:- Introduce an errno code to string facility to allow tools such as 'perf trace' to support multi-arch perf.data decoding/beautifying, uses errno header files copied from the kernel, this allows removing the need for audit-libs in arches generating its syscall tables from the kernel sources, so far x86 and s/390 (Hendrik Brueckner)
- Intel-PT/BTS sample synthesizing fixes (Adrian Hunter)
- Intel vendor event JSON updates for the Broadwell, BroadwellDE, BroadwellX, Goldmont, Haswell, HaswellX, IvyBridge, IvyBridge, IvyTown, IvyTown, Silvermont, Skylake and SkylakeX architectures. (Andi Kleen)
- Use
ui__error()to have --field error handling messages not to disappear due to TUI exit cleanup (Arnaldo Carvalho de Melo)- Don't warn about unavailability of builtin clang in 'perf trace', just continue fallbacking to using the external toolchain (Arnaldo Carvalho de Melo)
- Move conditional
O_CLOEXECdefine toutil.hto keep the build working on older distros where that is not available now that this define will be used in more source files (Arnaldo Carvalho de Melo)- Using
O_CLOEXECindo_open()to avoid having too many open files when using 'perf script' from the 'perf report' TUI scripts browser (Wang YanQing)- Add 'perf trace --print-sample' to help in debugging the printing of timestamp calculations, for instance (Arnaldo Carvalho de Melo)
- Do not print from time delta for interrupted syscall lines in 'perf trace' (those ending with '...') just print the total syscall duration at raw_syscalls:sys_exit time (Arnaldo Carvalho de Melo)
- Beautify
FUTEX_BITSET_MATCH_ANYin the futex syscall in 'perf trace' (Arnaldo Carvalho de Melo)- Display EXTRA features for 'make VF=1' build (Jiri Olsa)
- Add support for CoreSight trace decoding by making the perf tools use the external openCSD (Mathieu Poirier, Tor Jeremiassen)
Signed-off-by Arnaldo Carvalho de Melo <[email protected]>----------------------------------------------------------------
Adrian Hunter (3):
perf intel-pt/bts: Do not swap when synthesizing samples
perf evsel: Ensure reserved member ofPERF_SAMPLE_CPUis zero inperf_event__synthesize_sample()perf tools: Get rid of unused 'swapped' parameter fromperf_event__synthesize_sample()Andi Kleen (13):
perf vendor events intel: Update Broadwell events to V22 perf vendor events intel: Update BroadwellX events to V13 perf vendor events intel: Update Goldmont events to V12 perf vendor events intel: Update Haswell events to V27 perf vendor events intel: Update HaswellX events to V19 perf vendor events intel: Update IvyBridge events to V20 perf vendor events intel: Update IvyTown events to V20 perf vendor events intel: Update Silvermont events to V14 perf vendor events intel: Update Skylake events to V36 perf vendor events intel: Update SkylakeX events to V1.06 perf vendor events intel: Update BroadwellDE events to V7 perf vendor events intel: Update IvyBridge files to V20 perf vendor events intel: Update IvyTown files to V20Arnaldo Carvalho de Melo (9):
perf tools: Useui__error()for reporting --fields errors perf bpf: Don't warn about unavailability of builtin clang, just fallback perf tools: Move conditionalO_CLOEXECtoutil.h
perf bpf: Remove misplaced__maybe_unusedattribute
perf trace: Add --print-sample
perf trace: Do not print from time delta for interrupted syscall lines perf trace beauty futex: BeautifyFUTEX_BITSET_MATCH_ANYperf evlist: Removefcntl.hfromevlist.h
perf trace beauty flock: Move to separate object fileHendrik Brueckner (5):
tools include arch: Grab a copy oferrno.hfor arch's supported by perf tools include asm-generic: Graberrno.handerrno-base.hperf util: Introduce architecture specific errno/name mapping perf trace: Obtain errno strings by usingarch_syscalls__strerrno()perf trace: Remove audit-libs dependency if syscall tables are presentJiri Olsa (1):
perf build: Display EXTRA features for VF=1 buildMathieu Poirier (9):
perf report: Fix regression when decodingintel_pttraces perf tools: Integrating the CoreSight decoding library perf tools: Add initial entry point for decoder CoreSight traces perf tools: Add decoder mechanic to support dumping trace data perf tools: Add support for decoding CoreSight trace data perf tools: Add functionality to communicate with the openCSD decoder pert tools: Add queue management functionality
perf tools: Add full support for CoreSight trace decoding perf tools: Add mechanic to synthesise CoreSight trace packetsTor Jeremiassen (2):
perf tools: Add processing of coresight metadata
MAINTAINERS: Adding entry for CoreSight trace decodingWang YanQing (1):
perf symbols: UsingO_CLOEXECindo_openMAINTAINERS | 3 +- tools/arch/alpha/include/uapi/asm/errno.h | 128 + tools/arch/mips/include/asm/errno.h | 17 + tools/arch/mips/include/uapi/asm/errno.h | 130 + tools/arch/parisc/include/uapi/asm/errno.h | 128 + tools/arch/powerpc/include/uapi/asm/errno.h | 10 + tools/arch/sparc/include/uapi/asm/errno.h | 118 + tools/arch/x86/include/uapi/asm/errno.h | 1 + tools/build/Makefile.feature | 3 +- tools/build/feature/Makefile | 7 +- tools/build/feature/test-all.c | 5 + tools/build/feature/test-libopencsd.c | 8 + tools/include/uapi/asm-generic/errno-base.h | 40 + tools/include/uapi/asm-generic/errno.h | 123 + tools/perf/Build | 4 +- tools/perf/Documentation/perf-trace.txt | 4 + tools/perf/Makefile.config | 49 +- tools/perf/Makefile.perf | 15 +- tools/perf/builtin-help.c | 2 +- tools/perf/builtin-inject.c | 3 +- tools/perf/builtin-kvm.c | 3 + tools/perf/builtin-script.c | 1 + tools/perf/builtin-trace.c | 57 +- tools/perf/check-headers.sh | 9 + tools/perf/perf.c | 4 +- .../perf/pmu-events/arch/x86/broadwell/cache.json | 555 ++- .../arch/x86/broadwell/floating-point.json | 108 +- .../pmu-events/arch/x86/broadwell/frontend.json | 138 +- .../perf/pmu-events/arch/x86/broadwell/memory.json | 210 +- .../perf/pmu-events/arch/x86/broadwell/other.json | 20 +- .../pmu-events/arch/x86/broadwell/pipeline.json | 1216 +++--- .../arch/x86/broadwell/virtual-memory.json | 150 +- .../pmu-events/arch/x86/broadwellde/cache.json | 389 +- .../arch/x86/broadwellde/floating-point.json | 108 +- .../pmu-events/arch/x86/broadwellde/frontend.json | 138 +- .../pmu-events/arch/x86/broadwellde/memory.json | 9 +- .../pmu-events/arch/x86/broadwellde/other.json | 20 +- .../pmu-events/arch/x86/broadwellde/pipeline.json | 1214 +++--- .../arch/x86/broadwellde/virtual-memory.json | 150 +- .../perf/pmu-events/arch/x86/broadwellx/cache.json | 383 +- .../arch/x86/broadwellx/floating-point.json | 108 +- .../pmu-events/arch/x86/broadwellx/frontend.json | 138 +- .../pmu-events/arch/x86/broadwellx/memory.json | 40 +- .../perf/pmu-events/arch/x86/broadwellx/other.json | 20 +- .../pmu-events/arch/x86/broadwellx/pipeline.json | 1214 +++--- .../arch/x86/broadwellx/virtual-memory.json | 150 +- tools/perf/pmu-events/arch/x86/goldmont/cache.json | 1244 +++++- .../perf/pmu-events/arch/x86/goldmont/memory.json | 280 +- tools/perf/pmu-events/arch/x86/goldmont/other.json | 54 +- .../pmu-events/arch/x86/goldmont/pipeline.json | 506 +-- .../arch/x86/goldmont/virtual-memory.json | 60 +- tools/perf/pmu-events/arch/x86/haswell/cache.json | 365 +- .../arch/x86/haswell/floating-point.json | 20 +- .../perf/pmu-events/arch/x86/haswell/frontend.json | 132 +- tools/perf/pmu-events/arch/x86/haswell/memory.json | 21 + tools/perf/pmu-events/arch/x86/haswell/other.json | 20 +- .../perf/pmu-events/arch/x86/haswell/pipeline.json | 1131 ++--- .../arch/x86/haswell/virtual-memory.json | 212 +- tools/perf/pmu-events/arch/x86/haswellx/cache.json | 377 +- .../arch/x86/haswellx/floating-point.json | 20 +- .../pmu-events/arch/x86/haswellx/frontend.json | 132 +- .../perf/pmu-events/arch/x86/haswellx/memory.json | 28 + tools/perf/pmu-events/arch/x86/haswellx/other.json | 20 +- .../pmu-events/arch/x86/haswellx/pipeline.json | 1133 ++--- .../arch/x86/haswellx/virtual-memory.json | 212 +- .../perf/pmu-events/arch/x86/ivybridge/cache.json | 243 +- .../pmu-events/arch/x86/ivybridge/frontend.json | 122 +- .../perf/pmu-events/arch/x86/ivybridge/memory.json | 24 +- .../perf/pmu-events/arch/x86/ivybridge/other.json | 20 +- .../pmu-events/arch/x86/ivybridge/pipeline.json | 822 ++-- .../arch/x86/ivybridge/virtual-memory.json | 60 +- tools/perf/pmu-events/arch/x86/ivytown/cache.json | 236 +- .../perf/pmu-events/arch/x86/ivytown/frontend.json | 122 +- tools/perf/pmu-events/arch/x86/ivytown/memory.json | 24 +- tools/perf/pmu-events/arch/x86/ivytown/other.json | 20 +- .../perf/pmu-events/arch/x86/ivytown/pipeline.json | 822 ++-- .../arch/x86/ivytown/virtual-memory.json | 60 +- .../perf/pmu-events/arch/x86/silvermont/cache.json | 3 +- tools/perf/pmu-events/arch/x86/skylake/cache.json | 4390 +++----------------- .../arch/x86/skylake/floating-point.json | 5 +- .../perf/pmu-events/arch/x86/skylake/frontend.json | 232 +- tools/perf/pmu-events/arch/x86/skylake/memory.json | 2118 +--------- tools/perf/pmu-events/arch/x86/skylake/other.json | 40 +- .../perf/pmu-events/arch/x86/skylake/pipeline.json | 973 ++--- .../arch/x86/skylake/virtual-memory.json | 262 +- tools/perf/pmu-events/arch/x86/skylakex/cache.json | 257 +- .../arch/x86/skylakex/floating-point.json | 3 +- .../pmu-events/arch/x86/skylakex/frontend.json | 48 +- .../perf/pmu-events/arch/x86/skylakex/memory.json | 231 +- tools/perf/pmu-events/arch/x86/skylakex/other.json | 94 +- .../pmu-events/arch/x86/skylakex/pipeline.json | 44 +- .../arch/x86/skylakex/virtual-memory.json | 42 +- tools/perf/tests/bpf.c | 1 + tools/perf/tests/openat-syscall-tp-fields.c | 3 + tools/perf/tests/sample-parsing.c | 2 +- tools/perf/trace/beauty/Build | 1 + tools/perf/trace/beauty/arch_errno_names.c | 1 + tools/perf/trace/beauty/arch_errno_names.sh | 100 + tools/perf/trace/beauty/beauty.h | 5 + tools/perf/trace/beauty/flock.c | 10 +- tools/perf/trace/beauty/futex_val3.c | 18 + tools/perf/util/Build | 8 +- tools/perf/util/auxtrace.c | 2 + tools/perf/util/bpf-loader.c | 4 +- tools/perf/util/cgroup.c | 3 + tools/perf/util/cs-etm-decoder/Build | 1 + tools/perf/util/cs-etm-decoder/cs-etm-decoder.c | 513 +++ tools/perf/util/cs-etm-decoder/cs-etm-decoder.h | 105 + tools/perf/util/cs-etm.c | 1023 +++++ tools/perf/util/cs-etm.h | 18 + tools/perf/util/data.c | 10 - tools/perf/util/dso.c | 2 +- tools/perf/util/event.h | 3 +- tools/perf/util/evlist.c | 1 + tools/perf/util/evlist.h | 1 - tools/perf/util/evsel.c | 29 +- tools/perf/util/generate-cmdlist.sh | 2 +- tools/perf/util/intel-bts.c | 6 +- tools/perf/util/intel-pt.c | 11 +- tools/perf/util/parse-events.c | 3 + tools/perf/util/session.c | 4 +- tools/perf/util/sort.c | 4 +- tools/perf/util/util.h | 10 + 123 files changed, 13093 insertions(+), 13445 deletions(-) create mode 100644 tools/arch/alpha/include/uapi/asm/errno.h create mode 100644 tools/arch/mips/include/asm/errno.h create mode 100644 tools/arch/mips/include/uapi/asm/errno.h create mode 100644 tools/arch/parisc/include/uapi/asm/errno.h create mode 100644 tools/arch/powerpc/include/uapi/asm/errno.h create mode 100644 tools/arch/sparc/include/uapi/asm/errno.h create mode 100644 tools/arch/x86/include/uapi/asm/errno.h create mode 100644 tools/build/feature/test-libopencsd.c create mode 100644 tools/include/uapi/asm-generic/errno-base.h
Quoted 8 lines
create mode 100644 tools/include/uapi/asm-generic/errno.h create mode 100644 tools/perf/trace/beauty/arch_errno_names.c create mode 100755 tools/perf/trace/beauty/arch_errno_names.sh create mode 100644 tools/perf/trace/beauty/futex_val3.c create mode 100644 tools/perf/util/cs-etm-decoder/Build create mode 100644 tools/perf/util/cs-etm-decoder/cs-etm-decoder.c create mode 100644 tools/perf/util/cs-etm-decoder/cs-etm-decoder.h create mode 100644 tools/perf/util/cs-etm.c
Pulled, thanks a lot Arnaldo!
Ingo