Messages in this thread | | | Date | Thu, 5 Nov 2015 13:23:01 +0800 | From | Jiaxing Wang <> | Subject | Re: [PATCH RESEND] tracing: Make tracing work when debugfs is not compiled or initialized. |
| |
On Wed, Nov 04, 2015 at 10:03:39AM -0500, Steven Rostedt wrote: > On Wed, 4 Nov 2015 09:11:18 +0800 > Jiaxing Wang <hello.wjx@gmail.com> wrote: > > > Currently tracing_init_dentry() returns -ENODEV when debugfs is not > > initialized, which causes tracefs not populated with tracing files and > > directories, so we will get an empty directory even after we manually > > mount tracefs. > > > > We can make tracing_init_dentry() return NULL as long as tracefs > > is initialized and get a populated tracefs. > > > > We also need to make global_trace.dir not NULL in order to pass the checks > > in tracing_get_dentry() and add_tracer_options(). > > > > Also added stub debugfs_create_automount() for when debugfs is not > > configured in. > > > > Signed-off-by: Jiaxing Wang <hello.wjx@gmail.com> > > --- > > include/linux/debugfs.h | 8 ++++++++ > > kernel/trace/Kconfig | 1 - > > kernel/trace/trace.c | 29 +++++++++++++++++------------ > > 3 files changed, 25 insertions(+), 13 deletions(-) > > > > diff --git a/include/linux/debugfs.h b/include/linux/debugfs.h > > index 9beb636..b42ef88 100644 > > --- a/include/linux/debugfs.h > > +++ b/include/linux/debugfs.h > > @@ -160,6 +160,14 @@ static inline struct dentry *debugfs_create_symlink(const char *name, > > return ERR_PTR(-ENODEV); > > } > > > > +static inline struct dentry *debugfs_create_automount(const char *name, > > + struct dentry *parent, > > + struct vfsmount *(*f)(void *), > > + void *data) > > +{ > > + return ERR_PTR(-ENODEV); > > +} > > This part needs an Acked-by from Greg KH. > > > + > > static inline void debugfs_remove(struct dentry *dentry) > > { } > > > > diff --git a/kernel/trace/Kconfig b/kernel/trace/Kconfig > > index 1153c43..59f6377f 100644 > > --- a/kernel/trace/Kconfig > > +++ b/kernel/trace/Kconfig > > @@ -95,7 +95,6 @@ config RING_BUFFER_ALLOW_SWAP > > > > config TRACING > > bool > > - select DEBUG_FS > > select RING_BUFFER > > select STACKTRACE if STACKTRACE_SUPPORT > > select TRACEPOINTS > > diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c > > index 6e79408..6dd064e 100644 > > --- a/kernel/trace/trace.c > > +++ b/kernel/trace/trace.c > > @@ -6706,6 +6706,8 @@ static struct vfsmount *trace_automount(void *ingore) > > return mnt; > > } > > > > +#define TRACE_TOP_DIR_ENTRY ((struct dentry *)1) > > + > > /** > > * tracing_init_dentry - initialize top level trace array > > * > > @@ -6716,27 +6718,30 @@ static struct vfsmount *trace_automount(void *ingore) > > struct dentry *tracing_init_dentry(void) > > { > > struct trace_array *tr = &global_trace; > > + struct dentry *traced; > > > > /* The top level trace array uses NULL as parent */ > > if (tr->dir) > > return NULL; > > > > - if (WARN_ON(!debugfs_initialized())) > > + if (WARN_ON(!tracefs_initialized())) > > return ERR_PTR(-ENODEV); > > > > - /* > > - * As there may still be users that expect the tracing > > - * files to exist in debugfs/tracing, we must automount > > - * the tracefs file system there, so older tools still > > - * work with the newer kerenl. > > - */ > > - tr->dir = debugfs_create_automount("tracing", NULL, > > - trace_automount, NULL); > > - if (!tr->dir) { > > - pr_warn_once("Could not create debugfs directory 'tracing'\n"); > > - return ERR_PTR(-ENOMEM); > > + if (debugfs_initialized()) { > > + /* > > + * As there may still be users that expect the tracing > > + * files to exist in debugfs/tracing, we must automount > > + * the tracefs file system there, so older tools still > > + * work with the newer kerenl. > > + */ > > + traced = debugfs_create_automount("tracing", NULL, > > + trace_automount, NULL); > > + if (!traced) > > + pr_warn_once("Could not create debugfs directory 'tracing'\n"); > > This should return a warning, and please keep the tr->dir instead of > this new traced variable. Do you mean return ERR_PTR(-ENOMEM); when debugfs_create_automount() return NULL? As long as tracefs is initialized, we can make tracing_init_dentry() return NULL even if the debugfs automount point is not created(), and tracefs can still be populated. If tracing_init_dentry() returns error in this case, the caller of tracing_init_dentry() will not populate tracefs. > > > } > > > > + tr->dir = TRACE_TOP_DIR_ENTRY; > > + > > Also, no need to add this, because if debugfs is not initialize, then > tr->dir would be ERR_PTR(-ENODEV), which still works as tr->dir is not > NULL. If we accept debugfs_create_automount() return NULL, tr->dir can still be NULL if we do tr->dir = debugfs_create_automount(). > > -- Steve > > > return NULL; > > } > > >
| |