1 /* 2 * event tracer 3 * 4 * Copyright (C) 2008 Red Hat Inc, Steven Rostedt <srostedt@redhat.com> 5 * 6 * - Added format output of fields of the trace point. 7 * This was based off of work by Tom Zanussi <tzanussi@gmail.com>. 8 * 9 */ 10 11 #include <linux/workqueue.h> 12 #include <linux/spinlock.h> 13 #include <linux/kthread.h> 14 #include <linux/debugfs.h> 15 #include <linux/uaccess.h> 16 #include <linux/module.h> 17 #include <linux/ctype.h> 18 #include <linux/delay.h> 19 20 #include <asm/setup.h> 21 22 #include "trace_output.h" 23 24 #undef TRACE_SYSTEM 25 #define TRACE_SYSTEM "TRACE_SYSTEM" 26 27 DEFINE_MUTEX(event_mutex); 28 29 LIST_HEAD(ftrace_events); 30 31 int trace_define_field(struct ftrace_event_call *call, const char *type, 32 const char *name, int offset, int size, int is_signed, 33 int filter_type) 34 { 35 struct ftrace_event_field *field; 36 37 field = kzalloc(sizeof(*field), GFP_KERNEL); 38 if (!field) 39 goto err; 40 41 field->name = kstrdup(name, GFP_KERNEL); 42 if (!field->name) 43 goto err; 44 45 field->type = kstrdup(type, GFP_KERNEL); 46 if (!field->type) 47 goto err; 48 49 if (filter_type == FILTER_OTHER) 50 field->filter_type = filter_assign_type(type); 51 else 52 field->filter_type = filter_type; 53 54 field->offset = offset; 55 field->size = size; 56 field->is_signed = is_signed; 57 58 list_add(&field->link, &call->fields); 59 60 return 0; 61 62 err: 63 if (field) { 64 kfree(field->name); 65 kfree(field->type); 66 } 67 kfree(field); 68 69 return -ENOMEM; 70 } 71 EXPORT_SYMBOL_GPL(trace_define_field); 72 73 #define __common_field(type, item) \ 74 ret = trace_define_field(call, #type, "common_" #item, \ 75 offsetof(typeof(ent), item), \ 76 sizeof(ent.item), \ 77 is_signed_type(type), FILTER_OTHER); \ 78 if (ret) \ 79 return ret; 80 81 static int trace_define_common_fields(struct ftrace_event_call *call) 82 { 83 int ret; 84 struct trace_entry ent; 85 86 __common_field(unsigned short, type); 87 __common_field(unsigned char, flags); 88 __common_field(unsigned char, preempt_count); 89 __common_field(int, pid); 90 __common_field(int, lock_depth); 91 92 return ret; 93 } 94 95 void trace_destroy_fields(struct ftrace_event_call *call) 96 { 97 struct ftrace_event_field *field, *next; 98 99 list_for_each_entry_safe(field, next, &call->fields, link) { 100 list_del(&field->link); 101 kfree(field->type); 102 kfree(field->name); 103 kfree(field); 104 } 105 } 106 107 int trace_event_raw_init(struct ftrace_event_call *call) 108 { 109 int id; 110 111 id = register_ftrace_event(call->event); 112 if (!id) 113 return -ENODEV; 114 call->id = id; 115 INIT_LIST_HEAD(&call->fields); 116 117 return 0; 118 } 119 EXPORT_SYMBOL_GPL(trace_event_raw_init); 120 121 static int ftrace_event_enable_disable(struct ftrace_event_call *call, 122 int enable) 123 { 124 int ret = 0; 125 126 switch (enable) { 127 case 0: 128 if (call->enabled) { 129 call->enabled = 0; 130 tracing_stop_cmdline_record(); 131 call->unregfunc(call); 132 } 133 break; 134 case 1: 135 if (!call->enabled) { 136 tracing_start_cmdline_record(); 137 ret = call->regfunc(call); 138 if (ret) { 139 tracing_stop_cmdline_record(); 140 pr_info("event trace: Could not enable event " 141 "%s\n", call->name); 142 break; 143 } 144 call->enabled = 1; 145 } 146 break; 147 } 148 149 return ret; 150 } 151 152 static void ftrace_clear_events(void) 153 { 154 struct ftrace_event_call *call; 155 156 mutex_lock(&event_mutex); 157 list_for_each_entry(call, &ftrace_events, list) { 158 ftrace_event_enable_disable(call, 0); 159 } 160 mutex_unlock(&event_mutex); 161 } 162 163 /* 164 * __ftrace_set_clr_event(NULL, NULL, NULL, set) will set/unset all events. 165 */ 166 static int __ftrace_set_clr_event(const char *match, const char *sub, 167 const char *event, int set) 168 { 169 struct ftrace_event_call *call; 170 int ret = -EINVAL; 171 172 mutex_lock(&event_mutex); 173 list_for_each_entry(call, &ftrace_events, list) { 174 175 if (!call->name || !call->regfunc) 176 continue; 177 178 if (match && 179 strcmp(match, call->name) != 0 && 180 strcmp(match, call->system) != 0) 181 continue; 182 183 if (sub && strcmp(sub, call->system) != 0) 184 continue; 185 186 if (event && strcmp(event, call->name) != 0) 187 continue; 188 189 ftrace_event_enable_disable(call, set); 190 191 ret = 0; 192 } 193 mutex_unlock(&event_mutex); 194 195 return ret; 196 } 197 198 static int ftrace_set_clr_event(char *buf, int set) 199 { 200 char *event = NULL, *sub = NULL, *match; 201 202 /* 203 * The buf format can be <subsystem>:<event-name> 204 * *:<event-name> means any event by that name. 205 * :<event-name> is the same. 206 * 207 * <subsystem>:* means all events in that subsystem 208 * <subsystem>: means the same. 209 * 210 * <name> (no ':') means all events in a subsystem with 211 * the name <name> or any event that matches <name> 212 */ 213 214 match = strsep(&buf, ":"); 215 if (buf) { 216 sub = match; 217 event = buf; 218 match = NULL; 219 220 if (!strlen(sub) || strcmp(sub, "*") == 0) 221 sub = NULL; 222 if (!strlen(event) || strcmp(event, "*") == 0) 223 event = NULL; 224 } 225 226 return __ftrace_set_clr_event(match, sub, event, set); 227 } 228 229 /** 230 * trace_set_clr_event - enable or disable an event 231 * @system: system name to match (NULL for any system) 232 * @event: event name to match (NULL for all events, within system) 233 * @set: 1 to enable, 0 to disable 234 * 235 * This is a way for other parts of the kernel to enable or disable 236 * event recording. 237 * 238 * Returns 0 on success, -EINVAL if the parameters do not match any 239 * registered events. 240 */ 241 int trace_set_clr_event(const char *system, const char *event, int set) 242 { 243 return __ftrace_set_clr_event(NULL, system, event, set); 244 } 245 246 /* 128 should be much more than enough */ 247 #define EVENT_BUF_SIZE 127 248 249 static ssize_t 250 ftrace_event_write(struct file *file, const char __user *ubuf, 251 size_t cnt, loff_t *ppos) 252 { 253 struct trace_parser parser; 254 ssize_t read, ret; 255 256 if (!cnt) 257 return 0; 258 259 ret = tracing_update_buffers(); 260 if (ret < 0) 261 return ret; 262 263 if (trace_parser_get_init(&parser, EVENT_BUF_SIZE + 1)) 264 return -ENOMEM; 265 266 read = trace_get_user(&parser, ubuf, cnt, ppos); 267 268 if (read >= 0 && trace_parser_loaded((&parser))) { 269 int set = 1; 270 271 if (*parser.buffer == '!') 272 set = 0; 273 274 parser.buffer[parser.idx] = 0; 275 276 ret = ftrace_set_clr_event(parser.buffer + !set, set); 277 if (ret) 278 goto out_put; 279 } 280 281 ret = read; 282 283 out_put: 284 trace_parser_put(&parser); 285 286 return ret; 287 } 288 289 static void * 290 t_next(struct seq_file *m, void *v, loff_t *pos) 291 { 292 struct ftrace_event_call *call = v; 293 294 (*pos)++; 295 296 list_for_each_entry_continue(call, &ftrace_events, list) { 297 /* 298 * The ftrace subsystem is for showing formats only. 299 * They can not be enabled or disabled via the event files. 300 */ 301 if (call->regfunc) 302 return call; 303 } 304 305 return NULL; 306 } 307 308 static void *t_start(struct seq_file *m, loff_t *pos) 309 { 310 struct ftrace_event_call *call; 311 loff_t l; 312 313 mutex_lock(&event_mutex); 314 315 call = list_entry(&ftrace_events, struct ftrace_event_call, list); 316 for (l = 0; l <= *pos; ) { 317 call = t_next(m, call, &l); 318 if (!call) 319 break; 320 } 321 return call; 322 } 323 324 static void * 325 s_next(struct seq_file *m, void *v, loff_t *pos) 326 { 327 struct ftrace_event_call *call = v; 328 329 (*pos)++; 330 331 list_for_each_entry_continue(call, &ftrace_events, list) { 332 if (call->enabled) 333 return call; 334 } 335 336 return NULL; 337 } 338 339 static void *s_start(struct seq_file *m, loff_t *pos) 340 { 341 struct ftrace_event_call *call; 342 loff_t l; 343 344 mutex_lock(&event_mutex); 345 346 call = list_entry(&ftrace_events, struct ftrace_event_call, list); 347 for (l = 0; l <= *pos; ) { 348 call = s_next(m, call, &l); 349 if (!call) 350 break; 351 } 352 return call; 353 } 354 355 static int t_show(struct seq_file *m, void *v) 356 { 357 struct ftrace_event_call *call = v; 358 359 if (strcmp(call->system, TRACE_SYSTEM) != 0) 360 seq_printf(m, "%s:", call->system); 361 seq_printf(m, "%s\n", call->name); 362 363 return 0; 364 } 365 366 static void t_stop(struct seq_file *m, void *p) 367 { 368 mutex_unlock(&event_mutex); 369 } 370 371 static int 372 ftrace_event_seq_open(struct inode *inode, struct file *file) 373 { 374 const struct seq_operations *seq_ops; 375 376 if ((file->f_mode & FMODE_WRITE) && 377 (file->f_flags & O_TRUNC)) 378 ftrace_clear_events(); 379 380 seq_ops = inode->i_private; 381 return seq_open(file, seq_ops); 382 } 383 384 static ssize_t 385 event_enable_read(struct file *filp, char __user *ubuf, size_t cnt, 386 loff_t *ppos) 387 { 388 struct ftrace_event_call *call = filp->private_data; 389 char *buf; 390 391 if (call->enabled) 392 buf = "1\n"; 393 else 394 buf = "0\n"; 395 396 return simple_read_from_buffer(ubuf, cnt, ppos, buf, 2); 397 } 398 399 static ssize_t 400 event_enable_write(struct file *filp, const char __user *ubuf, size_t cnt, 401 loff_t *ppos) 402 { 403 struct ftrace_event_call *call = filp->private_data; 404 char buf[64]; 405 unsigned long val; 406 int ret; 407 408 if (cnt >= sizeof(buf)) 409 return -EINVAL; 410 411 if (copy_from_user(&buf, ubuf, cnt)) 412 return -EFAULT; 413 414 buf[cnt] = 0; 415 416 ret = strict_strtoul(buf, 10, &val); 417 if (ret < 0) 418 return ret; 419 420 ret = tracing_update_buffers(); 421 if (ret < 0) 422 return ret; 423 424 switch (val) { 425 case 0: 426 case 1: 427 mutex_lock(&event_mutex); 428 ret = ftrace_event_enable_disable(call, val); 429 mutex_unlock(&event_mutex); 430 break; 431 432 default: 433 return -EINVAL; 434 } 435 436 *ppos += cnt; 437 438 return ret ? ret : cnt; 439 } 440 441 static ssize_t 442 system_enable_read(struct file *filp, char __user *ubuf, size_t cnt, 443 loff_t *ppos) 444 { 445 const char set_to_char[4] = { '?', '0', '1', 'X' }; 446 const char *system = filp->private_data; 447 struct ftrace_event_call *call; 448 char buf[2]; 449 int set = 0; 450 int ret; 451 452 mutex_lock(&event_mutex); 453 list_for_each_entry(call, &ftrace_events, list) { 454 if (!call->name || !call->regfunc) 455 continue; 456 457 if (system && strcmp(call->system, system) != 0) 458 continue; 459 460 /* 461 * We need to find out if all the events are set 462 * or if all events or cleared, or if we have 463 * a mixture. 464 */ 465 set |= (1 << !!call->enabled); 466 467 /* 468 * If we have a mixture, no need to look further. 469 */ 470 if (set == 3) 471 break; 472 } 473 mutex_unlock(&event_mutex); 474 475 buf[0] = set_to_char[set]; 476 buf[1] = '\n'; 477 478 ret = simple_read_from_buffer(ubuf, cnt, ppos, buf, 2); 479 480 return ret; 481 } 482 483 static ssize_t 484 system_enable_write(struct file *filp, const char __user *ubuf, size_t cnt, 485 loff_t *ppos) 486 { 487 const char *system = filp->private_data; 488 unsigned long val; 489 char buf[64]; 490 ssize_t ret; 491 492 if (cnt >= sizeof(buf)) 493 return -EINVAL; 494 495 if (copy_from_user(&buf, ubuf, cnt)) 496 return -EFAULT; 497 498 buf[cnt] = 0; 499 500 ret = strict_strtoul(buf, 10, &val); 501 if (ret < 0) 502 return ret; 503 504 ret = tracing_update_buffers(); 505 if (ret < 0) 506 return ret; 507 508 if (val != 0 && val != 1) 509 return -EINVAL; 510 511 ret = __ftrace_set_clr_event(NULL, system, NULL, val); 512 if (ret) 513 goto out; 514 515 ret = cnt; 516 517 out: 518 *ppos += cnt; 519 520 return ret; 521 } 522 523 extern char *__bad_type_size(void); 524 525 #undef FIELD 526 #define FIELD(type, name) \ 527 sizeof(type) != sizeof(field.name) ? __bad_type_size() : \ 528 #type, "common_" #name, offsetof(typeof(field), name), \ 529 sizeof(field.name), is_signed_type(type) 530 531 static int trace_write_header(struct trace_seq *s) 532 { 533 struct trace_entry field; 534 535 /* struct trace_entry */ 536 return trace_seq_printf(s, 537 "\tfield:%s %s;\toffset:%zu;\tsize:%zu;\tsigned:%u;\n" 538 "\tfield:%s %s;\toffset:%zu;\tsize:%zu;\tsigned:%u;\n" 539 "\tfield:%s %s;\toffset:%zu;\tsize:%zu;\tsigned:%u;\n" 540 "\tfield:%s %s;\toffset:%zu;\tsize:%zu;\tsigned:%u;\n" 541 "\tfield:%s %s;\toffset:%zu;\tsize:%zu;\tsigned:%u;\n" 542 "\n", 543 FIELD(unsigned short, type), 544 FIELD(unsigned char, flags), 545 FIELD(unsigned char, preempt_count), 546 FIELD(int, pid), 547 FIELD(int, lock_depth)); 548 } 549 550 static ssize_t 551 event_format_read(struct file *filp, char __user *ubuf, size_t cnt, 552 loff_t *ppos) 553 { 554 struct ftrace_event_call *call = filp->private_data; 555 struct trace_seq *s; 556 char *buf; 557 int r; 558 559 if (*ppos) 560 return 0; 561 562 s = kmalloc(sizeof(*s), GFP_KERNEL); 563 if (!s) 564 return -ENOMEM; 565 566 trace_seq_init(s); 567 568 /* If any of the first writes fail, so will the show_format. */ 569 570 trace_seq_printf(s, "name: %s\n", call->name); 571 trace_seq_printf(s, "ID: %d\n", call->id); 572 trace_seq_printf(s, "format:\n"); 573 trace_write_header(s); 574 575 r = call->show_format(call, s); 576 if (!r) { 577 /* 578 * ug! The format output is bigger than a PAGE!! 579 */ 580 buf = "FORMAT TOO BIG\n"; 581 r = simple_read_from_buffer(ubuf, cnt, ppos, 582 buf, strlen(buf)); 583 goto out; 584 } 585 586 r = simple_read_from_buffer(ubuf, cnt, ppos, 587 s->buffer, s->len); 588 out: 589 kfree(s); 590 return r; 591 } 592 593 static ssize_t 594 event_id_read(struct file *filp, char __user *ubuf, size_t cnt, loff_t *ppos) 595 { 596 struct ftrace_event_call *call = filp->private_data; 597 struct trace_seq *s; 598 int r; 599 600 if (*ppos) 601 return 0; 602 603 s = kmalloc(sizeof(*s), GFP_KERNEL); 604 if (!s) 605 return -ENOMEM; 606 607 trace_seq_init(s); 608 trace_seq_printf(s, "%d\n", call->id); 609 610 r = simple_read_from_buffer(ubuf, cnt, ppos, 611 s->buffer, s->len); 612 kfree(s); 613 return r; 614 } 615 616 static ssize_t 617 event_filter_read(struct file *filp, char __user *ubuf, size_t cnt, 618 loff_t *ppos) 619 { 620 struct ftrace_event_call *call = filp->private_data; 621 struct trace_seq *s; 622 int r; 623 624 if (*ppos) 625 return 0; 626 627 s = kmalloc(sizeof(*s), GFP_KERNEL); 628 if (!s) 629 return -ENOMEM; 630 631 trace_seq_init(s); 632 633 print_event_filter(call, s); 634 r = simple_read_from_buffer(ubuf, cnt, ppos, s->buffer, s->len); 635 636 kfree(s); 637 638 return r; 639 } 640 641 static ssize_t 642 event_filter_write(struct file *filp, const char __user *ubuf, size_t cnt, 643 loff_t *ppos) 644 { 645 struct ftrace_event_call *call = filp->private_data; 646 char *buf; 647 int err; 648 649 if (cnt >= PAGE_SIZE) 650 return -EINVAL; 651 652 buf = (char *)__get_free_page(GFP_TEMPORARY); 653 if (!buf) 654 return -ENOMEM; 655 656 if (copy_from_user(buf, ubuf, cnt)) { 657 free_page((unsigned long) buf); 658 return -EFAULT; 659 } 660 buf[cnt] = '\0'; 661 662 err = apply_event_filter(call, buf); 663 free_page((unsigned long) buf); 664 if (err < 0) 665 return err; 666 667 *ppos += cnt; 668 669 return cnt; 670 } 671 672 static ssize_t 673 subsystem_filter_read(struct file *filp, char __user *ubuf, size_t cnt, 674 loff_t *ppos) 675 { 676 struct event_subsystem *system = filp->private_data; 677 struct trace_seq *s; 678 int r; 679 680 if (*ppos) 681 return 0; 682 683 s = kmalloc(sizeof(*s), GFP_KERNEL); 684 if (!s) 685 return -ENOMEM; 686 687 trace_seq_init(s); 688 689 print_subsystem_event_filter(system, s); 690 r = simple_read_from_buffer(ubuf, cnt, ppos, s->buffer, s->len); 691 692 kfree(s); 693 694 return r; 695 } 696 697 static ssize_t 698 subsystem_filter_write(struct file *filp, const char __user *ubuf, size_t cnt, 699 loff_t *ppos) 700 { 701 struct event_subsystem *system = filp->private_data; 702 char *buf; 703 int err; 704 705 if (cnt >= PAGE_SIZE) 706 return -EINVAL; 707 708 buf = (char *)__get_free_page(GFP_TEMPORARY); 709 if (!buf) 710 return -ENOMEM; 711 712 if (copy_from_user(buf, ubuf, cnt)) { 713 free_page((unsigned long) buf); 714 return -EFAULT; 715 } 716 buf[cnt] = '\0'; 717 718 err = apply_subsystem_event_filter(system, buf); 719 free_page((unsigned long) buf); 720 if (err < 0) 721 return err; 722 723 *ppos += cnt; 724 725 return cnt; 726 } 727 728 static ssize_t 729 show_header(struct file *filp, char __user *ubuf, size_t cnt, loff_t *ppos) 730 { 731 int (*func)(struct trace_seq *s) = filp->private_data; 732 struct trace_seq *s; 733 int r; 734 735 if (*ppos) 736 return 0; 737 738 s = kmalloc(sizeof(*s), GFP_KERNEL); 739 if (!s) 740 return -ENOMEM; 741 742 trace_seq_init(s); 743 744 func(s); 745 r = simple_read_from_buffer(ubuf, cnt, ppos, s->buffer, s->len); 746 747 kfree(s); 748 749 return r; 750 } 751 752 static const struct seq_operations show_event_seq_ops = { 753 .start = t_start, 754 .next = t_next, 755 .show = t_show, 756 .stop = t_stop, 757 }; 758 759 static const struct seq_operations show_set_event_seq_ops = { 760 .start = s_start, 761 .next = s_next, 762 .show = t_show, 763 .stop = t_stop, 764 }; 765 766 static const struct file_operations ftrace_avail_fops = { 767 .open = ftrace_event_seq_open, 768 .read = seq_read, 769 .llseek = seq_lseek, 770 .release = seq_release, 771 }; 772 773 static const struct file_operations ftrace_set_event_fops = { 774 .open = ftrace_event_seq_open, 775 .read = seq_read, 776 .write = ftrace_event_write, 777 .llseek = seq_lseek, 778 .release = seq_release, 779 }; 780 781 static const struct file_operations ftrace_enable_fops = { 782 .open = tracing_open_generic, 783 .read = event_enable_read, 784 .write = event_enable_write, 785 }; 786 787 static const struct file_operations ftrace_event_format_fops = { 788 .open = tracing_open_generic, 789 .read = event_format_read, 790 }; 791 792 static const struct file_operations ftrace_event_id_fops = { 793 .open = tracing_open_generic, 794 .read = event_id_read, 795 }; 796 797 static const struct file_operations ftrace_event_filter_fops = { 798 .open = tracing_open_generic, 799 .read = event_filter_read, 800 .write = event_filter_write, 801 }; 802 803 static const struct file_operations ftrace_subsystem_filter_fops = { 804 .open = tracing_open_generic, 805 .read = subsystem_filter_read, 806 .write = subsystem_filter_write, 807 }; 808 809 static const struct file_operations ftrace_system_enable_fops = { 810 .open = tracing_open_generic, 811 .read = system_enable_read, 812 .write = system_enable_write, 813 }; 814 815 static const struct file_operations ftrace_show_header_fops = { 816 .open = tracing_open_generic, 817 .read = show_header, 818 }; 819 820 static struct dentry *event_trace_events_dir(void) 821 { 822 static struct dentry *d_tracer; 823 static struct dentry *d_events; 824 825 if (d_events) 826 return d_events; 827 828 d_tracer = tracing_init_dentry(); 829 if (!d_tracer) 830 return NULL; 831 832 d_events = debugfs_create_dir("events", d_tracer); 833 if (!d_events) 834 pr_warning("Could not create debugfs " 835 "'events' directory\n"); 836 837 return d_events; 838 } 839 840 static LIST_HEAD(event_subsystems); 841 842 static struct dentry * 843 event_subsystem_dir(const char *name, struct dentry *d_events) 844 { 845 struct event_subsystem *system; 846 struct dentry *entry; 847 848 /* First see if we did not already create this dir */ 849 list_for_each_entry(system, &event_subsystems, list) { 850 if (strcmp(system->name, name) == 0) { 851 system->nr_events++; 852 return system->entry; 853 } 854 } 855 856 /* need to create new entry */ 857 system = kmalloc(sizeof(*system), GFP_KERNEL); 858 if (!system) { 859 pr_warning("No memory to create event subsystem %s\n", 860 name); 861 return d_events; 862 } 863 864 system->entry = debugfs_create_dir(name, d_events); 865 if (!system->entry) { 866 pr_warning("Could not create event subsystem %s\n", 867 name); 868 kfree(system); 869 return d_events; 870 } 871 872 system->nr_events = 1; 873 system->name = kstrdup(name, GFP_KERNEL); 874 if (!system->name) { 875 debugfs_remove(system->entry); 876 kfree(system); 877 return d_events; 878 } 879 880 list_add(&system->list, &event_subsystems); 881 882 system->filter = NULL; 883 884 system->filter = kzalloc(sizeof(struct event_filter), GFP_KERNEL); 885 if (!system->filter) { 886 pr_warning("Could not allocate filter for subsystem " 887 "'%s'\n", name); 888 return system->entry; 889 } 890 891 entry = debugfs_create_file("filter", 0644, system->entry, system, 892 &ftrace_subsystem_filter_fops); 893 if (!entry) { 894 kfree(system->filter); 895 system->filter = NULL; 896 pr_warning("Could not create debugfs " 897 "'%s/filter' entry\n", name); 898 } 899 900 trace_create_file("enable", 0644, system->entry, 901 (void *)system->name, 902 &ftrace_system_enable_fops); 903 904 return system->entry; 905 } 906 907 static int 908 event_create_dir(struct ftrace_event_call *call, struct dentry *d_events, 909 const struct file_operations *id, 910 const struct file_operations *enable, 911 const struct file_operations *filter, 912 const struct file_operations *format) 913 { 914 int ret; 915 916 /* 917 * If the trace point header did not define TRACE_SYSTEM 918 * then the system would be called "TRACE_SYSTEM". 919 */ 920 if (strcmp(call->system, TRACE_SYSTEM) != 0) 921 d_events = event_subsystem_dir(call->system, d_events); 922 923 call->dir = debugfs_create_dir(call->name, d_events); 924 if (!call->dir) { 925 pr_warning("Could not create debugfs " 926 "'%s' directory\n", call->name); 927 return -1; 928 } 929 930 if (call->regfunc) 931 trace_create_file("enable", 0644, call->dir, call, 932 enable); 933 934 if (call->id && call->profile_enable) 935 trace_create_file("id", 0444, call->dir, call, 936 id); 937 938 if (call->define_fields) { 939 ret = trace_define_common_fields(call); 940 if (!ret) 941 ret = call->define_fields(call); 942 if (ret < 0) { 943 pr_warning("Could not initialize trace point" 944 " events/%s\n", call->name); 945 return ret; 946 } 947 trace_create_file("filter", 0644, call->dir, call, 948 filter); 949 } 950 951 /* A trace may not want to export its format */ 952 if (!call->show_format) 953 return 0; 954 955 trace_create_file("format", 0444, call->dir, call, 956 format); 957 958 return 0; 959 } 960 961 static int __trace_add_event_call(struct ftrace_event_call *call) 962 { 963 struct dentry *d_events; 964 int ret; 965 966 if (!call->name) 967 return -EINVAL; 968 969 if (call->raw_init) { 970 ret = call->raw_init(call); 971 if (ret < 0) { 972 if (ret != -ENOSYS) 973 pr_warning("Could not initialize trace " 974 "events/%s\n", call->name); 975 return ret; 976 } 977 } 978 979 d_events = event_trace_events_dir(); 980 if (!d_events) 981 return -ENOENT; 982 983 ret = event_create_dir(call, d_events, &ftrace_event_id_fops, 984 &ftrace_enable_fops, &ftrace_event_filter_fops, 985 &ftrace_event_format_fops); 986 if (!ret) 987 list_add(&call->list, &ftrace_events); 988 989 return ret; 990 } 991 992 /* Add an additional event_call dynamically */ 993 int trace_add_event_call(struct ftrace_event_call *call) 994 { 995 int ret; 996 mutex_lock(&event_mutex); 997 ret = __trace_add_event_call(call); 998 mutex_unlock(&event_mutex); 999 return ret; 1000 } 1001 1002 static void remove_subsystem_dir(const char *name) 1003 { 1004 struct event_subsystem *system; 1005 1006 if (strcmp(name, TRACE_SYSTEM) == 0) 1007 return; 1008 1009 list_for_each_entry(system, &event_subsystems, list) { 1010 if (strcmp(system->name, name) == 0) { 1011 if (!--system->nr_events) { 1012 struct event_filter *filter = system->filter; 1013 1014 debugfs_remove_recursive(system->entry); 1015 list_del(&system->list); 1016 if (filter) { 1017 kfree(filter->filter_string); 1018 kfree(filter); 1019 } 1020 kfree(system->name); 1021 kfree(system); 1022 } 1023 break; 1024 } 1025 } 1026 } 1027 1028 /* 1029 * Must be called under locking both of event_mutex and trace_event_mutex. 1030 */ 1031 static void __trace_remove_event_call(struct ftrace_event_call *call) 1032 { 1033 ftrace_event_enable_disable(call, 0); 1034 if (call->event) 1035 __unregister_ftrace_event(call->event); 1036 debugfs_remove_recursive(call->dir); 1037 list_del(&call->list); 1038 trace_destroy_fields(call); 1039 destroy_preds(call); 1040 remove_subsystem_dir(call->system); 1041 } 1042 1043 /* Remove an event_call */ 1044 void trace_remove_event_call(struct ftrace_event_call *call) 1045 { 1046 mutex_lock(&event_mutex); 1047 down_write(&trace_event_mutex); 1048 __trace_remove_event_call(call); 1049 up_write(&trace_event_mutex); 1050 mutex_unlock(&event_mutex); 1051 } 1052 1053 #define for_each_event(event, start, end) \ 1054 for (event = start; \ 1055 (unsigned long)event < (unsigned long)end; \ 1056 event++) 1057 1058 #ifdef CONFIG_MODULES 1059 1060 static LIST_HEAD(ftrace_module_file_list); 1061 1062 /* 1063 * Modules must own their file_operations to keep up with 1064 * reference counting. 1065 */ 1066 struct ftrace_module_file_ops { 1067 struct list_head list; 1068 struct module *mod; 1069 struct file_operations id; 1070 struct file_operations enable; 1071 struct file_operations format; 1072 struct file_operations filter; 1073 }; 1074 1075 static struct ftrace_module_file_ops * 1076 trace_create_file_ops(struct module *mod) 1077 { 1078 struct ftrace_module_file_ops *file_ops; 1079 1080 /* 1081 * This is a bit of a PITA. To allow for correct reference 1082 * counting, modules must "own" their file_operations. 1083 * To do this, we allocate the file operations that will be 1084 * used in the event directory. 1085 */ 1086 1087 file_ops = kmalloc(sizeof(*file_ops), GFP_KERNEL); 1088 if (!file_ops) 1089 return NULL; 1090 1091 file_ops->mod = mod; 1092 1093 file_ops->id = ftrace_event_id_fops; 1094 file_ops->id.owner = mod; 1095 1096 file_ops->enable = ftrace_enable_fops; 1097 file_ops->enable.owner = mod; 1098 1099 file_ops->filter = ftrace_event_filter_fops; 1100 file_ops->filter.owner = mod; 1101 1102 file_ops->format = ftrace_event_format_fops; 1103 file_ops->format.owner = mod; 1104 1105 list_add(&file_ops->list, &ftrace_module_file_list); 1106 1107 return file_ops; 1108 } 1109 1110 static void trace_module_add_events(struct module *mod) 1111 { 1112 struct ftrace_module_file_ops *file_ops = NULL; 1113 struct ftrace_event_call *call, *start, *end; 1114 struct dentry *d_events; 1115 int ret; 1116 1117 start = mod->trace_events; 1118 end = mod->trace_events + mod->num_trace_events; 1119 1120 if (start == end) 1121 return; 1122 1123 d_events = event_trace_events_dir(); 1124 if (!d_events) 1125 return; 1126 1127 for_each_event(call, start, end) { 1128 /* The linker may leave blanks */ 1129 if (!call->name) 1130 continue; 1131 if (call->raw_init) { 1132 ret = call->raw_init(call); 1133 if (ret < 0) { 1134 if (ret != -ENOSYS) 1135 pr_warning("Could not initialize trace " 1136 "point events/%s\n", call->name); 1137 continue; 1138 } 1139 } 1140 /* 1141 * This module has events, create file ops for this module 1142 * if not already done. 1143 */ 1144 if (!file_ops) { 1145 file_ops = trace_create_file_ops(mod); 1146 if (!file_ops) 1147 return; 1148 } 1149 call->mod = mod; 1150 ret = event_create_dir(call, d_events, 1151 &file_ops->id, &file_ops->enable, 1152 &file_ops->filter, &file_ops->format); 1153 if (!ret) 1154 list_add(&call->list, &ftrace_events); 1155 } 1156 } 1157 1158 static void trace_module_remove_events(struct module *mod) 1159 { 1160 struct ftrace_module_file_ops *file_ops; 1161 struct ftrace_event_call *call, *p; 1162 bool found = false; 1163 1164 down_write(&trace_event_mutex); 1165 list_for_each_entry_safe(call, p, &ftrace_events, list) { 1166 if (call->mod == mod) { 1167 found = true; 1168 __trace_remove_event_call(call); 1169 } 1170 } 1171 1172 /* Now free the file_operations */ 1173 list_for_each_entry(file_ops, &ftrace_module_file_list, list) { 1174 if (file_ops->mod == mod) 1175 break; 1176 } 1177 if (&file_ops->list != &ftrace_module_file_list) { 1178 list_del(&file_ops->list); 1179 kfree(file_ops); 1180 } 1181 1182 /* 1183 * It is safest to reset the ring buffer if the module being unloaded 1184 * registered any events. 1185 */ 1186 if (found) 1187 tracing_reset_current_online_cpus(); 1188 up_write(&trace_event_mutex); 1189 } 1190 1191 static int trace_module_notify(struct notifier_block *self, 1192 unsigned long val, void *data) 1193 { 1194 struct module *mod = data; 1195 1196 mutex_lock(&event_mutex); 1197 switch (val) { 1198 case MODULE_STATE_COMING: 1199 trace_module_add_events(mod); 1200 break; 1201 case MODULE_STATE_GOING: 1202 trace_module_remove_events(mod); 1203 break; 1204 } 1205 mutex_unlock(&event_mutex); 1206 1207 return 0; 1208 } 1209 #else 1210 static int trace_module_notify(struct notifier_block *self, 1211 unsigned long val, void *data) 1212 { 1213 return 0; 1214 } 1215 #endif /* CONFIG_MODULES */ 1216 1217 static struct notifier_block trace_module_nb = { 1218 .notifier_call = trace_module_notify, 1219 .priority = 0, 1220 }; 1221 1222 extern struct ftrace_event_call __start_ftrace_events[]; 1223 extern struct ftrace_event_call __stop_ftrace_events[]; 1224 1225 static char bootup_event_buf[COMMAND_LINE_SIZE] __initdata; 1226 1227 static __init int setup_trace_event(char *str) 1228 { 1229 strlcpy(bootup_event_buf, str, COMMAND_LINE_SIZE); 1230 ring_buffer_expanded = 1; 1231 tracing_selftest_disabled = 1; 1232 1233 return 1; 1234 } 1235 __setup("trace_event=", setup_trace_event); 1236 1237 static __init int event_trace_init(void) 1238 { 1239 struct ftrace_event_call *call; 1240 struct dentry *d_tracer; 1241 struct dentry *entry; 1242 struct dentry *d_events; 1243 int ret; 1244 char *buf = bootup_event_buf; 1245 char *token; 1246 1247 d_tracer = tracing_init_dentry(); 1248 if (!d_tracer) 1249 return 0; 1250 1251 entry = debugfs_create_file("available_events", 0444, d_tracer, 1252 (void *)&show_event_seq_ops, 1253 &ftrace_avail_fops); 1254 if (!entry) 1255 pr_warning("Could not create debugfs " 1256 "'available_events' entry\n"); 1257 1258 entry = debugfs_create_file("set_event", 0644, d_tracer, 1259 (void *)&show_set_event_seq_ops, 1260 &ftrace_set_event_fops); 1261 if (!entry) 1262 pr_warning("Could not create debugfs " 1263 "'set_event' entry\n"); 1264 1265 d_events = event_trace_events_dir(); 1266 if (!d_events) 1267 return 0; 1268 1269 /* ring buffer internal formats */ 1270 trace_create_file("header_page", 0444, d_events, 1271 ring_buffer_print_page_header, 1272 &ftrace_show_header_fops); 1273 1274 trace_create_file("header_event", 0444, d_events, 1275 ring_buffer_print_entry_header, 1276 &ftrace_show_header_fops); 1277 1278 trace_create_file("enable", 0644, d_events, 1279 NULL, &ftrace_system_enable_fops); 1280 1281 for_each_event(call, __start_ftrace_events, __stop_ftrace_events) { 1282 /* The linker may leave blanks */ 1283 if (!call->name) 1284 continue; 1285 if (call->raw_init) { 1286 ret = call->raw_init(call); 1287 if (ret < 0) { 1288 if (ret != -ENOSYS) 1289 pr_warning("Could not initialize trace " 1290 "point events/%s\n", call->name); 1291 continue; 1292 } 1293 } 1294 ret = event_create_dir(call, d_events, &ftrace_event_id_fops, 1295 &ftrace_enable_fops, 1296 &ftrace_event_filter_fops, 1297 &ftrace_event_format_fops); 1298 if (!ret) 1299 list_add(&call->list, &ftrace_events); 1300 } 1301 1302 while (true) { 1303 token = strsep(&buf, ","); 1304 1305 if (!token) 1306 break; 1307 if (!*token) 1308 continue; 1309 1310 ret = ftrace_set_clr_event(token, 1); 1311 if (ret) 1312 pr_warning("Failed to enable trace event: %s\n", token); 1313 } 1314 1315 ret = register_module_notifier(&trace_module_nb); 1316 if (ret) 1317 pr_warning("Failed to register trace events module notifier\n"); 1318 1319 return 0; 1320 } 1321 fs_initcall(event_trace_init); 1322 1323 #ifdef CONFIG_FTRACE_STARTUP_TEST 1324 1325 static DEFINE_SPINLOCK(test_spinlock); 1326 static DEFINE_SPINLOCK(test_spinlock_irq); 1327 static DEFINE_MUTEX(test_mutex); 1328 1329 static __init void test_work(struct work_struct *dummy) 1330 { 1331 spin_lock(&test_spinlock); 1332 spin_lock_irq(&test_spinlock_irq); 1333 udelay(1); 1334 spin_unlock_irq(&test_spinlock_irq); 1335 spin_unlock(&test_spinlock); 1336 1337 mutex_lock(&test_mutex); 1338 msleep(1); 1339 mutex_unlock(&test_mutex); 1340 } 1341 1342 static __init int event_test_thread(void *unused) 1343 { 1344 void *test_malloc; 1345 1346 test_malloc = kmalloc(1234, GFP_KERNEL); 1347 if (!test_malloc) 1348 pr_info("failed to kmalloc\n"); 1349 1350 schedule_on_each_cpu(test_work); 1351 1352 kfree(test_malloc); 1353 1354 set_current_state(TASK_INTERRUPTIBLE); 1355 while (!kthread_should_stop()) 1356 schedule(); 1357 1358 return 0; 1359 } 1360 1361 /* 1362 * Do various things that may trigger events. 1363 */ 1364 static __init void event_test_stuff(void) 1365 { 1366 struct task_struct *test_thread; 1367 1368 test_thread = kthread_run(event_test_thread, NULL, "test-events"); 1369 msleep(1); 1370 kthread_stop(test_thread); 1371 } 1372 1373 /* 1374 * For every trace event defined, we will test each trace point separately, 1375 * and then by groups, and finally all trace points. 1376 */ 1377 static __init void event_trace_self_tests(void) 1378 { 1379 struct ftrace_event_call *call; 1380 struct event_subsystem *system; 1381 int ret; 1382 1383 pr_info("Running tests on trace events:\n"); 1384 1385 list_for_each_entry(call, &ftrace_events, list) { 1386 1387 /* Only test those that have a regfunc */ 1388 if (!call->regfunc) 1389 continue; 1390 1391 /* 1392 * Testing syscall events here is pretty useless, but 1393 * we still do it if configured. But this is time consuming. 1394 * What we really need is a user thread to perform the 1395 * syscalls as we test. 1396 */ 1397 #ifndef CONFIG_EVENT_TRACE_TEST_SYSCALLS 1398 if (call->system && 1399 strcmp(call->system, "syscalls") == 0) 1400 continue; 1401 #endif 1402 1403 pr_info("Testing event %s: ", call->name); 1404 1405 /* 1406 * If an event is already enabled, someone is using 1407 * it and the self test should not be on. 1408 */ 1409 if (call->enabled) { 1410 pr_warning("Enabled event during self test!\n"); 1411 WARN_ON_ONCE(1); 1412 continue; 1413 } 1414 1415 ftrace_event_enable_disable(call, 1); 1416 event_test_stuff(); 1417 ftrace_event_enable_disable(call, 0); 1418 1419 pr_cont("OK\n"); 1420 } 1421 1422 /* Now test at the sub system level */ 1423 1424 pr_info("Running tests on trace event systems:\n"); 1425 1426 list_for_each_entry(system, &event_subsystems, list) { 1427 1428 /* the ftrace system is special, skip it */ 1429 if (strcmp(system->name, "ftrace") == 0) 1430 continue; 1431 1432 pr_info("Testing event system %s: ", system->name); 1433 1434 ret = __ftrace_set_clr_event(NULL, system->name, NULL, 1); 1435 if (WARN_ON_ONCE(ret)) { 1436 pr_warning("error enabling system %s\n", 1437 system->name); 1438 continue; 1439 } 1440 1441 event_test_stuff(); 1442 1443 ret = __ftrace_set_clr_event(NULL, system->name, NULL, 0); 1444 if (WARN_ON_ONCE(ret)) 1445 pr_warning("error disabling system %s\n", 1446 system->name); 1447 1448 pr_cont("OK\n"); 1449 } 1450 1451 /* Test with all events enabled */ 1452 1453 pr_info("Running tests on all trace events:\n"); 1454 pr_info("Testing all events: "); 1455 1456 ret = __ftrace_set_clr_event(NULL, NULL, NULL, 1); 1457 if (WARN_ON_ONCE(ret)) { 1458 pr_warning("error enabling all events\n"); 1459 return; 1460 } 1461 1462 event_test_stuff(); 1463 1464 /* reset sysname */ 1465 ret = __ftrace_set_clr_event(NULL, NULL, NULL, 0); 1466 if (WARN_ON_ONCE(ret)) { 1467 pr_warning("error disabling all events\n"); 1468 return; 1469 } 1470 1471 pr_cont("OK\n"); 1472 } 1473 1474 #ifdef CONFIG_FUNCTION_TRACER 1475 1476 static DEFINE_PER_CPU(atomic_t, ftrace_test_event_disable); 1477 1478 static void 1479 function_test_events_call(unsigned long ip, unsigned long parent_ip) 1480 { 1481 struct ring_buffer_event *event; 1482 struct ring_buffer *buffer; 1483 struct ftrace_entry *entry; 1484 unsigned long flags; 1485 long disabled; 1486 int resched; 1487 int cpu; 1488 int pc; 1489 1490 pc = preempt_count(); 1491 resched = ftrace_preempt_disable(); 1492 cpu = raw_smp_processor_id(); 1493 disabled = atomic_inc_return(&per_cpu(ftrace_test_event_disable, cpu)); 1494 1495 if (disabled != 1) 1496 goto out; 1497 1498 local_save_flags(flags); 1499 1500 event = trace_current_buffer_lock_reserve(&buffer, 1501 TRACE_FN, sizeof(*entry), 1502 flags, pc); 1503 if (!event) 1504 goto out; 1505 entry = ring_buffer_event_data(event); 1506 entry->ip = ip; 1507 entry->parent_ip = parent_ip; 1508 1509 trace_nowake_buffer_unlock_commit(buffer, event, flags, pc); 1510 1511 out: 1512 atomic_dec(&per_cpu(ftrace_test_event_disable, cpu)); 1513 ftrace_preempt_enable(resched); 1514 } 1515 1516 static struct ftrace_ops trace_ops __initdata = 1517 { 1518 .func = function_test_events_call, 1519 }; 1520 1521 static __init void event_trace_self_test_with_function(void) 1522 { 1523 register_ftrace_function(&trace_ops); 1524 pr_info("Running tests again, along with the function tracer\n"); 1525 event_trace_self_tests(); 1526 unregister_ftrace_function(&trace_ops); 1527 } 1528 #else 1529 static __init void event_trace_self_test_with_function(void) 1530 { 1531 } 1532 #endif 1533 1534 static __init int event_trace_self_tests_init(void) 1535 { 1536 if (!tracing_selftest_disabled) { 1537 event_trace_self_tests(); 1538 event_trace_self_test_with_function(); 1539 } 1540 1541 return 0; 1542 } 1543 1544 late_initcall(event_trace_self_tests_init); 1545 1546 #endif 1547