|
@@ -451,6 +451,13 @@ static struct rchan_buf *relay_open_buf(struct rchan *chan, unsigned int cpu)
|
|
|
if (!dentry)
|
|
|
goto free_buf;
|
|
|
relay_set_buf_dentry(buf, dentry);
|
|
|
+ } else {
|
|
|
+ /* Only retrieve global info, nothing more, nothing less */
|
|
|
+ dentry = chan->cb->create_buf_file(NULL, NULL,
|
|
|
+ S_IRUSR, buf,
|
|
|
+ &chan->is_global);
|
|
|
+ if (WARN_ON(dentry))
|
|
|
+ goto free_buf;
|
|
|
}
|
|
|
|
|
|
buf->cpu = cpu;
|
|
@@ -562,6 +569,10 @@ static int relay_hotcpu_callback(struct notifier_block *nb,
|
|
|
* attributes specified. The created channel buffer files
|
|
|
* will be named base_filename0...base_filenameN-1. File
|
|
|
* permissions will be %S_IRUSR.
|
|
|
+ *
|
|
|
+ * If opening a buffer (@parent = NULL) that you later wish to register
|
|
|
+ * in a filesystem, call relay_late_setup_files() once the @parent dentry
|
|
|
+ * is available.
|
|
|
*/
|
|
|
struct rchan *relay_open(const char *base_filename,
|
|
|
struct dentry *parent,
|
|
@@ -640,8 +651,12 @@ static void __relay_set_buf_dentry(void *info)
|
|
|
*
|
|
|
* Returns 0 if successful, non-zero otherwise.
|
|
|
*
|
|
|
- * Use to setup files for a previously buffer-only channel.
|
|
|
- * Useful to do early tracing in kernel, before VFS is up, for example.
|
|
|
+ * Use to setup files for a previously buffer-only channel created
|
|
|
+ * by relay_open() with a NULL parent dentry.
|
|
|
+ *
|
|
|
+ * For example, this is useful for perfomring early tracing in kernel,
|
|
|
+ * before VFS is up and then exposing the early results once the dentry
|
|
|
+ * is available.
|
|
|
*/
|
|
|
int relay_late_setup_files(struct rchan *chan,
|
|
|
const char *base_filename,
|
|
@@ -666,6 +681,20 @@ int relay_late_setup_files(struct rchan *chan,
|
|
|
}
|
|
|
chan->has_base_filename = 1;
|
|
|
chan->parent = parent;
|
|
|
+
|
|
|
+ if (chan->is_global) {
|
|
|
+ err = -EINVAL;
|
|
|
+ if (!WARN_ON_ONCE(!chan->buf[0])) {
|
|
|
+ dentry = relay_create_buf_file(chan, chan->buf[0], 0);
|
|
|
+ if (dentry && !WARN_ON_ONCE(!chan->is_global)) {
|
|
|
+ relay_set_buf_dentry(chan->buf[0], dentry);
|
|
|
+ err = 0;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ mutex_unlock(&relay_channels_mutex);
|
|
|
+ return err;
|
|
|
+ }
|
|
|
+
|
|
|
curr_cpu = get_cpu();
|
|
|
/*
|
|
|
* The CPU hotplug notifier ran before us and created buffers with
|
|
@@ -706,6 +735,7 @@ int relay_late_setup_files(struct rchan *chan,
|
|
|
|
|
|
return err;
|
|
|
}
|
|
|
+EXPORT_SYMBOL_GPL(relay_late_setup_files);
|
|
|
|
|
|
/**
|
|
|
* relay_switch_subbuf - switch to a new sub-buffer
|