diff mbox series

[09/43] xfs: trace in-memory freecounters

Message ID 20250206064511.2323878-10-hch@lst.de (mailing list archive)
State Not Applicable, archived
Headers show
Series [01/43] xfs: factor out a xfs_rt_check_size helper | expand

Commit Message

hch Feb. 6, 2025, 6:44 a.m. UTC
Add two tracepoints when the freecounter dips into the reserved pool
and when it is entirely out of space.

This requires moving enum xfs_free_counter to xfs_types.h to avoid
build failures in various sources files include xfs_trace.h, but
that's probably the right place for it anyway.

Signed-off-by: Christoph Hellwig <hch@lst.de>
---
 fs/xfs/libxfs/xfs_types.h | 17 +++++++++++++++++
 fs/xfs/xfs_mount.c        |  2 ++
 fs/xfs/xfs_mount.h        | 13 -------------
 fs/xfs/xfs_trace.h        | 36 ++++++++++++++++++++++++++++++++++++
 4 files changed, 55 insertions(+), 13 deletions(-)

Comments

Darrick J. Wong Feb. 6, 2025, 8:15 p.m. UTC | #1
On Thu, Feb 06, 2025 at 07:44:25AM +0100, Christoph Hellwig wrote:
> Add two tracepoints when the freecounter dips into the reserved pool
> and when it is entirely out of space.
> 
> This requires moving enum xfs_free_counter to xfs_types.h to avoid
> build failures in various sources files include xfs_trace.h, but
> that's probably the right place for it anyway.
> 
> Signed-off-by: Christoph Hellwig <hch@lst.de>

Yay finally!
Reviewed-by: "Darrick J. Wong" <djwong@kernel.org>

--D

