diff options
| -rw-r--r-- | kernel/trace/trace_kprobe.c | 37 |
1 files changed, 28 insertions, 9 deletions
diff --git a/kernel/trace/trace_kprobe.c b/kernel/trace/trace_kprobe.c index aff5f80b59b8..bf05fb49a6f3 100644 --- a/kernel/trace/trace_kprobe.c +++ b/kernel/trace/trace_kprobe.c | |||
| @@ -606,23 +606,22 @@ static int create_trace_probe(int argc, char **argv) | |||
| 606 | */ | 606 | */ |
| 607 | struct trace_probe *tp; | 607 | struct trace_probe *tp; |
| 608 | int i, ret = 0; | 608 | int i, ret = 0; |
| 609 | int is_return = 0; | 609 | int is_return = 0, is_delete = 0; |
| 610 | char *symbol = NULL, *event = NULL, *arg = NULL, *group = NULL; | 610 | char *symbol = NULL, *event = NULL, *arg = NULL, *group = NULL; |
| 611 | unsigned long offset = 0; | 611 | unsigned long offset = 0; |
| 612 | void *addr = NULL; | 612 | void *addr = NULL; |
| 613 | char buf[MAX_EVENT_NAME_LEN]; | 613 | char buf[MAX_EVENT_NAME_LEN]; |
| 614 | 614 | ||
| 615 | if (argc < 2) { | 615 | /* argc must be >= 1 */ |
| 616 | pr_info("Probe point is not specified.\n"); | ||
| 617 | return -EINVAL; | ||
| 618 | } | ||
| 619 | |||
| 620 | if (argv[0][0] == 'p') | 616 | if (argv[0][0] == 'p') |
| 621 | is_return = 0; | 617 | is_return = 0; |
| 622 | else if (argv[0][0] == 'r') | 618 | else if (argv[0][0] == 'r') |
| 623 | is_return = 1; | 619 | is_return = 1; |
| 620 | else if (argv[0][0] == '-') | ||
| 621 | is_delete = 1; | ||
| 624 | else { | 622 | else { |
| 625 | pr_info("Probe definition must be started with 'p' or 'r'.\n"); | 623 | pr_info("Probe definition must be started with 'p', 'r' or" |
| 624 | " '-'.\n"); | ||
| 626 | return -EINVAL; | 625 | return -EINVAL; |
| 627 | } | 626 | } |
| 628 | 627 | ||
| @@ -642,7 +641,29 @@ static int create_trace_probe(int argc, char **argv) | |||
| 642 | return -EINVAL; | 641 | return -EINVAL; |
| 643 | } | 642 | } |
| 644 | } | 643 | } |
| 644 | if (!group) | ||
| 645 | group = KPROBE_EVENT_SYSTEM; | ||
| 645 | 646 | ||
| 647 | if (is_delete) { | ||
| 648 | if (!event) { | ||
| 649 | pr_info("Delete command needs an event name.\n"); | ||
| 650 | return -EINVAL; | ||
| 651 | } | ||
| 652 | tp = find_probe_event(event, group); | ||
| 653 | if (!tp) { | ||
| 654 | pr_info("Event %s/%s doesn't exist.\n", group, event); | ||
| 655 | return -ENOENT; | ||
| 656 | } | ||
| 657 | /* delete an event */ | ||
| 658 | unregister_trace_probe(tp); | ||
| 659 | free_trace_probe(tp); | ||
| 660 | return 0; | ||
| 661 | } | ||
| 662 | |||
| 663 | if (argc < 2) { | ||
| 664 | pr_info("Probe point is not specified.\n"); | ||
| 665 | return -EINVAL; | ||
| 666 | } | ||
| 646 | if (isdigit(argv[1][0])) { | 667 | if (isdigit(argv[1][0])) { |
| 647 | if (is_return) { | 668 | if (is_return) { |
| 648 | pr_info("Return probe point must be a symbol.\n"); | 669 | pr_info("Return probe point must be a symbol.\n"); |
| @@ -671,8 +692,6 @@ static int create_trace_probe(int argc, char **argv) | |||
| 671 | argc -= 2; argv += 2; | 692 | argc -= 2; argv += 2; |
| 672 | 693 | ||
| 673 | /* setup a probe */ | 694 | /* setup a probe */ |
| 674 | if (!group) | ||
| 675 | group = KPROBE_EVENT_SYSTEM; | ||
| 676 | if (!event) { | 695 | if (!event) { |
| 677 | /* Make a new event name */ | 696 | /* Make a new event name */ |
| 678 | if (symbol) | 697 | if (symbol) |
