linux/tools/perf/tests/parse-no-sample-id-all.c
<<
>>
Prefs
   1#include <linux/types.h>
   2#include <stddef.h>
   3
   4#include "tests.h"
   5
   6#include "event.h"
   7#include "evlist.h"
   8#include "header.h"
   9#include "util.h"
  10#include "debug.h"
  11
  12static int process_event(struct perf_evlist **pevlist, union perf_event *event)
  13{
  14        struct perf_sample sample;
  15
  16        if (event->header.type == PERF_RECORD_HEADER_ATTR) {
  17                if (perf_event__process_attr(NULL, event, pevlist)) {
  18                        pr_debug("perf_event__process_attr failed\n");
  19                        return -1;
  20                }
  21                return 0;
  22        }
  23
  24        if (event->header.type >= PERF_RECORD_USER_TYPE_START)
  25                return -1;
  26
  27        if (!*pevlist)
  28                return -1;
  29
  30        if (perf_evlist__parse_sample(*pevlist, event, &sample)) {
  31                pr_debug("perf_evlist__parse_sample failed\n");
  32                return -1;
  33        }
  34
  35        return 0;
  36}
  37
  38static int process_events(union perf_event **events, size_t count)
  39{
  40        struct perf_evlist *evlist = NULL;
  41        int err = 0;
  42        size_t i;
  43
  44        for (i = 0; i < count && !err; i++)
  45                err = process_event(&evlist, events[i]);
  46
  47        perf_evlist__delete(evlist);
  48
  49        return err;
  50}
  51
  52struct test_attr_event {
  53        struct attr_event attr;
  54        u64 id;
  55};
  56
  57/**
  58 * test__parse_no_sample_id_all - test parsing with no sample_id_all bit set.
  59 *
  60 * This function tests parsing data produced on kernel's that do not support the
  61 * sample_id_all bit.  Without the sample_id_all bit, non-sample events (such as
  62 * mmap events) do not have an id sample appended, and consequently logic
  63 * designed to determine the id will not work.  That case happens when there is
  64 * more than one selected event, so this test processes three events: 2
  65 * attributes representing the selected events and one mmap event.
  66 *
  67 * Return: %0 on success, %-1 if the test fails.
  68 */
  69int test__parse_no_sample_id_all(int subtest __maybe_unused)
  70{
  71        int err;
  72
  73        struct test_attr_event event1 = {
  74                .attr = {
  75                        .header = {
  76                                .type = PERF_RECORD_HEADER_ATTR,
  77                                .size = sizeof(struct test_attr_event),
  78                        },
  79                },
  80                .id = 1,
  81        };
  82        struct test_attr_event event2 = {
  83                .attr = {
  84                        .header = {
  85                                .type = PERF_RECORD_HEADER_ATTR,
  86                                .size = sizeof(struct test_attr_event),
  87                        },
  88                },
  89                .id = 2,
  90        };
  91        struct mmap_event event3 = {
  92                .header = {
  93                        .type = PERF_RECORD_MMAP,
  94                        .size = sizeof(struct mmap_event),
  95                },
  96        };
  97        union perf_event *events[] = {
  98                (union perf_event *)&event1,
  99                (union perf_event *)&event2,
 100                (union perf_event *)&event3,
 101        };
 102
 103        err = process_events(events, ARRAY_SIZE(events));
 104        if (err)
 105                return -1;
 106
 107        return 0;
 108}
 109