Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
fork

Configure Feed

Select the types of activity you want to include in your feed.

at v4.13-rc6 115 lines 2.7 kB view raw
1#include <errno.h> 2#include <stdio.h> 3#include <sys/epoll.h> 4#include <util/evlist.h> 5#include <linux/filter.h> 6#include "tests.h" 7#include "debug.h" 8#include "probe-file.h" 9#include "build-id.h" 10 11/* To test SDT event, we need libelf support to scan elf binary */ 12#if defined(HAVE_SDT_EVENT) && defined(HAVE_LIBELF_SUPPORT) 13 14#include <sys/sdt.h> 15 16static int target_function(void) 17{ 18 DTRACE_PROBE(perf, test_target); 19 return TEST_OK; 20} 21 22/* Copied from builtin-buildid-cache.c */ 23static int build_id_cache__add_file(const char *filename) 24{ 25 char sbuild_id[SBUILD_ID_SIZE]; 26 u8 build_id[BUILD_ID_SIZE]; 27 int err; 28 29 err = filename__read_build_id(filename, &build_id, sizeof(build_id)); 30 if (err < 0) { 31 pr_debug("Failed to read build id of %s\n", filename); 32 return err; 33 } 34 35 build_id__sprintf(build_id, sizeof(build_id), sbuild_id); 36 err = build_id_cache__add_s(sbuild_id, filename, false, false); 37 if (err < 0) 38 pr_debug("Failed to add build id cache of %s\n", filename); 39 return err; 40} 41 42static char *get_self_path(void) 43{ 44 char *buf = calloc(PATH_MAX, sizeof(char)); 45 46 if (buf && readlink("/proc/self/exe", buf, PATH_MAX - 1) < 0) { 47 pr_debug("Failed to get correct path of perf\n"); 48 free(buf); 49 return NULL; 50 } 51 return buf; 52} 53 54static int search_cached_probe(const char *target, 55 const char *group, const char *event) 56{ 57 struct probe_cache *cache = probe_cache__new(target); 58 int ret = 0; 59 60 if (!cache) { 61 pr_debug("Failed to open probe cache of %s\n", target); 62 return -EINVAL; 63 } 64 65 if (!probe_cache__find_by_name(cache, group, event)) { 66 pr_debug("Failed to find %s:%s in the cache\n", group, event); 67 ret = -ENOENT; 68 } 69 probe_cache__delete(cache); 70 71 return ret; 72} 73 74int test__sdt_event(int subtests __maybe_unused) 75{ 76 int ret = TEST_FAIL; 77 char __tempdir[] = "./test-buildid-XXXXXX"; 78 char *tempdir = NULL, *myself = get_self_path(); 79 80 if (myself == NULL || mkdtemp(__tempdir) == NULL) { 81 pr_debug("Failed to make a tempdir for build-id cache\n"); 82 goto error; 83 } 84 /* Note that buildid_dir must be an absolute path */ 85 tempdir = realpath(__tempdir, NULL); 86 87 /* At first, scan itself */ 88 set_buildid_dir(tempdir); 89 if (build_id_cache__add_file(myself) < 0) 90 goto error_rmdir; 91 92 /* Open a cache and make sure the SDT is stored */ 93 if (search_cached_probe(myself, "sdt_perf", "test_target") < 0) 94 goto error_rmdir; 95 96 /* TBD: probing on the SDT event and collect logs */ 97 98 /* Call the target and get an event */ 99 ret = target_function(); 100 101error_rmdir: 102 /* Cleanup temporary buildid dir */ 103 rm_rf(tempdir); 104error: 105 free(tempdir); 106 free(myself); 107 return ret; 108} 109#else 110int test__sdt_event(int subtests __maybe_unused) 111{ 112 pr_debug("Skip SDT event test because SDT support is not compiled\n"); 113 return TEST_SKIP; 114} 115#endif