> ---
>  fs/xfs/libxfs/xfs_types.h | 17 +++++++++++++++++
>  fs/xfs/xfs_mount.c        |  2 ++
>  fs/xfs/xfs_mount.h        | 13 -------------
>  fs/xfs/xfs_trace.h        | 36 ++++++++++++++++++++++++++++++++++++
>  4 files changed, 55 insertions(+), 13 deletions(-)
> 
> diff --git a/fs/xfs/libxfs/xfs_types.h b/fs/xfs/libxfs/xfs_types.h
> index ca2401c1facd..76f3c31573ec 100644
> --- a/fs/xfs/libxfs/xfs_types.h
> +++ b/fs/xfs/libxfs/xfs_types.h
> @@ -233,6 +233,23 @@ enum xfs_group_type {
>  	{ XG_TYPE_AG,	"ag" }, \
>  	{ XG_TYPE_RTG,	"rtg" }
>  
> +enum xfs_free_counter {
> +	/*
> +	 * Number of free blocks on the data device.
> +	 */
> +	XC_FREE_BLOCKS,
> +
> +	/*
> +	 * Number of free RT extents on the RT device.
> +	 */
> +	XC_FREE_RTEXTENTS,
> +	XC_FREE_NR,
> +};
> +
> +#define XFS_FREECOUNTER_STR \
> +	{ XC_FREE_BLOCKS,		"blocks" }, \
> +	{ XC_FREE_RTEXTENTS,		"rtextents" }
> +
>  /*
>   * Type verifier functions
>   */
> diff --git a/fs/xfs/xfs_mount.c b/fs/xfs/xfs_mount.c
> index 65123f4ffc2a..1cce5ad0e7a4 100644
> --- a/fs/xfs/xfs_mount.c
> +++ b/fs/xfs/xfs_mount.c
> @@ -1347,6 +1347,7 @@ xfs_dec_freecounter(
>  		}
>  
>  		mp->m_resblks[ctr].avail = lcounter;
> +		trace_xfs_freecounter_reserved(mp, ctr, delta, _RET_IP_);
>  		spin_unlock(&mp->m_sb_lock);
>  	}
>  
> @@ -1354,6 +1355,7 @@ xfs_dec_freecounter(
>  	return 0;
>  
>  fdblocks_enospc:
> +	trace_xfs_freecounter_enospc(mp, ctr, delta, _RET_IP_);
>  	spin_unlock(&mp->m_sb_lock);
>  	return -ENOSPC;
>  }
> diff --git a/fs/xfs/xfs_mount.h b/fs/xfs/xfs_mount.h
> index 2d0e34e517b1..d4a57e2fdcc5 100644
> --- a/fs/xfs/xfs_mount.h
> +++ b/fs/xfs/xfs_mount.h
> @@ -105,19 +105,6 @@ struct xfs_groups {
>  	uint64_t		blkmask;
>  };
>  
> -enum xfs_free_counter {
> -	/*
> -	 * Number of free blocks on the data device.
> -	 */
> -	XC_FREE_BLOCKS,
> -
> -	/*
> -	 * Number of free RT extents on the RT device.
> -	 */
> -	XC_FREE_RTEXTENTS,
> -	XC_FREE_NR,
> -};
> -
>  /*
>   * The struct xfsmount layout is optimised to separate read-mostly variables
>   * from variables that are frequently modified. We put the read-mostly variables
> diff --git a/fs/xfs/xfs_trace.h b/fs/xfs/xfs_trace.h
> index 7fdcb519cf2f..740e0a8c3eca 100644
> --- a/fs/xfs/xfs_trace.h
> +++ b/fs/xfs/xfs_trace.h
> @@ -5668,6 +5668,42 @@ TRACE_EVENT(xfs_growfs_check_rtgeom,
>  );
>  #endif /* CONFIG_XFS_RT */
>  
> +TRACE_DEFINE_ENUM(XC_FREE_BLOCKS);
> +TRACE_DEFINE_ENUM(XC_FREE_RTEXTENTS);
> +
> +DECLARE_EVENT_CLASS(xfs_freeblocks_class,
> +	TP_PROTO(struct xfs_mount *mp, enum xfs_free_counter ctr,
> +		 uint64_t delta, unsigned long caller_ip),
> +	TP_ARGS(mp, ctr, delta, caller_ip),
> +	TP_STRUCT__entry(
> +		__field(dev_t, dev)
> +		__field(enum xfs_free_counter, ctr)
> +		__field(uint64_t, delta)
> +		__field(uint64_t, avail)
> +		__field(unsigned long, caller_ip)
> +	),
> +	TP_fast_assign(
> +		__entry->dev = mp->m_super->s_dev;
> +		__entry->ctr = ctr;
> +		__entry->delta = delta;
> +		__entry->avail = mp->m_resblks[ctr].avail;
> +		__entry->caller_ip = caller_ip;
> +	),
> +	TP_printk("dev %d:%d ctr %s delta %llu avail %llu caller %pS",
> +		  MAJOR(__entry->dev), MINOR(__entry->dev),
> +		  __print_symbolic(__entry->ctr, XFS_FREECOUNTER_STR),
> +		  __entry->delta,
> +		  __entry->avail,
> +		  (char *)__entry->caller_ip)
> +)
> +#define DEFINE_FREEBLOCKS_RESV_EVENT(name) \
> +DEFINE_EVENT(xfs_freeblocks_class, name, \
> +	TP_PROTO(struct xfs_mount *mp, enum xfs_free_counter ctr, \
> +		 uint64_t delta, unsigned long caller_ip), \
> +	TP_ARGS(mp, ctr, delta, caller_ip))
> +DEFINE_FREEBLOCKS_RESV_EVENT(xfs_freecounter_reserved);
> +DEFINE_FREEBLOCKS_RESV_EVENT(xfs_freecounter_enospc);
> +
>  #endif /* _TRACE_XFS_H */
>  
>  #undef TRACE_INCLUDE_PATH
> -- 
> 2.45.2
> 
>
diff mbox series

Patch

diff --git a/fs/xfs/libxfs/xfs_types.h b/fs/xfs/libxfs/xfs_types.h
index ca2401c1facd..76f3c31573ec 100644
--- a/fs/xfs/libxfs/xfs_types.h
+++ b/fs/xfs/libxfs/xfs_types.h
@@ -233,6 +233,23 @@  enum xfs_group_type {
 	{ XG_TYPE_AG,	"ag" }, \
 	{ XG_TYPE_RTG,	"rtg" }
 
+enum xfs_free_counter {
+	/*
+	 * Number of free blocks on the data device.
+	 */
+	XC_FREE_BLOCKS,
+
+	/*
+	 * Number of free RT extents on the RT device.
+	 */
+	XC_FREE_RTEXTENTS,
+	XC_FREE_NR,
+};
+
+#define XFS_FREECOUNTER_STR \
+	{ XC_FREE_BLOCKS,		"blocks" }, \
+	{ XC_FREE_RTEXTENTS,		"rtextents" }
+
 /*
  * Type verifier functions
  */
diff --git a/fs/xfs/xfs_mount.c b/fs/xfs/xfs_mount.c
index 65123f4ffc2a..1cce5ad0e7a4 100644
--- a/fs/xfs/xfs_mount.c
+++ b/fs/xfs/xfs_mount.c
@@ -1347,6 +1347,7 @@  xfs_dec_freecounter(
 		}
 
 		mp->m_resblks[ctr].avail = lcounter;
+		trace_xfs_freecounter_reserved(mp, ctr, delta, _RET_IP_);
 		spin_unlock(&mp->m_sb_lock);
 	}
 
