Skip to content

Commit

Permalink
Merge branch 'perf/core' into perf/urgent
Browse files Browse the repository at this point in the history
  • Loading branch information
Ingo Molnar committed Aug 11, 2010
2 parents 1c250d7 + 4694153 commit b3e84ff
Show file tree
Hide file tree
Showing 22 changed files with 1,295 additions and 1,034 deletions.
25 changes: 21 additions & 4 deletions tools/perf/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -158,7 +158,7 @@ all::
# Define NO_DWARF if you do not want debug-info analysis feature at all.

$(shell sh -c 'mkdir -p $(OUTPUT)scripts/{perl,python}/Perf-Trace-Util/' 2> /dev/null)
$(shell sh -c 'mkdir -p $(OUTPUT)util/{ui,scripting-engines}/' 2> /dev/null)
$(shell sh -c 'mkdir -p $(OUTPUT)util/{ui/browsers,scripting-engines}/' 2> /dev/null)
$(shell sh -c 'mkdir $(OUTPUT)bench' 2> /dev/null)

$(OUTPUT)PERF-VERSION-FILE: .FORCE-PERF-VERSION-FILE
Expand Down Expand Up @@ -567,9 +567,20 @@ else
# Fedora has /usr/include/slang/slang.h, but ubuntu /usr/include/slang.h
BASIC_CFLAGS += -I/usr/include/slang
EXTLIBS += -lnewt -lslang
LIB_OBJS += $(OUTPUT)util/newt.o
LIB_OBJS += $(OUTPUT)util/ui/setup.o
LIB_OBJS += $(OUTPUT)util/ui/browser.o
LIB_OBJS += $(OUTPUT)util/ui/browsers/annotate.o
LIB_OBJS += $(OUTPUT)util/ui/browsers/hists.o
LIB_OBJS += $(OUTPUT)util/ui/browsers/map.o
LIB_OBJS += $(OUTPUT)util/ui/helpline.o
LIB_OBJS += $(OUTPUT)util/ui/progress.o
LIB_OBJS += $(OUTPUT)util/ui/util.o
LIB_H += util/ui/browser.h
LIB_H += util/ui/browsers/map.h
LIB_H += util/ui/helpline.h
LIB_H += util/ui/libslang.h
LIB_H += util/ui/progress.h
LIB_H += util/ui/util.h
endif
endif

Expand Down Expand Up @@ -967,10 +978,16 @@ $(OUTPUT)builtin-init-db.o: builtin-init-db.c $(OUTPUT)PERF-CFLAGS
$(OUTPUT)util/config.o: util/config.c $(OUTPUT)PERF-CFLAGS
$(QUIET_CC)$(CC) -o $@ -c $(ALL_CFLAGS) -DETC_PERFCONFIG='"$(ETC_PERFCONFIG_SQ)"' $<

$(OUTPUT)util/newt.o: util/newt.c $(OUTPUT)PERF-CFLAGS
$(OUTPUT)util/ui/browser.o: util/ui/browser.c $(OUTPUT)PERF-CFLAGS
$(QUIET_CC)$(CC) -o $@ -c $(ALL_CFLAGS) -DENABLE_SLFUTURE_CONST $<

$(OUTPUT)util/ui/browser.o: util/ui/browser.c $(OUTPUT)PERF-CFLAGS
$(OUTPUT)util/ui/browsers/annotate.o: util/ui/browsers/annotate.c $(OUTPUT)PERF-CFLAGS
$(QUIET_CC)$(CC) -o $@ -c $(ALL_CFLAGS) -DENABLE_SLFUTURE_CONST $<

$(OUTPUT)util/ui/browsers/hists.o: util/ui/browsers/hists.c $(OUTPUT)PERF-CFLAGS
$(QUIET_CC)$(CC) -o $@ -c $(ALL_CFLAGS) -DENABLE_SLFUTURE_CONST $<

$(OUTPUT)util/ui/browsers/map.o: util/ui/browsers/map.c $(OUTPUT)PERF-CFLAGS
$(QUIET_CC)$(CC) -o $@ -c $(ALL_CFLAGS) -DENABLE_SLFUTURE_CONST $<

