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

Darrick J. Wong
2025-02-06T20:15:25Z

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
>
>