trace_eprobe.c 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994
  1. // SPDX-License-Identifier: GPL-2.0
  2. /*
  3. * event probes
  4. *
  5. * Part of this code was copied from kernel/trace/trace_kprobe.c written by
  6. * Masami Hiramatsu <mhiramat@kernel.org>
  7. *
  8. * Copyright (C) 2021, VMware Inc, Steven Rostedt <rostedt@goodmis.org>
  9. * Copyright (C) 2021, VMware Inc, Tzvetomir Stoyanov tz.stoyanov@gmail.com>
  10. *
  11. */
  12. #include <linux/module.h>
  13. #include <linux/mutex.h>
  14. #include <linux/ftrace.h>
  15. #include "trace_dynevent.h"
  16. #include "trace_probe.h"
  17. #include "trace_probe_tmpl.h"
  18. #include "trace_probe_kernel.h"
  19. #define EPROBE_EVENT_SYSTEM "eprobes"
  20. struct trace_eprobe {
  21. /* tracepoint system */
  22. const char *event_system;
  23. /* tracepoint event */
  24. const char *event_name;
  25. /* filter string for the tracepoint */
  26. char *filter_str;
  27. struct trace_event_call *event;
  28. struct dyn_event devent;
  29. struct trace_probe tp;
  30. };
  31. struct eprobe_data {
  32. struct trace_event_file *file;
  33. struct trace_eprobe *ep;
  34. };
  35. #define for_each_trace_eprobe_tp(ep, _tp) \
  36. list_for_each_entry(ep, trace_probe_probe_list(_tp), tp.list)
  37. static int __trace_eprobe_create(int argc, const char *argv[]);
  38. static void trace_event_probe_cleanup(struct trace_eprobe *ep)
  39. {
  40. if (!ep)
  41. return;
  42. trace_probe_cleanup(&ep->tp);
  43. kfree(ep->event_name);
  44. kfree(ep->event_system);
  45. if (ep->event)
  46. trace_event_put_ref(ep->event);
  47. kfree(ep->filter_str);
  48. kfree(ep);
  49. }
  50. static struct trace_eprobe *to_trace_eprobe(struct dyn_event *ev)
  51. {
  52. return container_of(ev, struct trace_eprobe, devent);
  53. }
  54. static int eprobe_dyn_event_create(const char *raw_command)
  55. {
  56. return trace_probe_create(raw_command, __trace_eprobe_create);
  57. }
  58. static int eprobe_dyn_event_show(struct seq_file *m, struct dyn_event *ev)
  59. {
  60. struct trace_eprobe *ep = to_trace_eprobe(ev);
  61. int i;
  62. seq_printf(m, "e:%s/%s", trace_probe_group_name(&ep->tp),
  63. trace_probe_name(&ep->tp));
  64. seq_printf(m, " %s.%s", ep->event_system, ep->event_name);
  65. for (i = 0; i < ep->tp.nr_args; i++)
  66. seq_printf(m, " %s=%s", ep->tp.args[i].name, ep->tp.args[i].comm);
  67. seq_putc(m, '\n');
  68. return 0;
  69. }
  70. static int unregister_trace_eprobe(struct trace_eprobe *ep)
  71. {
  72. /* If other probes are on the event, just unregister eprobe */
  73. if (trace_probe_has_sibling(&ep->tp))
  74. goto unreg;
  75. /* Enabled event can not be unregistered */
  76. if (trace_probe_is_enabled(&ep->tp))
  77. return -EBUSY;
  78. /* Will fail if probe is being used by ftrace or perf */
  79. if (trace_probe_unregister_event_call(&ep->tp))
  80. return -EBUSY;
  81. unreg:
  82. dyn_event_remove(&ep->devent);
  83. trace_probe_unlink(&ep->tp);
  84. return 0;
  85. }
  86. static int eprobe_dyn_event_release(struct dyn_event *ev)
  87. {
  88. struct trace_eprobe *ep = to_trace_eprobe(ev);
  89. int ret = unregister_trace_eprobe(ep);
  90. if (!ret)
  91. trace_event_probe_cleanup(ep);
  92. return ret;
  93. }
  94. static bool eprobe_dyn_event_is_busy(struct dyn_event *ev)
  95. {
  96. struct trace_eprobe *ep = to_trace_eprobe(ev);
  97. return trace_probe_is_enabled(&ep->tp);
  98. }
  99. static bool eprobe_dyn_event_match(const char *system, const char *event,
  100. int argc, const char **argv, struct dyn_event *ev)
  101. {
  102. struct trace_eprobe *ep = to_trace_eprobe(ev);
  103. const char *slash;
  104. /*
  105. * We match the following:
  106. * event only - match all eprobes with event name
  107. * system and event only - match all system/event probes
  108. * system only - match all system probes
  109. *
  110. * The below has the above satisfied with more arguments:
  111. *
  112. * attached system/event - If the arg has the system and event
  113. * the probe is attached to, match
  114. * probes with the attachment.
  115. *
  116. * If any more args are given, then it requires a full match.
  117. */
  118. /*
  119. * If system exists, but this probe is not part of that system
  120. * do not match.
  121. */
  122. if (system && strcmp(trace_probe_group_name(&ep->tp), system) != 0)
  123. return false;
  124. /* Must match the event name */
  125. if (event[0] != '\0' && strcmp(trace_probe_name(&ep->tp), event) != 0)
  126. return false;
  127. /* No arguments match all */
  128. if (argc < 1)
  129. return true;
  130. /* First argument is the system/event the probe is attached to */
  131. slash = strchr(argv[0], '/');
  132. if (!slash)
  133. slash = strchr(argv[0], '.');
  134. if (!slash)
  135. return false;
  136. if (strncmp(ep->event_system, argv[0], slash - argv[0]))
  137. return false;
  138. if (strcmp(ep->event_name, slash + 1))
  139. return false;
  140. argc--;
  141. argv++;
  142. /* If there are no other args, then match */
  143. if (argc < 1)
  144. return true;
  145. return trace_probe_match_command_args(&ep->tp, argc, argv);
  146. }
  147. static struct dyn_event_operations eprobe_dyn_event_ops = {
  148. .create = eprobe_dyn_event_create,
  149. .show = eprobe_dyn_event_show,
  150. .is_busy = eprobe_dyn_event_is_busy,
  151. .free = eprobe_dyn_event_release,
  152. .match = eprobe_dyn_event_match,
  153. };
  154. static struct trace_eprobe *alloc_event_probe(const char *group,
  155. const char *this_event,
  156. struct trace_event_call *event,
  157. int nargs)
  158. {
  159. struct trace_eprobe *ep;
  160. const char *event_name;
  161. const char *sys_name;
  162. int ret = -ENOMEM;
  163. if (!event)
  164. return ERR_PTR(-ENODEV);
  165. sys_name = event->class->system;
  166. event_name = trace_event_name(event);
  167. ep = kzalloc(struct_size(ep, tp.args, nargs), GFP_KERNEL);
  168. if (!ep) {
  169. trace_event_put_ref(event);
  170. goto error;
  171. }
  172. ep->event = event;
  173. ep->event_name = kstrdup(event_name, GFP_KERNEL);
  174. if (!ep->event_name)
  175. goto error;
  176. ep->event_system = kstrdup(sys_name, GFP_KERNEL);
  177. if (!ep->event_system)
  178. goto error;
  179. ret = trace_probe_init(&ep->tp, this_event, group, false, nargs);
  180. if (ret < 0)
  181. goto error;
  182. dyn_event_init(&ep->devent, &eprobe_dyn_event_ops);
  183. return ep;
  184. error:
  185. trace_event_probe_cleanup(ep);
  186. return ERR_PTR(ret);
  187. }
  188. static int eprobe_event_define_fields(struct trace_event_call *event_call)
  189. {
  190. struct eprobe_trace_entry_head field;
  191. struct trace_probe *tp;
  192. tp = trace_probe_primary_from_call(event_call);
  193. if (WARN_ON_ONCE(!tp))
  194. return -ENOENT;
  195. return traceprobe_define_arg_fields(event_call, sizeof(field), tp);
  196. }
  197. static struct trace_event_fields eprobe_fields_array[] = {
  198. { .type = TRACE_FUNCTION_TYPE,
  199. .define_fields = eprobe_event_define_fields },
  200. {}
  201. };
  202. /* Event entry printers */
  203. static enum print_line_t
  204. print_eprobe_event(struct trace_iterator *iter, int flags,
  205. struct trace_event *event)
  206. {
  207. struct eprobe_trace_entry_head *field;
  208. struct trace_event_call *pevent;
  209. struct trace_event *probed_event;
  210. struct trace_seq *s = &iter->seq;
  211. struct trace_eprobe *ep;
  212. struct trace_probe *tp;
  213. unsigned int type;
  214. field = (struct eprobe_trace_entry_head *)iter->ent;
  215. tp = trace_probe_primary_from_call(
  216. container_of(event, struct trace_event_call, event));
  217. if (WARN_ON_ONCE(!tp))
  218. goto out;
  219. ep = container_of(tp, struct trace_eprobe, tp);
  220. type = ep->event->event.type;
  221. trace_seq_printf(s, "%s: (", trace_probe_name(tp));
  222. probed_event = ftrace_find_event(type);
  223. if (probed_event) {
  224. pevent = container_of(probed_event, struct trace_event_call, event);
  225. trace_seq_printf(s, "%s.%s", pevent->class->system,
  226. trace_event_name(pevent));
  227. } else {
  228. trace_seq_printf(s, "%u", type);
  229. }
  230. trace_seq_putc(s, ')');
  231. if (trace_probe_print_args(s, tp->args, tp->nr_args,
  232. (u8 *)&field[1], field) < 0)
  233. goto out;
  234. trace_seq_putc(s, '\n');
  235. out:
  236. return trace_handle_return(s);
  237. }
  238. static nokprobe_inline unsigned long
  239. get_event_field(struct fetch_insn *code, void *rec)
  240. {
  241. struct ftrace_event_field *field = code->data;
  242. unsigned long val;
  243. void *addr;
  244. addr = rec + field->offset;
  245. if (is_string_field(field)) {
  246. switch (field->filter_type) {
  247. case FILTER_DYN_STRING:
  248. val = (unsigned long)(rec + (*(unsigned int *)addr & 0xffff));
  249. break;
  250. case FILTER_RDYN_STRING:
  251. val = (unsigned long)(addr + (*(unsigned int *)addr & 0xffff));
  252. break;
  253. case FILTER_STATIC_STRING:
  254. val = (unsigned long)addr;
  255. break;
  256. case FILTER_PTR_STRING:
  257. val = (unsigned long)(*(char *)addr);
  258. break;
  259. default:
  260. WARN_ON_ONCE(1);
  261. return 0;
  262. }
  263. return val;
  264. }
  265. switch (field->size) {
  266. case 1:
  267. if (field->is_signed)
  268. val = *(char *)addr;
  269. else
  270. val = *(unsigned char *)addr;
  271. break;
  272. case 2:
  273. if (field->is_signed)
  274. val = *(short *)addr;
  275. else
  276. val = *(unsigned short *)addr;
  277. break;
  278. case 4:
  279. if (field->is_signed)
  280. val = *(int *)addr;
  281. else
  282. val = *(unsigned int *)addr;
  283. break;
  284. default:
  285. if (field->is_signed)
  286. val = *(long *)addr;
  287. else
  288. val = *(unsigned long *)addr;
  289. break;
  290. }
  291. return val;
  292. }
  293. static int get_eprobe_size(struct trace_probe *tp, void *rec)
  294. {
  295. struct fetch_insn *code;
  296. struct probe_arg *arg;
  297. int i, len, ret = 0;
  298. for (i = 0; i < tp->nr_args; i++) {
  299. arg = tp->args + i;
  300. if (arg->dynamic) {
  301. unsigned long val;
  302. code = arg->code;
  303. retry:
  304. switch (code->op) {
  305. case FETCH_OP_TP_ARG:
  306. val = get_event_field(code, rec);
  307. break;
  308. case FETCH_NOP_SYMBOL: /* Ignore a place holder */
  309. code++;
  310. goto retry;
  311. default:
  312. if (process_common_fetch_insn(code, &val) < 0)
  313. continue;
  314. }
  315. code++;
  316. len = process_fetch_insn_bottom(code, val, NULL, NULL);
  317. if (len > 0)
  318. ret += len;
  319. }
  320. }
  321. return ret;
  322. }
  323. /* Kprobe specific fetch functions */
  324. /* Note that we don't verify it, since the code does not come from user space */
  325. static int
  326. process_fetch_insn(struct fetch_insn *code, void *rec, void *edata,
  327. void *dest, void *base)
  328. {
  329. unsigned long val;
  330. int ret;
  331. retry:
  332. switch (code->op) {
  333. case FETCH_OP_TP_ARG:
  334. val = get_event_field(code, rec);
  335. break;
  336. case FETCH_NOP_SYMBOL: /* Ignore a place holder */
  337. code++;
  338. goto retry;
  339. default:
  340. ret = process_common_fetch_insn(code, &val);
  341. if (ret < 0)
  342. return ret;
  343. }
  344. code++;
  345. return process_fetch_insn_bottom(code, val, dest, base);
  346. }
  347. NOKPROBE_SYMBOL(process_fetch_insn)
  348. /* eprobe handler */
  349. static inline void
  350. __eprobe_trace_func(struct eprobe_data *edata, void *rec)
  351. {
  352. struct eprobe_trace_entry_head *entry;
  353. struct trace_event_call *call = trace_probe_event_call(&edata->ep->tp);
  354. struct trace_event_buffer fbuffer;
  355. int dsize;
  356. if (WARN_ON_ONCE(call != edata->file->event_call))
  357. return;
  358. if (trace_trigger_soft_disabled(edata->file))
  359. return;
  360. dsize = get_eprobe_size(&edata->ep->tp, rec);
  361. entry = trace_event_buffer_reserve(&fbuffer, edata->file,
  362. sizeof(*entry) + edata->ep->tp.size + dsize);
  363. if (!entry)
  364. return;
  365. entry = fbuffer.entry = ring_buffer_event_data(fbuffer.event);
  366. store_trace_args(&entry[1], &edata->ep->tp, rec, NULL, sizeof(*entry), dsize);
  367. trace_event_buffer_commit(&fbuffer);
  368. }
  369. /*
  370. * The event probe implementation uses event triggers to get access to
  371. * the event it is attached to, but is not an actual trigger. The below
  372. * functions are just stubs to fulfill what is needed to use the trigger
  373. * infrastructure.
  374. */
  375. static int eprobe_trigger_init(struct event_trigger_data *data)
  376. {
  377. return 0;
  378. }
  379. static void eprobe_trigger_free(struct event_trigger_data *data)
  380. {
  381. }
  382. static int eprobe_trigger_print(struct seq_file *m,
  383. struct event_trigger_data *data)
  384. {
  385. /* Do not print eprobe event triggers */
  386. return 0;
  387. }
  388. static void eprobe_trigger_func(struct event_trigger_data *data,
  389. struct trace_buffer *buffer, void *rec,
  390. struct ring_buffer_event *rbe)
  391. {
  392. struct eprobe_data *edata = data->private_data;
  393. if (unlikely(!rec))
  394. return;
  395. __eprobe_trace_func(edata, rec);
  396. }
  397. static struct event_trigger_ops eprobe_trigger_ops = {
  398. .trigger = eprobe_trigger_func,
  399. .print = eprobe_trigger_print,
  400. .init = eprobe_trigger_init,
  401. .free = eprobe_trigger_free,
  402. };
  403. static int eprobe_trigger_cmd_parse(struct event_command *cmd_ops,
  404. struct trace_event_file *file,
  405. char *glob, char *cmd,
  406. char *param_and_filter)
  407. {
  408. return -1;
  409. }
  410. static int eprobe_trigger_reg_func(char *glob,
  411. struct event_trigger_data *data,
  412. struct trace_event_file *file)
  413. {
  414. return -1;
  415. }
  416. static void eprobe_trigger_unreg_func(char *glob,
  417. struct event_trigger_data *data,
  418. struct trace_event_file *file)
  419. {
  420. }
  421. static struct event_trigger_ops *eprobe_trigger_get_ops(char *cmd,
  422. char *param)
  423. {
  424. return &eprobe_trigger_ops;
  425. }
  426. static struct event_command event_trigger_cmd = {
  427. .name = "eprobe",
  428. .trigger_type = ETT_EVENT_EPROBE,
  429. .flags = EVENT_CMD_FL_NEEDS_REC,
  430. .parse = eprobe_trigger_cmd_parse,
  431. .reg = eprobe_trigger_reg_func,
  432. .unreg = eprobe_trigger_unreg_func,
  433. .unreg_all = NULL,
  434. .get_trigger_ops = eprobe_trigger_get_ops,
  435. .set_filter = NULL,
  436. };
  437. static struct event_trigger_data *
  438. new_eprobe_trigger(struct trace_eprobe *ep, struct trace_event_file *file)
  439. {
  440. struct event_trigger_data *trigger;
  441. struct event_filter *filter = NULL;
  442. struct eprobe_data *edata;
  443. int ret;
  444. edata = kzalloc(sizeof(*edata), GFP_KERNEL);
  445. trigger = kzalloc(sizeof(*trigger), GFP_KERNEL);
  446. if (!trigger || !edata) {
  447. ret = -ENOMEM;
  448. goto error;
  449. }
  450. trigger->flags = EVENT_TRIGGER_FL_PROBE;
  451. trigger->count = -1;
  452. trigger->ops = &eprobe_trigger_ops;
  453. /*
  454. * EVENT PROBE triggers are not registered as commands with
  455. * register_event_command(), as they are not controlled by the user
  456. * from the trigger file
  457. */
  458. trigger->cmd_ops = &event_trigger_cmd;
  459. INIT_LIST_HEAD(&trigger->list);
  460. if (ep->filter_str) {
  461. ret = create_event_filter(file->tr, ep->event,
  462. ep->filter_str, false, &filter);
  463. if (ret)
  464. goto error;
  465. }
  466. RCU_INIT_POINTER(trigger->filter, filter);
  467. edata->file = file;
  468. edata->ep = ep;
  469. trigger->private_data = edata;
  470. return trigger;
  471. error:
  472. free_event_filter(filter);
  473. kfree(edata);
  474. kfree(trigger);
  475. return ERR_PTR(ret);
  476. }
  477. static int enable_eprobe(struct trace_eprobe *ep,
  478. struct trace_event_file *eprobe_file)
  479. {
  480. struct event_trigger_data *trigger;
  481. struct trace_event_file *file;
  482. struct trace_array *tr = eprobe_file->tr;
  483. file = find_event_file(tr, ep->event_system, ep->event_name);
  484. if (!file)
  485. return -ENOENT;
  486. trigger = new_eprobe_trigger(ep, eprobe_file);
  487. if (IS_ERR(trigger))
  488. return PTR_ERR(trigger);
  489. list_add_tail_rcu(&trigger->list, &file->triggers);
  490. trace_event_trigger_enable_disable(file, 1);
  491. update_cond_flag(file);
  492. return 0;
  493. }
  494. static struct trace_event_functions eprobe_funcs = {
  495. .trace = print_eprobe_event
  496. };
  497. static int disable_eprobe(struct trace_eprobe *ep,
  498. struct trace_array *tr)
  499. {
  500. struct event_trigger_data *trigger = NULL, *iter;
  501. struct trace_event_file *file;
  502. struct event_filter *filter;
  503. struct eprobe_data *edata;
  504. file = find_event_file(tr, ep->event_system, ep->event_name);
  505. if (!file)
  506. return -ENOENT;
  507. list_for_each_entry(iter, &file->triggers, list) {
  508. if (!(iter->flags & EVENT_TRIGGER_FL_PROBE))
  509. continue;
  510. edata = iter->private_data;
  511. if (edata->ep == ep) {
  512. trigger = iter;
  513. break;
  514. }
  515. }
  516. if (!trigger)
  517. return -ENODEV;
  518. list_del_rcu(&trigger->list);
  519. trace_event_trigger_enable_disable(file, 0);
  520. update_cond_flag(file);
  521. /* Make sure nothing is using the edata or trigger */
  522. tracepoint_synchronize_unregister();
  523. filter = rcu_access_pointer(trigger->filter);
  524. if (filter)
  525. free_event_filter(filter);
  526. kfree(edata);
  527. kfree(trigger);
  528. return 0;
  529. }
  530. static int enable_trace_eprobe(struct trace_event_call *call,
  531. struct trace_event_file *file)
  532. {
  533. struct trace_probe *tp;
  534. struct trace_eprobe *ep;
  535. bool enabled;
  536. int ret = 0;
  537. int cnt = 0;
  538. tp = trace_probe_primary_from_call(call);
  539. if (WARN_ON_ONCE(!tp))
  540. return -ENODEV;
  541. enabled = trace_probe_is_enabled(tp);
  542. /* This also changes "enabled" state */
  543. if (file) {
  544. ret = trace_probe_add_file(tp, file);
  545. if (ret)
  546. return ret;
  547. } else
  548. trace_probe_set_flag(tp, TP_FLAG_PROFILE);
  549. if (enabled)
  550. return 0;
  551. for_each_trace_eprobe_tp(ep, tp) {
  552. ret = enable_eprobe(ep, file);
  553. if (ret)
  554. break;
  555. enabled = true;
  556. cnt++;
  557. }
  558. if (ret) {
  559. /* Failed to enable one of them. Roll back all */
  560. if (enabled) {
  561. /*
  562. * It's a bug if one failed for something other than memory
  563. * not being available but another eprobe succeeded.
  564. */
  565. WARN_ON_ONCE(ret != -ENOMEM);
  566. for_each_trace_eprobe_tp(ep, tp) {
  567. disable_eprobe(ep, file->tr);
  568. if (!--cnt)
  569. break;
  570. }
  571. }
  572. if (file)
  573. trace_probe_remove_file(tp, file);
  574. else
  575. trace_probe_clear_flag(tp, TP_FLAG_PROFILE);
  576. }
  577. return ret;
  578. }
  579. static int disable_trace_eprobe(struct trace_event_call *call,
  580. struct trace_event_file *file)
  581. {
  582. struct trace_probe *tp;
  583. struct trace_eprobe *ep;
  584. tp = trace_probe_primary_from_call(call);
  585. if (WARN_ON_ONCE(!tp))
  586. return -ENODEV;
  587. if (file) {
  588. if (!trace_probe_get_file_link(tp, file))
  589. return -ENOENT;
  590. if (!trace_probe_has_single_file(tp))
  591. goto out;
  592. trace_probe_clear_flag(tp, TP_FLAG_TRACE);
  593. } else
  594. trace_probe_clear_flag(tp, TP_FLAG_PROFILE);
  595. if (!trace_probe_is_enabled(tp)) {
  596. for_each_trace_eprobe_tp(ep, tp)
  597. disable_eprobe(ep, file->tr);
  598. }
  599. out:
  600. if (file)
  601. /*
  602. * Synchronization is done in below function. For perf event,
  603. * file == NULL and perf_trace_event_unreg() calls
  604. * tracepoint_synchronize_unregister() to ensure synchronize
  605. * event. We don't need to care about it.
  606. */
  607. trace_probe_remove_file(tp, file);
  608. return 0;
  609. }
  610. static int eprobe_register(struct trace_event_call *event,
  611. enum trace_reg type, void *data)
  612. {
  613. struct trace_event_file *file = data;
  614. switch (type) {
  615. case TRACE_REG_REGISTER:
  616. return enable_trace_eprobe(event, file);
  617. case TRACE_REG_UNREGISTER:
  618. return disable_trace_eprobe(event, file);
  619. #ifdef CONFIG_PERF_EVENTS
  620. case TRACE_REG_PERF_REGISTER:
  621. case TRACE_REG_PERF_UNREGISTER:
  622. case TRACE_REG_PERF_OPEN:
  623. case TRACE_REG_PERF_CLOSE:
  624. case TRACE_REG_PERF_ADD:
  625. case TRACE_REG_PERF_DEL:
  626. return 0;
  627. #endif
  628. }
  629. return 0;
  630. }
  631. static inline void init_trace_eprobe_call(struct trace_eprobe *ep)
  632. {
  633. struct trace_event_call *call = trace_probe_event_call(&ep->tp);
  634. call->flags = TRACE_EVENT_FL_EPROBE;
  635. call->event.funcs = &eprobe_funcs;
  636. call->class->fields_array = eprobe_fields_array;
  637. call->class->reg = eprobe_register;
  638. }
  639. static struct trace_event_call *
  640. find_and_get_event(const char *system, const char *event_name)
  641. {
  642. struct trace_event_call *tp_event;
  643. const char *name;
  644. list_for_each_entry(tp_event, &ftrace_events, list) {
  645. /* Skip other probes and ftrace events */
  646. if (tp_event->flags &
  647. (TRACE_EVENT_FL_IGNORE_ENABLE |
  648. TRACE_EVENT_FL_KPROBE |
  649. TRACE_EVENT_FL_UPROBE |
  650. TRACE_EVENT_FL_EPROBE))
  651. continue;
  652. if (!tp_event->class->system ||
  653. strcmp(system, tp_event->class->system))
  654. continue;
  655. name = trace_event_name(tp_event);
  656. if (!name || strcmp(event_name, name))
  657. continue;
  658. if (!trace_event_try_get_ref(tp_event))
  659. return NULL;
  660. return tp_event;
  661. }
  662. return NULL;
  663. }
  664. static int trace_eprobe_tp_update_arg(struct trace_eprobe *ep, const char *argv[], int i)
  665. {
  666. struct traceprobe_parse_context ctx = {
  667. .event = ep->event,
  668. .flags = TPARG_FL_KERNEL | TPARG_FL_TEVENT,
  669. };
  670. int ret;
  671. ret = traceprobe_parse_probe_arg(&ep->tp, i, argv[i], &ctx);
  672. /* Handle symbols "@" */
  673. if (!ret)
  674. ret = traceprobe_update_arg(&ep->tp.args[i]);
  675. traceprobe_finish_parse(&ctx);
  676. return ret;
  677. }
  678. static int trace_eprobe_parse_filter(struct trace_eprobe *ep, int argc, const char *argv[])
  679. {
  680. struct event_filter *dummy = NULL;
  681. int i, ret, len = 0;
  682. char *p;
  683. if (argc == 0) {
  684. trace_probe_log_err(0, NO_EP_FILTER);
  685. return -EINVAL;
  686. }
  687. /* Recover the filter string */
  688. for (i = 0; i < argc; i++)
  689. len += strlen(argv[i]) + 1;
  690. ep->filter_str = kzalloc(len, GFP_KERNEL);
  691. if (!ep->filter_str)
  692. return -ENOMEM;
  693. p = ep->filter_str;
  694. for (i = 0; i < argc; i++) {
  695. if (i)
  696. ret = snprintf(p, len, " %s", argv[i]);
  697. else
  698. ret = snprintf(p, len, "%s", argv[i]);
  699. p += ret;
  700. len -= ret;
  701. }
  702. /*
  703. * Ensure the filter string can be parsed correctly. Note, this
  704. * filter string is for the original event, not for the eprobe.
  705. */
  706. ret = create_event_filter(top_trace_array(), ep->event, ep->filter_str,
  707. true, &dummy);
  708. free_event_filter(dummy);
  709. if (ret)
  710. goto error;
  711. return 0;
  712. error:
  713. kfree(ep->filter_str);
  714. ep->filter_str = NULL;
  715. return ret;
  716. }
  717. static int __trace_eprobe_create(int argc, const char *argv[])
  718. {
  719. /*
  720. * Argument syntax:
  721. * e[:[GRP/][ENAME]] SYSTEM.EVENT [FETCHARGS] [if FILTER]
  722. * Fetch args (no space):
  723. * <name>=$<field>[:TYPE]
  724. */
  725. const char *event = NULL, *group = EPROBE_EVENT_SYSTEM;
  726. const char *sys_event = NULL, *sys_name = NULL;
  727. struct trace_event_call *event_call;
  728. struct trace_eprobe *ep = NULL;
  729. char buf1[MAX_EVENT_NAME_LEN];
  730. char buf2[MAX_EVENT_NAME_LEN];
  731. char gbuf[MAX_EVENT_NAME_LEN];
  732. int ret = 0, filter_idx = 0;
  733. int i, filter_cnt;
  734. if (argc < 2 || argv[0][0] != 'e')
  735. return -ECANCELED;
  736. trace_probe_log_init("event_probe", argc, argv);
  737. event = strchr(&argv[0][1], ':');
  738. if (event) {
  739. event++;
  740. ret = traceprobe_parse_event_name(&event, &group, gbuf,
  741. event - argv[0]);
  742. if (ret)
  743. goto parse_error;
  744. }
  745. trace_probe_log_set_index(1);
  746. sys_event = argv[1];
  747. ret = traceprobe_parse_event_name(&sys_event, &sys_name, buf2, 0);
  748. if (ret || !sys_event || !sys_name) {
  749. trace_probe_log_err(0, NO_EVENT_INFO);
  750. goto parse_error;
  751. }
  752. if (!event) {
  753. strscpy(buf1, sys_event, MAX_EVENT_NAME_LEN);
  754. event = buf1;
  755. }
  756. for (i = 2; i < argc; i++) {
  757. if (!strcmp(argv[i], "if")) {
  758. filter_idx = i + 1;
  759. filter_cnt = argc - filter_idx;
  760. argc = i;
  761. break;
  762. }
  763. }
  764. if (argc - 2 > MAX_TRACE_ARGS) {
  765. ret = -E2BIG;
  766. goto error;
  767. }
  768. mutex_lock(&event_mutex);
  769. event_call = find_and_get_event(sys_name, sys_event);
  770. ep = alloc_event_probe(group, event, event_call, argc - 2);
  771. mutex_unlock(&event_mutex);
  772. if (IS_ERR(ep)) {
  773. ret = PTR_ERR(ep);
  774. if (ret == -ENODEV)
  775. trace_probe_log_err(0, BAD_ATTACH_EVENT);
  776. /* This must return -ENOMEM or missing event, else there is a bug */
  777. WARN_ON_ONCE(ret != -ENOMEM && ret != -ENODEV);
  778. ep = NULL;
  779. goto error;
  780. }
  781. if (filter_idx) {
  782. trace_probe_log_set_index(filter_idx);
  783. ret = trace_eprobe_parse_filter(ep, filter_cnt, argv + filter_idx);
  784. if (ret)
  785. goto parse_error;
  786. } else
  787. ep->filter_str = NULL;
  788. argc -= 2; argv += 2;
  789. /* parse arguments */
  790. for (i = 0; i < argc; i++) {
  791. trace_probe_log_set_index(i + 2);
  792. ret = trace_eprobe_tp_update_arg(ep, argv, i);
  793. if (ret)
  794. goto error;
  795. }
  796. ret = traceprobe_set_print_fmt(&ep->tp, PROBE_PRINT_EVENT);
  797. if (ret < 0)
  798. goto error;
  799. init_trace_eprobe_call(ep);
  800. mutex_lock(&event_mutex);
  801. ret = trace_probe_register_event_call(&ep->tp);
  802. if (ret) {
  803. if (ret == -EEXIST) {
  804. trace_probe_log_set_index(0);
  805. trace_probe_log_err(0, EVENT_EXIST);
  806. }
  807. mutex_unlock(&event_mutex);
  808. goto error;
  809. }
  810. ret = dyn_event_add(&ep->devent, &ep->tp.event->call);
  811. if (ret < 0) {
  812. trace_probe_unregister_event_call(&ep->tp);
  813. mutex_unlock(&event_mutex);
  814. goto error;
  815. }
  816. mutex_unlock(&event_mutex);
  817. return ret;
  818. parse_error:
  819. ret = -EINVAL;
  820. error:
  821. trace_event_probe_cleanup(ep);
  822. return ret;
  823. }
  824. /*
  825. * Register dynevent at core_initcall. This allows kernel to setup eprobe
  826. * events in postcore_initcall without tracefs.
  827. */
  828. static __init int trace_events_eprobe_init_early(void)
  829. {
  830. int err = 0;
  831. err = dyn_event_register(&eprobe_dyn_event_ops);
  832. if (err)
  833. pr_warn("Could not register eprobe_dyn_event_ops\n");
  834. return err;
  835. }
  836. core_initcall(trace_events_eprobe_init_early);