xfs: report "max_resp" used for min log size computation

Move the tracepoint that computes the size of the transaction used to
compute the minimum log size into xfs_log_get_max_trans_res so that we
only have to compute this stuff once.

Leave xfs_log_get_max_trans_res as a non-static function so that xfs_db
can call it to report the results of the userspace computation of the
same value to diagnose mkfs/kernel misinteractions.

Signed-off-by: Darrick J. Wong <djwong@kernel.org>
Reviewed-by: Dave Chinner <dchinner@redhat.com>
Reviewed-by: Christoph Hellwig <hch@lst.de>
This commit is contained in:
Darrick J. Wong 2022-04-25 18:38:13 -07:00
parent 52d8ea4f24
commit 918247ce54
3 changed files with 20 additions and 3 deletions

View File

@ -76,6 +76,7 @@ xfs_log_get_max_trans_res(
*max_resp = resv.tr_attrsetm; /* struct copy */ *max_resp = resv.tr_attrsetm; /* struct copy */
max_resp->tr_logres = attr_space; max_resp->tr_logres = attr_space;
} }
trace_xfs_log_get_max_trans_res(mp, max_resp);
} }
/* /*

View File

@ -3534,6 +3534,25 @@ DEFINE_EVENT(xfs_trans_resv_class, name, \
DEFINE_TRANS_RESV_EVENT(xfs_trans_resv_calc); DEFINE_TRANS_RESV_EVENT(xfs_trans_resv_calc);
DEFINE_TRANS_RESV_EVENT(xfs_trans_resv_calc_minlogsize); DEFINE_TRANS_RESV_EVENT(xfs_trans_resv_calc_minlogsize);
TRACE_EVENT(xfs_log_get_max_trans_res,
TP_PROTO(struct xfs_mount *mp, const struct xfs_trans_res *res),
TP_ARGS(mp, res),
TP_STRUCT__entry(
__field(dev_t, dev)
__field(uint, logres)
__field(int, logcount)
),
TP_fast_assign(
__entry->dev = mp->m_super->s_dev;
__entry->logres = res->tr_logres;
__entry->logcount = res->tr_logcount;
),
TP_printk("dev %d:%d logres %u logcount %d",
MAJOR(__entry->dev), MINOR(__entry->dev),
__entry->logres,
__entry->logcount)
);
DECLARE_EVENT_CLASS(xfs_trans_class, DECLARE_EVENT_CLASS(xfs_trans_class,
TP_PROTO(struct xfs_trans *tp, unsigned long caller_ip), TP_PROTO(struct xfs_trans *tp, unsigned long caller_ip),
TP_ARGS(tp, caller_ip), TP_ARGS(tp, caller_ip),

View File

@ -32,7 +32,6 @@ static void
xfs_trans_trace_reservations( xfs_trans_trace_reservations(
struct xfs_mount *mp) struct xfs_mount *mp)
{ {
struct xfs_trans_res resv;
struct xfs_trans_res *res; struct xfs_trans_res *res;
struct xfs_trans_res *end_res; struct xfs_trans_res *end_res;
int i; int i;
@ -41,8 +40,6 @@ xfs_trans_trace_reservations(
end_res = (struct xfs_trans_res *)(M_RES(mp) + 1); end_res = (struct xfs_trans_res *)(M_RES(mp) + 1);
for (i = 0; res < end_res; i++, res++) for (i = 0; res < end_res; i++, res++)
trace_xfs_trans_resv_calc(mp, i, res); trace_xfs_trans_resv_calc(mp, i, res);
xfs_log_get_max_trans_res(mp, &resv);
trace_xfs_trans_resv_calc(mp, -1, &resv);
} }
#else #else
# define xfs_trans_trace_reservations(mp) # define xfs_trans_trace_reservations(mp)