@@ -1354,6 +1355,7 @@  xfs_dec_freecounter(
 	return 0;
 
 fdblocks_enospc:
+	trace_xfs_freecounter_enospc(mp, ctr, delta, _RET_IP_);
 	spin_unlock(&mp->m_sb_lock);
 	return -ENOSPC;
 }
diff --git a/fs/xfs/xfs_mount.h b/fs/xfs/xfs_mount.h
index 2d0e34e517b1..d4a57e2fdcc5 100644
--- a/fs/xfs/xfs_mount.h
+++ b/fs/xfs/xfs_mount.h
@@ -105,19 +105,6 @@  struct xfs_groups {
 	uint64_t		blkmask;
 };
 
-enum xfs_free_counter {
-	/*
-	 * Number of free blocks on the data device.
-	 */
-	XC_FREE_BLOCKS,
-
-	/*
-	 * Number of free RT extents on the RT device.
-	 */
-	XC_FREE_RTEXTENTS,
-	XC_FREE_NR,
-};
-
 /*
  * The struct xfsmount layout is optimised to separate read-mostly variables
  * from variables that are frequently modified. We put the read-mostly variables
diff --git a/fs/xfs/xfs_trace.h b/fs/xfs/xfs_trace.h
index 7fdcb519cf2f..740e0a8c3eca 100644
--- a/fs/xfs/xfs_trace.h
+++ b/fs/xfs/xfs_trace.h
@@ -5668,6 +5668,42 @@  TRACE_EVENT(xfs_growfs_check_rtgeom,
 );
 #endif /* CONFIG_XFS_RT */
 
+TRACE_DEFINE_ENUM(XC_FREE_BLOCKS);
+TRACE_DEFINE_ENUM(XC_FREE_RTEXTENTS);
+
+DECLARE_EVENT_CLASS(xfs_freeblocks_class,
+	TP_PROTO(struct xfs_mount *mp, enum xfs_free_counter ctr,
+		 uint64_t delta, unsigned long caller_ip),
+	TP_ARGS(mp, ctr, delta, caller_ip),
+	TP_STRUCT__entry(
+		__field(dev_t, dev)
+		__field(enum xfs_free_counter, ctr)
+		__field(uint64_t, delta)
+		__field(uint64_t, avail)
+		__field(unsigned long, caller_ip)
+	),
+	TP_fast_assign(
+		__entry->dev = mp->m_super->s_dev;
+		__entry->ctr = ctr;
+		__entry->delta = delta;
+		__entry->avail = mp->m_resblks[ctr].avail;
+		__entry->caller_ip = caller_ip;
+	),
+	TP_printk("dev %d:%d ctr %s delta %llu avail %llu caller %pS",
+		  MAJOR(__entry->dev), MINOR(__entry->dev),
+		  __print_symbolic(__entry->ctr, XFS_FREECOUNTER_STR),
+		  __entry->delta,
+		  __entry->avail,
+		  (char *)__entry->caller_ip)
+)
+#define DEFINE_FREEBLOCKS_RESV_EVENT(name) \
+DEFINE_EVENT(xfs_freeblocks_class, name, \
+	TP_PROTO(struct xfs_mount *mp, enum xfs_free_counter ctr, \
+		 uint64_t delta, unsigned long caller_ip), \
+	TP_ARGS(mp, ctr, delta, caller_ip))
+DEFINE_FREEBLOCKS_RESV_EVENT(xfs_freecounter_reserved);
+DEFINE_FREEBLOCKS_RESV_EVENT(xfs_freecounter_enospc);
+
 #endif /* _TRACE_XFS_H */
 
 #undef TRACE_INCLUDE_PATH