diff mbox series

NFSD: trace export root filehandle event

Message ID 20240327152737.1411-1-chenhx.fnst@fujitsu.com (mailing list archive)
State New
Headers show
Series NFSD: trace export root filehandle event | expand

Commit Message

Chen Hanxiao March 27, 2024, 3:27 p.m. UTC
Add a tracepoint for obtaining root filehandle event

Signed-off-by: Chen Hanxiao <chenhx.fnst@fujitsu.com>
---
 fs/nfsd/export.c |  4 +---
 fs/nfsd/trace.h  | 39 +++++++++++++++++++++++++++++++++++++++
 2 files changed, 40 insertions(+), 3 deletions(-)

Comments

Chuck Lever March 27, 2024, 4:05 p.m. UTC | #1
On Wed, Mar 27, 2024 at 11:27:37PM +0800, Chen Hanxiao wrote:
> Add a tracepoint for obtaining root filehandle event
> 
> Signed-off-by: Chen Hanxiao <chenhx.fnst@fujitsu.com>
> ---
>  fs/nfsd/export.c |  4 +---
>  fs/nfsd/trace.h  | 39 +++++++++++++++++++++++++++++++++++++++
>  2 files changed, 40 insertions(+), 3 deletions(-)
> 
> diff --git a/fs/nfsd/export.c b/fs/nfsd/export.c
> index 7b641095a665..690721ba42f3 100644
> --- a/fs/nfsd/export.c
> +++ b/fs/nfsd/export.c
> @@ -1027,15 +1027,13 @@ exp_rootfh(struct net *net, struct auth_domain *clp, char *name,
>  	}
>  	inode = d_inode(path.dentry);
>  
> -	dprintk("nfsd: exp_rootfh(%s [%p] %s:%s/%ld)\n",
> -		 name, path.dentry, clp->name,
> -		 inode->i_sb->s_id, inode->i_ino);
>  	exp = exp_parent(cd, clp, &path);
>  	if (IS_ERR(exp)) {
>  		err = PTR_ERR(exp);
>  		goto out;
>  	}
>  
> +	trace_nfsd_exp_rootfh(name, path.dentry, clp->name, inode, exp);

Converting the above dprintk to a tracepoint seems sensible.

I'd like to hear comments from others about whether the new
tracepoint records a useful set of information. We don't need to
record the memory address of the dentry, for example. Recording the
net namespace might be useful, though.


