diff options
Diffstat (limited to 'kernel')
| -rw-r--r-- | kernel/relay.c | 34 |
1 files changed, 32 insertions, 2 deletions
diff --git a/kernel/relay.c b/kernel/relay.c index 04d7cf3ef8cf..d797502140b9 100644 --- a/kernel/relay.c +++ b/kernel/relay.c | |||
| @@ -451,6 +451,13 @@ static struct rchan_buf *relay_open_buf(struct rchan *chan, unsigned int cpu) | |||
| 451 | if (!dentry) | 451 | if (!dentry) |
| 452 | goto free_buf; | 452 | goto free_buf; |
| 453 | relay_set_buf_dentry(buf, dentry); | 453 | relay_set_buf_dentry(buf, dentry); |
| 454 | } else { | ||
| 455 | /* Only retrieve global info, nothing more, nothing less */ | ||
| 456 | dentry = chan->cb->create_buf_file(NULL, NULL, | ||
| 457 | S_IRUSR, buf, | ||
| 458 | &chan->is_global); | ||
| 459 | if (WARN_ON(dentry)) | ||
| 460 | goto free_buf; | ||
| 454 | } | 461 | } |
| 455 | 462 | ||
| 456 | buf->cpu = cpu; | 463 | buf->cpu = cpu; |
| @@ -562,6 +569,10 @@ static int relay_hotcpu_callback(struct notifier_block *nb, | |||
| 562 | * attributes specified. The created channel buffer files | 569 | * attributes specified. The created channel buffer files |
| 563 | * will be named base_filename0...base_filenameN-1. File | 570 | * will be named base_filename0...base_filenameN-1. File |
| 564 | * permissions will be %S_IRUSR. | 571 | * permissions will be %S_IRUSR. |
| 572 | * | ||
| 573 | * If opening a buffer (@parent = NULL) that you later wish to register | ||
| 574 | * in a filesystem, call relay_late_setup_files() once the @parent dentry | ||
| 575 | * is available. | ||
| 565 | */ | 576 | */ |
| 566 | struct rchan *relay_open(const char *base_filename, | 577 | struct rchan *relay_open(const char *base_filename, |
| 567 | struct dentry *parent, | 578 | struct dentry *parent, |
| @@ -640,8 +651,12 @@ static void __relay_set_buf_dentry(void *info) | |||
| 640 | * | 651 | * |
| 641 | * Returns 0 if successful, non-zero otherwise. | 652 | * Returns 0 if successful, non-zero otherwise. |
| 642 | * | 653 | * |
| 643 | * Use to setup files for a previously buffer-only channel. | 654 | * Use to setup files for a previously buffer-only channel created |
| 644 | * Useful to do early tracing in kernel, before VFS is up, for example. | 655 | * by relay_open() with a NULL parent dentry. |
| 656 | * | ||
| 657 | * For example, this is useful for perfomring early tracing in kernel, | ||
| 658 | * before VFS is up and then exposing the early results once the dentry | ||
| 659 | * is available. | ||
| 645 | */ | 660 | */ |
| 646 | int relay_late_setup_files(struct rchan *chan, | 661 | int relay_late_setup_files(struct rchan *chan, |
| 647 | const char *base_filename, | 662 | const char *base_filename, |
| @@ -666,6 +681,20 @@ int relay_late_setup_files(struct rchan *chan, | |||
| 666 | } | 681 | } |
| 667 | chan->has_base_filename = 1; | 682 | chan->has_base_filename = 1; |
| 668 | chan->parent = parent; | 683 | chan->parent = parent; |
| 684 | |||
| 685 | if (chan->is_global) { | ||
| 686 | err = -EINVAL; | ||
| 687 | if (!WARN_ON_ONCE(!chan->buf[0])) { | ||
| 688 | dentry = relay_create_buf_file(chan, chan->buf[0], 0); | ||
| 689 | if (dentry && !WARN_ON_ONCE(!chan->is_global)) { | ||
| 690 | relay_set_buf_dentry(chan->buf[0], dentry); | ||
| 691 | err = 0; | ||
| 692 | } | ||
| 693 | } | ||
| 694 | mutex_unlock(&relay_channels_mutex); | ||
| 695 | return err; | ||
| 696 | } | ||
| 697 | |||
| 669 | curr_cpu = get_cpu(); | 698 | curr_cpu = get_cpu(); |
| 670 | /* | 699 | /* |
| 671 | * The CPU hotplug notifier ran before us and created buffers with | 700 | * The CPU hotplug notifier ran before us and created buffers with |
| @@ -706,6 +735,7 @@ int relay_late_setup_files(struct rchan *chan, | |||
| 706 | 735 | ||
| 707 | return err; | 736 | return err; |
| 708 | } | 737 | } |
| 738 | EXPORT_SYMBOL_GPL(relay_late_setup_files); | ||
| 709 | 739 | ||
| 710 | /** | 740 | /** |
| 711 | * relay_switch_subbuf - switch to a new sub-buffer | 741 | * relay_switch_subbuf - switch to a new sub-buffer |
