linux/tools/perf/tests/sdt.c
<<
>>
Prefs
   1#include <stdio.h>
   2#include <sys/epoll.h>
   3#include <util/util.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) < 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
 116