/* * perf_hooks.c * * Copyright (C) 2016 Wang Nan <wangnan0@huawei.com> * Copyright (C) 2016 Huawei Inc. */ #include <errno.h> #include <stdlib.h> #include <setjmp.h> #include <linux/err.h> #include "util/util.h" #include "util/debug.h" #include "util/perf-hooks.h" static sigjmp_buf jmpbuf; static const struct perf_hook_desc *current_perf_hook; void perf_hooks__invoke(const struct perf_hook_desc *desc) { if (!(desc && desc->p_hook_func && *desc->p_hook_func)) return; if (sigsetjmp(jmpbuf, 1)) { pr_warning("Fatal error (SEGFAULT) in perf hook '%s'\n", desc->hook_name); *(current_perf_hook->p_hook_func) = NULL; } else { current_perf_hook = desc; (**desc->p_hook_func)(desc->hook_ctx); } current_perf_hook = NULL; } void perf_hooks__recover(void) { if (current_perf_hook) siglongjmp(jmpbuf, 1); } #define PERF_HOOK(name) \ perf_hook_func_t __perf_hook_func_##name = NULL; \ struct perf_hook_desc __perf_hook_desc_##name = \ {.hook_name = #name, \ .p_hook_func = &__perf_hook_func_##name, \ .hook_ctx = NULL}; #include "perf-hooks-list.h" #undef PERF_HOOK #define PERF_HOOK(name) \ &__perf_hook_desc_##name, static struct perf_hook_desc *perf_hooks[] = { #include "perf-hooks-list.h" }; #undef PERF_HOOK int perf_hooks__set_hook(const char *hook_name, perf_hook_func_t hook_func, void *hook_ctx) { unsigned int i; for (i = 0; i < ARRAY_SIZE(perf_hooks); i++) { if (strcmp(hook_name, perf_hooks[i]->hook_name) != 0) continue; if (*(perf_hooks[i]->p_hook_func)) pr_warning("Overwrite existing hook: %s\n", hook_name); *(perf_hooks[i]->p_hook_func) = hook_func; perf_hooks[i]->hook_ctx = hook_ctx; return 0; } return -ENOENT; } perf_hook_func_t perf_hooks__get_hook(const char *hook_name) { unsigned int i; for (i = 0; i < ARRAY_SIZE(perf_hooks); i++) { if (strcmp(hook_name, perf_hooks[i]->hook_name) != 0) continue; return *(perf_hooks[i]->p_hook_func); } return ERR_PTR(-ENOENT); } e</a><a href='/cgit.cgi/linux/net-next.git/commit/tools/perf/pmu-events/arch/x86/nehalemep/floating-point.json?id=5c8802f14a0679e970e7b25f809a12c3ae1a873d'>commit</a><a href='/cgit.cgi/linux/net-next.git/diff/tools/perf/pmu-events/arch/x86/nehalemep/floating-point.json?id=5c8802f14a0679e970e7b25f809a12c3ae1a873d'>diff</a></td><td class='form'><form class='right' method='get' action='/cgit.cgi/linux/net-next.git/log/tools/perf/pmu-events/arch/x86/nehalemep/floating-point.json'> <input type='hidden' name='id' value='5c8802f14a0679e970e7b25f809a12c3ae1a873d'/><select name='qt'> <option value='grep'>log msg</option> <option value='author'>author</option> <option value='committer'>committer</option> <option value='range'>range</option> </select> <input class='txt' type='search' size='10' name='q' value=''/> <input type='submit' value='search'/> </form> </td></tr></table> <div class='path'>path: <a href='/cgit.cgi/linux/net-next.git/log/?id=5c8802f14a0679e970e7b25f809a12c3ae1a873d'>root</a>/<a href='/cgit.cgi/linux/net-next.git/log/tools?id=5c8802f14a0679e970e7b25f809a12c3ae1a873d'>tools</a>/<a href='/cgit.cgi/linux/net-next.git/log/tools/perf?id=5c8802f14a0679e970e7b25f809a12c3ae1a873d'>perf</a>/<a href='/cgit.cgi/linux/net-next.git/log/tools/perf/pmu-events?id=5c8802f14a0679e970e7b25f809a12c3ae1a873d'>pmu-events</a>/<a href='/cgit.cgi/linux/net-next.git/log/tools/perf/pmu-events/arch?id=5c8802f14a0679e970e7b25f809a12c3ae1a873d'>arch</a>/<a href='/cgit.cgi/linux/net-next.git/log/tools/perf/pmu-events/arch/x86?id=5c8802f14a0679e970e7b25f809a12c3ae1a873d'>x86</a>/<a href='/cgit.cgi/linux/net-next.git/log/tools/perf/pmu-events/arch/x86/nehalemep?id=5c8802f14a0679e970e7b25f809a12c3ae1a873d'>nehalemep</a>/<a href='/cgit.cgi/linux/net-next.git/log/tools/perf/pmu-events/arch/x86/nehalemep/floating-point.json?id=5c8802f14a0679e970e7b25f809a12c3ae1a873d'>floating-point.json</a></div><div class='content'><table class='list nowrap'><tr class='nohover'><th class='left'>Age</th><th class='left'>Commit message (<a href='/cgit.cgi/linux/net-next.git/log/tools/perf/pmu-events/arch/x86/nehalemep/floating-point.json?id=5c8802f14a0679e970e7b25f809a12c3ae1a873d&showmsg=1'>Expand</a>)</th><th class='left'>Author</th><th class='left'>Files</th><th class='left'>Lines</th></tr>