diff options
| author | Ingo Molnar <mingo@elte.hu> | 2011-08-05 04:35:55 -0400 |
|---|---|---|
| committer | Ingo Molnar <mingo@elte.hu> | 2011-08-05 04:35:55 -0400 |
| commit | 6d158f3ec537bd6d3786196b6db97fcc0f973aef (patch) | |
| tree | be45a7498c9e24f6759adb9c0cd2153a6686fe22 | |
| parent | 3272cab4063467410802367a8d69f06c65b2a866 (diff) | |
| parent | 00894ce9b85887caa0c16e18757004b9cc9f64cf (diff) | |
Merge branch 'perf/core' of git://git.kernel.org/pub/scm/linux/kernel/git/acme/linux into perf/urgent
| -rw-r--r-- | tools/perf/builtin-record.c | 19 | ||||
| -rw-r--r-- | tools/perf/builtin-report.c | 15 | ||||
| -rw-r--r-- | tools/perf/util/evlist.c | 13 | ||||
| -rw-r--r-- | tools/perf/util/evlist.h | 2 | ||||
| -rw-r--r-- | tools/perf/util/header.c | 8 | ||||
| -rw-r--r-- | tools/perf/util/python.c | 115 |
6 files changed, 140 insertions, 32 deletions
diff --git a/tools/perf/builtin-record.c b/tools/perf/builtin-record.c index 80dc5b790e47..f6426b496f4a 100644 --- a/tools/perf/builtin-record.c +++ b/tools/perf/builtin-record.c | |||
| @@ -30,8 +30,6 @@ | |||
| 30 | #include <sched.h> | 30 | #include <sched.h> |
| 31 | #include <sys/mman.h> | 31 | #include <sys/mman.h> |
| 32 | 32 | ||
| 33 | #define FD(e, x, y) (*(int *)xyarray__entry(e->fd, x, y)) | ||
| 34 | |||
| 35 | enum write_mode_t { | 33 | enum write_mode_t { |
| 36 | WRITE_FORCE, | 34 | WRITE_FORCE, |
| 37 | WRITE_APPEND | 35 | WRITE_APPEND |
| @@ -438,7 +436,6 @@ static void mmap_read_all(void) | |||
| 438 | 436 | ||
| 439 | static int __cmd_record(int argc, const char **argv) | 437 | static int __cmd_record(int argc, const char **argv) |
| 440 | { | 438 | { |
| 441 | int i; | ||
| 442 | struct stat st; | 439 | struct stat st; |
| 443 | int flags; | 440 | int flags; |
| 444 | int err; | 441 | int err; |
| @@ -682,7 +679,6 @@ static int __cmd_record(int argc, const char **argv) | |||
| 682 | 679 | ||
| 683 | for (;;) { | 680 | for (;;) { |
| 684 | int hits = samples; | 681 | int hits = samples; |
| 685 | int thread; | ||
| 686 | 682 | ||
| 687 | mmap_read_all(); | 683 | mmap_read_all(); |
| 688 | 684 | ||
| @@ -693,19 +689,8 @@ static int __cmd_record(int argc, const char **argv) | |||
| 693 | waking++; | 689 | waking++; |
| 694 | } | 690 | } |
| 695 | 691 | ||
| 696 | if (done) { | 692 | if (done) |
| 697 | for (i = 0; i < evsel_list->cpus->nr; i++) { | 693 | perf_evlist__disable(evsel_list); |
| 698 | struct perf_evsel *pos; | ||
| 699 | |||
| 700 | list_for_each_entry(pos, &evsel_list->entries, node) { | ||
| 701 | for (thread = 0; | ||
| 702 | thread < evsel_list->threads->nr; | ||
| 703 | thread++) | ||
| 704 | ioctl(FD(pos, i, thread), | ||
| 705 | PERF_EVENT_IOC_DISABLE); | ||
| 706 | } | ||
| 707 | } | ||
| 708 | } | ||
| 709 | } | 694 | } |
| 710 | 695 | ||
| 711 | if (quiet || signr == SIGUSR1) | 696 | if (quiet || signr == SIGUSR1) |
diff --git a/tools/perf/builtin-report.c b/tools/perf/builtin-report.c index f854efda7686..d7ff277bdb78 100644 --- a/tools/perf/builtin-report.c +++ b/tools/perf/builtin-report.c | |||
| @@ -162,23 +162,22 @@ static int perf_session__setup_sample_type(struct perf_session *self) | |||
| 162 | { | 162 | { |
| 163 | if (!(self->sample_type & PERF_SAMPLE_CALLCHAIN)) { | 163 | if (!(self->sample_type & PERF_SAMPLE_CALLCHAIN)) { |
| 164 | if (sort__has_parent) { | 164 | if (sort__has_parent) { |
| 165 | fprintf(stderr, "selected --sort parent, but no" | 165 | ui__warning("Selected --sort parent, but no " |
| 166 | " callchain data. Did you call" | 166 | "callchain data. Did you call " |
| 167 | " perf record without -g?\n"); | 167 | "'perf record' without -g?\n"); |
| 168 | return -EINVAL; | 168 | return -EINVAL; |
| 169 | } | 169 | } |
| 170 | if (symbol_conf.use_callchain) { | 170 | if (symbol_conf.use_callchain) { |
| 171 | fprintf(stderr, "selected -g but no callchain data." | 171 | ui__warning("Selected -g but no callchain data. Did " |
| 172 | " Did you call perf record without" | 172 | "you call 'perf record' without -g?\n"); |
| 173 | " -g?\n"); | ||
| 174 | return -1; | 173 | return -1; |
| 175 | } | 174 | } |
| 176 | } else if (!dont_use_callchains && callchain_param.mode != CHAIN_NONE && | 175 | } else if (!dont_use_callchains && callchain_param.mode != CHAIN_NONE && |
| 177 | !symbol_conf.use_callchain) { | 176 | !symbol_conf.use_callchain) { |
| 178 | symbol_conf.use_callchain = true; | 177 | symbol_conf.use_callchain = true; |
| 179 | if (callchain_register_param(&callchain_param) < 0) { | 178 | if (callchain_register_param(&callchain_param) < 0) { |
| 180 | fprintf(stderr, "Can't register callchain" | 179 | ui__warning("Can't register callchain " |
| 181 | " params\n"); | 180 | "params.\n"); |
| 182 | return -EINVAL; | 181 | return -EINVAL; |
| 183 | } | 182 | } |
| 184 | } | 183 | } |
diff --git a/tools/perf/util/evlist.c b/tools/perf/util/evlist.c index b021ea9265c3..e03e7bc8205e 100644 --- a/tools/perf/util/evlist.c +++ b/tools/perf/util/evlist.c | |||
| @@ -91,6 +91,19 @@ int perf_evlist__add_default(struct perf_evlist *evlist) | |||
| 91 | return 0; | 91 | return 0; |
| 92 | } | 92 | } |
| 93 | 93 | ||
| 94 | void perf_evlist__disable(struct perf_evlist *evlist) | ||
| 95 | { | ||
| 96 | int cpu, thread; | ||
| 97 | struct perf_evsel *pos; | ||
| 98 | |||
| 99 | for (cpu = 0; cpu < evlist->cpus->nr; cpu++) { | ||
| 100 | list_for_each_entry(pos, &evlist->entries, node) { | ||
| 101 | for (thread = 0; thread < evlist->threads->nr; thread++) | ||
| 102 | ioctl(FD(pos, cpu, thread), PERF_EVENT_IOC_DISABLE); | ||
| 103 | } | ||
| 104 | } | ||
| 105 | } | ||
| 106 | |||
| 94 | int perf_evlist__alloc_pollfd(struct perf_evlist *evlist) | 107 | int perf_evlist__alloc_pollfd(struct perf_evlist *evlist) |
| 95 | { | 108 | { |
| 96 | int nfds = evlist->cpus->nr * evlist->threads->nr * evlist->nr_entries; | 109 | int nfds = evlist->cpus->nr * evlist->threads->nr * evlist->nr_entries; |
diff --git a/tools/perf/util/evlist.h b/tools/perf/util/evlist.h index b2b862374f37..ce85ae9ae57a 100644 --- a/tools/perf/util/evlist.h +++ b/tools/perf/util/evlist.h | |||
| @@ -53,6 +53,8 @@ int perf_evlist__alloc_mmap(struct perf_evlist *evlist); | |||
| 53 | int perf_evlist__mmap(struct perf_evlist *evlist, int pages, bool overwrite); | 53 | int perf_evlist__mmap(struct perf_evlist *evlist, int pages, bool overwrite); |
| 54 | void perf_evlist__munmap(struct perf_evlist *evlist); | 54 | void perf_evlist__munmap(struct perf_evlist *evlist); |
| 55 | 55 | ||
| 56 | void perf_evlist__disable(struct perf_evlist *evlist); | ||
| 57 | |||
| 56 | static inline void perf_evlist__set_maps(struct perf_evlist *evlist, | 58 | static inline void perf_evlist__set_maps(struct perf_evlist *evlist, |
| 57 | struct cpu_map *cpus, | 59 | struct cpu_map *cpus, |
| 58 | struct thread_map *threads) | 60 | struct thread_map *threads) |
diff --git a/tools/perf/util/header.c b/tools/perf/util/header.c index cb2959a3fb43..d4f3101773db 100644 --- a/tools/perf/util/header.c +++ b/tools/perf/util/header.c | |||
| @@ -189,8 +189,8 @@ int build_id_cache__add_s(const char *sbuild_id, const char *debugdir, | |||
| 189 | const char *name, bool is_kallsyms) | 189 | const char *name, bool is_kallsyms) |
| 190 | { | 190 | { |
| 191 | const size_t size = PATH_MAX; | 191 | const size_t size = PATH_MAX; |
| 192 | char *realname, *filename = malloc(size), | 192 | char *realname, *filename = zalloc(size), |
| 193 | *linkname = malloc(size), *targetname; | 193 | *linkname = zalloc(size), *targetname; |
| 194 | int len, err = -1; | 194 | int len, err = -1; |
| 195 | 195 | ||
| 196 | if (is_kallsyms) { | 196 | if (is_kallsyms) { |
| @@ -254,8 +254,8 @@ static int build_id_cache__add_b(const u8 *build_id, size_t build_id_size, | |||
| 254 | int build_id_cache__remove_s(const char *sbuild_id, const char *debugdir) | 254 | int build_id_cache__remove_s(const char *sbuild_id, const char *debugdir) |
| 255 | { | 255 | { |
| 256 | const size_t size = PATH_MAX; | 256 | const size_t size = PATH_MAX; |
| 257 | char *filename = malloc(size), | 257 | char *filename = zalloc(size), |
| 258 | *linkname = malloc(size); | 258 | *linkname = zalloc(size); |
| 259 | int err = -1; | 259 | int err = -1; |
| 260 | 260 | ||
| 261 | if (filename == NULL || linkname == NULL) | 261 | if (filename == NULL || linkname == NULL) |
diff --git a/tools/perf/util/python.c b/tools/perf/util/python.c index 8e0b5a39d8a7..cbc8f215d4b7 100644 --- a/tools/perf/util/python.c +++ b/tools/perf/util/python.c | |||
| @@ -187,16 +187,119 @@ static PyTypeObject pyrf_throttle_event__type = { | |||
| 187 | .tp_repr = (reprfunc)pyrf_throttle_event__repr, | 187 | .tp_repr = (reprfunc)pyrf_throttle_event__repr, |
| 188 | }; | 188 | }; |
| 189 | 189 | ||
| 190 | static char pyrf_lost_event__doc[] = PyDoc_STR("perf lost event object."); | ||
| 191 | |||
| 192 | static PyMemberDef pyrf_lost_event__members[] = { | ||
| 193 | sample_members | ||
| 194 | member_def(lost_event, id, T_ULONGLONG, "event id"), | ||
| 195 | member_def(lost_event, lost, T_ULONGLONG, "number of lost events"), | ||
| 196 | { .name = NULL, }, | ||
| 197 | }; | ||
| 198 | |||
| 199 | static PyObject *pyrf_lost_event__repr(struct pyrf_event *pevent) | ||
| 200 | { | ||
| 201 | PyObject *ret; | ||
| 202 | char *s; | ||
| 203 | |||
| 204 | if (asprintf(&s, "{ type: lost, id: %#" PRIx64 ", " | ||
| 205 | "lost: %#" PRIx64 " }", | ||
| 206 | pevent->event.lost.id, pevent->event.lost.lost) < 0) { | ||
| 207 | ret = PyErr_NoMemory(); | ||
| 208 | } else { | ||
| 209 | ret = PyString_FromString(s); | ||
| 210 | free(s); | ||
| 211 | } | ||
| 212 | return ret; | ||
| 213 | } | ||
| 214 | |||
| 215 | static PyTypeObject pyrf_lost_event__type = { | ||
| 216 | PyVarObject_HEAD_INIT(NULL, 0) | ||
| 217 | .tp_name = "perf.lost_event", | ||
| 218 | .tp_basicsize = sizeof(struct pyrf_event), | ||
| 219 | .tp_flags = Py_TPFLAGS_DEFAULT|Py_TPFLAGS_BASETYPE, | ||
| 220 | .tp_doc = pyrf_lost_event__doc, | ||
| 221 | .tp_members = pyrf_lost_event__members, | ||
| 222 | .tp_repr = (reprfunc)pyrf_lost_event__repr, | ||
| 223 | }; | ||
| 224 | |||
| 225 | static char pyrf_read_event__doc[] = PyDoc_STR("perf read event object."); | ||
| 226 | |||
| 227 | static PyMemberDef pyrf_read_event__members[] = { | ||
| 228 | sample_members | ||
| 229 | member_def(read_event, pid, T_UINT, "event pid"), | ||
| 230 | member_def(read_event, tid, T_UINT, "event tid"), | ||
| 231 | { .name = NULL, }, | ||
| 232 | }; | ||
| 233 | |||
| 234 | static PyObject *pyrf_read_event__repr(struct pyrf_event *pevent) | ||
| 235 | { | ||
| 236 | return PyString_FromFormat("{ type: read, pid: %u, tid: %u }", | ||
| 237 | pevent->event.read.pid, | ||
| 238 | pevent->event.read.tid); | ||
| 239 | /* | ||
| 240 | * FIXME: return the array of read values, | ||
| 241 | * making this method useful ;-) | ||
| 242 | */ | ||
| 243 | } | ||
| 244 | |||
| 245 | static PyTypeObject pyrf_read_event__type = { | ||
| 246 | PyVarObject_HEAD_INIT(NULL, 0) | ||
| 247 | .tp_name = "perf.read_event", | ||
| 248 | .tp_basicsize = sizeof(struct pyrf_event), | ||
| 249 | .tp_flags = Py_TPFLAGS_DEFAULT|Py_TPFLAGS_BASETYPE, | ||
| 250 | .tp_doc = pyrf_read_event__doc, | ||
| 251 | .tp_members = pyrf_read_event__members, | ||
| 252 | .tp_repr = (reprfunc)pyrf_read_event__repr, | ||
| 253 | }; | ||
| 254 | |||
| 255 | static char pyrf_sample_event__doc[] = PyDoc_STR("perf sample event object."); | ||
| 256 | |||
| 257 | static PyMemberDef pyrf_sample_event__members[] = { | ||
| 258 | sample_members | ||
| 259 | member_def(perf_event_header, type, T_UINT, "event type"), | ||
| 260 | { .name = NULL, }, | ||
| 261 | }; | ||
| 262 | |||
| 263 | static PyObject *pyrf_sample_event__repr(struct pyrf_event *pevent) | ||
| 264 | { | ||
| 265 | PyObject *ret; | ||
| 266 | char *s; | ||
| 267 | |||
| 268 | if (asprintf(&s, "{ type: sample }") < 0) { | ||
| 269 | ret = PyErr_NoMemory(); | ||
| 270 | } else { | ||
| 271 | ret = PyString_FromString(s); | ||
| 272 | free(s); | ||
| 273 | } | ||
| 274 | return ret; | ||
| 275 | } | ||
| 276 | |||
| 277 | static PyTypeObject pyrf_sample_event__type = { | ||
| 278 | PyVarObject_HEAD_INIT(NULL, 0) | ||
| 279 | .tp_name = "perf.sample_event", | ||
| 280 | .tp_basicsize = sizeof(struct pyrf_event), | ||
| 281 | .tp_flags = Py_TPFLAGS_DEFAULT|Py_TPFLAGS_BASETYPE, | ||
| 282 | .tp_doc = pyrf_sample_event__doc, | ||
| 283 | .tp_members = pyrf_sample_event__members, | ||
| 284 | .tp_repr = (reprfunc)pyrf_sample_event__repr, | ||
| 285 | }; | ||
| 286 | |||
| 190 | static int pyrf_event__setup_types(void) | 287 | static int pyrf_event__setup_types(void) |
| 191 | { | 288 | { |
| 192 | int err; | 289 | int err; |
| 193 | pyrf_mmap_event__type.tp_new = | 290 | pyrf_mmap_event__type.tp_new = |
| 194 | pyrf_task_event__type.tp_new = | 291 | pyrf_task_event__type.tp_new = |
| 195 | pyrf_comm_event__type.tp_new = | 292 | pyrf_comm_event__type.tp_new = |
| 293 | pyrf_lost_event__type.tp_new = | ||
| 294 | pyrf_read_event__type.tp_new = | ||
| 295 | pyrf_sample_event__type.tp_new = | ||
| 196 | pyrf_throttle_event__type.tp_new = PyType_GenericNew; | 296 | pyrf_throttle_event__type.tp_new = PyType_GenericNew; |
| 197 | err = PyType_Ready(&pyrf_mmap_event__type); | 297 | err = PyType_Ready(&pyrf_mmap_event__type); |
| 198 | if (err < 0) | 298 | if (err < 0) |
| 199 | goto out; | 299 | goto out; |
| 300 | err = PyType_Ready(&pyrf_lost_event__type); | ||
| 301 | if (err < 0) | ||
| 302 | goto out; | ||
| 200 | err = PyType_Ready(&pyrf_task_event__type); | 303 | err = PyType_Ready(&pyrf_task_event__type); |
| 201 | if (err < 0) | 304 | if (err < 0) |
| 202 | goto out; | 305 | goto out; |
| @@ -206,20 +309,26 @@ static int pyrf_event__setup_types(void) | |||
| 206 | err = PyType_Ready(&pyrf_throttle_event__type); | 309 | err = PyType_Ready(&pyrf_throttle_event__type); |
| 207 | if (err < 0) | 310 | if (err < 0) |
| 208 | goto out; | 311 | goto out; |
| 312 | err = PyType_Ready(&pyrf_read_event__type); | ||
| 313 | if (err < 0) | ||
| 314 | goto out; | ||
| 315 | err = PyType_Ready(&pyrf_sample_event__type); | ||
| 316 | if (err < 0) | ||
| 317 | goto out; | ||
| 209 | out: | 318 | out: |
| 210 | return err; | 319 | return err; |
| 211 | } | 320 | } |
| 212 | 321 | ||
| 213 | static PyTypeObject *pyrf_event__type[] = { | 322 | static PyTypeObject *pyrf_event__type[] = { |
| 214 | [PERF_RECORD_MMAP] = &pyrf_mmap_event__type, | 323 | [PERF_RECORD_MMAP] = &pyrf_mmap_event__type, |
| 215 | [PERF_RECORD_LOST] = &pyrf_mmap_event__type, | 324 | [PERF_RECORD_LOST] = &pyrf_lost_event__type, |
| 216 | [PERF_RECORD_COMM] = &pyrf_comm_event__type, | 325 | [PERF_RECORD_COMM] = &pyrf_comm_event__type, |
| 217 | [PERF_RECORD_EXIT] = &pyrf_task_event__type, | 326 | [PERF_RECORD_EXIT] = &pyrf_task_event__type, |
| 218 | [PERF_RECORD_THROTTLE] = &pyrf_throttle_event__type, | 327 | [PERF_RECORD_THROTTLE] = &pyrf_throttle_event__type, |
| 219 | [PERF_RECORD_UNTHROTTLE] = &pyrf_throttle_event__type, | 328 | [PERF_RECORD_UNTHROTTLE] = &pyrf_throttle_event__type, |
| 220 | [PERF_RECORD_FORK] = &pyrf_task_event__type, | 329 | [PERF_RECORD_FORK] = &pyrf_task_event__type, |
| 221 | [PERF_RECORD_READ] = &pyrf_mmap_event__type, | 330 | [PERF_RECORD_READ] = &pyrf_read_event__type, |
| 222 | [PERF_RECORD_SAMPLE] = &pyrf_mmap_event__type, | 331 | [PERF_RECORD_SAMPLE] = &pyrf_sample_event__type, |
| 223 | }; | 332 | }; |
| 224 | 333 | ||
| 225 | static PyObject *pyrf_event__new(union perf_event *event) | 334 | static PyObject *pyrf_event__new(union perf_event *event) |
