~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

TOMOYO Linux Cross Reference
Linux/kernel/trace/trace_eprobe.c

Version: ~ [ linux-6.11.5 ] ~ [ linux-6.10.14 ] ~ [ linux-6.9.12 ] ~ [ linux-6.8.12 ] ~ [ linux-6.7.12 ] ~ [ linux-6.6.58 ] ~ [ linux-6.5.13 ] ~ [ linux-6.4.16 ] ~ [ linux-6.3.13 ] ~ [ linux-6.2.16 ] ~ [ linux-6.1.114 ] ~ [ linux-6.0.19 ] ~ [ linux-5.19.17 ] ~ [ linux-5.18.19 ] ~ [ linux-5.17.15 ] ~ [ linux-5.16.20 ] ~ [ linux-5.15.169 ] ~ [ linux-5.14.21 ] ~ [ linux-5.13.19 ] ~ [ linux-5.12.19 ] ~ [ linux-5.11.22 ] ~ [ linux-5.10.228 ] ~ [ linux-5.9.16 ] ~ [ linux-5.8.18 ] ~ [ linux-5.7.19 ] ~ [ linux-5.6.19 ] ~ [ linux-5.5.19 ] ~ [ linux-5.4.284 ] ~ [ linux-5.3.18 ] ~ [ linux-5.2.21 ] ~ [ linux-5.1.21 ] ~ [ linux-5.0.21 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.322 ] ~ [ linux-4.18.20 ] ~ [ linux-4.17.19 ] ~ [ linux-4.16.18 ] ~ [ linux-4.15.18 ] ~ [ linux-4.14.336 ] ~ [ linux-4.13.16 ] ~ [ linux-4.12.14 ] ~ [ linux-4.11.12 ] ~ [ linux-4.10.17 ] ~ [ linux-4.9.337 ] ~ [ linux-4.4.302 ] ~ [ linux-3.10.108 ] ~ [ linux-2.6.32.71 ] ~ [ linux-2.6.0 ] ~ [ linux-2.4.37.11 ] ~ [ unix-v6-master ] ~ [ ccs-tools-1.8.9 ] ~ [ policy-sample ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

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

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

kernel.org | git.kernel.org | LWN.net | Project Home | SVN repository | Mail admin

Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.

sflogo.php