bpf-loader.c 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352
  1. /*
  2. * bpf-loader.c
  3. *
  4. * Copyright (C) 2015 Wang Nan <wangnan0@huawei.com>
  5. * Copyright (C) 2015 Huawei Inc.
  6. */
  7. #include <bpf/libbpf.h>
  8. #include <linux/err.h>
  9. #include "perf.h"
  10. #include "debug.h"
  11. #include "bpf-loader.h"
  12. #include "probe-event.h"
  13. #include "probe-finder.h" // for MAX_PROBES
  14. #include "llvm-utils.h"
  15. #define DEFINE_PRINT_FN(name, level) \
  16. static int libbpf_##name(const char *fmt, ...) \
  17. { \
  18. va_list args; \
  19. int ret; \
  20. \
  21. va_start(args, fmt); \
  22. ret = veprintf(level, verbose, pr_fmt(fmt), args);\
  23. va_end(args); \
  24. return ret; \
  25. }
  26. DEFINE_PRINT_FN(warning, 0)
  27. DEFINE_PRINT_FN(info, 0)
  28. DEFINE_PRINT_FN(debug, 1)
  29. struct bpf_prog_priv {
  30. struct perf_probe_event pev;
  31. };
  32. struct bpf_object *bpf__prepare_load(const char *filename, bool source)
  33. {
  34. struct bpf_object *obj;
  35. static bool libbpf_initialized;
  36. if (!libbpf_initialized) {
  37. libbpf_set_print(libbpf_warning,
  38. libbpf_info,
  39. libbpf_debug);
  40. libbpf_initialized = true;
  41. }
  42. if (source) {
  43. int err;
  44. void *obj_buf;
  45. size_t obj_buf_sz;
  46. err = llvm__compile_bpf(filename, &obj_buf, &obj_buf_sz);
  47. if (err)
  48. return ERR_PTR(err);
  49. obj = bpf_object__open_buffer(obj_buf, obj_buf_sz, filename);
  50. free(obj_buf);
  51. } else
  52. obj = bpf_object__open(filename);
  53. if (!obj) {
  54. pr_debug("bpf: failed to load %s\n", filename);
  55. return ERR_PTR(-EINVAL);
  56. }
  57. return obj;
  58. }
  59. void bpf__clear(void)
  60. {
  61. struct bpf_object *obj, *tmp;
  62. bpf_object__for_each_safe(obj, tmp) {
  63. bpf__unprobe(obj);
  64. bpf_object__close(obj);
  65. }
  66. }
  67. static void
  68. bpf_prog_priv__clear(struct bpf_program *prog __maybe_unused,
  69. void *_priv)
  70. {
  71. struct bpf_prog_priv *priv = _priv;
  72. cleanup_perf_probe_events(&priv->pev, 1);
  73. free(priv);
  74. }
  75. static int
  76. config_bpf_program(struct bpf_program *prog)
  77. {
  78. struct perf_probe_event *pev = NULL;
  79. struct bpf_prog_priv *priv = NULL;
  80. const char *config_str;
  81. int err;
  82. config_str = bpf_program__title(prog, false);
  83. if (!config_str) {
  84. pr_debug("bpf: unable to get title for program\n");
  85. return -EINVAL;
  86. }
  87. priv = calloc(sizeof(*priv), 1);
  88. if (!priv) {
  89. pr_debug("bpf: failed to alloc priv\n");
  90. return -ENOMEM;
  91. }
  92. pev = &priv->pev;
  93. pr_debug("bpf: config program '%s'\n", config_str);
  94. err = parse_perf_probe_command(config_str, pev);
  95. if (err < 0) {
  96. pr_debug("bpf: '%s' is not a valid config string\n",
  97. config_str);
  98. err = -EINVAL;
  99. goto errout;
  100. }
  101. if (pev->group && strcmp(pev->group, PERF_BPF_PROBE_GROUP)) {
  102. pr_debug("bpf: '%s': group for event is set and not '%s'.\n",
  103. config_str, PERF_BPF_PROBE_GROUP);
  104. err = -EINVAL;
  105. goto errout;
  106. } else if (!pev->group)
  107. pev->group = strdup(PERF_BPF_PROBE_GROUP);
  108. if (!pev->group) {
  109. pr_debug("bpf: strdup failed\n");
  110. err = -ENOMEM;
  111. goto errout;
  112. }
  113. if (!pev->event) {
  114. pr_debug("bpf: '%s': event name is missing\n",
  115. config_str);
  116. err = -EINVAL;
  117. goto errout;
  118. }
  119. pr_debug("bpf: config '%s' is ok\n", config_str);
  120. err = bpf_program__set_private(prog, priv, bpf_prog_priv__clear);
  121. if (err) {
  122. pr_debug("Failed to set priv for program '%s'\n", config_str);
  123. goto errout;
  124. }
  125. return 0;
  126. errout:
  127. if (pev)
  128. clear_perf_probe_event(pev);
  129. free(priv);
  130. return err;
  131. }
  132. static int bpf__prepare_probe(void)
  133. {
  134. static int err = 0;
  135. static bool initialized = false;
  136. /*
  137. * Make err static, so if init failed the first, bpf__prepare_probe()
  138. * fails each time without calling init_probe_symbol_maps multiple
  139. * times.
  140. */
  141. if (initialized)
  142. return err;
  143. initialized = true;
  144. err = init_probe_symbol_maps(false);
  145. if (err < 0)
  146. pr_debug("Failed to init_probe_symbol_maps\n");
  147. probe_conf.max_probes = MAX_PROBES;
  148. return err;
  149. }
  150. int bpf__probe(struct bpf_object *obj)
  151. {
  152. int err = 0;
  153. struct bpf_program *prog;
  154. struct bpf_prog_priv *priv;
  155. struct perf_probe_event *pev;
  156. err = bpf__prepare_probe();
  157. if (err) {
  158. pr_debug("bpf__prepare_probe failed\n");
  159. return err;
  160. }
  161. bpf_object__for_each_program(prog, obj) {
  162. err = config_bpf_program(prog);
  163. if (err)
  164. goto out;
  165. err = bpf_program__get_private(prog, (void **)&priv);
  166. if (err || !priv)
  167. goto out;
  168. pev = &priv->pev;
  169. err = convert_perf_probe_events(pev, 1);
  170. if (err < 0) {
  171. pr_debug("bpf_probe: failed to convert perf probe events");
  172. goto out;
  173. }
  174. err = apply_perf_probe_events(pev, 1);
  175. if (err < 0) {
  176. pr_debug("bpf_probe: failed to apply perf probe events");
  177. goto out;
  178. }
  179. }
  180. out:
  181. return err < 0 ? err : 0;
  182. }
  183. #define EVENTS_WRITE_BUFSIZE 4096
  184. int bpf__unprobe(struct bpf_object *obj)
  185. {
  186. int err, ret = 0;
  187. struct bpf_program *prog;
  188. struct bpf_prog_priv *priv;
  189. bpf_object__for_each_program(prog, obj) {
  190. int i;
  191. err = bpf_program__get_private(prog, (void **)&priv);
  192. if (err || !priv)
  193. continue;
  194. for (i = 0; i < priv->pev.ntevs; i++) {
  195. struct probe_trace_event *tev = &priv->pev.tevs[i];
  196. char name_buf[EVENTS_WRITE_BUFSIZE];
  197. struct strfilter *delfilter;
  198. snprintf(name_buf, EVENTS_WRITE_BUFSIZE,
  199. "%s:%s", tev->group, tev->event);
  200. name_buf[EVENTS_WRITE_BUFSIZE - 1] = '\0';
  201. delfilter = strfilter__new(name_buf, NULL);
  202. if (!delfilter) {
  203. pr_debug("Failed to create filter for unprobing\n");
  204. ret = -ENOMEM;
  205. continue;
  206. }
  207. err = del_perf_probe_events(delfilter);
  208. strfilter__delete(delfilter);
  209. if (err) {
  210. pr_debug("Failed to delete %s\n", name_buf);
  211. ret = err;
  212. continue;
  213. }
  214. }
  215. }
  216. return ret;
  217. }
  218. int bpf__load(struct bpf_object *obj)
  219. {
  220. int err;
  221. err = bpf_object__load(obj);
  222. if (err) {
  223. pr_debug("bpf: load objects failed\n");
  224. return err;
  225. }
  226. return 0;
  227. }
  228. int bpf__foreach_tev(struct bpf_object *obj,
  229. bpf_prog_iter_callback_t func,
  230. void *arg)
  231. {
  232. struct bpf_program *prog;
  233. int err;
  234. bpf_object__for_each_program(prog, obj) {
  235. struct probe_trace_event *tev;
  236. struct perf_probe_event *pev;
  237. struct bpf_prog_priv *priv;
  238. int i, fd;
  239. err = bpf_program__get_private(prog,
  240. (void **)&priv);
  241. if (err || !priv) {
  242. pr_debug("bpf: failed to get private field\n");
  243. return -EINVAL;
  244. }
  245. pev = &priv->pev;
  246. for (i = 0; i < pev->ntevs; i++) {
  247. tev = &pev->tevs[i];
  248. fd = bpf_program__fd(prog);
  249. if (fd < 0) {
  250. pr_debug("bpf: failed to get file descriptor\n");
  251. return fd;
  252. }
  253. err = (*func)(tev, fd, arg);
  254. if (err) {
  255. pr_debug("bpf: call back failed, stop iterate\n");
  256. return err;
  257. }
  258. }
  259. }
  260. return 0;
  261. }
  262. #define bpf__strerror_head(err, buf, size) \
  263. char sbuf[STRERR_BUFSIZE], *emsg;\
  264. if (!size)\
  265. return 0;\
  266. if (err < 0)\
  267. err = -err;\
  268. emsg = strerror_r(err, sbuf, sizeof(sbuf));\
  269. switch (err) {\
  270. default:\
  271. scnprintf(buf, size, "%s", emsg);\
  272. break;
  273. #define bpf__strerror_entry(val, fmt...)\
  274. case val: {\
  275. scnprintf(buf, size, fmt);\
  276. break;\
  277. }
  278. #define bpf__strerror_end(buf, size)\
  279. }\
  280. buf[size - 1] = '\0';
  281. int bpf__strerror_probe(struct bpf_object *obj __maybe_unused,
  282. int err, char *buf, size_t size)
  283. {
  284. bpf__strerror_head(err, buf, size);
  285. bpf__strerror_entry(EEXIST, "Probe point exist. Try use 'perf probe -d \"*\"'");
  286. bpf__strerror_entry(EPERM, "You need to be root, and /proc/sys/kernel/kptr_restrict should be 0\n");
  287. bpf__strerror_entry(ENOENT, "You need to check probing points in BPF file\n");
  288. bpf__strerror_end(buf, size);
  289. return 0;
  290. }
  291. int bpf__strerror_load(struct bpf_object *obj __maybe_unused,
  292. int err, char *buf, size_t size)
  293. {
  294. bpf__strerror_head(err, buf, size);
  295. bpf__strerror_entry(EINVAL, "%s: Are you root and runing a CONFIG_BPF_SYSCALL kernel?",
  296. emsg)
  297. bpf__strerror_end(buf, size);
  298. return 0;
  299. }