linux/tools/perf/util/machine.c
<<
>>
Prefs
   1#include "callchain.h"
   2#include "debug.h"
   3#include "event.h"
   4#include "evsel.h"
   5#include "hist.h"
   6#include "machine.h"
   7#include "map.h"
   8#include "sort.h"
   9#include "strlist.h"
  10#include "thread.h"
  11#include "vdso.h"
  12#include <stdbool.h>
  13#include <symbol/kallsyms.h>
  14#include "unwind.h"
  15#include "linux/hash.h"
  16
  17static void __machine__remove_thread(struct machine *machine, struct thread *th, bool lock);
  18
  19static void dsos__init(struct dsos *dsos)
  20{
  21        INIT_LIST_HEAD(&dsos->head);
  22        dsos->root = RB_ROOT;
  23        pthread_rwlock_init(&dsos->lock, NULL);
  24}
  25
  26int machine__init(struct machine *machine, const char *root_dir, pid_t pid)
  27{
  28        map_groups__init(&machine->kmaps, machine);
  29        RB_CLEAR_NODE(&machine->rb_node);
  30        dsos__init(&machine->dsos);
  31
  32        machine->threads = RB_ROOT;
  33        pthread_rwlock_init(&machine->threads_lock, NULL);
  34        INIT_LIST_HEAD(&machine->dead_threads);
  35        machine->last_match = NULL;
  36
  37        machine->vdso_info = NULL;
  38        machine->env = NULL;
  39
  40        machine->pid = pid;
  41
  42        machine->symbol_filter = NULL;
  43        machine->id_hdr_size = 0;
  44        machine->comm_exec = false;
  45        machine->kernel_start = 0;
  46
  47        machine->root_dir = strdup(root_dir);
  48        if (machine->root_dir == NULL)
  49                return -ENOMEM;
  50
  51        if (pid != HOST_KERNEL_ID) {
  52                struct thread *thread = machine__findnew_thread(machine, -1,
  53                                                                pid);
  54                char comm[64];
  55
  56                if (thread == NULL)
  57                        return -ENOMEM;
  58
  59                snprintf(comm, sizeof(comm), "[guest/%d]", pid);
  60                thread__set_comm(thread, comm, 0);
  61                thread__put(thread);
  62        }
  63
  64        machine->current_tid = NULL;
  65
  66        return 0;
  67}
  68
  69struct machine *machine__new_host(void)
  70{
  71        struct machine *machine = malloc(sizeof(*machine));
  72
  73        if (machine != NULL) {
  74                machine__init(machine, "", HOST_KERNEL_ID);
  75
  76                if (machine__create_kernel_maps(machine) < 0)
  77                        goto out_delete;
  78        }
  79
  80        return machine;
  81out_delete:
  82        free(machine);
  83        return NULL;
  84}
  85
  86static void dsos__purge(struct dsos *dsos)
  87{
  88        struct dso *pos, *n;
  89
  90        pthread_rwlock_wrlock(&dsos->lock);
  91
  92        list_for_each_entry_safe(pos, n, &dsos->head, node) {
  93                RB_CLEAR_NODE(&pos->rb_node);
  94                pos->root = NULL;
  95                list_del_init(&pos->node);
  96                dso__put(pos);
  97        }
  98
  99        pthread_rwlock_unlock(&dsos->lock);
 100}
 101
 102static void dsos__exit(struct dsos *dsos)
 103{
 104        dsos__purge(dsos);
 105        pthread_rwlock_destroy(&dsos->lock);
 106}
 107
 108void machine__delete_threads(struct machine *machine)
 109{
 110        struct rb_node *nd;
 111
 112        pthread_rwlock_wrlock(&machine->threads_lock);
 113        nd = rb_first(&machine->threads);
 114        while (nd) {
 115                struct thread *t = rb_entry(nd, struct thread, rb_node);
 116
 117                nd = rb_next(nd);
 118                __machine__remove_thread(machine, t, false);
 119        }
 120        pthread_rwlock_unlock(&machine->threads_lock);
 121}
 122
 123void machine__exit(struct machine *machine)
 124{
 125        map_groups__exit(&machine->kmaps);
 126        dsos__exit(&machine->dsos);
 127        machine__exit_vdso(machine);
 128        zfree(&machine->root_dir);
 129        zfree(&machine->current_tid);
 130        pthread_rwlock_destroy(&machine->threads_lock);
 131}
 132
 133void machine__delete(struct machine *machine)
 134{
 135        machine__exit(machine);
 136        free(machine);
 137}
 138
 139void machines__init(struct machines *machines)
 140{
 141        machine__init(&machines->host, "", HOST_KERNEL_ID);
 142        machines->guests = RB_ROOT;
 143        machines->symbol_filter = NULL;
 144}
 145
 146void machines__exit(struct machines *machines)
 147{
 148        machine__exit(&machines->host);
 149        /* XXX exit guest */
 150}
 151
 152struct machine *machines__add(struct machines *machines, pid_t pid,
 153                              const char *root_dir)
 154{
 155        struct rb_node **p = &machines->guests.rb_node;
 156        struct rb_node *parent = NULL;
 157        struct machine *pos, *machine = malloc(sizeof(*machine));
 158
 159        if (machine == NULL)
 160                return NULL;
 161
 162        if (machine__init(machine, root_dir, pid) != 0) {
 163                free(machine);
 164                return NULL;
 165        }
 166
 167        machine->symbol_filter = machines->symbol_filter;
 168
 169        while (*p != NULL) {
 170                parent = *p;
 171                pos = rb_entry(parent, struct machine, rb_node);
 172                if (pid < pos->pid)
 173                        p = &(*p)->rb_left;
 174                else
 175                        p = &(*p)->rb_right;
 176        }
 177
 178        rb_link_node(&machine->rb_node, parent, p);
 179        rb_insert_color(&machine->rb_node, &machines->guests);
 180
 181        return machine;
 182}
 183
 184void machines__set_symbol_filter(struct machines *machines,
 185                                 symbol_filter_t symbol_filter)
 186{
 187        struct rb_node *nd;
 188
 189        machines->symbol_filter = symbol_filter;
 190        machines->host.symbol_filter = symbol_filter;
 191
 192        for (nd = rb_first(&machines->guests); nd; nd = rb_next(nd)) {
 193                struct machine *machine = rb_entry(nd, struct machine, rb_node);
 194
 195                machine->symbol_filter = symbol_filter;
 196        }
 197}
 198
 199void machines__set_comm_exec(struct machines *machines, bool comm_exec)
 200{
 201        struct rb_node *nd;
 202
 203        machines->host.comm_exec = comm_exec;
 204
 205        for (nd = rb_first(&machines->guests); nd; nd = rb_next(nd)) {
 206                struct machine *machine = rb_entry(nd, struct machine, rb_node);
 207
 208                machine->comm_exec = comm_exec;
 209        }
 210}
 211
 212struct machine *machines__find(struct machines *machines, pid_t pid)
 213{
 214        struct rb_node **p = &machines->guests.rb_node;
 215        struct rb_node *parent = NULL;
 216        struct machine *machine;
 217        struct machine *default_machine = NULL;
 218
 219        if (pid == HOST_KERNEL_ID)
 220                return &machines->host;
 221
 222        while (*p != NULL) {
 223                parent = *p;
 224                machine = rb_entry(parent, struct machine, rb_node);
 225                if (pid < machine->pid)
 226                        p = &(*p)->rb_left;
 227                else if (pid > machine->pid)
 228                        p = &(*p)->rb_right;
 229                else
 230                        return machine;
 231                if (!machine->pid)
 232                        default_machine = machine;
 233        }
 234
 235        return default_machine;
 236}
 237
 238struct machine *machines__findnew(struct machines *machines, pid_t pid)
 239{
 240        char path[PATH_MAX];
 241        const char *root_dir = "";
 242        struct machine *machine = machines__find(machines, pid);
 243
 244        if (machine && (machine->pid == pid))
 245                goto out;
 246
 247        if ((pid != HOST_KERNEL_ID) &&
 248            (pid != DEFAULT_GUEST_KERNEL_ID) &&
 249            (symbol_conf.guestmount)) {
 250                sprintf(path, "%s/%d", symbol_conf.guestmount, pid);
 251                if (access(path, R_OK)) {
 252                        static struct strlist *seen;
 253
 254                        if (!seen)
 255                                seen = strlist__new(NULL, NULL);
 256
 257                        if (!strlist__has_entry(seen, path)) {
 258                                pr_err("Can't access file %s\n", path);
 259                                strlist__add(seen, path);
 260                        }
 261                        machine = NULL;
 262                        goto out;
 263                }
 264                root_dir = path;
 265        }
 266
 267        machine = machines__add(machines, pid, root_dir);
 268out:
 269        return machine;
 270}
 271
 272void machines__process_guests(struct machines *machines,
 273                              machine__process_t process, void *data)
 274{
 275        struct rb_node *nd;
 276
 277        for (nd = rb_first(&machines->guests); nd; nd = rb_next(nd)) {
 278                struct machine *pos = rb_entry(nd, struct machine, rb_node);
 279                process(pos, data);
 280        }
 281}
 282
 283char *machine__mmap_name(struct machine *machine, char *bf, size_t size)
 284{
 285        if (machine__is_host(machine))
 286                snprintf(bf, size, "[%s]", "kernel.kallsyms");
 287        else if (machine__is_default_guest(machine))
 288                snprintf(bf, size, "[%s]", "guest.kernel.kallsyms");
 289        else {
 290                snprintf(bf, size, "[%s.%d]", "guest.kernel.kallsyms",
 291                         machine->pid);
 292        }
 293
 294        return bf;
 295}
 296
 297void machines__set_id_hdr_size(struct machines *machines, u16 id_hdr_size)
 298{
 299        struct rb_node *node;
 300        struct machine *machine;
 301
 302        machines->host.id_hdr_size = id_hdr_size;
 303
 304        for (node = rb_first(&machines->guests); node; node = rb_next(node)) {
 305                machine = rb_entry(node, struct machine, rb_node);
 306                machine->id_hdr_size = id_hdr_size;
 307        }
 308
 309        return;
 310}
 311
 312static void machine__update_thread_pid(struct machine *machine,
 313                                       struct thread *th, pid_t pid)
 314{
 315        struct thread *leader;
 316
 317        if (pid == th->pid_ || pid == -1 || th->pid_ != -1)
 318                return;
 319
 320        th->pid_ = pid;
 321
 322        if (th->pid_ == th->tid)
 323                return;
 324
 325        leader = __machine__findnew_thread(machine, th->pid_, th->pid_);
 326        if (!leader)
 327                goto out_err;
 328
 329        if (!leader->mg)
 330                leader->mg = map_groups__new(machine);
 331
 332        if (!leader->mg)
 333                goto out_err;
 334
 335        if (th->mg == leader->mg)
 336                return;
 337
 338        if (th->mg) {
 339                /*
 340                 * Maps are created from MMAP events which provide the pid and
 341                 * tid.  Consequently there never should be any maps on a thread
 342                 * with an unknown pid.  Just print an error if there are.
 343                 */
 344                if (!map_groups__empty(th->mg))
 345                        pr_err("Discarding thread maps for %d:%d\n",
 346                               th->pid_, th->tid);
 347                map_groups__put(th->mg);
 348        }
 349
 350        th->mg = map_groups__get(leader->mg);
 351
 352        return;
 353
 354out_err:
 355        pr_err("Failed to join map groups for %d:%d\n", th->pid_, th->tid);
 356}
 357
 358static struct thread *____machine__findnew_thread(struct machine *machine,
 359                                                  pid_t pid, pid_t tid,
 360                                                  bool create)
 361{
 362        struct rb_node **p = &machine->threads.rb_node;
 363        struct rb_node *parent = NULL;
 364        struct thread *th;
 365
 366        /*
 367         * Front-end cache - TID lookups come in blocks,
 368         * so most of the time we dont have to look up
 369         * the full rbtree:
 370         */
 371        th = machine->last_match;
 372        if (th != NULL) {
 373                if (th->tid == tid) {
 374                        machine__update_thread_pid(machine, th, pid);
 375                        return th;
 376                }
 377
 378                machine->last_match = NULL;
 379        }
 380
 381        while (*p != NULL) {
 382                parent = *p;
 383                th = rb_entry(parent, struct thread, rb_node);
 384
 385                if (th->tid == tid) {
 386                        machine->last_match = th;
 387                        machine__update_thread_pid(machine, th, pid);
 388                        return th;
 389                }
 390
 391                if (tid < th->tid)
 392                        p = &(*p)->rb_left;
 393                else
 394                        p = &(*p)->rb_right;
 395        }
 396
 397        if (!create)
 398                return NULL;
 399
 400        th = thread__new(pid, tid);
 401        if (th != NULL) {
 402                rb_link_node(&th->rb_node, parent, p);
 403                rb_insert_color(&th->rb_node, &machine->threads);
 404
 405                /*
 406                 * We have to initialize map_groups separately
 407                 * after rb tree is updated.
 408                 *
 409                 * The reason is that we call machine__findnew_thread
 410                 * within thread__init_map_groups to find the thread
 411                 * leader and that would screwed the rb tree.
 412                 */
 413                if (thread__init_map_groups(th, machine)) {
 414                        rb_erase_init(&th->rb_node, &machine->threads);
 415                        RB_CLEAR_NODE(&th->rb_node);
 416                        thread__delete(th);
 417                        return NULL;
 418                }
 419                /*
 420                 * It is now in the rbtree, get a ref
 421                 */
 422                thread__get(th);
 423                machine->last_match = th;
 424        }
 425
 426        return th;
 427}
 428
 429struct thread *__machine__findnew_thread(struct machine *machine, pid_t pid, pid_t tid)
 430{
 431        return ____machine__findnew_thread(machine, pid, tid, true);
 432}
 433
 434struct thread *machine__findnew_thread(struct machine *machine, pid_t pid,
 435                                       pid_t tid)
 436{
 437        struct thread *th;
 438
 439        pthread_rwlock_wrlock(&machine->threads_lock);
 440        th = thread__get(__machine__findnew_thread(machine, pid, tid));
 441        pthread_rwlock_unlock(&machine->threads_lock);
 442        return th;
 443}
 444
 445struct thread *machine__find_thread(struct machine *machine, pid_t pid,
 446                                    pid_t tid)
 447{
 448        struct thread *th;
 449        pthread_rwlock_rdlock(&machine->threads_lock);
 450        th =  thread__get(____machine__findnew_thread(machine, pid, tid, false));
 451        pthread_rwlock_unlock(&machine->threads_lock);
 452        return th;
 453}
 454
 455struct comm *machine__thread_exec_comm(struct machine *machine,
 456                                       struct thread *thread)
 457{
 458        if (machine->comm_exec)
 459                return thread__exec_comm(thread);
 460        else
 461                return thread__comm(thread);
 462}
 463
 464int machine__process_comm_event(struct machine *machine, union perf_event *event,
 465                                struct perf_sample *sample)
 466{
 467        struct thread *thread = machine__findnew_thread(machine,
 468                                                        event->comm.pid,
 469                                                        event->comm.tid);
 470        bool exec = event->header.misc & PERF_RECORD_MISC_COMM_EXEC;
 471        int err = 0;
 472
 473        if (exec)
 474                machine->comm_exec = true;
 475
 476        if (dump_trace)
 477                perf_event__fprintf_comm(event, stdout);
 478
 479        if (thread == NULL ||
 480            __thread__set_comm(thread, event->comm.comm, sample->time, exec)) {
 481                dump_printf("problem processing PERF_RECORD_COMM, skipping event.\n");
 482                err = -1;
 483        }
 484
 485        thread__put(thread);
 486
 487        return err;
 488}
 489
 490int machine__process_lost_event(struct machine *machine __maybe_unused,
 491                                union perf_event *event, struct perf_sample *sample __maybe_unused)
 492{
 493        dump_printf(": id:%" PRIu64 ": lost:%" PRIu64 "\n",
 494                    event->lost.id, event->lost.lost);
 495        return 0;
 496}
 497
 498int machine__process_lost_samples_event(struct machine *machine __maybe_unused,
 499                                        union perf_event *event, struct perf_sample *sample)
 500{
 501        dump_printf(": id:%" PRIu64 ": lost samples :%" PRIu64 "\n",
 502                    sample->id, event->lost_samples.lost);
 503        return 0;
 504}
 505
 506static struct dso *machine__findnew_module_dso(struct machine *machine,
 507                                               struct kmod_path *m,
 508                                               const char *filename)
 509{
 510        struct dso *dso;
 511
 512        pthread_rwlock_wrlock(&machine->dsos.lock);
 513
 514        dso = __dsos__find(&machine->dsos, m->name, true);
 515        if (!dso) {
 516                dso = __dsos__addnew(&machine->dsos, m->name);
 517                if (dso == NULL)
 518                        goto out_unlock;
 519
 520                if (machine__is_host(machine))
 521                        dso->symtab_type = DSO_BINARY_TYPE__SYSTEM_PATH_KMODULE;
 522                else
 523                        dso->symtab_type = DSO_BINARY_TYPE__GUEST_KMODULE;
 524
 525                /* _KMODULE_COMP should be next to _KMODULE */
 526                if (m->kmod && m->comp)
 527                        dso->symtab_type++;
 528
 529                dso__set_short_name(dso, strdup(m->name), true);
 530                dso__set_long_name(dso, strdup(filename), true);
 531        }
 532
 533        dso__get(dso);
 534out_unlock:
 535        pthread_rwlock_unlock(&machine->dsos.lock);
 536        return dso;
 537}
 538
 539int machine__process_aux_event(struct machine *machine __maybe_unused,
 540                               union perf_event *event)
 541{
 542        if (dump_trace)
 543                perf_event__fprintf_aux(event, stdout);
 544        return 0;
 545}
 546
 547int machine__process_itrace_start_event(struct machine *machine __maybe_unused,
 548                                        union perf_event *event)
 549{
 550        if (dump_trace)
 551                perf_event__fprintf_itrace_start(event, stdout);
 552        return 0;
 553}
 554
 555int machine__process_switch_event(struct machine *machine __maybe_unused,
 556                                  union perf_event *event)
 557{
 558        if (dump_trace)
 559                perf_event__fprintf_switch(event, stdout);
 560        return 0;
 561}
 562
 563struct map *machine__findnew_module_map(struct machine *machine, u64 start,
 564                                        const char *filename)
 565{
 566        struct map *map = NULL;
 567        struct dso *dso;
 568        struct kmod_path m;
 569
 570        if (kmod_path__parse_name(&m, filename))
 571                return NULL;
 572
 573        map = map_groups__find_by_name(&machine->kmaps, MAP__FUNCTION,
 574                                       m.name);
 575        if (map)
 576                goto out;
 577
 578        dso = machine__findnew_module_dso(machine, &m, filename);
 579        if (dso == NULL)
 580                goto out;
 581
 582        map = map__new2(start, dso, MAP__FUNCTION);
 583        if (map == NULL)
 584                goto out;
 585
 586        map_groups__insert(&machine->kmaps, map);
 587
 588out:
 589        free(m.name);
 590        return map;
 591}
 592
 593size_t machines__fprintf_dsos(struct machines *machines, FILE *fp)
 594{
 595        struct rb_node *nd;
 596        size_t ret = __dsos__fprintf(&machines->host.dsos.head, fp);
 597
 598        for (nd = rb_first(&machines->guests); nd; nd = rb_next(nd)) {
 599                struct machine *pos = rb_entry(nd, struct machine, rb_node);
 600                ret += __dsos__fprintf(&pos->dsos.head, fp);
 601        }
 602
 603        return ret;
 604}
 605
 606size_t machine__fprintf_dsos_buildid(struct machine *m, FILE *fp,
 607                                     bool (skip)(struct dso *dso, int parm), int parm)
 608{
 609        return __dsos__fprintf_buildid(&m->dsos.head, fp, skip, parm);
 610}
 611
 612size_t machines__fprintf_dsos_buildid(struct machines *machines, FILE *fp,
 613                                     bool (skip)(struct dso *dso, int parm), int parm)
 614{
 615        struct rb_node *nd;
 616        size_t ret = machine__fprintf_dsos_buildid(&machines->host, fp, skip, parm);
 617
 618        for (nd = rb_first(&machines->guests); nd; nd = rb_next(nd)) {
 619                struct machine *pos = rb_entry(nd, struct machine, rb_node);
 620                ret += machine__fprintf_dsos_buildid(pos, fp, skip, parm);
 621        }
 622        return ret;
 623}
 624
 625size_t machine__fprintf_vmlinux_path(struct machine *machine, FILE *fp)
 626{
 627        int i;
 628        size_t printed = 0;
 629        struct dso *kdso = machine__kernel_map(machine)->dso;
 630
 631        if (kdso->has_build_id) {
 632                char filename[PATH_MAX];
 633                if (dso__build_id_filename(kdso, filename, sizeof(filename)))
 634                        printed += fprintf(fp, "[0] %s\n", filename);
 635        }
 636
 637        for (i = 0; i < vmlinux_path__nr_entries; ++i)
 638                printed += fprintf(fp, "[%d] %s\n",
 639                                   i + kdso->has_build_id, vmlinux_path[i]);
 640
 641        return printed;
 642}
 643
 644size_t machine__fprintf(struct machine *machine, FILE *fp)
 645{
 646        size_t ret = 0;
 647        struct rb_node *nd;
 648
 649        pthread_rwlock_rdlock(&machine->threads_lock);
 650
 651        for (nd = rb_first(&machine->threads); nd; nd = rb_next(nd)) {
 652                struct thread *pos = rb_entry(nd, struct thread, rb_node);
 653
 654                ret += thread__fprintf(pos, fp);
 655        }
 656
 657        pthread_rwlock_unlock(&machine->threads_lock);
 658
 659        return ret;
 660}
 661
 662static struct dso *machine__get_kernel(struct machine *machine)
 663{
 664        const char *vmlinux_name = NULL;
 665        struct dso *kernel;
 666
 667        if (machine__is_host(machine)) {
 668                vmlinux_name = symbol_conf.vmlinux_name;
 669                if (!vmlinux_name)
 670                        vmlinux_name = "[kernel.kallsyms]";
 671
 672                kernel = machine__findnew_kernel(machine, vmlinux_name,
 673                                                 "[kernel]", DSO_TYPE_KERNEL);
 674        } else {
 675                char bf[PATH_MAX];
 676
 677                if (machine__is_default_guest(machine))
 678                        vmlinux_name = symbol_conf.default_guest_vmlinux_name;
 679                if (!vmlinux_name)
 680                        vmlinux_name = machine__mmap_name(machine, bf,
 681                                                          sizeof(bf));
 682
 683                kernel = machine__findnew_kernel(machine, vmlinux_name,
 684                                                 "[guest.kernel]",
 685                                                 DSO_TYPE_GUEST_KERNEL);
 686        }
 687
 688        if (kernel != NULL && (!kernel->has_build_id))
 689                dso__read_running_kernel_build_id(kernel, machine);
 690
 691        return kernel;
 692}
 693
 694struct process_args {
 695        u64 start;
 696};
 697
 698static void machine__get_kallsyms_filename(struct machine *machine, char *buf,
 699                                           size_t bufsz)
 700{
 701        if (machine__is_default_guest(machine))
 702                scnprintf(buf, bufsz, "%s", symbol_conf.default_guest_kallsyms);
 703        else
 704                scnprintf(buf, bufsz, "%s/proc/kallsyms", machine->root_dir);
 705}
 706
 707const char *ref_reloc_sym_names[] = {"_text", "_stext", NULL};
 708
 709/* Figure out the start address of kernel map from /proc/kallsyms.
 710 * Returns the name of the start symbol in *symbol_name. Pass in NULL as
 711 * symbol_name if it's not that important.
 712 */
 713static u64 machine__get_running_kernel_start(struct machine *machine,
 714                                             const char **symbol_name)
 715{
 716        char filename[PATH_MAX];
 717        int i;
 718        const char *name;
 719        u64 addr = 0;
 720
 721        machine__get_kallsyms_filename(machine, filename, PATH_MAX);
 722
 723        if (symbol__restricted_filename(filename, "/proc/kallsyms"))
 724                return 0;
 725
 726        for (i = 0; (name = ref_reloc_sym_names[i]) != NULL; i++) {
 727                addr = kallsyms__get_function_start(filename, name);
 728                if (addr)
 729                        break;
 730        }
 731
 732        if (symbol_name)
 733                *symbol_name = name;
 734
 735        return addr;
 736}
 737
 738int __machine__create_kernel_maps(struct machine *machine, struct dso *kernel)
 739{
 740        enum map_type type;
 741        u64 start = machine__get_running_kernel_start(machine, NULL);
 742
 743        for (type = 0; type < MAP__NR_TYPES; ++type) {
 744                struct kmap *kmap;
 745                struct map *map;
 746
 747                machine->vmlinux_maps[type] = map__new2(start, kernel, type);
 748                if (machine->vmlinux_maps[type] == NULL)
 749                        return -1;
 750
 751                machine->vmlinux_maps[type]->map_ip =
 752                        machine->vmlinux_maps[type]->unmap_ip =
 753                                identity__map_ip;
 754                map = __machine__kernel_map(machine, type);
 755                kmap = map__kmap(map);
 756                if (!kmap)
 757                        return -1;
 758
 759                kmap->kmaps = &machine->kmaps;
 760                map_groups__insert(&machine->kmaps, map);
 761        }
 762
 763        return 0;
 764}
 765
 766void machine__destroy_kernel_maps(struct machine *machine)
 767{
 768        enum map_type type;
 769
 770        for (type = 0; type < MAP__NR_TYPES; ++type) {
 771                struct kmap *kmap;
 772                struct map *map = __machine__kernel_map(machine, type);
 773
 774                if (map == NULL)
 775                        continue;
 776
 777                kmap = map__kmap(map);
 778                map_groups__remove(&machine->kmaps, map);
 779                if (kmap && kmap->ref_reloc_sym) {
 780                        /*
 781                         * ref_reloc_sym is shared among all maps, so free just
 782                         * on one of them.
 783                         */
 784                        if (type == MAP__FUNCTION) {
 785                                zfree((char **)&kmap->ref_reloc_sym->name);
 786                                zfree(&kmap->ref_reloc_sym);
 787                        } else
 788                                kmap->ref_reloc_sym = NULL;
 789                }
 790
 791                machine->vmlinux_maps[type] = NULL;
 792        }
 793}
 794
 795int machines__create_guest_kernel_maps(struct machines *machines)
 796{
 797        int ret = 0;
 798        struct dirent **namelist = NULL;
 799        int i, items = 0;
 800        char path[PATH_MAX];
 801        pid_t pid;
 802        char *endp;
 803
 804        if (symbol_conf.default_guest_vmlinux_name ||
 805            symbol_conf.default_guest_modules ||
 806            symbol_conf.default_guest_kallsyms) {
 807                machines__create_kernel_maps(machines, DEFAULT_GUEST_KERNEL_ID);
 808        }
 809
 810        if (symbol_conf.guestmount) {
 811                items = scandir(symbol_conf.guestmount, &namelist, NULL, NULL);
 812                if (items <= 0)
 813                        return -ENOENT;
 814                for (i = 0; i < items; i++) {
 815                        if (!isdigit(namelist[i]->d_name[0])) {
 816                                /* Filter out . and .. */
 817                                continue;
 818                        }
 819                        pid = (pid_t)strtol(namelist[i]->d_name, &endp, 10);
 820                        if ((*endp != '\0') ||
 821                            (endp == namelist[i]->d_name) ||
 822                            (errno == ERANGE)) {
 823                                pr_debug("invalid directory (%s). Skipping.\n",
 824                                         namelist[i]->d_name);
 825                                continue;
 826                        }
 827                        sprintf(path, "%s/%s/proc/kallsyms",
 828                                symbol_conf.guestmount,
 829                                namelist[i]->d_name);
 830                        ret = access(path, R_OK);
 831                        if (ret) {
 832                                pr_debug("Can't access file %s\n", path);
 833                                goto failure;
 834                        }
 835                        machines__create_kernel_maps(machines, pid);
 836                }
 837failure:
 838                free(namelist);
 839        }
 840
 841        return ret;
 842}
 843
 844void machines__destroy_kernel_maps(struct machines *machines)
 845{
 846        struct rb_node *next = rb_first(&machines->guests);
 847
 848        machine__destroy_kernel_maps(&machines->host);
 849
 850        while (next) {
 851                struct machine *pos = rb_entry(next, struct machine, rb_node);
 852
 853                next = rb_next(&pos->rb_node);
 854                rb_erase(&pos->rb_node, &machines->guests);
 855                machine__delete(pos);
 856        }
 857}
 858
 859int machines__create_kernel_maps(struct machines *machines, pid_t pid)
 860{
 861        struct machine *machine = machines__findnew(machines, pid);
 862
 863        if (machine == NULL)
 864                return -1;
 865
 866        return machine__create_kernel_maps(machine);
 867}
 868
 869int machine__load_kallsyms(struct machine *machine, const char *filename,
 870                           enum map_type type, symbol_filter_t filter)
 871{
 872        struct map *map = machine__kernel_map(machine);
 873        int ret = dso__load_kallsyms(map->dso, filename, map, filter);
 874
 875        if (ret > 0) {
 876                dso__set_loaded(map->dso, type);
 877                /*
 878                 * Since /proc/kallsyms will have multiple sessions for the
 879                 * kernel, with modules between them, fixup the end of all
 880                 * sections.
 881                 */
 882                __map_groups__fixup_end(&machine->kmaps, type);
 883        }
 884
 885        return ret;
 886}
 887
 888int machine__load_vmlinux_path(struct machine *machine, enum map_type type,
 889                               symbol_filter_t filter)
 890{
 891        struct map *map = machine__kernel_map(machine);
 892        int ret = dso__load_vmlinux_path(map->dso, map, filter);
 893
 894        if (ret > 0)
 895                dso__set_loaded(map->dso, type);
 896
 897        return ret;
 898}
 899
 900static void map_groups__fixup_end(struct map_groups *mg)
 901{
 902        int i;
 903        for (i = 0; i < MAP__NR_TYPES; ++i)
 904                __map_groups__fixup_end(mg, i);
 905}
 906
 907static char *get_kernel_version(const char *root_dir)
 908{
 909        char version[PATH_MAX];
 910        FILE *file;
 911        char *name, *tmp;
 912        const char *prefix = "Linux version ";
 913
 914        sprintf(version, "%s/proc/version", root_dir);
 915        file = fopen(version, "r");
 916        if (!file)
 917                return NULL;
 918
 919        version[0] = '\0';
 920        tmp = fgets(version, sizeof(version), file);
 921        fclose(file);
 922
 923        name = strstr(version, prefix);
 924        if (!name)
 925                return NULL;
 926        name += strlen(prefix);
 927        tmp = strchr(name, ' ');
 928        if (tmp)
 929                *tmp = '\0';
 930
 931        return strdup(name);
 932}
 933
 934static bool is_kmod_dso(struct dso *dso)
 935{
 936        return dso->symtab_type == DSO_BINARY_TYPE__SYSTEM_PATH_KMODULE ||
 937               dso->symtab_type == DSO_BINARY_TYPE__GUEST_KMODULE;
 938}
 939
 940static int map_groups__set_module_path(struct map_groups *mg, const char *path,
 941                                       struct kmod_path *m)
 942{
 943        struct map *map;
 944        char *long_name;
 945
 946        map = map_groups__find_by_name(mg, MAP__FUNCTION, m->name);
 947        if (map == NULL)
 948                return 0;
 949
 950        long_name = strdup(path);
 951        if (long_name == NULL)
 952                return -ENOMEM;
 953
 954        dso__set_long_name(map->dso, long_name, true);
 955        dso__kernel_module_get_build_id(map->dso, "");
 956
 957        /*
 958         * Full name could reveal us kmod compression, so
 959         * we need to update the symtab_type if needed.
 960         */
 961        if (m->comp && is_kmod_dso(map->dso))
 962                map->dso->symtab_type++;
 963
 964        return 0;
 965}
 966
 967static int map_groups__set_modules_path_dir(struct map_groups *mg,
 968                                const char *dir_name, int depth)
 969{
 970        struct dirent *dent;
 971        DIR *dir = opendir(dir_name);
 972        int ret = 0;
 973
 974        if (!dir) {
 975                pr_debug("%s: cannot open %s dir\n", __func__, dir_name);
 976                return -1;
 977        }
 978
 979        while ((dent = readdir(dir)) != NULL) {
 980                char path[PATH_MAX];
 981                struct stat st;
 982
 983                /*sshfs might return bad dent->d_type, so we have to stat*/
 984                snprintf(path, sizeof(path), "%s/%s", dir_name, dent->d_name);
 985                if (stat(path, &st))
 986                        continue;
 987
 988                if (S_ISDIR(st.st_mode)) {
 989                        if (!strcmp(dent->d_name, ".") ||
 990                            !strcmp(dent->d_name, ".."))
 991                                continue;
 992
 993                        /* Do not follow top-level source and build symlinks */
 994                        if (depth == 0) {
 995                                if (!strcmp(dent->d_name, "source") ||
 996                                    !strcmp(dent->d_name, "build"))
 997                                        continue;
 998                        }
 999
1000                        ret = map_groups__set_modules_path_dir(mg, path,
1001                                                               depth + 1);
1002                        if (ret < 0)
1003                                goto out;
1004                } else {
1005                        struct kmod_path m;
1006
1007                        ret = kmod_path__parse_name(&m, dent->d_name);
1008                        if (ret)
1009                                goto out;
1010
1011                        if (m.kmod)
1012                                ret = map_groups__set_module_path(mg, path, &m);
1013
1014                        free(m.name);
1015
1016                        if (ret)
1017                                goto out;
1018                }
1019        }
1020
1021out:
1022        closedir(dir);
1023        return ret;
1024}
1025
1026static int machine__set_modules_path(struct machine *machine)
1027{
1028        char *version;
1029        char modules_path[PATH_MAX];
1030
1031        version = get_kernel_version(machine->root_dir);
1032        if (!version)
1033                return -1;
1034
1035        snprintf(modules_path, sizeof(modules_path), "%s/lib/modules/%s",
1036                 machine->root_dir, version);
1037        free(version);
1038
1039        return map_groups__set_modules_path_dir(&machine->kmaps, modules_path, 0);
1040}
1041
1042static int machine__create_module(void *arg, const char *name, u64 start)
1043{
1044        struct machine *machine = arg;
1045        struct map *map;
1046
1047        map = machine__findnew_module_map(machine, start, name);
1048        if (map == NULL)
1049                return -1;
1050
1051        dso__kernel_module_get_build_id(map->dso, machine->root_dir);
1052
1053        return 0;
1054}
1055
1056static int machine__create_modules(struct machine *machine)
1057{
1058        const char *modules;
1059        char path[PATH_MAX];
1060
1061        if (machine__is_default_guest(machine)) {
1062                modules = symbol_conf.default_guest_modules;
1063        } else {
1064                snprintf(path, PATH_MAX, "%s/proc/modules", machine->root_dir);
1065                modules = path;
1066        }
1067
1068        if (symbol__restricted_filename(modules, "/proc/modules"))
1069                return -1;
1070
1071        if (modules__parse(modules, machine, machine__create_module))
1072                return -1;
1073
1074        if (!machine__set_modules_path(machine))
1075                return 0;
1076
1077        pr_debug("Problems setting modules path maps, continuing anyway...\n");
1078
1079        return 0;
1080}
1081
1082int machine__create_kernel_maps(struct machine *machine)
1083{
1084        struct dso *kernel = machine__get_kernel(machine);
1085        const char *name;
1086        u64 addr = machine__get_running_kernel_start(machine, &name);
1087        if (!addr)
1088                return -1;
1089
1090        if (kernel == NULL ||
1091            __machine__create_kernel_maps(machine, kernel) < 0)
1092                return -1;
1093
1094        if (symbol_conf.use_modules && machine__create_modules(machine) < 0) {
1095                if (machine__is_host(machine))
1096                        pr_debug("Problems creating module maps, "
1097                                 "continuing anyway...\n");
1098                else
1099                        pr_debug("Problems creating module maps for guest %d, "
1100                                 "continuing anyway...\n", machine->pid);
1101        }
1102
1103        /*
1104         * Now that we have all the maps created, just set the ->end of them:
1105         */
1106        map_groups__fixup_end(&machine->kmaps);
1107
1108        if (maps__set_kallsyms_ref_reloc_sym(machine->vmlinux_maps, name,
1109                                             addr)) {
1110                machine__destroy_kernel_maps(machine);
1111                return -1;
1112        }
1113
1114        return 0;
1115}
1116
1117static void machine__set_kernel_mmap_len(struct machine *machine,
1118                                         union perf_event *event)
1119{
1120        int i;
1121
1122        for (i = 0; i < MAP__NR_TYPES; i++) {
1123                machine->vmlinux_maps[i]->start = event->mmap.start;
1124                machine->vmlinux_maps[i]->end   = (event->mmap.start +
1125                                                   event->mmap.len);
1126                /*
1127                 * Be a bit paranoid here, some perf.data file came with
1128                 * a zero sized synthesized MMAP event for the kernel.
1129                 */
1130                if (machine->vmlinux_maps[i]->end == 0)
1131                        machine->vmlinux_maps[i]->end = ~0ULL;
1132        }
1133}
1134
1135static bool machine__uses_kcore(struct machine *machine)
1136{
1137        struct dso *dso;
1138
1139        list_for_each_entry(dso, &machine->dsos.head, node) {
1140                if (dso__is_kcore(dso))
1141                        return true;
1142        }
1143
1144        return false;
1145}
1146
1147static int machine__process_kernel_mmap_event(struct machine *machine,
1148                                              union perf_event *event)
1149{
1150        struct map *map;
1151        char kmmap_prefix[PATH_MAX];
1152        enum dso_kernel_type kernel_type;
1153        bool is_kernel_mmap;
1154
1155        /* If we have maps from kcore then we do not need or want any others */
1156        if (machine__uses_kcore(machine))
1157                return 0;
1158
1159        machine__mmap_name(machine, kmmap_prefix, sizeof(kmmap_prefix));
1160        if (machine__is_host(machine))
1161                kernel_type = DSO_TYPE_KERNEL;
1162        else
1163                kernel_type = DSO_TYPE_GUEST_KERNEL;
1164
1165        is_kernel_mmap = memcmp(event->mmap.filename,
1166                                kmmap_prefix,
1167                                strlen(kmmap_prefix) - 1) == 0;
1168        if (event->mmap.filename[0] == '/' ||
1169            (!is_kernel_mmap && event->mmap.filename[0] == '[')) {
1170                map = machine__findnew_module_map(machine, event->mmap.start,
1171                                                  event->mmap.filename);
1172                if (map == NULL)
1173                        goto out_problem;
1174
1175                map->end = map->start + event->mmap.len;
1176        } else if (is_kernel_mmap) {
1177                const char *symbol_name = (event->mmap.filename +
1178                                strlen(kmmap_prefix));
1179                /*
1180                 * Should be there already, from the build-id table in
1181                 * the header.
1182                 */
1183                struct dso *kernel = NULL;
1184                struct dso *dso;
1185
1186                pthread_rwlock_rdlock(&machine->dsos.lock);
1187
1188                list_for_each_entry(dso, &machine->dsos.head, node) {
1189
1190                        /*
1191                         * The cpumode passed to is_kernel_module is not the
1192                         * cpumode of *this* event. If we insist on passing
1193                         * correct cpumode to is_kernel_module, we should
1194                         * record the cpumode when we adding this dso to the
1195                         * linked list.
1196                         *
1197                         * However we don't really need passing correct
1198                         * cpumode.  We know the correct cpumode must be kernel
1199                         * mode (if not, we should not link it onto kernel_dsos
1200                         * list).
1201                         *
1202                         * Therefore, we pass PERF_RECORD_MISC_CPUMODE_UNKNOWN.
1203                         * is_kernel_module() treats it as a kernel cpumode.
1204                         */
1205
1206                        if (!dso->kernel ||
1207                            is_kernel_module(dso->long_name,
1208                                             PERF_RECORD_MISC_CPUMODE_UNKNOWN))
1209                                continue;
1210
1211
1212                        kernel = dso;
1213                        break;
1214                }
1215
1216                pthread_rwlock_unlock(&machine->dsos.lock);
1217
1218                if (kernel == NULL)
1219                        kernel = machine__findnew_dso(machine, kmmap_prefix);
1220                if (kernel == NULL)
1221                        goto out_problem;
1222
1223                kernel->kernel = kernel_type;
1224                if (__machine__create_kernel_maps(machine, kernel) < 0) {
1225                        dso__put(kernel);
1226                        goto out_problem;
1227                }
1228
1229                if (strstr(kernel->long_name, "vmlinux"))
1230                        dso__set_short_name(kernel, "[kernel.vmlinux]", false);
1231
1232                machine__set_kernel_mmap_len(machine, event);
1233
1234                /*
1235                 * Avoid using a zero address (kptr_restrict) for the ref reloc
1236                 * symbol. Effectively having zero here means that at record
1237                 * time /proc/sys/kernel/kptr_restrict was non zero.
1238                 */
1239                if (event->mmap.pgoff != 0) {
1240                        maps__set_kallsyms_ref_reloc_sym(machine->vmlinux_maps,
1241                                                         symbol_name,
1242                                                         event->mmap.pgoff);
1243                }
1244
1245                if (machine__is_default_guest(machine)) {
1246                        /*
1247                         * preload dso of guest kernel and modules
1248                         */
1249                        dso__load(kernel, machine__kernel_map(machine), NULL);
1250                }
1251        }
1252        return 0;
1253out_problem:
1254        return -1;
1255}
1256
1257int machine__process_mmap2_event(struct machine *machine,
1258                                 union perf_event *event,
1259                                 struct perf_sample *sample __maybe_unused)
1260{
1261        u8 cpumode = event->header.misc & PERF_RECORD_MISC_CPUMODE_MASK;
1262        struct thread *thread;
1263        struct map *map;
1264        enum map_type type;
1265        int ret = 0;
1266
1267        if (dump_trace)
1268                perf_event__fprintf_mmap2(event, stdout);
1269
1270        if (cpumode == PERF_RECORD_MISC_GUEST_KERNEL ||
1271            cpumode == PERF_RECORD_MISC_KERNEL) {
1272                ret = machine__process_kernel_mmap_event(machine, event);
1273                if (ret < 0)
1274                        goto out_problem;
1275                return 0;
1276        }
1277
1278        thread = machine__findnew_thread(machine, event->mmap2.pid,
1279                                        event->mmap2.tid);
1280        if (thread == NULL)
1281                goto out_problem;
1282
1283        if (event->header.misc & PERF_RECORD_MISC_MMAP_DATA)
1284                type = MAP__VARIABLE;
1285        else
1286                type = MAP__FUNCTION;
1287
1288        map = map__new(machine, event->mmap2.start,
1289                        event->mmap2.len, event->mmap2.pgoff,
1290                        event->mmap2.pid, event->mmap2.maj,
1291                        event->mmap2.min, event->mmap2.ino,
1292                        event->mmap2.ino_generation,
1293                        event->mmap2.prot,
1294                        event->mmap2.flags,
1295                        event->mmap2.filename, type, thread);
1296
1297        if (map == NULL)
1298                goto out_problem_map;
1299
1300        thread__insert_map(thread, map);
1301        thread__put(thread);
1302        map__put(map);
1303        return 0;
1304
1305out_problem_map:
1306        thread__put(thread);
1307out_problem:
1308        dump_printf("problem processing PERF_RECORD_MMAP2, skipping event.\n");
1309        return 0;
1310}
1311
1312int machine__process_mmap_event(struct machine *machine, union perf_event *event,
1313                                struct perf_sample *sample __maybe_unused)
1314{
1315        u8 cpumode = event->header.misc & PERF_RECORD_MISC_CPUMODE_MASK;
1316        struct thread *thread;
1317        struct map *map;
1318        enum map_type type;
1319        int ret = 0;
1320
1321        if (dump_trace)
1322                perf_event__fprintf_mmap(event, stdout);
1323
1324        if (cpumode == PERF_RECORD_MISC_GUEST_KERNEL ||
1325            cpumode == PERF_RECORD_MISC_KERNEL) {
1326                ret = machine__process_kernel_mmap_event(machine, event);
1327                if (ret < 0)
1328                        goto out_problem;
1329                return 0;
1330        }
1331
1332        thread = machine__findnew_thread(machine, event->mmap.pid,
1333                                         event->mmap.tid);
1334        if (thread == NULL)
1335                goto out_problem;
1336
1337        if (event->header.misc & PERF_RECORD_MISC_MMAP_DATA)
1338                type = MAP__VARIABLE;
1339        else
1340                type = MAP__FUNCTION;
1341
1342        map = map__new(machine, event->mmap.start,
1343                        event->mmap.len, event->mmap.pgoff,
1344                        event->mmap.pid, 0, 0, 0, 0, 0, 0,
1345                        event->mmap.filename,
1346                        type, thread);
1347
1348        if (map == NULL)
1349                goto out_problem_map;
1350
1351        thread__insert_map(thread, map);
1352        thread__put(thread);
1353        map__put(map);
1354        return 0;
1355
1356out_problem_map:
1357        thread__put(thread);
1358out_problem:
1359        dump_printf("problem processing PERF_RECORD_MMAP, skipping event.\n");
1360        return 0;
1361}
1362
1363static void __machine__remove_thread(struct machine *machine, struct thread *th, bool lock)
1364{
1365        if (machine->last_match == th)
1366                machine->last_match = NULL;
1367
1368        BUG_ON(atomic_read(&th->refcnt) == 0);
1369        if (lock)
1370                pthread_rwlock_wrlock(&machine->threads_lock);
1371        rb_erase_init(&th->rb_node, &machine->threads);
1372        RB_CLEAR_NODE(&th->rb_node);
1373        /*
1374         * Move it first to the dead_threads list, then drop the reference,
1375         * if this is the last reference, then the thread__delete destructor
1376         * will be called and we will remove it from the dead_threads list.
1377         */
1378        list_add_tail(&th->node, &machine->dead_threads);
1379        if (lock)
1380                pthread_rwlock_unlock(&machine->threads_lock);
1381        thread__put(th);
1382}
1383
1384void machine__remove_thread(struct machine *machine, struct thread *th)
1385{
1386        return __machine__remove_thread(machine, th, true);
1387}
1388
1389int machine__process_fork_event(struct machine *machine, union perf_event *event,
1390                                struct perf_sample *sample)
1391{
1392        struct thread *thread = machine__find_thread(machine,
1393                                                     event->fork.pid,
1394                                                     event->fork.tid);
1395        struct thread *parent = machine__findnew_thread(machine,
1396                                                        event->fork.ppid,
1397                                                        event->fork.ptid);
1398        int err = 0;
1399
1400        if (dump_trace)
1401                perf_event__fprintf_task(event, stdout);
1402
1403        /*
1404         * There may be an existing thread that is not actually the parent,
1405         * either because we are processing events out of order, or because the
1406         * (fork) event that would have removed the thread was lost. Assume the
1407         * latter case and continue on as best we can.
1408         */
1409        if (parent->pid_ != (pid_t)event->fork.ppid) {
1410                dump_printf("removing erroneous parent thread %d/%d\n",
1411                            parent->pid_, parent->tid);
1412                machine__remove_thread(machine, parent);
1413                thread__put(parent);
1414                parent = machine__findnew_thread(machine, event->fork.ppid,
1415                                                 event->fork.ptid);
1416        }
1417
1418        /* if a thread currently exists for the thread id remove it */
1419        if (thread != NULL) {
1420                machine__remove_thread(machine, thread);
1421                thread__put(thread);
1422        }
1423
1424        thread = machine__findnew_thread(machine, event->fork.pid,
1425                                         event->fork.tid);
1426
1427        if (thread == NULL || parent == NULL ||
1428            thread__fork(thread, parent, sample->time) < 0) {
1429                dump_printf("problem processing PERF_RECORD_FORK, skipping event.\n");
1430                err = -1;
1431        }
1432        thread__put(thread);
1433        thread__put(parent);
1434
1435        return err;
1436}
1437
1438int machine__process_exit_event(struct machine *machine, union perf_event *event,
1439                                struct perf_sample *sample __maybe_unused)
1440{
1441        struct thread *thread = machine__find_thread(machine,
1442                                                     event->fork.pid,
1443                                                     event->fork.tid);
1444
1445        if (dump_trace)
1446                perf_event__fprintf_task(event, stdout);
1447
1448        if (thread != NULL) {
1449                thread__exited(thread);
1450                thread__put(thread);
1451        }
1452
1453        return 0;
1454}
1455
1456int machine__process_event(struct machine *machine, union perf_event *event,
1457                           struct perf_sample *sample)
1458{
1459        int ret;
1460
1461        switch (event->header.type) {
1462        case PERF_RECORD_COMM:
1463                ret = machine__process_comm_event(machine, event, sample); break;
1464        case PERF_RECORD_MMAP:
1465                ret = machine__process_mmap_event(machine, event, sample); break;
1466        case PERF_RECORD_MMAP2:
1467                ret = machine__process_mmap2_event(machine, event, sample); break;
1468        case PERF_RECORD_FORK:
1469                ret = machine__process_fork_event(machine, event, sample); break;
1470        case PERF_RECORD_EXIT:
1471                ret = machine__process_exit_event(machine, event, sample); break;
1472        case PERF_RECORD_LOST:
1473                ret = machine__process_lost_event(machine, event, sample); break;
1474        case PERF_RECORD_AUX:
1475                ret = machine__process_aux_event(machine, event); break;
1476        case PERF_RECORD_ITRACE_START:
1477                ret = machine__process_itrace_start_event(machine, event); break;
1478        case PERF_RECORD_LOST_SAMPLES:
1479                ret = machine__process_lost_samples_event(machine, event, sample); break;
1480        case PERF_RECORD_SWITCH:
1481        case PERF_RECORD_SWITCH_CPU_WIDE:
1482                ret = machine__process_switch_event(machine, event); break;
1483        default:
1484                ret = -1;
1485                break;
1486        }
1487
1488        return ret;
1489}
1490
1491static bool symbol__match_regex(struct symbol *sym, regex_t *regex)
1492{
1493        if (sym->name && !regexec(regex, sym->name, 0, NULL, 0))
1494                return 1;
1495        return 0;
1496}
1497
1498static void ip__resolve_ams(struct thread *thread,
1499                            struct addr_map_symbol *ams,
1500                            u64 ip)
1501{
1502        struct addr_location al;
1503
1504        memset(&al, 0, sizeof(al));
1505        /*
1506         * We cannot use the header.misc hint to determine whether a
1507         * branch stack address is user, kernel, guest, hypervisor.
1508         * Branches may straddle the kernel/user/hypervisor boundaries.
1509         * Thus, we have to try consecutively until we find a match
1510         * or else, the symbol is unknown
1511         */
1512        thread__find_cpumode_addr_location(thread, MAP__FUNCTION, ip, &al);
1513
1514        ams->addr = ip;
1515        ams->al_addr = al.addr;
1516        ams->sym = al.sym;
1517        ams->map = al.map;
1518}
1519
1520static void ip__resolve_data(struct thread *thread,
1521                             u8 m, struct addr_map_symbol *ams, u64 addr)
1522{
1523        struct addr_location al;
1524
1525        memset(&al, 0, sizeof(al));
1526
1527        thread__find_addr_location(thread, m, MAP__VARIABLE, addr, &al);
1528        if (al.map == NULL) {
1529                /*
1530                 * some shared data regions have execute bit set which puts
1531                 * their mapping in the MAP__FUNCTION type array.
1532                 * Check there as a fallback option before dropping the sample.
1533                 */
1534                thread__find_addr_location(thread, m, MAP__FUNCTION, addr, &al);
1535        }
1536
1537        ams->addr = addr;
1538        ams->al_addr = al.addr;
1539        ams->sym = al.sym;
1540        ams->map = al.map;
1541}
1542
1543struct mem_info *sample__resolve_mem(struct perf_sample *sample,
1544                                     struct addr_location *al)
1545{
1546        struct mem_info *mi = zalloc(sizeof(*mi));
1547
1548        if (!mi)
1549                return NULL;
1550
1551        ip__resolve_ams(al->thread, &mi->iaddr, sample->ip);
1552        ip__resolve_data(al->thread, al->cpumode, &mi->daddr, sample->addr);
1553        mi->data_src.val = sample->data_src;
1554
1555        return mi;
1556}
1557
1558static int add_callchain_ip(struct thread *thread,
1559                            struct symbol **parent,
1560                            struct addr_location *root_al,
1561                            u8 *cpumode,
1562                            u64 ip)
1563{
1564        struct addr_location al;
1565
1566        al.filtered = 0;
1567        al.sym = NULL;
1568        if (!cpumode) {
1569                thread__find_cpumode_addr_location(thread, MAP__FUNCTION,
1570                                                   ip, &al);
1571        } else {
1572                if (ip >= PERF_CONTEXT_MAX) {
1573                        switch (ip) {
1574                        case PERF_CONTEXT_HV:
1575                                *cpumode = PERF_RECORD_MISC_HYPERVISOR;
1576                                break;
1577                        case PERF_CONTEXT_KERNEL:
1578                                *cpumode = PERF_RECORD_MISC_KERNEL;
1579                                break;
1580                        case PERF_CONTEXT_USER:
1581                                *cpumode = PERF_RECORD_MISC_USER;
1582                                break;
1583                        default:
1584                                pr_debug("invalid callchain context: "
1585                                         "%"PRId64"\n", (s64) ip);
1586                                /*
1587                                 * It seems the callchain is corrupted.
1588                                 * Discard all.
1589                                 */
1590                                callchain_cursor_reset(&callchain_cursor);
1591                                return 1;
1592                        }
1593                        return 0;
1594                }
1595                thread__find_addr_location(thread, *cpumode, MAP__FUNCTION,
1596                                           ip, &al);
1597        }
1598
1599        if (al.sym != NULL) {
1600                if (sort__has_parent && !*parent &&
1601                    symbol__match_regex(al.sym, &parent_regex))
1602                        *parent = al.sym;
1603                else if (have_ignore_callees && root_al &&
1604                  symbol__match_regex(al.sym, &ignore_callees_regex)) {
1605                        /* Treat this symbol as the root,
1606                           forgetting its callees. */
1607                        *root_al = al;
1608                        callchain_cursor_reset(&callchain_cursor);
1609                }
1610        }
1611
1612        return callchain_cursor_append(&callchain_cursor, al.addr, al.map, al.sym);
1613}
1614
1615struct branch_info *sample__resolve_bstack(struct perf_sample *sample,
1616                                           struct addr_location *al)
1617{
1618        unsigned int i;
1619        const struct branch_stack *bs = sample->branch_stack;
1620        struct branch_info *bi = calloc(bs->nr, sizeof(struct branch_info));
1621
1622        if (!bi)
1623                return NULL;
1624
1625        for (i = 0; i < bs->nr; i++) {
1626                ip__resolve_ams(al->thread, &bi[i].to, bs->entries[i].to);
1627                ip__resolve_ams(al->thread, &bi[i].from, bs->entries[i].from);
1628                bi[i].flags = bs->entries[i].flags;
1629        }
1630        return bi;
1631}
1632
1633#define CHASHSZ 127
1634#define CHASHBITS 7
1635#define NO_ENTRY 0xff
1636
1637#define PERF_MAX_BRANCH_DEPTH 127
1638
1639/* Remove loops. */
1640static int remove_loops(struct branch_entry *l, int nr)
1641{
1642        int i, j, off;
1643        unsigned char chash[CHASHSZ];
1644
1645        memset(chash, NO_ENTRY, sizeof(chash));
1646
1647        BUG_ON(PERF_MAX_BRANCH_DEPTH > 255);
1648
1649        for (i = 0; i < nr; i++) {
1650                int h = hash_64(l[i].from, CHASHBITS) % CHASHSZ;
1651
1652                /* no collision handling for now */
1653                if (chash[h] == NO_ENTRY) {
1654                        chash[h] = i;
1655                } else if (l[chash[h]].from == l[i].from) {
1656                        bool is_loop = true;
1657                        /* check if it is a real loop */
1658                        off = 0;
1659                        for (j = chash[h]; j < i && i + off < nr; j++, off++)
1660                                if (l[j].from != l[i + off].from) {
1661                                        is_loop = false;
1662                                        break;
1663                                }
1664                        if (is_loop) {
1665                                memmove(l + i, l + i + off,
1666                                        (nr - (i + off)) * sizeof(*l));
1667                                nr -= off;
1668                        }
1669                }
1670        }
1671        return nr;
1672}
1673
1674/*
1675 * Recolve LBR callstack chain sample
1676 * Return:
1677 * 1 on success get LBR callchain information
1678 * 0 no available LBR callchain information, should try fp
1679 * negative error code on other errors.
1680 */
1681static int resolve_lbr_callchain_sample(struct thread *thread,
1682                                        struct perf_sample *sample,
1683                                        struct symbol **parent,
1684                                        struct addr_location *root_al,
1685                                        int max_stack)
1686{
1687        struct ip_callchain *chain = sample->callchain;
1688        int chain_nr = min(max_stack, (int)chain->nr);
1689        u8 cpumode = PERF_RECORD_MISC_USER;
1690        int i, j, err;
1691        u64 ip;
1692
1693        for (i = 0; i < chain_nr; i++) {
1694                if (chain->ips[i] == PERF_CONTEXT_USER)
1695                        break;
1696        }
1697
1698        /* LBR only affects the user callchain */
1699        if (i != chain_nr) {
1700                struct branch_stack *lbr_stack = sample->branch_stack;
1701                int lbr_nr = lbr_stack->nr;
1702                /*
1703                 * LBR callstack can only get user call chain.
1704                 * The mix_chain_nr is kernel call chain
1705                 * number plus LBR user call chain number.
1706                 * i is kernel call chain number,
1707                 * 1 is PERF_CONTEXT_USER,
1708                 * lbr_nr + 1 is the user call chain number.
1709                 * For details, please refer to the comments
1710                 * in callchain__printf
1711                 */
1712                int mix_chain_nr = i + 1 + lbr_nr + 1;
1713
1714                if (mix_chain_nr > PERF_MAX_STACK_DEPTH + PERF_MAX_BRANCH_DEPTH) {
1715                        pr_warning("corrupted callchain. skipping...\n");
1716                        return 0;
1717                }
1718
1719                for (j = 0; j < mix_chain_nr; j++) {
1720                        if (callchain_param.order == ORDER_CALLEE) {
1721                                if (j < i + 1)
1722                                        ip = chain->ips[j];
1723                                else if (j > i + 1)
1724                                        ip = lbr_stack->entries[j - i - 2].from;
1725                                else
1726                                        ip = lbr_stack->entries[0].to;
1727                        } else {
1728                                if (j < lbr_nr)
1729                                        ip = lbr_stack->entries[lbr_nr - j - 1].from;
1730                                else if (j > lbr_nr)
1731                                        ip = chain->ips[i + 1 - (j - lbr_nr)];
1732                                else
1733                                        ip = lbr_stack->entries[0].to;
1734                        }
1735
1736                        err = add_callchain_ip(thread, parent, root_al, &cpumode, ip);
1737                        if (err)
1738                                return (err < 0) ? err : 0;
1739                }
1740                return 1;
1741        }
1742
1743        return 0;
1744}
1745
1746static int thread__resolve_callchain_sample(struct thread *thread,
1747                                            struct perf_evsel *evsel,
1748                                            struct perf_sample *sample,
1749                                            struct symbol **parent,
1750                                            struct addr_location *root_al,
1751                                            int max_stack)
1752{
1753        struct branch_stack *branch = sample->branch_stack;
1754        struct ip_callchain *chain = sample->callchain;
1755        int chain_nr = min(max_stack, (int)chain->nr);
1756        u8 cpumode = PERF_RECORD_MISC_USER;
1757        int i, j, err;
1758        int skip_idx = -1;
1759        int first_call = 0;
1760
1761        callchain_cursor_reset(&callchain_cursor);
1762
1763        if (has_branch_callstack(evsel)) {
1764                err = resolve_lbr_callchain_sample(thread, sample, parent,
1765                                                   root_al, max_stack);
1766                if (err)
1767                        return (err < 0) ? err : 0;
1768        }
1769
1770        /*
1771         * Based on DWARF debug information, some architectures skip
1772         * a callchain entry saved by the kernel.
1773         */
1774        if (chain->nr < PERF_MAX_STACK_DEPTH)
1775                skip_idx = arch_skip_callchain_idx(thread, chain);
1776
1777        /*
1778         * Add branches to call stack for easier browsing. This gives
1779         * more context for a sample than just the callers.
1780         *
1781         * This uses individual histograms of paths compared to the
1782         * aggregated histograms the normal LBR mode uses.
1783         *
1784         * Limitations for now:
1785         * - No extra filters
1786         * - No annotations (should annotate somehow)
1787         */
1788
1789        if (branch && callchain_param.branch_callstack) {
1790                int nr = min(max_stack, (int)branch->nr);
1791                struct branch_entry be[nr];
1792
1793                if (branch->nr > PERF_MAX_BRANCH_DEPTH) {
1794                        pr_warning("corrupted branch chain. skipping...\n");
1795                        goto check_calls;
1796                }
1797
1798                for (i = 0; i < nr; i++) {
1799                        if (callchain_param.order == ORDER_CALLEE) {
1800                                be[i] = branch->entries[i];
1801                                /*
1802                                 * Check for overlap into the callchain.
1803                                 * The return address is one off compared to
1804                                 * the branch entry. To adjust for this
1805                                 * assume the calling instruction is not longer
1806                                 * than 8 bytes.
1807                                 */
1808                                if (i == skip_idx ||
1809                                    chain->ips[first_call] >= PERF_CONTEXT_MAX)
1810                                        first_call++;
1811                                else if (be[i].from < chain->ips[first_call] &&
1812                                    be[i].from >= chain->ips[first_call] - 8)
1813                                        first_call++;
1814                        } else
1815                                be[i] = branch->entries[branch->nr - i - 1];
1816                }
1817
1818                nr = remove_loops(be, nr);
1819
1820                for (i = 0; i < nr; i++) {
1821                        err = add_callchain_ip(thread, parent, root_al,
1822                                               NULL, be[i].to);
1823                        if (!err)
1824                                err = add_callchain_ip(thread, parent, root_al,
1825                                                       NULL, be[i].from);
1826                        if (err == -EINVAL)
1827                                break;
1828                        if (err)
1829                                return err;
1830                }
1831                chain_nr -= nr;
1832        }
1833
1834check_calls:
1835        if (chain->nr > PERF_MAX_STACK_DEPTH && (int)chain->nr > max_stack) {
1836                pr_warning("corrupted callchain. skipping...\n");
1837                return 0;
1838        }
1839
1840        for (i = first_call; i < chain_nr; i++) {
1841                u64 ip;
1842
1843                if (callchain_param.order == ORDER_CALLEE)
1844                        j = i;
1845                else
1846                        j = chain->nr - i - 1;
1847
1848#ifdef HAVE_SKIP_CALLCHAIN_IDX
1849                if (j == skip_idx)
1850                        continue;
1851#endif
1852                ip = chain->ips[j];
1853
1854                err = add_callchain_ip(thread, parent, root_al, &cpumode, ip);
1855
1856                if (err)
1857                        return (err < 0) ? err : 0;
1858        }
1859
1860        return 0;
1861}
1862
1863static int unwind_entry(struct unwind_entry *entry, void *arg)
1864{
1865        struct callchain_cursor *cursor = arg;
1866        return callchain_cursor_append(cursor, entry->ip,
1867                                       entry->map, entry->sym);
1868}
1869
1870int thread__resolve_callchain(struct thread *thread,
1871                              struct perf_evsel *evsel,
1872                              struct perf_sample *sample,
1873                              struct symbol **parent,
1874                              struct addr_location *root_al,
1875                              int max_stack)
1876{
1877        int ret = thread__resolve_callchain_sample(thread, evsel,
1878                                                   sample, parent,
1879                                                   root_al, max_stack);
1880        if (ret)
1881                return ret;
1882
1883        /* Can we do dwarf post unwind? */
1884        if (!((evsel->attr.sample_type & PERF_SAMPLE_REGS_USER) &&
1885              (evsel->attr.sample_type & PERF_SAMPLE_STACK_USER)))
1886                return 0;
1887
1888        /* Bail out if nothing was captured. */
1889        if ((!sample->user_regs.regs) ||
1890            (!sample->user_stack.size))
1891                return 0;
1892
1893        return unwind__get_entries(unwind_entry, &callchain_cursor,
1894                                   thread, sample, max_stack);
1895
1896}
1897
1898int machine__for_each_thread(struct machine *machine,
1899                             int (*fn)(struct thread *thread, void *p),
1900                             void *priv)
1901{
1902        struct rb_node *nd;
1903        struct thread *thread;
1904        int rc = 0;
1905
1906        for (nd = rb_first(&machine->threads); nd; nd = rb_next(nd)) {
1907                thread = rb_entry(nd, struct thread, rb_node);
1908                rc = fn(thread, priv);
1909                if (rc != 0)
1910                        return rc;
1911        }
1912
1913        list_for_each_entry(thread, &machine->dead_threads, node) {
1914                rc = fn(thread, priv);
1915                if (rc != 0)
1916                        return rc;
1917        }
1918        return rc;
1919}
1920
1921int machines__for_each_thread(struct machines *machines,
1922                              int (*fn)(struct thread *thread, void *p),
1923                              void *priv)
1924{
1925        struct rb_node *nd;
1926        int rc = 0;
1927
1928        rc = machine__for_each_thread(&machines->host, fn, priv);
1929        if (rc != 0)
1930                return rc;
1931
1932        for (nd = rb_first(&machines->guests); nd; nd = rb_next(nd)) {
1933                struct machine *machine = rb_entry(nd, struct machine, rb_node);
1934
1935                rc = machine__for_each_thread(machine, fn, priv);
1936                if (rc != 0)
1937                        return rc;
1938        }
1939        return rc;
1940}
1941
1942int __machine__synthesize_threads(struct machine *machine, struct perf_tool *tool,
1943                                  struct target *target, struct thread_map *threads,
1944                                  perf_event__handler_t process, bool data_mmap,
1945                                  unsigned int proc_map_timeout)
1946{
1947        if (target__has_task(target))
1948                return perf_event__synthesize_thread_map(tool, threads, process, machine, data_mmap, proc_map_timeout);
1949        else if (target__has_cpu(target))
1950                return perf_event__synthesize_threads(tool, process, machine, data_mmap, proc_map_timeout);
1951        /* command specified */
1952        return 0;
1953}
1954
1955pid_t machine__get_current_tid(struct machine *machine, int cpu)
1956{
1957        if (cpu < 0 || cpu >= MAX_NR_CPUS || !machine->current_tid)
1958                return -1;
1959
1960        return machine->current_tid[cpu];
1961}
1962
1963int machine__set_current_tid(struct machine *machine, int cpu, pid_t pid,
1964                             pid_t tid)
1965{
1966        struct thread *thread;
1967
1968        if (cpu < 0)
1969                return -EINVAL;
1970
1971        if (!machine->current_tid) {
1972                int i;
1973
1974                machine->current_tid = calloc(MAX_NR_CPUS, sizeof(pid_t));
1975                if (!machine->current_tid)
1976                        return -ENOMEM;
1977                for (i = 0; i < MAX_NR_CPUS; i++)
1978                        machine->current_tid[i] = -1;
1979        }
1980
1981        if (cpu >= MAX_NR_CPUS) {
1982                pr_err("Requested CPU %d too large. ", cpu);
1983                pr_err("Consider raising MAX_NR_CPUS\n");
1984                return -EINVAL;
1985        }
1986
1987        machine->current_tid[cpu] = tid;
1988
1989        thread = machine__findnew_thread(machine, pid, tid);
1990        if (!thread)
1991                return -ENOMEM;
1992
1993        thread->cpu = cpu;
1994        thread__put(thread);
1995
1996        return 0;
1997}
1998
1999int machine__get_kernel_start(struct machine *machine)
2000{
2001        struct map *map = machine__kernel_map(machine);
2002        int err = 0;
2003
2004        /*
2005         * The only addresses above 2^63 are kernel addresses of a 64-bit
2006         * kernel.  Note that addresses are unsigned so that on a 32-bit system
2007         * all addresses including kernel addresses are less than 2^32.  In
2008         * that case (32-bit system), if the kernel mapping is unknown, all
2009         * addresses will be assumed to be in user space - see
2010         * machine__kernel_ip().
2011         */
2012        machine->kernel_start = 1ULL << 63;
2013        if (map) {
2014                err = map__load(map, machine->symbol_filter);
2015                if (map->start)
2016                        machine->kernel_start = map->start;
2017        }
2018        return err;
2019}
2020
2021struct dso *machine__findnew_dso(struct machine *machine, const char *filename)
2022{
2023        return dsos__findnew(&machine->dsos, filename);
2024}
2025
2026char *machine__resolve_kernel_addr(void *vmachine, unsigned long long *addrp, char **modp)
2027{
2028        struct machine *machine = vmachine;
2029        struct map *map;
2030        struct symbol *sym = map_groups__find_symbol(&machine->kmaps, MAP__FUNCTION, *addrp, &map,  NULL);
2031
2032        if (sym == NULL)
2033                return NULL;
2034
2035        *modp = __map__is_kmodule(map) ? (char *)map->dso->short_name : NULL;
2036        *addrp = map->unmap_ip(map, sym->start);
2037        return sym->name;
2038}
2039