>  	/*
>  	 * fh must be initialized before calling fh_compose
>  	 */
> diff --git a/fs/nfsd/trace.h b/fs/nfsd/trace.h
> index 1cd2076210b1..a11b348f5d6d 100644
> --- a/fs/nfsd/trace.h
> +++ b/fs/nfsd/trace.h
> @@ -396,6 +396,45 @@ TRACE_EVENT(nfsd_export_update,
>  	)
>  );
>  
> +TRACE_EVENT(nfsd_exp_rootfh,
> +	TP_PROTO(
> +		const char *name,
> +		const struct dentry *dentry,
> +		const char *clp_name,
> +		const struct inode *inode,
> +		struct svc_export *exp
> +		),
> +	TP_ARGS(name, dentry, clp_name, inode, exp),
> +	TP_STRUCT__entry(
> +		__string(name, name)
> +		__field(const void *, dentry)
> +		__string(clp_name, clp_name)
> +		__string(s_id, inode->i_sb->s_id)
> +		__field(unsigned long, i_ino)
> +		__array(unsigned char, uuid, 16)
> +		__field(const void *, ex_uuid)
> +	),
> +	TP_fast_assign(
> +		__assign_str(name, name);
> +		__entry->dentry = dentry;
> +		__assign_str(clp_name, clp_name);
> +		__assign_str(s_id, inode->i_sb->s_id);
> +		__entry->i_ino = inode->i_ino;
> +		__entry->ex_uuid = exp->ex_uuid;
> +		if (exp->ex_uuid)
> +			memcpy(__entry->uuid, exp->ex_uuid, 16);
> +	),
> +	TP_printk(
> +		"path=%s dentry=%p domain=%s sid=%s/inode=%ld uuid=%s",
> +		__get_str(name),
> +		__entry->dentry,
> +		__get_str(clp_name),
> +		__get_str(s_id),
> +		__entry->i_ino,
> +		__entry->ex_uuid ? __print_hex_str(__entry->uuid, 16) : "NULL"
> +	)
> +);
> +
>  DECLARE_EVENT_CLASS(nfsd_io_class,
>  	TP_PROTO(struct svc_rqst *rqstp,
>  		 struct svc_fh	*fhp,
> -- 
> 2.39.1
>
Chen Hanxiao March 28, 2024, 10:55 a.m. UTC | #2
> -----邮件原件-----
> 发件人: Chuck Lever <chuck.lever@oracle.com>
> 发送时间: 2024年3月28日 0:06
> 收件人: Chen, Hanxia <chenhx.fnst@fujitsu.com>
> 抄送: Jeff Layton <jlayton@kernel.org>; Neil Brown <neilb@suse.de>; Olga
> Kornievskaia <kolga@netapp.com>; Dai Ngo <Dai.Ngo@oracle.com>; Tom
> Talpey <tom@talpey.com>; linux-nfs@vger.kernel.org
> 主题: Re: [PATCH] NFSD: trace export root filehandle event
> 
> On Wed, Mar 27, 2024 at 11:27:37PM +0800, Chen Hanxiao wrote:
> > Add a tracepoint for obtaining root filehandle event
> >
> > Signed-off-by: Chen Hanxiao <chenhx.fnst@fujitsu.com>
> > ---
> >  fs/nfsd/export.c |  4 +---
> >  fs/nfsd/trace.h  | 39 +++++++++++++++++++++++++++++++++++++++
> >  2 files changed, 40 insertions(+), 3 deletions(-)
> >
> > diff --git a/fs/nfsd/export.c b/fs/nfsd/export.c
> > index 7b641095a665..690721ba42f3 100644
> > --- a/fs/nfsd/export.c
> > +++ b/fs/nfsd/export.c
> > @@ -1027,15 +1027,13 @@ exp_rootfh(struct net *net, struct auth_domain
> *clp, char *name,
> >  	}
> >  	inode = d_inode(path.dentry);
> >
> > -	dprintk("nfsd: exp_rootfh(%s [%p] %s:%s/%ld)\n",
> > -		 name, path.dentry, clp->name,
> > -		 inode->i_sb->s_id, inode->i_ino);
> >  	exp = exp_parent(cd, clp, &path);
> >  	if (IS_ERR(exp)) {
> >  		err = PTR_ERR(exp);
> >  		goto out;
> >  	}
> >
> > +	trace_nfsd_exp_rootfh(name, path.dentry, clp->name, inode, exp);
> 
> Converting the above dprintk to a tracepoint seems sensible.
> 
> I'd like to hear comments from others about whether the new
> tracepoint records a useful set of information. We don't need to
> record the memory address of the dentry, for example. Recording the
> net namespace might be useful, though.
> 

Maybe we cloud record ex_flags too.

Regards,
- Chen
diff mbox series

Patch

diff --git a/fs/nfsd/export.c b/fs/nfsd/export.c
index 7b641095a665..690721ba42f3 100644
--- a/fs/nfsd/export.c
+++ b/fs/nfsd/export.c
@@ -1027,15 +1027,13 @@  exp_rootfh(struct net *net, struct auth_domain *clp, char *name,
 	}
 	inode = d_inode(path.dentry);
 
-	dprintk("nfsd: exp_rootfh(%s [%p] %s:%s/%ld)\n",
-		 name, path.dentry, clp->name,
-		 inode->i_sb->s_id, inode->i_ino);
 	exp = exp_parent(cd, clp, &path);
 	if (IS_ERR(exp)) {
 		err = PTR_ERR(exp);
 		goto out;
 	}
 
+	trace_nfsd_exp_rootfh(name, path.dentry, clp->name, inode, exp);
 	/*
 	 * fh must be initialized before calling fh_compose
 	 */
diff --git a/fs/nfsd/trace.h b/fs/nfsd/trace.h
index 1cd2076210b1..a11b348f5d6d 100644
--- a/fs/nfsd/trace.h
+++ b/fs/nfsd/trace.h
@@ -396,6 +396,45 @@  TRACE_EVENT(nfsd_export_update,
 	)
 );
 
+TRACE_EVENT(nfsd_exp_rootfh,
+	TP_PROTO(
+		const char *name,
+		const struct dentry *dentry,
+		const char *clp_name,
+		const struct inode *inode,
+		struct svc_export *exp
+		),
+	TP_ARGS(name, dentry, clp_name, inode, exp),
+	TP_STRUCT__entry(
+		__string(name, name)
+		__field(const void *, dentry)
+		__string(clp_name, clp_name)
+		__string(s_id, inode->i_sb->s_id)
+		__field(unsigned long, i_ino)
+		__array(unsigned char, uuid, 16)
+		__field(const void *, ex_uuid)
+	),
+	TP_fast_assign(
+		__assign_str(name, name);
+		__entry->dentry = dentry;
+		__assign_str(clp_name, clp_name);
+		__assign_str(s_id, inode->i_sb->s_id);
+		__entry->i_ino = inode->i_ino;
+		__entry->ex_uuid = exp->ex_uuid;
+		if (exp->ex_uuid)
+			memcpy(__entry->uuid, exp->ex_uuid, 16);
+	),
+	TP_printk(
+		"path=%s dentry=%p domain=%s sid=%s/inode=%ld uuid=%s",
+		__get_str(name),
+		__entry->dentry,
+		__get_str(clp_name),
+		__get_str(s_id),
+		__entry->i_ino,
+		__entry->ex_uuid ? __print_hex_str(__entry->uuid, 16) : "NULL"
+	)
+);
+
 DECLARE_EVENT_CLASS(nfsd_io_class,
 	TP_PROTO(struct svc_rqst *rqstp,
 		 struct svc_fh	*fhp,