lkml.org 
[lkml]   [2015]   [Nov]   [5]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    Date
    From
    SubjectRe: [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;
    > > }
    > >
    >


    \
     
     \ /
      Last update: 2015-11-05 06:41    [W:3.546 / U:0.044 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site