int event__process_comm(event_t *self) { struct thread *thread = threads__findnew(self->comm.pid); dump_printf(": %s:%d\n", self->comm.comm, self->comm.pid); if (thread == NULL || thread__set_comm(thread, self->comm.comm)) { dump_printf("problem processing PERF_RECORD_COMM, skipping event.\n"); return -1; } return 0; }
int event__process_task(event_t *self) { struct thread *thread = threads__findnew(self->fork.pid); struct thread *parent = threads__findnew(self->fork.ppid); dump_printf("(%d:%d):(%d:%d)\n", self->fork.pid, self->fork.tid, self->fork.ppid, self->fork.ptid); /* * A thread clone will have the same PID for both parent and child. */ if (thread == parent) return 0; if (self->header.type == PERF_RECORD_EXIT) return 0; if (thread == NULL || parent == NULL || thread__fork(thread, parent) < 0) { dump_printf("problem processing PERF_RECORD_FORK, skipping event.\n"); return -1; } return 0; }
int event__preprocess_sample(const event_t *self, struct addr_location *al, symbol_filter_t filter) { u8 cpumode = self->header.misc & PERF_RECORD_MISC_CPUMODE_MASK; struct thread *thread = threads__findnew(self->ip.pid); if (thread == NULL) return -1; dump_printf(" ... thread: %s:%d\n", thread->comm, thread->pid); thread__find_addr_location(thread, cpumode, MAP__FUNCTION, self->ip.ip, al, filter); dump_printf(" ...... dso: %s\n", al->map ? al->map->dso->long_name : al->level == 'H' ? "[hypervisor]" : "<not found>"); return 0; }
int event__process_mmap(event_t *self) { struct thread *thread = threads__findnew(self->mmap.pid); struct map *map = map__new(&self->mmap, MAP__FUNCTION, event__cwd, event__cwdlen); dump_printf(" %d/%d: [%p(%p) @ %p]: %s\n", self->mmap.pid, self->mmap.tid, (void *)(long)self->mmap.start, (void *)(long)self->mmap.len, (void *)(long)self->mmap.pgoff, self->mmap.filename); if (thread == NULL || map == NULL) dump_printf("problem processing PERF_RECORD_MMAP, skipping event.\n"); else thread__insert_map(thread, map); return 0; }
static int process_comm_event(event_t *event, unsigned long offset, unsigned long head) { struct thread *thread; thread = threads__findnew(event->comm.pid, &threads, &last_match); dump_printf("%p [%p]: PERF_RECORD_COMM: %s:%d\n", (void *)(offset + head), (void *)(long)(event->header.size), event->comm.comm, event->comm.pid); if (thread == NULL || thread__set_comm(thread, event->comm.comm)) { dump_printf("problem processing PERF_RECORD_COMM, skipping event.\n"); return -1; } total_comm++; return 0; }
static int process_sample_event(event_t *event, unsigned long offset, unsigned long head) { char level; int show = 0; struct dso *dso = NULL; struct thread *thread; u64 ip = event->ip.ip; u64 timestamp = -1; u32 cpu = -1; u64 period = 1; void *more_data = event->ip.__more_data; int cpumode; thread = threads__findnew(event->ip.pid, &threads, &last_match); if (sample_type & PERF_SAMPLE_TIME) { timestamp = *(u64 *)more_data; more_data += sizeof(u64); } if (sample_type & PERF_SAMPLE_CPU) { cpu = *(u32 *)more_data; more_data += sizeof(u32); more_data += sizeof(u32); /* reserved */ } if (sample_type & PERF_SAMPLE_PERIOD) { period = *(u64 *)more_data; more_data += sizeof(u64); } dump_printf("%p [%p]: PERF_RECORD_SAMPLE (IP, %d): %d/%d: %p period: %Ld\n", (void *)(offset + head), (void *)(long)(event->header.size), event->header.misc, event->ip.pid, event->ip.tid, (void *)(long)ip, (long long)period); dump_printf(" ... thread: %s:%d\n", thread->comm, thread->pid); if (thread == NULL) { eprintf("problem processing %d event, skipping it.\n", event->header.type); return -1; } cpumode = event->header.misc & PERF_RECORD_MISC_CPUMODE_MASK; if (cpumode == PERF_RECORD_MISC_KERNEL) { show = SHOW_KERNEL; level = 'k'; dso = kernel_dso; dump_printf(" ...... dso: %s\n", dso->name); } else if (cpumode == PERF_RECORD_MISC_USER) { show = SHOW_USER; level = '.'; } else { show = SHOW_HV; level = 'H'; dso = hypervisor_dso; dump_printf(" ...... dso: [hypervisor]\n"); } if (sample_type & PERF_SAMPLE_RAW) { struct { u32 size; char data[0]; } *raw = more_data; /* * FIXME: better resolve from pid from the struct trace_entry * field, although it should be the same than this perf * event pid */ print_event(cpu, raw->data, raw->size, timestamp, thread->comm); } total += period; return 0; }