]> www.infradead.org Git - users/hch/xfs.git/commitdiff
xfs: trace in-memory freecounters
authorChristoph Hellwig <hch@lst.de>
Fri, 31 Jan 2025 06:24:44 +0000 (07:24 +0100)
committerChristoph Hellwig <hch@lst.de>
Mon, 3 Feb 2025 04:49:07 +0000 (05:49 +0100)
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
fs/xfs/xfs_mount.c
fs/xfs/xfs_mount.h
fs/xfs/xfs_trace.h

index ca2401c1facda7e164e590158b8290f248a35f13..76f3c31573ec378d513229f518972cfce5e19ee9 100644 (file)
@@ -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
  */
index 65123f4ffc2a6ca20ab653b7d02d9694dd8e2b69..1cce5ad0e7a44f8d95341305c4493725f89ef815 100644 (file)
@@ -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;
 }
index 2d0e34e517b13630fe998bd1b57d9b0b5cc5d1d6..d4a57e2fdcc51544d8a3dce61c152c080c4b75a9 100644 (file)
@@ -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
index 7fdcb519cf2f9e1d2b802dbea3e654c6b098618c..740e0a8c3eca3ff7a0d2243f4ad4da2d6c7f3d97 100644 (file)
@@ -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