diff options
| author | Jiri Olsa <jolsa@redhat.com> | 2012-07-22 08:14:40 -0400 |
|---|---|---|
| committer | Arnaldo Carvalho de Melo <acme@redhat.com> | 2012-07-25 10:33:17 -0400 |
| commit | f7add556534529ab18501ced98d7f3f2fc7f0621 (patch) | |
| tree | e1042e31b33bac69c43f6010bbd47b0664689a1b /tools | |
| parent | 4dff624ae05bf3fb89f7653b3a55e7a5f1f1dadf (diff) | |
perf test: Add dso data caching tests
Adding automated test for DSO data reading. Testing raw/cached reads
from different file/cache locations.
Signed-off-by: Jiri Olsa <jolsa@redhat.com>
Cc: Arun Sharma <asharma@fb.com>
Cc: Benjamin Redelings <benjamin.redelings@nescent.org>
Cc: Corey Ashford <cjashfor@linux.vnet.ibm.com>
Cc: Cyrill Gorcunov <gorcunov@openvz.org>
Cc: Frank Ch. Eigler <fche@redhat.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Ingo Molnar <mingo@kernel.org>
Cc: Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Robert Richter <robert.richter@amd.com>
Cc: Stephane Eranian <eranian@google.com>
Cc: Tom Zanussi <tzanussi@gmail.com>
Cc: Ulrich Drepper <drepper@gmail.com>
Link: http://lkml.kernel.org/r/1342959280-5361-18-git-send-email-jolsa@redhat.com
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Diffstat (limited to 'tools')
| -rw-r--r-- | tools/perf/Makefile | 1 | ||||
| -rw-r--r-- | tools/perf/builtin-test.c | 4 | ||||
| -rw-r--r-- | tools/perf/util/dso-test-data.c | 153 | ||||
| -rw-r--r-- | tools/perf/util/symbol.h | 1 |
4 files changed, 159 insertions, 0 deletions
diff --git a/tools/perf/Makefile b/tools/perf/Makefile index 75d74e5db8d5..e8f057983ae4 100644 --- a/tools/perf/Makefile +++ b/tools/perf/Makefile | |||
| @@ -354,6 +354,7 @@ LIB_OBJS += $(OUTPUT)util/usage.o | |||
| 354 | LIB_OBJS += $(OUTPUT)util/wrapper.o | 354 | LIB_OBJS += $(OUTPUT)util/wrapper.o |
| 355 | LIB_OBJS += $(OUTPUT)util/sigchain.o | 355 | LIB_OBJS += $(OUTPUT)util/sigchain.o |
| 356 | LIB_OBJS += $(OUTPUT)util/symbol.o | 356 | LIB_OBJS += $(OUTPUT)util/symbol.o |
| 357 | LIB_OBJS += $(OUTPUT)util/dso-test-data.o | ||
| 357 | LIB_OBJS += $(OUTPUT)util/color.o | 358 | LIB_OBJS += $(OUTPUT)util/color.o |
| 358 | LIB_OBJS += $(OUTPUT)util/pager.o | 359 | LIB_OBJS += $(OUTPUT)util/pager.o |
| 359 | LIB_OBJS += $(OUTPUT)util/header.o | 360 | LIB_OBJS += $(OUTPUT)util/header.o |
diff --git a/tools/perf/builtin-test.c b/tools/perf/builtin-test.c index 5ce30305462b..d909eb74a0eb 100644 --- a/tools/perf/builtin-test.c +++ b/tools/perf/builtin-test.c | |||
| @@ -1142,6 +1142,10 @@ static struct test { | |||
| 1142 | .func = test__perf_pmu, | 1142 | .func = test__perf_pmu, |
| 1143 | }, | 1143 | }, |
| 1144 | { | 1144 | { |
| 1145 | .desc = "Test dso data interface", | ||
| 1146 | .func = dso__test_data, | ||
| 1147 | }, | ||
| 1148 | { | ||
| 1145 | .func = NULL, | 1149 | .func = NULL, |
| 1146 | }, | 1150 | }, |
| 1147 | }; | 1151 | }; |
diff --git a/tools/perf/util/dso-test-data.c b/tools/perf/util/dso-test-data.c new file mode 100644 index 000000000000..541cdc72c7df --- /dev/null +++ b/tools/perf/util/dso-test-data.c | |||
| @@ -0,0 +1,153 @@ | |||
| 1 | #include "util.h" | ||
| 2 | |||
| 3 | #include <stdlib.h> | ||
| 4 | #include <sys/types.h> | ||
| 5 | #include <sys/stat.h> | ||
| 6 | #include <fcntl.h> | ||
| 7 | #include <string.h> | ||
| 8 | |||
| 9 | #include "symbol.h" | ||
| 10 | |||
| 11 | #define TEST_ASSERT_VAL(text, cond) \ | ||
| 12 | do { \ | ||
| 13 | if (!(cond)) { \ | ||
| 14 | pr_debug("FAILED %s:%d %s\n", __FILE__, __LINE__, text); \ | ||
| 15 | return -1; \ | ||
| 16 | } \ | ||
| 17 | } while (0) | ||
| 18 | |||
| 19 | static char *test_file(int size) | ||
| 20 | { | ||
| 21 | static char buf_templ[] = "/tmp/test-XXXXXX"; | ||
| 22 | char *templ = buf_templ; | ||
| 23 | int fd, i; | ||
| 24 | unsigned char *buf; | ||
| 25 | |||
| 26 | fd = mkostemp(templ, O_CREAT|O_WRONLY|O_TRUNC); | ||
| 27 | |||
| 28 | buf = malloc(size); | ||
| 29 | if (!buf) { | ||
| 30 | close(fd); | ||
| 31 | return NULL; | ||
| 32 | } | ||
| 33 | |||
| 34 | for (i = 0; i < size; i++) | ||
| 35 | buf[i] = (unsigned char) ((int) i % 10); | ||
| 36 | |||
| 37 | if (size != write(fd, buf, size)) | ||
| 38 | templ = NULL; | ||
| 39 | |||
| 40 | close(fd); | ||
| 41 | return templ; | ||
| 42 | } | ||
| 43 | |||
| 44 | #define TEST_FILE_SIZE (DSO__DATA_CACHE_SIZE * 20) | ||
| 45 | |||
| 46 | struct test_data_offset { | ||
| 47 | off_t offset; | ||
| 48 | u8 data[10]; | ||
| 49 | int size; | ||
| 50 | }; | ||
| 51 | |||
| 52 | struct test_data_offset offsets[] = { | ||
| 53 | /* Fill first cache page. */ | ||
| 54 | { | ||
| 55 | .offset = 10, | ||
| 56 | .data = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }, | ||
| 57 | .size = 10, | ||
| 58 | }, | ||
| 59 | /* Read first cache page. */ | ||
| 60 | { | ||
| 61 | .offset = 10, | ||
| 62 | .data = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }, | ||
| 63 | .size = 10, | ||
| 64 | }, | ||
| 65 | /* Fill cache boundary pages. */ | ||
| 66 | { | ||
| 67 | .offset = DSO__DATA_CACHE_SIZE - DSO__DATA_CACHE_SIZE % 10, | ||
| 68 | .data = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }, | ||
| 69 | .size = 10, | ||
| 70 | }, | ||
| 71 | /* Read cache boundary pages. */ | ||
| 72 | { | ||
| 73 | .offset = DSO__DATA_CACHE_SIZE - DSO__DATA_CACHE_SIZE % 10, | ||
| 74 | .data = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }, | ||
| 75 | .size = 10, | ||
| 76 | }, | ||
| 77 | /* Fill final cache page. */ | ||
| 78 | { | ||
| 79 | .offset = TEST_FILE_SIZE - 10, | ||
| 80 | .data = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }, | ||
| 81 | .size = 10, | ||
| 82 | }, | ||
| 83 | /* Read final cache page. */ | ||
| 84 | { | ||
| 85 | .offset = TEST_FILE_SIZE - 10, | ||
| 86 | .data = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }, | ||
| 87 | .size = 10, | ||
| 88 | }, | ||
| 89 | /* Read final cache page. */ | ||
| 90 | { | ||
| 91 | .offset = TEST_FILE_SIZE - 3, | ||
| 92 | .data = { 7, 8, 9, 0, 0, 0, 0, 0, 0, 0 }, | ||
| 93 | .size = 3, | ||
| 94 | }, | ||
| 95 | }; | ||
| 96 | |||
| 97 | int dso__test_data(void) | ||
| 98 | { | ||
| 99 | struct machine machine; | ||
| 100 | struct dso *dso; | ||
| 101 | char *file = test_file(TEST_FILE_SIZE); | ||
| 102 | size_t i; | ||
| 103 | |||
| 104 | TEST_ASSERT_VAL("No test file", file); | ||
| 105 | |||
| 106 | memset(&machine, 0, sizeof(machine)); | ||
| 107 | |||
| 108 | dso = dso__new((const char *)file); | ||
| 109 | |||
| 110 | /* Basic 10 bytes tests. */ | ||
| 111 | for (i = 0; i < ARRAY_SIZE(offsets); i++) { | ||
| 112 | struct test_data_offset *data = &offsets[i]; | ||
| 113 | ssize_t size; | ||
| 114 | u8 buf[10]; | ||
| 115 | |||
| 116 | memset(buf, 0, 10); | ||
| 117 | size = dso__data_read_offset(dso, &machine, data->offset, | ||
| 118 | buf, 10); | ||
| 119 | |||
| 120 | TEST_ASSERT_VAL("Wrong size", size == data->size); | ||
| 121 | TEST_ASSERT_VAL("Wrong data", !memcmp(buf, data->data, 10)); | ||
| 122 | } | ||
| 123 | |||
| 124 | /* Read cross multiple cache pages. */ | ||
| 125 | { | ||
| 126 | ssize_t size; | ||
| 127 | int c; | ||
| 128 | u8 *buf; | ||
| 129 | |||
| 130 | buf = malloc(TEST_FILE_SIZE); | ||
| 131 | TEST_ASSERT_VAL("ENOMEM\n", buf); | ||
| 132 | |||
| 133 | /* First iteration to fill caches, second one to read them. */ | ||
| 134 | for (c = 0; c < 2; c++) { | ||
| 135 | memset(buf, 0, TEST_FILE_SIZE); | ||
| 136 | size = dso__data_read_offset(dso, &machine, 10, | ||
| 137 | buf, TEST_FILE_SIZE); | ||
| 138 | |||
| 139 | TEST_ASSERT_VAL("Wrong size", | ||
| 140 | size == (TEST_FILE_SIZE - 10)); | ||
| 141 | |||
| 142 | for (i = 0; i < (size_t)size; i++) | ||
| 143 | TEST_ASSERT_VAL("Wrong data", | ||
| 144 | buf[i] == (i % 10)); | ||
| 145 | } | ||
| 146 | |||
| 147 | free(buf); | ||
| 148 | } | ||
| 149 | |||
| 150 | dso__delete(dso); | ||
| 151 | unlink(file); | ||
| 152 | return 0; | ||
| 153 | } | ||
diff --git a/tools/perf/util/symbol.h b/tools/perf/util/symbol.h index 980d5f57373b..1fe733a1e21f 100644 --- a/tools/perf/util/symbol.h +++ b/tools/perf/util/symbol.h | |||
| @@ -325,4 +325,5 @@ ssize_t dso__data_read_offset(struct dso *dso, struct machine *machine, | |||
| 325 | ssize_t dso__data_read_addr(struct dso *dso, struct map *map, | 325 | ssize_t dso__data_read_addr(struct dso *dso, struct map *map, |
| 326 | struct machine *machine, u64 addr, | 326 | struct machine *machine, u64 addr, |
| 327 | u8 *data, ssize_t size); | 327 | u8 *data, ssize_t size); |
| 328 | int dso__test_data(void); | ||
| 328 | #endif /* __PERF_SYMBOL */ | 329 | #endif /* __PERF_SYMBOL */ |
