1 /* 2 * trace_events_trigger - trace event triggers 3 * 4 * This program is free software; you can redistribute it and/or modify 5 * it under the terms of the GNU General Public License as published by 6 * the Free Software Foundation; either version 2 of the License, or 7 * (at your option) any later version. 8 * 9 * This program is distributed in the hope that it will be useful, 10 * but WITHOUT ANY WARRANTY; without even the implied warranty of 11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 * GNU General Public License for more details. 13 * 14 * You should have received a copy of the GNU General Public License 15 * along with this program; if not, write to the Free Software 16 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. 17 * 18 * Copyright (C) 2013 Tom Zanussi <tom.zanussi@linux.intel.com> 19 */ 20 21 #include <linux/module.h> 22 #include <linux/ctype.h> 23 #include <linux/mutex.h> 24 #include <linux/slab.h> 25 #include <linux/rculist.h> 26 27 #include "trace.h" 28 29 static LIST_HEAD(trigger_commands); 30 static DEFINE_MUTEX(trigger_cmd_mutex); 31 32 void trigger_data_free(struct event_trigger_data *data) 33 { 34 if (data->cmd_ops->set_filter) 35 data->cmd_ops->set_filter(NULL, data, NULL); 36 37 synchronize_sched(); /* make sure current triggers exit before free */ 38 kfree(data); 39 } 40 41 /** 42 * event_triggers_call - Call triggers associated with a trace event 43 * @file: The trace_event_file associated with the event 44 * @rec: The trace entry for the event, NULL for unconditional invocation 45 * 46 * For each trigger associated with an event, invoke the trigger 47 * function registered with the associated trigger command. If rec is 48 * non-NULL, it means that the trigger requires further processing and 49 * shouldn't be unconditionally invoked. If rec is non-NULL and the 50 * trigger has a filter associated with it, rec will checked against 51 * the filter and if the record matches the trigger will be invoked. 52 * If the trigger is a 'post_trigger', meaning it shouldn't be invoked 53 * in any case until the current event is written, the trigger 54 * function isn't invoked but the bit associated with the deferred 55 * trigger is set in the return value. 56 * 57 * Returns an enum event_trigger_type value containing a set bit for 58 * any trigger that should be deferred, ETT_NONE if nothing to defer. 59 * 60 * Called from tracepoint handlers (with rcu_read_lock_sched() held). 61 * 62 * Return: an enum event_trigger_type value containing a set bit for 63 * any trigger that should be deferred, ETT_NONE if nothing to defer. 64 */ 65 enum event_trigger_type 66 event_triggers_call(struct trace_event_file *file, void *rec, 67 struct ring_buffer_event *event) 68 { 69 struct event_trigger_data *data; 70 enum event_trigger_type tt = ETT_NONE; 71 struct event_filter *filter; 72 73 if (list_empty(&file->triggers)) 74 return tt; 75 76 list_for_each_entry_rcu(data, &file->triggers, list) { 77 if (data->paused) 78 continue; 79 if (!rec) { 80 data->ops->func(data, rec, event); 81 continue; 82 } 83 filter = rcu_dereference_sched(data->filter); 84 if (filter && !filter_match_preds(filter, rec)) 85 continue; 86 if (event_command_post_trigger(data->cmd_ops)) { 87 tt |= data->cmd_ops->trigger_type; 88 continue; 89 } 90 data->ops->func(data, rec, event); 91 } 92 return tt; 93 } 94 EXPORT_SYMBOL_GPL(event_triggers_call); 95 96 /** 97 * event_triggers_post_call - Call 'post_triggers' for a trace event 98 * @file: The trace_event_file associated with the event 99 * @tt: enum event_trigger_type containing a set bit for each trigger to invoke 100 * @rec: The trace entry for the event 101 * 102 * For each trigger associated with an event, invoke the trigger 103 * function registered with the associated trigger command, if the 104 * corresponding bit is set in the tt enum passed into this function. 105 * See @event_triggers_call for details on how those bits are set. 106 * 107 * Called from tracepoint handlers (with rcu_read_lock_sched() held). 108 */ 109 void 110 event_triggers_post_call(struct trace_event_file *file, 111 enum event_trigger_type tt, 112 void *rec, struct ring_buffer_event *event) 113 { 114 struct event_trigger_data *data; 115 116 list_for_each_entry_rcu(data, &file->triggers, list) { 117 if (data->paused) 118 continue; 119 if (data->cmd_ops->trigger_type & tt) 120 data->ops->func(data, rec, event); 121 } 122 } 123 EXPORT_SYMBOL_GPL(event_triggers_post_call); 124 125 #define SHOW_AVAILABLE_TRIGGERS (void *)(1UL) 126 127 static void *trigger_next(struct seq_file *m, void *t, loff_t *pos) 128 { 129 struct trace_event_file *event_file = event_file_data(m->private); 130 131 if (t == SHOW_AVAILABLE_TRIGGERS) 132 return NULL; 133 134 return seq_list_next(t, &event_file->triggers, pos); 135 } 136 137 static void *trigger_start(struct seq_file *m, loff_t *pos) 138 { 139 struct trace_event_file *event_file; 140 141 /* ->stop() is called even if ->start() fails */ 142 mutex_lock(&event_mutex); 143 event_file = event_file_data(m->private); 144 if (unlikely(!event_file)) 145 return ERR_PTR(-ENODEV); 146 147 if (list_empty(&event_file->triggers)) 148 return *pos == 0 ? SHOW_AVAILABLE_TRIGGERS : NULL; 149 150 return seq_list_start(&event_file->triggers, *pos); 151 } 152 153 static void trigger_stop(struct seq_file *m, void *t) 154 { 155 mutex_unlock(&event_mutex); 156 } 157 158 static int trigger_show(struct seq_file *m, void *v) 159 { 160 struct event_trigger_data *data; 161 struct event_command *p; 162 163 if (v == SHOW_AVAILABLE_TRIGGERS) { 164 seq_puts(m, "# Available triggers:\n"); 165 seq_putc(m, '#'); 166 mutex_lock(&trigger_cmd_mutex); 167 list_for_each_entry_reverse(p, &trigger_commands, list) 168 seq_printf(m, " %s", p->name); 169 seq_putc(m, '\n'); 170 mutex_unlock(&trigger_cmd_mutex); 171 return 0; 172 } 173 174 data = list_entry(v, struct event_trigger_data, list); 175 data->ops->print(m, data->ops, data); 176 177 return 0; 178 } 179 180 static const struct seq_operations event_triggers_seq_ops = { 181 .start = trigger_start, 182 .next = trigger_next, 183 .stop = trigger_stop, 184 .show = trigger_show, 185 }; 186 187 static int event_trigger_regex_open(struct inode *inode, struct file *file) 188 { 189 int ret = 0; 190 191 mutex_lock(&event_mutex); 192 193 if (unlikely(!event_file_data(file))) { 194 mutex_unlock(&event_mutex); 195 return -ENODEV; 196 } 197 198 if ((file->f_mode & FMODE_WRITE) && 199 (file->f_flags & O_TRUNC)) { 200 struct trace_event_file *event_file; 201 struct event_command *p; 202 203 event_file = event_file_data(file); 204 205 list_for_each_entry(p, &trigger_commands, list) { 206 if (p->unreg_all) 207 p->unreg_all(event_file); 208 } 209 } 210 211 if (file->f_mode & FMODE_READ) { 212 ret = seq_open(file, &event_triggers_seq_ops); 213 if (!ret) { 214 struct seq_file *m = file->private_data; 215 m->private = file; 216 } 217 } 218 219 mutex_unlock(&event_mutex); 220 221 return ret; 222 } 223 224 static int trigger_process_regex(struct trace_event_file *file, char *buff) 225 { 226 char *command, *next = buff; 227 struct event_command *p; 228 int ret = -EINVAL; 229 230 command = strsep(&next, ": \t"); 231 command = (command[0] != '!') ? command : command + 1; 232 233 mutex_lock(&trigger_cmd_mutex); 234 list_for_each_entry(p, &trigger_commands, list) { 235 if (strcmp(p->name, command) == 0) { 236 ret = p->func(p, file, buff, command, next); 237 goto out_unlock; 238 } 239 } 240 out_unlock: 241 mutex_unlock(&trigger_cmd_mutex); 242 243 return ret; 244 } 245 246 static ssize_t event_trigger_regex_write(struct file *file, 247 const char __user *ubuf, 248 size_t cnt, loff_t *ppos) 249 { 250 struct trace_event_file *event_file; 251 ssize_t ret; 252 char *buf; 253 254 if (!cnt) 255 return 0; 256 257 if (cnt >= PAGE_SIZE) 258 return -EINVAL; 259 260 buf = memdup_user_nul(ubuf, cnt); 261 if (IS_ERR(buf)) 262 return PTR_ERR(buf); 263 264 strim(buf); 265 266 mutex_lock(&event_mutex); 267 event_file = event_file_data(file); 268 if (unlikely(!event_file)) { 269 mutex_unlock(&event_mutex); 270 kfree(buf); 271 return -ENODEV; 272 } 273 ret = trigger_process_regex(event_file, buf); 274 mutex_unlock(&event_mutex); 275 276 kfree(buf); 277 if (ret < 0) 278 goto out; 279 280 *ppos += cnt; 281 ret = cnt; 282 out: 283 return ret; 284 } 285 286 static int event_trigger_regex_release(struct inode *inode, struct file *file) 287 { 288 mutex_lock(&event_mutex); 289 290 if (file->f_mode & FMODE_READ) 291 seq_release(inode, file); 292 293 mutex_unlock(&event_mutex); 294 295 return 0; 296 } 297 298 static ssize_t 299 event_trigger_write(struct file *filp, const char __user *ubuf, 300 size_t cnt, loff_t *ppos) 301 { 302 return event_trigger_regex_write(filp, ubuf, cnt, ppos); 303 } 304 305 static int 306 event_trigger_open(struct inode *inode, struct file *filp) 307 { 308 return event_trigger_regex_open(inode, filp); 309 } 310 311 static int 312 event_trigger_release(struct inode *inode, struct file *file) 313 { 314 return event_trigger_regex_release(inode, file); 315 } 316 317 const struct file_operations event_trigger_fops = { 318 .open = event_trigger_open, 319 .read = seq_read, 320 .write = event_trigger_write, 321 .llseek = tracing_lseek, 322 .release = event_trigger_release, 323 }; 324 325 /* 326 * Currently we only register event commands from __init, so mark this 327 * __init too. 328 */ 329 __init int register_event_command(struct event_command *cmd) 330 { 331 struct event_command *p; 332 int ret = 0; 333 334 mutex_lock(&trigger_cmd_mutex); 335 list_for_each_entry(p, &trigger_commands, list) { 336 if (strcmp(cmd->name, p->name) == 0) { 337 ret = -EBUSY; 338 goto out_unlock; 339 } 340 } 341 list_add(&cmd->list, &trigger_commands); 342 out_unlock: 343 mutex_unlock(&trigger_cmd_mutex); 344 345 return ret; 346 } 347 348 /* 349 * Currently we only unregister event commands from __init, so mark 350 * this __init too. 351 */ 352 __init int unregister_event_command(struct event_command *cmd) 353 { 354 struct event_command *p, *n; 355 int ret = -ENODEV; 356 357 mutex_lock(&trigger_cmd_mutex); 358 list_for_each_entry_safe(p, n, &trigger_commands, list) { 359 if (strcmp(cmd->name, p->name) == 0) { 360 ret = 0; 361 list_del_init(&p->list); 362 goto out_unlock; 363 } 364 } 365 out_unlock: 366 mutex_unlock(&trigger_cmd_mutex); 367 368 return ret; 369 } 370 371 /** 372 * event_trigger_print - Generic event_trigger_ops @print implementation 373 * @name: The name of the event trigger 374 * @m: The seq_file being printed to 375 * @data: Trigger-specific data 376 * @filter_str: filter_str to print, if present 377 * 378 * Common implementation for event triggers to print themselves. 379 * 380 * Usually wrapped by a function that simply sets the @name of the 381 * trigger command and then invokes this. 382 * 383 * Return: 0 on success, errno otherwise 384 */ 385 static int 386 event_trigger_print(const char *name, struct seq_file *m, 387 void *data, char *filter_str) 388 { 389 long count = (long)data; 390 391 seq_puts(m, name); 392 393 if (count == -1) 394 seq_puts(m, ":unlimited"); 395 else 396 seq_printf(m, ":count=%ld", count); 397 398 if (filter_str) 399 seq_printf(m, " if %s\n", filter_str); 400 else 401 seq_putc(m, '\n'); 402 403 return 0; 404 } 405 406 /** 407 * event_trigger_init - Generic event_trigger_ops @init implementation 408 * @ops: The trigger ops associated with the trigger 409 * @data: Trigger-specific data 410 * 411 * Common implementation of event trigger initialization. 412 * 413 * Usually used directly as the @init method in event trigger 414 * implementations. 415 * 416 * Return: 0 on success, errno otherwise 417 */ 418 int event_trigger_init(struct event_trigger_ops *ops, 419 struct event_trigger_data *data) 420 { 421 data->ref++; 422 return 0; 423 } 424 425 /** 426 * event_trigger_free - Generic event_trigger_ops @free implementation 427 * @ops: The trigger ops associated with the trigger 428 * @data: Trigger-specific data 429 * 430 * Common implementation of event trigger de-initialization. 431 * 432 * Usually used directly as the @free method in event trigger 433 * implementations. 434 */ 435 static void 436 event_trigger_free(struct event_trigger_ops *ops, 437 struct event_trigger_data *data) 438 { 439 if (WARN_ON_ONCE(data->ref <= 0)) 440 return; 441 442 data->ref--; 443 if (!data->ref) 444 trigger_data_free(data); 445 } 446 447 int trace_event_trigger_enable_disable(struct trace_event_file *file, 448 int trigger_enable) 449 { 450 int ret = 0; 451 452 if (trigger_enable) { 453 if (atomic_inc_return(&file->tm_ref) > 1) 454 return ret; 455 set_bit(EVENT_FILE_FL_TRIGGER_MODE_BIT, &file->flags); 456 ret = trace_event_enable_disable(file, 1, 1); 457 } else { 458 if (atomic_dec_return(&file->tm_ref) > 0) 459 return ret; 460 clear_bit(EVENT_FILE_FL_TRIGGER_MODE_BIT, &file->flags); 461 ret = trace_event_enable_disable(file, 0, 1); 462 } 463 464 return ret; 465 } 466 467 /** 468 * clear_event_triggers - Clear all triggers associated with a trace array 469 * @tr: The trace array to clear 470 * 471 * For each trigger, the triggering event has its tm_ref decremented 472 * via trace_event_trigger_enable_disable(), and any associated event 473 * (in the case of enable/disable_event triggers) will have its sm_ref 474 * decremented via free()->trace_event_enable_disable(). That 475 * combination effectively reverses the soft-mode/trigger state added 476 * by trigger registration. 477 * 478 * Must be called with event_mutex held. 479 */ 480 void 481 clear_event_triggers(struct trace_array *tr) 482 { 483 struct trace_event_file *file; 484 485 list_for_each_entry(file, &tr->events, list) { 486 struct event_trigger_data *data, *n; 487 list_for_each_entry_safe(data, n, &file->triggers, list) { 488 trace_event_trigger_enable_disable(file, 0); 489 list_del_rcu(&data->list); 490 if (data->ops->free) 491 data->ops->free(data->ops, data); 492 } 493 } 494 } 495 496 /** 497 * update_cond_flag - Set or reset the TRIGGER_COND bit 498 * @file: The trace_event_file associated with the event 499 * 500 * If an event has triggers and any of those triggers has a filter or 501 * a post_trigger, trigger invocation needs to be deferred until after 502 * the current event has logged its data, and the event should have 503 * its TRIGGER_COND bit set, otherwise the TRIGGER_COND bit should be 504 * cleared. 505 */ 506 void update_cond_flag(struct trace_event_file *file) 507 { 508 struct event_trigger_data *data; 509 bool set_cond = false; 510 511 list_for_each_entry_rcu(data, &file->triggers, list) { 512 if (data->filter || event_command_post_trigger(data->cmd_ops) || 513 event_command_needs_rec(data->cmd_ops)) { 514 set_cond = true; 515 break; 516 } 517 } 518 519 if (set_cond) 520 set_bit(EVENT_FILE_FL_TRIGGER_COND_BIT, &file->flags); 521 else 522 clear_bit(EVENT_FILE_FL_TRIGGER_COND_BIT, &file->flags); 523 } 524 525 /** 526 * register_trigger - Generic event_command @reg implementation 527 * @glob: The raw string used to register the trigger 528 * @ops: The trigger ops associated with the trigger 529 * @data: Trigger-specific data to associate with the trigger 530 * @file: The trace_event_file associated with the event 531 * 532 * Common implementation for event trigger registration. 533 * 534 * Usually used directly as the @reg method in event command 535 * implementations. 536 * 537 * Return: 0 on success, errno otherwise 538 */ 539 static int register_trigger(char *glob, struct event_trigger_ops *ops, 540 struct event_trigger_data *data, 541 struct trace_event_file *file) 542 { 543 struct event_trigger_data *test; 544 int ret = 0; 545 546 list_for_each_entry_rcu(test, &file->triggers, list) { 547 if (test->cmd_ops->trigger_type == data->cmd_ops->trigger_type) { 548 ret = -EEXIST; 549 goto out; 550 } 551 } 552 553 if (data->ops->init) { 554 ret = data->ops->init(data->ops, data); 555 if (ret < 0) 556 goto out; 557 } 558 559 list_add_rcu(&data->list, &file->triggers); 560 ret++; 561 562 update_cond_flag(file); 563 if (trace_event_trigger_enable_disable(file, 1) < 0) { 564 list_del_rcu(&data->list); 565 update_cond_flag(file); 566 ret--; 567 } 568 out: 569 return ret; 570 } 571 572 /** 573 * unregister_trigger - Generic event_command @unreg implementation 574 * @glob: The raw string used to register the trigger 575 * @ops: The trigger ops associated with the trigger 576 * @test: Trigger-specific data used to find the trigger to remove 577 * @file: The trace_event_file associated with the event 578 * 579 * Common implementation for event trigger unregistration. 580 * 581 * Usually used directly as the @unreg method in event command 582 * implementations. 583 */ 584 void unregister_trigger(char *glob, struct event_trigger_ops *ops, 585 struct event_trigger_data *test, 586 struct trace_event_file *file) 587 { 588 struct event_trigger_data *data; 589 bool unregistered = false; 590 591 list_for_each_entry_rcu(data, &file->triggers, list) { 592 if (data->cmd_ops->trigger_type == test->cmd_ops->trigger_type) { 593 unregistered = true; 594 list_del_rcu(&data->list); 595 trace_event_trigger_enable_disable(file, 0); 596 update_cond_flag(file); 597 break; 598 } 599 } 600 601 if (unregistered && data->ops->free) 602 data->ops->free(data->ops, data); 603 } 604 605 /** 606 * event_trigger_callback - Generic event_command @func implementation 607 * @cmd_ops: The command ops, used for trigger registration 608 * @file: The trace_event_file associated with the event 609 * @glob: The raw string used to register the trigger 610 * @cmd: The cmd portion of the string used to register the trigger 611 * @param: The params portion of the string used to register the trigger 612 * 613 * Common implementation for event command parsing and trigger 614 * instantiation. 615 * 616 * Usually used directly as the @func method in event command 617 * implementations. 618 * 619 * Return: 0 on success, errno otherwise 620 */ 621 static int 622 event_trigger_callback(struct event_command *cmd_ops, 623 struct trace_event_file *file, 624 char *glob, char *cmd, char *param) 625 { 626 struct event_trigger_data *trigger_data; 627 struct event_trigger_ops *trigger_ops; 628 char *trigger = NULL; 629 char *number; 630 int ret; 631 632 /* separate the trigger from the filter (t:n [if filter]) */ 633 if (param && isdigit(param[0])) 634 trigger = strsep(¶m, " \t"); 635 636 trigger_ops = cmd_ops->get_trigger_ops(cmd, trigger); 637 638 ret = -ENOMEM; 639 trigger_data = kzalloc(sizeof(*trigger_data), GFP_KERNEL); 640 if (!trigger_data) 641 goto out; 642 643 trigger_data->count = -1; 644 trigger_data->ops = trigger_ops; 645 trigger_data->cmd_ops = cmd_ops; 646 trigger_data->private_data = file; 647 INIT_LIST_HEAD(&trigger_data->list); 648 INIT_LIST_HEAD(&trigger_data->named_list); 649 650 if (glob[0] == '!') { 651 cmd_ops->unreg(glob+1, trigger_ops, trigger_data, file); 652 kfree(trigger_data); 653 ret = 0; 654 goto out; 655 } 656 657 if (trigger) { 658 number = strsep(&trigger, ":"); 659 660 ret = -EINVAL; 661 if (!strlen(number)) 662 goto out_free; 663 664 /* 665 * We use the callback data field (which is a pointer) 666 * as our counter. 667 */ 668 ret = kstrtoul(number, 0, &trigger_data->count); 669 if (ret) 670 goto out_free; 671 } 672 673 if (!param) /* if param is non-empty, it's supposed to be a filter */ 674 goto out_reg; 675 676 if (!cmd_ops->set_filter) 677 goto out_reg; 678 679 ret = cmd_ops->set_filter(param, trigger_data, file); 680 if (ret < 0) 681 goto out_free; 682 683 out_reg: 684 ret = cmd_ops->reg(glob, trigger_ops, trigger_data, file); 685 /* 686 * The above returns on success the # of functions enabled, 687 * but if it didn't find any functions it returns zero. 688 * Consider no functions a failure too. 689 */ 690 if (!ret) { 691 ret = -ENOENT; 692 goto out_free; 693 } else if (ret < 0) 694 goto out_free; 695 ret = 0; 696 out: 697 return ret; 698 699 out_free: 700 if (cmd_ops->set_filter) 701 cmd_ops->set_filter(NULL, trigger_data, NULL); 702 kfree(trigger_data); 703 goto out; 704 } 705 706 /** 707 * set_trigger_filter - Generic event_command @set_filter implementation 708 * @filter_str: The filter string for the trigger, NULL to remove filter 709 * @trigger_data: Trigger-specific data 710 * @file: The trace_event_file associated with the event 711 * 712 * Common implementation for event command filter parsing and filter 713 * instantiation. 714 * 715 * Usually used directly as the @set_filter method in event command 716 * implementations. 717 * 718 * Also used to remove a filter (if filter_str = NULL). 719 * 720 * Return: 0 on success, errno otherwise 721 */ 722 int set_trigger_filter(char *filter_str, 723 struct event_trigger_data *trigger_data, 724 struct trace_event_file *file) 725 { 726 struct event_trigger_data *data = trigger_data; 727 struct event_filter *filter = NULL, *tmp; 728 int ret = -EINVAL; 729 char *s; 730 731 if (!filter_str) /* clear the current filter */ 732 goto assign; 733 734 s = strsep(&filter_str, " \t"); 735 736 if (!strlen(s) || strcmp(s, "if") != 0) 737 goto out; 738 739 if (!filter_str) 740 goto out; 741 742 /* The filter is for the 'trigger' event, not the triggered event */ 743 ret = create_event_filter(file->event_call, filter_str, false, &filter); 744 if (ret) 745 goto out; 746 assign: 747 tmp = rcu_access_pointer(data->filter); 748 749 rcu_assign_pointer(data->filter, filter); 750 751 if (tmp) { 752 /* Make sure the call is done with the filter */ 753 synchronize_sched(); 754 free_event_filter(tmp); 755 } 756 757 kfree(data->filter_str); 758 data->filter_str = NULL; 759 760 if (filter_str) { 761 data->filter_str = kstrdup(filter_str, GFP_KERNEL); 762 if (!data->filter_str) { 763 free_event_filter(rcu_access_pointer(data->filter)); 764 data->filter = NULL; 765 ret = -ENOMEM; 766 } 767 } 768 out: 769 return ret; 770 } 771 772 static LIST_HEAD(named_triggers); 773 774 /** 775 * find_named_trigger - Find the common named trigger associated with @name 776 * @name: The name of the set of named triggers to find the common data for 777 * 778 * Named triggers are sets of triggers that share a common set of 779 * trigger data. The first named trigger registered with a given name 780 * owns the common trigger data that the others subsequently 781 * registered with the same name will reference. This function 782 * returns the common trigger data associated with that first 783 * registered instance. 784 * 785 * Return: the common trigger data for the given named trigger on 786 * success, NULL otherwise. 787 */ 788 struct event_trigger_data *find_named_trigger(const char *name) 789 { 790 struct event_trigger_data *data; 791 792 if (!name) 793 return NULL; 794 795 list_for_each_entry(data, &named_triggers, named_list) { 796 if (data->named_data) 797 continue; 798 if (strcmp(data->name, name) == 0) 799 return data; 800 } 801 802 return NULL; 803 } 804 805 /** 806 * is_named_trigger - determine if a given trigger is a named trigger 807 * @test: The trigger data to test 808 * 809 * Return: true if 'test' is a named trigger, false otherwise. 810 */ 811 bool is_named_trigger(struct event_trigger_data *test) 812 { 813 struct event_trigger_data *data; 814 815 list_for_each_entry(data, &named_triggers, named_list) { 816 if (test == data) 817 return true; 818 } 819 820 return false; 821 } 822 823 /** 824 * save_named_trigger - save the trigger in the named trigger list 825 * @name: The name of the named trigger set 826 * @data: The trigger data to save 827 * 828 * Return: 0 if successful, negative error otherwise. 829 */ 830 int save_named_trigger(const char *name, struct event_trigger_data *data) 831 { 832 data->name = kstrdup(name, GFP_KERNEL); 833 if (!data->name) 834 return -ENOMEM; 835 836 list_add(&data->named_list, &named_triggers); 837 838 return 0; 839 } 840 841 /** 842 * del_named_trigger - delete a trigger from the named trigger list 843 * @data: The trigger data to delete 844 */ 845 void del_named_trigger(struct event_trigger_data *data) 846 { 847 kfree(data->name); 848 data->name = NULL; 849 850 list_del(&data->named_list); 851 } 852 853 static void __pause_named_trigger(struct event_trigger_data *data, bool pause) 854 { 855 struct event_trigger_data *test; 856 857 list_for_each_entry(test, &named_triggers, named_list) { 858 if (strcmp(test->name, data->name) == 0) { 859 if (pause) { 860 test->paused_tmp = test->paused; 861 test->paused = true; 862 } else { 863 test->paused = test->paused_tmp; 864 } 865 } 866 } 867 } 868 869 /** 870 * pause_named_trigger - Pause all named triggers with the same name 871 * @data: The trigger data of a named trigger to pause 872 * 873 * Pauses a named trigger along with all other triggers having the 874 * same name. Because named triggers share a common set of data, 875 * pausing only one is meaningless, so pausing one named trigger needs 876 * to pause all triggers with the same name. 877 */ 878 void pause_named_trigger(struct event_trigger_data *data) 879 { 880 __pause_named_trigger(data, true); 881 } 882 883 /** 884 * unpause_named_trigger - Un-pause all named triggers with the same name 885 * @data: The trigger data of a named trigger to unpause 886 * 887 * Un-pauses a named trigger along with all other triggers having the 888 * same name. Because named triggers share a common set of data, 889 * unpausing only one is meaningless, so unpausing one named trigger 890 * needs to unpause all triggers with the same name. 891 */ 892 void unpause_named_trigger(struct event_trigger_data *data) 893 { 894 __pause_named_trigger(data, false); 895 } 896 897 /** 898 * set_named_trigger_data - Associate common named trigger data 899 * @data: The trigger data of a named trigger to unpause 900 * 901 * Named triggers are sets of triggers that share a common set of 902 * trigger data. The first named trigger registered with a given name 903 * owns the common trigger data that the others subsequently 904 * registered with the same name will reference. This function 905 * associates the common trigger data from the first trigger with the 906 * given trigger. 907 */ 908 void set_named_trigger_data(struct event_trigger_data *data, 909 struct event_trigger_data *named_data) 910 { 911 data->named_data = named_data; 912 } 913 914 struct event_trigger_data * 915 get_named_trigger_data(struct event_trigger_data *data) 916 { 917 return data->named_data; 918 } 919 920 static void 921 traceon_trigger(struct event_trigger_data *data, void *rec, 922 struct ring_buffer_event *event) 923 { 924 if (tracing_is_on()) 925 return; 926 927 tracing_on(); 928 } 929 930 static void 931 traceon_count_trigger(struct event_trigger_data *data, void *rec, 932 struct ring_buffer_event *event) 933 { 934 if (tracing_is_on()) 935 return; 936 937 if (!data->count) 938 return; 939 940 if (data->count != -1) 941 (data->count)--; 942 943 tracing_on(); 944 } 945 946 static void 947 traceoff_trigger(struct event_trigger_data *data, void *rec, 948 struct ring_buffer_event *event) 949 { 950 if (!tracing_is_on()) 951 return; 952 953 tracing_off(); 954 } 955 956 static void 957 traceoff_count_trigger(struct event_trigger_data *data, void *rec, 958 struct ring_buffer_event *event) 959 { 960 if (!tracing_is_on()) 961 return; 962 963 if (!data->count) 964 return; 965 966 if (data->count != -1) 967 (data->count)--; 968 969 tracing_off(); 970 } 971 972 static int 973 traceon_trigger_print(struct seq_file *m, struct event_trigger_ops *ops, 974 struct event_trigger_data *data) 975 { 976 return event_trigger_print("traceon", m, (void *)data->count, 977 data->filter_str); 978 } 979 980 static int 981 traceoff_trigger_print(struct seq_file *m, struct event_trigger_ops *ops, 982 struct event_trigger_data *data) 983 { 984 return event_trigger_print("traceoff", m, (void *)data->count, 985 data->filter_str); 986 } 987 988 static struct event_trigger_ops traceon_trigger_ops = { 989 .func = traceon_trigger, 990 .print = traceon_trigger_print, 991 .init = event_trigger_init, 992 .free = event_trigger_free, 993 }; 994 995 static struct event_trigger_ops traceon_count_trigger_ops = { 996 .func = traceon_count_trigger, 997 .print = traceon_trigger_print, 998 .init = event_trigger_init, 999 .free = event_trigger_free, 1000 }; 1001 1002 static struct event_trigger_ops traceoff_trigger_ops = { 1003 .func = traceoff_trigger, 1004 .print = traceoff_trigger_print, 1005 .init = event_trigger_init, 1006 .free = event_trigger_free, 1007 }; 1008 1009 static struct event_trigger_ops traceoff_count_trigger_ops = { 1010 .func = traceoff_count_trigger, 1011 .print = traceoff_trigger_print, 1012 .init = event_trigger_init, 1013 .free = event_trigger_free, 1014 }; 1015 1016 static struct event_trigger_ops * 1017 onoff_get_trigger_ops(char *cmd, char *param) 1018 { 1019 struct event_trigger_ops *ops; 1020 1021 /* we register both traceon and traceoff to this callback */ 1022 if (strcmp(cmd, "traceon") == 0) 1023 ops = param ? &traceon_count_trigger_ops : 1024 &traceon_trigger_ops; 1025 else 1026 ops = param ? &traceoff_count_trigger_ops : 1027 &traceoff_trigger_ops; 1028 1029 return ops; 1030 } 1031 1032 static struct event_command trigger_traceon_cmd = { 1033 .name = "traceon", 1034 .trigger_type = ETT_TRACE_ONOFF, 1035 .func = event_trigger_callback, 1036 .reg = register_trigger, 1037 .unreg = unregister_trigger, 1038 .get_trigger_ops = onoff_get_trigger_ops, 1039 .set_filter = set_trigger_filter, 1040 }; 1041 1042 static struct event_command trigger_traceoff_cmd = { 1043 .name = "traceoff", 1044 .trigger_type = ETT_TRACE_ONOFF, 1045 .flags = EVENT_CMD_FL_POST_TRIGGER, 1046 .func = event_trigger_callback, 1047 .reg = register_trigger, 1048 .unreg = unregister_trigger, 1049 .get_trigger_ops = onoff_get_trigger_ops, 1050 .set_filter = set_trigger_filter, 1051 }; 1052 1053 #ifdef CONFIG_TRACER_SNAPSHOT 1054 static void 1055 snapshot_trigger(struct event_trigger_data *data, void *rec, 1056 struct ring_buffer_event *event) 1057 { 1058 struct trace_event_file *file = data->private_data; 1059 1060 if (file) 1061 tracing_snapshot_instance(file->tr); 1062 else 1063 tracing_snapshot(); 1064 } 1065 1066 static void 1067 snapshot_count_trigger(struct event_trigger_data *data, void *rec, 1068 struct ring_buffer_event *event) 1069 { 1070 if (!data->count) 1071 return; 1072 1073 if (data->count != -1) 1074 (data->count)--; 1075 1076 snapshot_trigger(data, rec, event); 1077 } 1078 1079 static int 1080 register_snapshot_trigger(char *glob, struct event_trigger_ops *ops, 1081 struct event_trigger_data *data, 1082 struct trace_event_file *file) 1083 { 1084 int ret = register_trigger(glob, ops, data, file); 1085 1086 if (ret > 0 && tracing_alloc_snapshot_instance(file->tr) != 0) { 1087 unregister_trigger(glob, ops, data, file); 1088 ret = 0; 1089 } 1090 1091 return ret; 1092 } 1093 1094 static int 1095 snapshot_trigger_print(struct seq_file *m, struct event_trigger_ops *ops, 1096 struct event_trigger_data *data) 1097 { 1098 return event_trigger_print("snapshot", m, (void *)data->count, 1099 data->filter_str); 1100 } 1101 1102 static struct event_trigger_ops snapshot_trigger_ops = { 1103 .func = snapshot_trigger, 1104 .print = snapshot_trigger_print, 1105 .init = event_trigger_init, 1106 .free = event_trigger_free, 1107 }; 1108 1109 static struct event_trigger_ops snapshot_count_trigger_ops = { 1110 .func = snapshot_count_trigger, 1111 .print = snapshot_trigger_print, 1112 .init = event_trigger_init, 1113 .free = event_trigger_free, 1114 }; 1115 1116 static struct event_trigger_ops * 1117 snapshot_get_trigger_ops(char *cmd, char *param) 1118 { 1119 return param ? &snapshot_count_trigger_ops : &snapshot_trigger_ops; 1120 } 1121 1122 static struct event_command trigger_snapshot_cmd = { 1123 .name = "snapshot", 1124 .trigger_type = ETT_SNAPSHOT, 1125 .func = event_trigger_callback, 1126 .reg = register_snapshot_trigger, 1127 .unreg = unregister_trigger, 1128 .get_trigger_ops = snapshot_get_trigger_ops, 1129 .set_filter = set_trigger_filter, 1130 }; 1131 1132 static __init int register_trigger_snapshot_cmd(void) 1133 { 1134 int ret; 1135 1136 ret = register_event_command(&trigger_snapshot_cmd); 1137 WARN_ON(ret < 0); 1138 1139 return ret; 1140 } 1141 #else 1142 static __init int register_trigger_snapshot_cmd(void) { return 0; } 1143 #endif /* CONFIG_TRACER_SNAPSHOT */ 1144 1145 #ifdef CONFIG_STACKTRACE 1146 #ifdef CONFIG_UNWINDER_ORC 1147 /* Skip 2: 1148 * event_triggers_post_call() 1149 * trace_event_raw_event_xxx() 1150 */ 1151 # define STACK_SKIP 2 1152 #else 1153 /* 1154 * Skip 4: 1155 * stacktrace_trigger() 1156 * event_triggers_post_call() 1157 * trace_event_buffer_commit() 1158 * trace_event_raw_event_xxx() 1159 */ 1160 #define STACK_SKIP 4 1161 #endif 1162 1163 static void 1164 stacktrace_trigger(struct event_trigger_data *data, void *rec, 1165 struct ring_buffer_event *event) 1166 { 1167 trace_dump_stack(STACK_SKIP); 1168 } 1169 1170 static void 1171 stacktrace_count_trigger(struct event_trigger_data *data, void *rec, 1172 struct ring_buffer_event *event) 1173 { 1174 if (!data->count) 1175 return; 1176 1177 if (data->count != -1) 1178 (data->count)--; 1179 1180 stacktrace_trigger(data, rec, event); 1181 } 1182 1183 static int 1184 stacktrace_trigger_print(struct seq_file *m, struct event_trigger_ops *ops, 1185 struct event_trigger_data *data) 1186 { 1187 return event_trigger_print("stacktrace", m, (void *)data->count, 1188 data->filter_str); 1189 } 1190 1191 static struct event_trigger_ops stacktrace_trigger_ops = { 1192 .func = stacktrace_trigger, 1193 .print = stacktrace_trigger_print, 1194 .init = event_trigger_init, 1195 .free = event_trigger_free, 1196 }; 1197 1198 static struct event_trigger_ops stacktrace_count_trigger_ops = { 1199 .func = stacktrace_count_trigger, 1200 .print = stacktrace_trigger_print, 1201 .init = event_trigger_init, 1202 .free = event_trigger_free, 1203 }; 1204 1205 static struct event_trigger_ops * 1206 stacktrace_get_trigger_ops(char *cmd, char *param) 1207 { 1208 return param ? &stacktrace_count_trigger_ops : &stacktrace_trigger_ops; 1209 } 1210 1211 static struct event_command trigger_stacktrace_cmd = { 1212 .name = "stacktrace", 1213 .trigger_type = ETT_STACKTRACE, 1214 .flags = EVENT_CMD_FL_POST_TRIGGER, 1215 .func = event_trigger_callback, 1216 .reg = register_trigger, 1217 .unreg = unregister_trigger, 1218 .get_trigger_ops = stacktrace_get_trigger_ops, 1219 .set_filter = set_trigger_filter, 1220 }; 1221 1222 static __init int register_trigger_stacktrace_cmd(void) 1223 { 1224 int ret; 1225 1226 ret = register_event_command(&trigger_stacktrace_cmd); 1227 WARN_ON(ret < 0); 1228 1229 return ret; 1230 } 1231 #else 1232 static __init int register_trigger_stacktrace_cmd(void) { return 0; } 1233 #endif /* CONFIG_STACKTRACE */ 1234 1235 static __init void unregister_trigger_traceon_traceoff_cmds(void) 1236 { 1237 unregister_event_command(&trigger_traceon_cmd); 1238 unregister_event_command(&trigger_traceoff_cmd); 1239 } 1240 1241 static void 1242 event_enable_trigger(struct event_trigger_data *data, void *rec, 1243 struct ring_buffer_event *event) 1244 { 1245 struct enable_trigger_data *enable_data = data->private_data; 1246 1247 if (enable_data->enable) 1248 clear_bit(EVENT_FILE_FL_SOFT_DISABLED_BIT, &enable_data->file->flags); 1249 else 1250 set_bit(EVENT_FILE_FL_SOFT_DISABLED_BIT, &enable_data->file->flags); 1251 } 1252 1253 static void 1254 event_enable_count_trigger(struct event_trigger_data *data, void *rec, 1255 struct ring_buffer_event *event) 1256 { 1257 struct enable_trigger_data *enable_data = data->private_data; 1258 1259 if (!data->count) 1260 return; 1261 1262 /* Skip if the event is in a state we want to switch to */ 1263 if (enable_data->enable == !(enable_data->file->flags & EVENT_FILE_FL_SOFT_DISABLED)) 1264 return; 1265 1266 if (data->count != -1) 1267 (data->count)--; 1268 1269 event_enable_trigger(data, rec, event); 1270 } 1271 1272 int event_enable_trigger_print(struct seq_file *m, 1273 struct event_trigger_ops *ops, 1274 struct event_trigger_data *data) 1275 { 1276 struct enable_trigger_data *enable_data = data->private_data; 1277 1278 seq_printf(m, "%s:%s:%s", 1279 enable_data->hist ? 1280 (enable_data->enable ? ENABLE_HIST_STR : DISABLE_HIST_STR) : 1281 (enable_data->enable ? ENABLE_EVENT_STR : DISABLE_EVENT_STR), 1282 enable_data->file->event_call->class->system, 1283 trace_event_name(enable_data->file->event_call)); 1284 1285 if (data->count == -1) 1286 seq_puts(m, ":unlimited"); 1287 else 1288 seq_printf(m, ":count=%ld", data->count); 1289 1290 if (data->filter_str) 1291 seq_printf(m, " if %s\n", data->filter_str); 1292 else 1293 seq_putc(m, '\n'); 1294 1295 return 0; 1296 } 1297 1298 void event_enable_trigger_free(struct event_trigger_ops *ops, 1299 struct event_trigger_data *data) 1300 { 1301 struct enable_trigger_data *enable_data = data->private_data; 1302 1303 if (WARN_ON_ONCE(data->ref <= 0)) 1304 return; 1305 1306 data->ref--; 1307 if (!data->ref) { 1308 /* Remove the SOFT_MODE flag */ 1309 trace_event_enable_disable(enable_data->file, 0, 1); 1310 module_put(enable_data->file->event_call->mod); 1311 trigger_data_free(data); 1312 kfree(enable_data); 1313 } 1314 } 1315 1316 static struct event_trigger_ops event_enable_trigger_ops = { 1317 .func = event_enable_trigger, 1318 .print = event_enable_trigger_print, 1319 .init = event_trigger_init, 1320 .free = event_enable_trigger_free, 1321 }; 1322 1323 static struct event_trigger_ops event_enable_count_trigger_ops = { 1324 .func = event_enable_count_trigger, 1325 .print = event_enable_trigger_print, 1326 .init = event_trigger_init, 1327 .free = event_enable_trigger_free, 1328 }; 1329 1330 static struct event_trigger_ops event_disable_trigger_ops = { 1331 .func = event_enable_trigger, 1332 .print = event_enable_trigger_print, 1333 .init = event_trigger_init, 1334 .free = event_enable_trigger_free, 1335 }; 1336 1337 static struct event_trigger_ops event_disable_count_trigger_ops = { 1338 .func = event_enable_count_trigger, 1339 .print = event_enable_trigger_print, 1340 .init = event_trigger_init, 1341 .free = event_enable_trigger_free, 1342 }; 1343 1344 int event_enable_trigger_func(struct event_command *cmd_ops, 1345 struct trace_event_file *file, 1346 char *glob, char *cmd, char *param) 1347 { 1348 struct trace_event_file *event_enable_file; 1349 struct enable_trigger_data *enable_data; 1350 struct event_trigger_data *trigger_data; 1351 struct event_trigger_ops *trigger_ops; 1352 struct trace_array *tr = file->tr; 1353 const char *system; 1354 const char *event; 1355 bool hist = false; 1356 char *trigger; 1357 char *number; 1358 bool enable; 1359 int ret; 1360 1361 if (!param) 1362 return -EINVAL; 1363 1364 /* separate the trigger from the filter (s:e:n [if filter]) */ 1365 trigger = strsep(¶m, " \t"); 1366 if (!trigger) 1367 return -EINVAL; 1368 1369 system = strsep(&trigger, ":"); 1370 if (!trigger) 1371 return -EINVAL; 1372 1373 event = strsep(&trigger, ":"); 1374 1375 ret = -EINVAL; 1376 event_enable_file = find_event_file(tr, system, event); 1377 if (!event_enable_file) 1378 goto out; 1379 1380 #ifdef CONFIG_HIST_TRIGGERS 1381 hist = ((strcmp(cmd, ENABLE_HIST_STR) == 0) || 1382 (strcmp(cmd, DISABLE_HIST_STR) == 0)); 1383 1384 enable = ((strcmp(cmd, ENABLE_EVENT_STR) == 0) || 1385 (strcmp(cmd, ENABLE_HIST_STR) == 0)); 1386 #else 1387 enable = strcmp(cmd, ENABLE_EVENT_STR) == 0; 1388 #endif 1389 trigger_ops = cmd_ops->get_trigger_ops(cmd, trigger); 1390 1391 ret = -ENOMEM; 1392 trigger_data = kzalloc(sizeof(*trigger_data), GFP_KERNEL); 1393 if (!trigger_data) 1394 goto out; 1395 1396 enable_data = kzalloc(sizeof(*enable_data), GFP_KERNEL); 1397 if (!enable_data) { 1398 kfree(trigger_data); 1399 goto out; 1400 } 1401 1402 trigger_data->count = -1; 1403 trigger_data->ops = trigger_ops; 1404 trigger_data->cmd_ops = cmd_ops; 1405 INIT_LIST_HEAD(&trigger_data->list); 1406 RCU_INIT_POINTER(trigger_data->filter, NULL); 1407 1408 enable_data->hist = hist; 1409 enable_data->enable = enable; 1410 enable_data->file = event_enable_file; 1411 trigger_data->private_data = enable_data; 1412 1413 if (glob[0] == '!') { 1414 cmd_ops->unreg(glob+1, trigger_ops, trigger_data, file); 1415 kfree(trigger_data); 1416 kfree(enable_data); 1417 ret = 0; 1418 goto out; 1419 } 1420 1421 if (trigger) { 1422 number = strsep(&trigger, ":"); 1423 1424 ret = -EINVAL; 1425 if (!strlen(number)) 1426 goto out_free; 1427 1428 /* 1429 * We use the callback data field (which is a pointer) 1430 * as our counter. 1431 */ 1432 ret = kstrtoul(number, 0, &trigger_data->count); 1433 if (ret) 1434 goto out_free; 1435 } 1436 1437 if (!param) /* if param is non-empty, it's supposed to be a filter */ 1438 goto out_reg; 1439 1440 if (!cmd_ops->set_filter) 1441 goto out_reg; 1442 1443 ret = cmd_ops->set_filter(param, trigger_data, file); 1444 if (ret < 0) 1445 goto out_free; 1446 1447 out_reg: 1448 /* Don't let event modules unload while probe registered */ 1449 ret = try_module_get(event_enable_file->event_call->mod); 1450 if (!ret) { 1451 ret = -EBUSY; 1452 goto out_free; 1453 } 1454 1455 ret = trace_event_enable_disable(event_enable_file, 1, 1); 1456 if (ret < 0) 1457 goto out_put; 1458 ret = cmd_ops->reg(glob, trigger_ops, trigger_data, file); 1459 /* 1460 * The above returns on success the # of functions enabled, 1461 * but if it didn't find any functions it returns zero. 1462 * Consider no functions a failure too. 1463 */ 1464 if (!ret) { 1465 ret = -ENOENT; 1466 goto out_disable; 1467 } else if (ret < 0) 1468 goto out_disable; 1469 /* Just return zero, not the number of enabled functions */ 1470 ret = 0; 1471 out: 1472 return ret; 1473 1474 out_disable: 1475 trace_event_enable_disable(event_enable_file, 0, 1); 1476 out_put: 1477 module_put(event_enable_file->event_call->mod); 1478 out_free: 1479 if (cmd_ops->set_filter) 1480 cmd_ops->set_filter(NULL, trigger_data, NULL); 1481 kfree(trigger_data); 1482 kfree(enable_data); 1483 goto out; 1484 } 1485 1486 int event_enable_register_trigger(char *glob, 1487 struct event_trigger_ops *ops, 1488 struct event_trigger_data *data, 1489 struct trace_event_file *file) 1490 { 1491 struct enable_trigger_data *enable_data = data->private_data; 1492 struct enable_trigger_data *test_enable_data; 1493 struct event_trigger_data *test; 1494 int ret = 0; 1495 1496 list_for_each_entry_rcu(test, &file->triggers, list) { 1497 test_enable_data = test->private_data; 1498 if (test_enable_data && 1499 (test->cmd_ops->trigger_type == 1500 data->cmd_ops->trigger_type) && 1501 (test_enable_data->file == enable_data->file)) { 1502 ret = -EEXIST; 1503 goto out; 1504 } 1505 } 1506 1507 if (data->ops->init) { 1508 ret = data->ops->init(data->ops, data); 1509 if (ret < 0) 1510 goto out; 1511 } 1512 1513 list_add_rcu(&data->list, &file->triggers); 1514 ret++; 1515 1516 update_cond_flag(file); 1517 if (trace_event_trigger_enable_disable(file, 1) < 0) { 1518 list_del_rcu(&data->list); 1519 update_cond_flag(file); 1520 ret--; 1521 } 1522 out: 1523 return ret; 1524 } 1525 1526 void event_enable_unregister_trigger(char *glob, 1527 struct event_trigger_ops *ops, 1528 struct event_trigger_data *test, 1529 struct trace_event_file *file) 1530 { 1531 struct enable_trigger_data *test_enable_data = test->private_data; 1532 struct enable_trigger_data *enable_data; 1533 struct event_trigger_data *data; 1534 bool unregistered = false; 1535 1536 list_for_each_entry_rcu(data, &file->triggers, list) { 1537 enable_data = data->private_data; 1538 if (enable_data && 1539 (data->cmd_ops->trigger_type == 1540 test->cmd_ops->trigger_type) && 1541 (enable_data->file == test_enable_data->file)) { 1542 unregistered = true; 1543 list_del_rcu(&data->list); 1544 trace_event_trigger_enable_disable(file, 0); 1545 update_cond_flag(file); 1546 break; 1547 } 1548 } 1549 1550 if (unregistered && data->ops->free) 1551 data->ops->free(data->ops, data); 1552 } 1553 1554 static struct event_trigger_ops * 1555 event_enable_get_trigger_ops(char *cmd, char *param) 1556 { 1557 struct event_trigger_ops *ops; 1558 bool enable; 1559 1560 #ifdef CONFIG_HIST_TRIGGERS 1561 enable = ((strcmp(cmd, ENABLE_EVENT_STR) == 0) || 1562 (strcmp(cmd, ENABLE_HIST_STR) == 0)); 1563 #else 1564 enable = strcmp(cmd, ENABLE_EVENT_STR) == 0; 1565 #endif 1566 if (enable) 1567 ops = param ? &event_enable_count_trigger_ops : 1568 &event_enable_trigger_ops; 1569 else 1570 ops = param ? &event_disable_count_trigger_ops : 1571 &event_disable_trigger_ops; 1572 1573 return ops; 1574 } 1575 1576 static struct event_command trigger_enable_cmd = { 1577 .name = ENABLE_EVENT_STR, 1578 .trigger_type = ETT_EVENT_ENABLE, 1579 .func = event_enable_trigger_func, 1580 .reg = event_enable_register_trigger, 1581 .unreg = event_enable_unregister_trigger, 1582 .get_trigger_ops = event_enable_get_trigger_ops, 1583 .set_filter = set_trigger_filter, 1584 }; 1585 1586 static struct event_command trigger_disable_cmd = { 1587 .name = DISABLE_EVENT_STR, 1588 .trigger_type = ETT_EVENT_ENABLE, 1589 .func = event_enable_trigger_func, 1590 .reg = event_enable_register_trigger, 1591 .unreg = event_enable_unregister_trigger, 1592 .get_trigger_ops = event_enable_get_trigger_ops, 1593 .set_filter = set_trigger_filter, 1594 }; 1595 1596 static __init void unregister_trigger_enable_disable_cmds(void) 1597 { 1598 unregister_event_command(&trigger_enable_cmd); 1599 unregister_event_command(&trigger_disable_cmd); 1600 } 1601 1602 static __init int register_trigger_enable_disable_cmds(void) 1603 { 1604 int ret; 1605 1606 ret = register_event_command(&trigger_enable_cmd); 1607 if (WARN_ON(ret < 0)) 1608 return ret; 1609 ret = register_event_command(&trigger_disable_cmd); 1610 if (WARN_ON(ret < 0)) 1611 unregister_trigger_enable_disable_cmds(); 1612 1613 return ret; 1614 } 1615 1616 static __init int register_trigger_traceon_traceoff_cmds(void) 1617 { 1618 int ret; 1619 1620 ret = register_event_command(&trigger_traceon_cmd); 1621 if (WARN_ON(ret < 0)) 1622 return ret; 1623 ret = register_event_command(&trigger_traceoff_cmd); 1624 if (WARN_ON(ret < 0)) 1625 unregister_trigger_traceon_traceoff_cmds(); 1626 1627 return ret; 1628 } 1629 1630 __init int register_trigger_cmds(void) 1631 { 1632 register_trigger_traceon_traceoff_cmds(); 1633 register_trigger_snapshot_cmd(); 1634 register_trigger_stacktrace_cmd(); 1635 register_trigger_enable_disable_cmds(); 1636 register_trigger_hist_enable_disable_cmds(); 1637 register_trigger_hist_cmd(); 1638 1639 return 0; 1640 } 1641