Back to home page

OSCL-LXR

 
 

    


0001 #include <linux/kernel.h>
0002 #include <linux/types.h>
0003 #include <stddef.h>
0004 
0005 #include "tests.h"
0006 
0007 #include "event.h"
0008 #include "evlist.h"
0009 #include "header.h"
0010 #include "debug.h"
0011 
0012 static int process_event(struct evlist **pevlist, union perf_event *event)
0013 {
0014     struct perf_sample sample;
0015 
0016     if (event->header.type == PERF_RECORD_HEADER_ATTR) {
0017         if (perf_event__process_attr(NULL, event, pevlist)) {
0018             pr_debug("perf_event__process_attr failed\n");
0019             return -1;
0020         }
0021         return 0;
0022     }
0023 
0024     if (event->header.type >= PERF_RECORD_USER_TYPE_START)
0025         return -1;
0026 
0027     if (!*pevlist)
0028         return -1;
0029 
0030     if (evlist__parse_sample(*pevlist, event, &sample)) {
0031         pr_debug("evlist__parse_sample failed\n");
0032         return -1;
0033     }
0034 
0035     return 0;
0036 }
0037 
0038 static int process_events(union perf_event **events, size_t count)
0039 {
0040     struct evlist *evlist = NULL;
0041     int err = 0;
0042     size_t i;
0043 
0044     for (i = 0; i < count && !err; i++)
0045         err = process_event(&evlist, events[i]);
0046 
0047     evlist__delete(evlist);
0048 
0049     return err;
0050 }
0051 
0052 struct test_attr_event {
0053     struct perf_event_header header;
0054     struct perf_event_attr   attr;
0055     u64 id;
0056 };
0057 
0058 /**
0059  * test__parse_no_sample_id_all - test parsing with no sample_id_all bit set.
0060  *
0061  * This function tests parsing data produced on kernel's that do not support the
0062  * sample_id_all bit.  Without the sample_id_all bit, non-sample events (such as
0063  * mmap events) do not have an id sample appended, and consequently logic
0064  * designed to determine the id will not work.  That case happens when there is
0065  * more than one selected event, so this test processes three events: 2
0066  * attributes representing the selected events and one mmap event.
0067  *
0068  * Return: %0 on success, %-1 if the test fails.
0069  */
0070 static int test__parse_no_sample_id_all(struct test_suite *test __maybe_unused,
0071                     int subtest __maybe_unused)
0072 {
0073     int err;
0074 
0075     struct test_attr_event event1 = {
0076         .header = {
0077             .type = PERF_RECORD_HEADER_ATTR,
0078             .size = sizeof(struct test_attr_event),
0079         },
0080         .id = 1,
0081     };
0082     struct test_attr_event event2 = {
0083         .header = {
0084             .type = PERF_RECORD_HEADER_ATTR,
0085             .size = sizeof(struct test_attr_event),
0086         },
0087         .id = 2,
0088     };
0089     struct perf_record_mmap event3 = {
0090         .header = {
0091             .type = PERF_RECORD_MMAP,
0092             .size = sizeof(struct perf_record_mmap),
0093         },
0094     };
0095     union perf_event *events[] = {
0096         (union perf_event *)&event1,
0097         (union perf_event *)&event2,
0098         (union perf_event *)&event3,
0099     };
0100 
0101     err = process_events(events, ARRAY_SIZE(events));
0102     if (err)
0103         return -1;
0104 
0105     return 0;
0106 }
0107 
0108 DEFINE_SUITE("Parse with no sample_id_all bit set", parse_no_sample_id_all);