$(OUTPUT)util/rbtree.o: ../../lib/rbtree.c $(OUTPUT)PERF-CFLAGS
Expand Down
2 changes: 1 addition & 1 deletion tools/perf/builtin-annotate.c
Original file line number Diff line number Diff line change
Expand Up @@ -285,7 +285,7 @@ static int hist_entry__tty_annotate(struct hist_entry *he)
LIST_HEAD(head);
struct objdump_line *pos, *n;

if (hist_entry__annotate(he, &head) < 0)
if (hist_entry__annotate(he, &head, 0) < 0)
return -1;

if (full_paths)
Expand Down
2 changes: 1 addition & 1 deletion tools/perf/util/debug.c
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ int eprintf(int level, const char *fmt, ...)
if (verbose >= level) {
va_start(args, fmt);
if (use_browser > 0)
ret = browser__show_help(fmt, args);
ret = ui_helpline__show_help(fmt, args);
else
ret = vfprintf(stderr, fmt, args);
va_end(args);
Expand Down
9 changes: 4 additions & 5 deletions tools/perf/util/debug.h
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ void trace_event(event_t *event);
struct ui_progress;

#ifdef NO_NEWT_SUPPORT
static inline int browser__show_help(const char *format __used, va_list ap __used)
static inline int ui_helpline__show_help(const char *format __used, va_list ap __used)
{
return 0;
}
Expand All @@ -30,10 +30,9 @@ static inline void ui_progress__update(struct ui_progress *self __used,

static inline void ui_progress__delete(struct ui_progress *self __used) {}
#else
int browser__show_help(const char *format, va_list ap);
struct ui_progress *ui_progress__new(const char *title, u64 total);
void ui_progress__update(struct ui_progress *self, u64 curr);
void ui_progress__delete(struct ui_progress *self);
extern char ui_helpline__last_msg[];
int ui_helpline__show_help(const char *format, va_list ap);
#include "ui/progress.h"
#endif

#endif /* __PERF_DEBUG_H */
13 changes: 7 additions & 6 deletions tools/perf/util/hist.c
Original file line number Diff line number Diff line change
Expand Up @@ -983,9 +983,9 @@ int hist_entry__inc_addr_samples(struct hist_entry *self, u64 ip)
return 0;
}

static struct objdump_line *objdump_line__new(s64 offset, char *line)
static struct objdump_line *objdump_line__new(s64 offset, char *line, size_t privsize)
{
struct objdump_line *self = malloc(sizeof(*self));
struct objdump_line *self = malloc(sizeof(*self) + privsize);

if (self != NULL) {
self->offset = offset;
Expand Down Expand Up @@ -1017,7 +1017,7 @@ struct objdump_line *objdump__get_next_ip_line(struct list_head *head,
}

static int hist_entry__parse_objdump_line(struct hist_entry *self, FILE *file,
struct list_head *head)
struct list_head *head, size_t privsize)
{
struct symbol *sym = self->ms.sym;
struct objdump_line *objdump_line;
Expand Down Expand Up @@ -1068,7 +1068,7 @@ static int hist_entry__parse_objdump_line(struct hist_entry *self, FILE *file,
offset = -1;
}

objdump_line = objdump_line__new(offset, line);
objdump_line = objdump_line__new(offset, line, privsize);
if (objdump_line == NULL) {
free(line);
return -1;
Expand All @@ -1078,7 +1078,8 @@ static int hist_entry__parse_objdump_line(struct hist_entry *self, FILE *file,
return 0;
}

int hist_entry__annotate(struct hist_entry *self, struct list_head *head)
int hist_entry__annotate(struct hist_entry *self, struct list_head *head,
size_t privsize)
{
struct symbol *sym = self->ms.sym;
struct map *map = self->ms.map;
Expand Down Expand Up @@ -1143,7 +1144,7 @@ int hist_entry__annotate(struct hist_entry *self, struct list_head *head)
goto out_free_filename;

while (!feof(file))
if (hist_entry__parse_objdump_line(self, file, head) < 0)
if (hist_entry__parse_objdump_line(self, file, head, privsize) < 0)
break;

pclose(file);
Expand Down
3 changes: 2 additions & 1 deletion tools/perf/util/hist.h
Original file line number Diff line number Diff line change
Expand Up @@ -101,7 +101,8 @@ size_t hists__fprintf(struct hists *self, struct hists *pair,
bool show_displacement, FILE *fp);

int hist_entry__inc_addr_samples(struct hist_entry *self, u64 ip);
int hist_entry__annotate(struct hist_entry *self, struct list_head *head);
int hist_entry__annotate(struct hist_entry *self, struct list_head *head,
size_t privsize);

void hists__filter_by_dso(struct hists *self, const struct dso *dso);
void hists__filter_by_thread(struct hists *self, const struct thread *thread);
Expand Down
2 changes: 2 additions & 0 deletions tools/perf/util/pstack.h
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
#ifndef _PERF_PSTACK_
#define _PERF_PSTACK_

#include <stdbool.h>

struct pstack;
struct pstack *pstack__new(unsigned short max_nr_entries);
void pstack__delete(struct pstack *self);
Expand Down
10 changes: 10 additions & 0 deletions tools/perf/util/symbol.c
Original file line number Diff line number Diff line change
Expand Up @@ -1079,6 +1079,16 @@ static int dso__load_sym(struct dso *self, struct map *map, const char *name,
if (!is_label && !elf_sym__is_a(&sym, map->type))
continue;

/* Reject ARM ELF "mapping symbols": these aren't unique and
* don't identify functions, so will confuse the profile
* output: */
if (ehdr.e_machine == EM_ARM) {
if (!strcmp(elf_name, "$a") ||
!strcmp(elf_name, "$d") ||
!strcmp(elf_name, "$t"))
continue;
}

if (opdsec && sym.st_shndx == opdidx) {
u32 offset = sym.st_value - opdshdr.sh_addr;
u64 *opd = opddata->d_buf + offset;
Expand Down
76 changes: 46 additions & 30 deletions tools/perf/util/ui/browser.c
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
#include <stdlib.h>
#include <sys/ttydefaults.h>
#include "browser.h"
#include "helpline.h"
#include "../color.h"
#include "../util.h"

Expand Down Expand Up @@ -49,7 +50,7 @@ void ui_browser__list_head_seek(struct ui_browser *self, off_t offset, int whenc
pos = head->next;
break;
case SEEK_CUR:
pos = self->first_visible_entry;
pos = self->top;
break;
case SEEK_END:
pos = head->prev;
Expand All @@ -66,7 +67,7 @@ void ui_browser__list_head_seek(struct ui_browser *self, off_t offset, int whenc
pos = pos->prev;
}

self->first_visible_entry = pos;
self->top = pos;
}

void ui_browser__rb_tree_seek(struct ui_browser *self, off_t offset, int whence)
Expand All @@ -79,7 +80,7 @@ void ui_browser__rb_tree_seek(struct ui_browser *self, off_t offset, int whence)
nd = rb_first(root);
break;
case SEEK_CUR:
nd = self->first_visible_entry;
nd = self->top;
break;
case SEEK_END:
nd = rb_last(root);
Expand All @@ -96,21 +97,21 @@ void ui_browser__rb_tree_seek(struct ui_browser *self, off_t offset, int whence)
nd = rb_prev(nd);
}

self->first_visible_entry = nd;
self->top = nd;
}

unsigned int ui_browser__rb_tree_refresh(struct ui_browser *self)
{
struct rb_node *nd;
int row = 0;

if (self->first_visible_entry == NULL)
self->first_visible_entry = rb_first(self->entries);
if (self->top == NULL)
self->top = rb_first(self->entries);

nd = self->first_visible_entry;
nd = self->top;

while (nd != NULL) {
SLsmg_gotorc(self->top + row, self->left);
SLsmg_gotorc(self->y + row, self->x);
self->write(self, nd, row);
if (++row == self->height)
break;
Expand All @@ -122,7 +123,7 @@ unsigned int ui_browser__rb_tree_refresh(struct ui_browser *self)

bool ui_browser__is_current_entry(struct ui_browser *self, unsigned row)
{
return (self->first_visible_entry_idx + row) == self->index;
return self->top_idx + row == self->index;
}

void ui_browser__refresh_dimensions(struct ui_browser *self)
Expand All @@ -135,18 +136,21 @@ void ui_browser__refresh_dimensions(struct ui_browser *self)
self->height = rows - 5;
if (self->height > self->nr_entries)
self->height = self->nr_entries;
self->top = (rows - self->height) / 2;
self->left = (cols - self->width) / 2;
self->y = (rows - self->height) / 2;
self->x = (cols - self->width) / 2;
}

void ui_browser__reset_index(struct ui_browser *self)
{
self->index = self->first_visible_entry_idx = 0;
self->index = self->top_idx = 0;
self->seek(self, 0, SEEK_SET);
}

int ui_browser__show(struct ui_browser *self, const char *title)
int ui_browser__show(struct ui_browser *self, const char *title,
const char *helpline, ...)
{
va_list ap;

if (self->form != NULL) {
newtFormDestroy(self->form);
newtPopWindow();
Expand All @@ -169,18 +173,31 @@ int ui_browser__show(struct ui_browser *self, const char *title)
newtFormAddHotKey(self->form, NEWT_KEY_PGDN);
newtFormAddHotKey(self->form, NEWT_KEY_HOME);
newtFormAddHotKey(self->form, NEWT_KEY_END);
newtFormAddHotKey(self->form, ' ');
newtFormAddComponent(self->form, self->sb);

va_start(ap, helpline);
ui_helpline__vpush(helpline, ap);
va_end(ap);
return 0;
}

void ui_browser__hide(struct ui_browser *self)
{
newtFormDestroy(self->form);
newtPopWindow();
self->form = NULL;
ui_helpline__pop();
}

int ui_browser__refresh(struct ui_browser *self)
{
int row;

newtScrollbarSet(self->sb, self->index, self->nr_entries - 1);
row = self->refresh(self);
SLsmg_set_color(HE_COLORSET_NORMAL);
SLsmg_fill_region(self->top + row, self->left,
SLsmg_fill_region(self->y + row, self->x,
self->height - row, self->width, ' ');

return 0;
Expand All @@ -205,43 +222,43 @@ int ui_browser__run(struct ui_browser *self, struct newtExitStruct *es)
if (self->index == self->nr_entries - 1)
break;
++self->index;
if (self->index == self->first_visible_entry_idx + self->height) {
++self->first_visible_entry_idx;
if (self->index == self->top_idx + self->height) {
++self->top_idx;
self->seek(self, +1, SEEK_CUR);
}
break;
case NEWT_KEY_UP:
if (self->index == 0)
break;
--self->index;
if (self->index < self->first_visible_entry_idx) {
--self->first_visible_entry_idx;
if (self->index < self->top_idx) {
--self->top_idx;
self->seek(self, -1, SEEK_CUR);
}
break;
case NEWT_KEY_PGDN:
case ' ':
if (self->first_visible_entry_idx + self->height > self->nr_entries - 1)
if (self->top_idx + self->height > self->nr_entries - 1)
break;

offset = self->height;
if (self->index + offset > self->nr_entries - 1)
offset = self->nr_entries - 1 - self->index;
self->index += offset;
self->first_visible_entry_idx += offset;
self->top_idx += offset;
self->seek(self, +offset, SEEK_CUR);
break;
case NEWT_KEY_PGUP:
if (self->first_visible_entry_idx == 0)
if (self->top_idx == 0)
break;

if (self->first_visible_entry_idx < self->height)
offset = self->first_visible_entry_idx;
if (self->top_idx < self->height)
offset = self->top_idx;
else
offset = self->height;

self->index -= offset;
self->first_visible_entry_idx -= offset;
self->top_idx -= offset;
self->seek(self, -offset, SEEK_CUR);
break;
case NEWT_KEY_HOME:
Expand All @@ -253,7 +270,7 @@ int ui_browser__run(struct ui_browser *self, struct newtExitStruct *es)
offset = self->nr_entries - 1;

self->index = self->nr_entries - 1;
self->first_visible_entry_idx = self->index - offset;
self->top_idx = self->index - offset;
self->seek(self, -offset, SEEK_END);
break;
default:
Expand All @@ -271,14 +288,13 @@ unsigned int ui_browser__list_head_refresh(struct ui_browser *self)
struct list_head *head = self->entries;
int row = 0;

if (self->first_visible_entry == NULL ||
self->first_visible_entry == self->entries)
self->first_visible_entry = head->next;
if (self->top == NULL || self->top == self->entries)
self->top = head->next;

pos = self->first_visible_entry;
pos = self->top;

list_for_each_from(pos, head) {
SLsmg_gotorc(self->top + row, self->left);
SLsmg_gotorc(self->y + row, self->x);
self->write(self, pos, row);
if (++row == self->height)
break;
Expand Down
Loading

0 comments on commit b3e84ff

Please sign in to comment.