diff options
| author | Mathieu Desnoyers <mathieu.desnoyers@efficios.com> | 2014-03-21 01:19:01 -0400 |
|---|---|---|
| committer | Steven Rostedt <rostedt@goodmis.org> | 2014-03-21 14:01:15 -0400 |
| commit | 0dea6d52638b2693b18cd2ed8938b236e0789ddb (patch) | |
| tree | 3b7e20b680b63900e81dee3a0f2469c4ae4abe7a | |
| parent | bc4c426ee2431d1f717004d3bbaacbd819b544fd (diff) | |
tracepoint: Remove unused API functions
After the following commit:
commit b75ef8b44b1cb95f5a26484b0e2fe37a63b12b44
Author: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
Date: Wed Aug 10 15:18:39 2011 -0400
Tracepoint: Dissociate from module mutex
The following functions became unnecessary:
- tracepoint_probe_register_noupdate,
- tracepoint_probe_unregister_noupdate,
- tracepoint_probe_update_all.
In fact, none of the in-kernel tracers, nor LTTng, nor SystemTAP use
them. Remove those.
Moreover, the functions:
- tracepoint_iter_start,
- tracepoint_iter_next,
- tracepoint_iter_stop,
- tracepoint_iter_reset.
are unused by in-kernel tracers, LTTng and SystemTAP. Remove those too.
Link: http://lkml.kernel.org/r/1395379142-2118-2-git-send-email-mathieu.desnoyers@efficios.com
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
| -rw-r--r-- | include/linux/tracepoint.h | 18 | ||||
| -rw-r--r-- | kernel/tracepoint.c | 222 |
2 files changed, 5 insertions, 235 deletions
diff --git a/include/linux/tracepoint.h b/include/linux/tracepoint.h index accc497f8d72..a3b2837d8dd1 100644 --- a/include/linux/tracepoint.h +++ b/include/linux/tracepoint.h | |||
| @@ -48,12 +48,6 @@ extern int tracepoint_probe_register(const char *name, void *probe, void *data); | |||
| 48 | extern int | 48 | extern int |
| 49 | tracepoint_probe_unregister(const char *name, void *probe, void *data); | 49 | tracepoint_probe_unregister(const char *name, void *probe, void *data); |
| 50 | 50 | ||
| 51 | extern int tracepoint_probe_register_noupdate(const char *name, void *probe, | ||
| 52 | void *data); | ||
| 53 | extern int tracepoint_probe_unregister_noupdate(const char *name, void *probe, | ||
| 54 | void *data); | ||
| 55 | extern void tracepoint_probe_update_all(void); | ||
| 56 | |||
| 57 | #ifdef CONFIG_MODULES | 51 | #ifdef CONFIG_MODULES |
| 58 | struct tp_module { | 52 | struct tp_module { |
| 59 | struct list_head list; | 53 | struct list_head list; |
| @@ -62,18 +56,6 @@ struct tp_module { | |||
| 62 | }; | 56 | }; |
| 63 | #endif /* CONFIG_MODULES */ | 57 | #endif /* CONFIG_MODULES */ |
| 64 | 58 | ||
| 65 | struct tracepoint_iter { | ||
| 66 | #ifdef CONFIG_MODULES | ||
| 67 | struct tp_module *module; | ||
| 68 | #endif /* CONFIG_MODULES */ | ||
| 69 | struct tracepoint * const *tracepoint; | ||
| 70 | }; | ||
| 71 | |||
| 72 | extern void tracepoint_iter_start(struct tracepoint_iter *iter); | ||
| 73 | extern void tracepoint_iter_next(struct tracepoint_iter *iter); | ||
| 74 | extern void tracepoint_iter_stop(struct tracepoint_iter *iter); | ||
| 75 | extern void tracepoint_iter_reset(struct tracepoint_iter *iter); | ||
| 76 | |||
| 77 | /* | 59 | /* |
| 78 | * tracepoint_synchronize_unregister must be called between the last tracepoint | 60 | * tracepoint_synchronize_unregister must be called between the last tracepoint |
| 79 | * probe unregistration and the end of module exit to make sure there is no | 61 | * probe unregistration and the end of module exit to make sure there is no |
diff --git a/kernel/tracepoint.c b/kernel/tracepoint.c index e2a58a22b0f4..65d9f9459a75 100644 --- a/kernel/tracepoint.c +++ b/kernel/tracepoint.c | |||
| @@ -67,10 +67,7 @@ struct tracepoint_entry { | |||
| 67 | }; | 67 | }; |
| 68 | 68 | ||
| 69 | struct tp_probes { | 69 | struct tp_probes { |
| 70 | union { | 70 | struct rcu_head rcu; |
| 71 | struct rcu_head rcu; | ||
| 72 | struct list_head list; | ||
| 73 | } u; | ||
| 74 | struct tracepoint_func probes[0]; | 71 | struct tracepoint_func probes[0]; |
| 75 | }; | 72 | }; |
| 76 | 73 | ||
| @@ -83,7 +80,7 @@ static inline void *allocate_probes(int count) | |||
| 83 | 80 | ||
| 84 | static void rcu_free_old_probes(struct rcu_head *head) | 81 | static void rcu_free_old_probes(struct rcu_head *head) |
| 85 | { | 82 | { |
| 86 | kfree(container_of(head, struct tp_probes, u.rcu)); | 83 | kfree(container_of(head, struct tp_probes, rcu)); |
| 87 | } | 84 | } |
| 88 | 85 | ||
| 89 | static inline void release_probes(struct tracepoint_func *old) | 86 | static inline void release_probes(struct tracepoint_func *old) |
| @@ -91,7 +88,7 @@ static inline void release_probes(struct tracepoint_func *old) | |||
| 91 | if (old) { | 88 | if (old) { |
| 92 | struct tp_probes *tp_probes = container_of(old, | 89 | struct tp_probes *tp_probes = container_of(old, |
| 93 | struct tp_probes, probes[0]); | 90 | struct tp_probes, probes[0]); |
| 94 | call_rcu_sched(&tp_probes->u.rcu, rcu_free_old_probes); | 91 | call_rcu_sched(&tp_probes->rcu, rcu_free_old_probes); |
| 95 | } | 92 | } |
| 96 | } | 93 | } |
| 97 | 94 | ||
| @@ -459,204 +456,11 @@ int tracepoint_probe_unregister(const char *name, void *probe, void *data) | |||
| 459 | } | 456 | } |
| 460 | EXPORT_SYMBOL_GPL(tracepoint_probe_unregister); | 457 | EXPORT_SYMBOL_GPL(tracepoint_probe_unregister); |
| 461 | 458 | ||
| 462 | static LIST_HEAD(old_probes); | ||
| 463 | static int need_update; | ||
| 464 | |||
| 465 | static void tracepoint_add_old_probes(void *old) | ||
| 466 | { | ||
| 467 | need_update = 1; | ||
| 468 | if (old) { | ||
| 469 | struct tp_probes *tp_probes = container_of(old, | ||
| 470 | struct tp_probes, probes[0]); | ||
| 471 | list_add(&tp_probes->u.list, &old_probes); | ||
| 472 | } | ||
| 473 | } | ||
| 474 | |||
| 475 | /** | ||
| 476 | * tracepoint_probe_register_noupdate - register a probe but not connect | ||
| 477 | * @name: tracepoint name | ||
| 478 | * @probe: probe handler | ||
| 479 | * @data: probe private data | ||
| 480 | * | ||
| 481 | * caller must call tracepoint_probe_update_all() | ||
| 482 | */ | ||
| 483 | int tracepoint_probe_register_noupdate(const char *name, void *probe, | ||
| 484 | void *data) | ||
| 485 | { | ||
| 486 | struct tracepoint_func *old; | ||
| 487 | |||
| 488 | mutex_lock(&tracepoints_mutex); | ||
| 489 | old = tracepoint_add_probe(name, probe, data); | ||
| 490 | if (IS_ERR(old)) { | ||
| 491 | mutex_unlock(&tracepoints_mutex); | ||
| 492 | return PTR_ERR(old); | ||
| 493 | } | ||
| 494 | tracepoint_add_old_probes(old); | ||
| 495 | mutex_unlock(&tracepoints_mutex); | ||
| 496 | return 0; | ||
| 497 | } | ||
| 498 | EXPORT_SYMBOL_GPL(tracepoint_probe_register_noupdate); | ||
| 499 | |||
| 500 | /** | ||
| 501 | * tracepoint_probe_unregister_noupdate - remove a probe but not disconnect | ||
| 502 | * @name: tracepoint name | ||
| 503 | * @probe: probe function pointer | ||
| 504 | * @data: probe private data | ||
| 505 | * | ||
| 506 | * caller must call tracepoint_probe_update_all() | ||
| 507 | */ | ||
| 508 | int tracepoint_probe_unregister_noupdate(const char *name, void *probe, | ||
| 509 | void *data) | ||
| 510 | { | ||
| 511 | struct tracepoint_func *old; | ||
| 512 | |||
| 513 | mutex_lock(&tracepoints_mutex); | ||
| 514 | old = tracepoint_remove_probe(name, probe, data); | ||
| 515 | if (IS_ERR(old)) { | ||
| 516 | mutex_unlock(&tracepoints_mutex); | ||
| 517 | return PTR_ERR(old); | ||
| 518 | } | ||
| 519 | tracepoint_add_old_probes(old); | ||
| 520 | mutex_unlock(&tracepoints_mutex); | ||
| 521 | return 0; | ||
| 522 | } | ||
| 523 | EXPORT_SYMBOL_GPL(tracepoint_probe_unregister_noupdate); | ||
| 524 | |||
| 525 | /** | ||
| 526 | * tracepoint_probe_update_all - update tracepoints | ||
| 527 | */ | ||
| 528 | void tracepoint_probe_update_all(void) | ||
| 529 | { | ||
| 530 | LIST_HEAD(release_probes); | ||
| 531 | struct tp_probes *pos, *next; | ||
| 532 | |||
| 533 | mutex_lock(&tracepoints_mutex); | ||
| 534 | if (!need_update) { | ||
| 535 | mutex_unlock(&tracepoints_mutex); | ||
| 536 | return; | ||
| 537 | } | ||
| 538 | if (!list_empty(&old_probes)) | ||
| 539 | list_replace_init(&old_probes, &release_probes); | ||
| 540 | need_update = 0; | ||
| 541 | tracepoint_update_probes(); | ||
| 542 | mutex_unlock(&tracepoints_mutex); | ||
| 543 | list_for_each_entry_safe(pos, next, &release_probes, u.list) { | ||
| 544 | list_del(&pos->u.list); | ||
| 545 | call_rcu_sched(&pos->u.rcu, rcu_free_old_probes); | ||
| 546 | } | ||
| 547 | } | ||
| 548 | EXPORT_SYMBOL_GPL(tracepoint_probe_update_all); | ||
| 549 | |||
| 550 | /** | ||
| 551 | * tracepoint_get_iter_range - Get a next tracepoint iterator given a range. | ||
| 552 | * @tracepoint: current tracepoints (in), next tracepoint (out) | ||
| 553 | * @begin: beginning of the range | ||
| 554 | * @end: end of the range | ||
| 555 | * | ||
| 556 | * Returns whether a next tracepoint has been found (1) or not (0). | ||
| 557 | * Will return the first tracepoint in the range if the input tracepoint is | ||
| 558 | * NULL. | ||
| 559 | */ | ||
| 560 | static int tracepoint_get_iter_range(struct tracepoint * const **tracepoint, | ||
| 561 | struct tracepoint * const *begin, struct tracepoint * const *end) | ||
| 562 | { | ||
| 563 | if (!*tracepoint && begin != end) { | ||
| 564 | *tracepoint = begin; | ||
| 565 | return 1; | ||
| 566 | } | ||
| 567 | if (*tracepoint >= begin && *tracepoint < end) | ||
| 568 | return 1; | ||
| 569 | return 0; | ||
| 570 | } | ||
| 571 | |||
| 572 | #ifdef CONFIG_MODULES | ||
| 573 | static void tracepoint_get_iter(struct tracepoint_iter *iter) | ||
| 574 | { | ||
| 575 | int found = 0; | ||
| 576 | struct tp_module *iter_mod; | ||
| 577 | |||
| 578 | /* Core kernel tracepoints */ | ||
| 579 | if (!iter->module) { | ||
| 580 | found = tracepoint_get_iter_range(&iter->tracepoint, | ||
| 581 | __start___tracepoints_ptrs, | ||
| 582 | __stop___tracepoints_ptrs); | ||
| 583 | if (found) | ||
| 584 | goto end; | ||
| 585 | } | ||
| 586 | /* Tracepoints in modules */ | ||
| 587 | mutex_lock(&tracepoints_mutex); | ||
| 588 | list_for_each_entry(iter_mod, &tracepoint_module_list, list) { | ||
| 589 | /* | ||
| 590 | * Sorted module list | ||
| 591 | */ | ||
| 592 | if (iter_mod < iter->module) | ||
| 593 | continue; | ||
| 594 | else if (iter_mod > iter->module) | ||
| 595 | iter->tracepoint = NULL; | ||
| 596 | found = tracepoint_get_iter_range(&iter->tracepoint, | ||
| 597 | iter_mod->tracepoints_ptrs, | ||
| 598 | iter_mod->tracepoints_ptrs | ||
| 599 | + iter_mod->num_tracepoints); | ||
| 600 | if (found) { | ||
| 601 | iter->module = iter_mod; | ||
| 602 | break; | ||
| 603 | } | ||
| 604 | } | ||
| 605 | mutex_unlock(&tracepoints_mutex); | ||
| 606 | end: | ||
| 607 | if (!found) | ||
| 608 | tracepoint_iter_reset(iter); | ||
| 609 | } | ||
| 610 | #else /* CONFIG_MODULES */ | ||
| 611 | static void tracepoint_get_iter(struct tracepoint_iter *iter) | ||
| 612 | { | ||
| 613 | int found = 0; | ||
| 614 | |||
| 615 | /* Core kernel tracepoints */ | ||
| 616 | found = tracepoint_get_iter_range(&iter->tracepoint, | ||
| 617 | __start___tracepoints_ptrs, | ||
| 618 | __stop___tracepoints_ptrs); | ||
| 619 | if (!found) | ||
| 620 | tracepoint_iter_reset(iter); | ||
| 621 | } | ||
| 622 | #endif /* CONFIG_MODULES */ | ||
| 623 | |||
| 624 | void tracepoint_iter_start(struct tracepoint_iter *iter) | ||
| 625 | { | ||
| 626 | tracepoint_get_iter(iter); | ||
| 627 | } | ||
| 628 | EXPORT_SYMBOL_GPL(tracepoint_iter_start); | ||
| 629 | |||
| 630 | void tracepoint_iter_next(struct tracepoint_iter *iter) | ||
| 631 | { | ||
| 632 | iter->tracepoint++; | ||
| 633 | /* | ||
| 634 | * iter->tracepoint may be invalid because we blindly incremented it. | ||
| 635 | * Make sure it is valid by marshalling on the tracepoints, getting the | ||
| 636 | * tracepoints from following modules if necessary. | ||
| 637 | */ | ||
| 638 | tracepoint_get_iter(iter); | ||
| 639 | } | ||
| 640 | EXPORT_SYMBOL_GPL(tracepoint_iter_next); | ||
| 641 | |||
| 642 | void tracepoint_iter_stop(struct tracepoint_iter *iter) | ||
| 643 | { | ||
| 644 | } | ||
| 645 | EXPORT_SYMBOL_GPL(tracepoint_iter_stop); | ||
| 646 | |||
| 647 | void tracepoint_iter_reset(struct tracepoint_iter *iter) | ||
| 648 | { | ||
| 649 | #ifdef CONFIG_MODULES | ||
| 650 | iter->module = NULL; | ||
| 651 | #endif /* CONFIG_MODULES */ | ||
| 652 | iter->tracepoint = NULL; | ||
| 653 | } | ||
| 654 | EXPORT_SYMBOL_GPL(tracepoint_iter_reset); | ||
| 655 | 459 | ||
| 656 | #ifdef CONFIG_MODULES | 460 | #ifdef CONFIG_MODULES |
| 657 | static int tracepoint_module_coming(struct module *mod) | 461 | static int tracepoint_module_coming(struct module *mod) |
| 658 | { | 462 | { |
| 659 | struct tp_module *tp_mod, *iter; | 463 | struct tp_module *tp_mod; |
| 660 | int ret = 0; | 464 | int ret = 0; |
| 661 | 465 | ||
| 662 | if (!mod->num_tracepoints) | 466 | if (!mod->num_tracepoints) |
| @@ -677,23 +481,7 @@ static int tracepoint_module_coming(struct module *mod) | |||
| 677 | } | 481 | } |
| 678 | tp_mod->num_tracepoints = mod->num_tracepoints; | 482 | tp_mod->num_tracepoints = mod->num_tracepoints; |
| 679 | tp_mod->tracepoints_ptrs = mod->tracepoints_ptrs; | 483 | tp_mod->tracepoints_ptrs = mod->tracepoints_ptrs; |
| 680 | 484 | list_add_tail(&tp_mod->list, &tracepoint_module_list); | |
| 681 | /* | ||
| 682 | * tracepoint_module_list is kept sorted by struct module pointer | ||
| 683 | * address for iteration on tracepoints from a seq_file that can release | ||
| 684 | * the mutex between calls. | ||
| 685 | */ | ||
| 686 | list_for_each_entry_reverse(iter, &tracepoint_module_list, list) { | ||
| 687 | BUG_ON(iter == tp_mod); /* Should never be in the list twice */ | ||
| 688 | if (iter < tp_mod) { | ||
| 689 | /* We belong to the location right after iter. */ | ||
| 690 | list_add(&tp_mod->list, &iter->list); | ||
| 691 | goto module_added; | ||
| 692 | } | ||
| 693 | } | ||
| 694 | /* We belong to the beginning of the list */ | ||
| 695 | list_add(&tp_mod->list, &tracepoint_module_list); | ||
| 696 | module_added: | ||
| 697 | tracepoint_update_probe_range(mod->tracepoints_ptrs, | 485 | tracepoint_update_probe_range(mod->tracepoints_ptrs, |
| 698 | mod->tracepoints_ptrs + mod->num_tracepoints); | 486 | mod->tracepoints_ptrs + mod->num_tracepoints); |
| 699 | end: | 487 | end: |
