162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-or-later
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * Copyright (C) 2023 Oracle.  All Rights Reserved.
462306a36Sopenharmony_ci * Author: Darrick J. Wong <djwong@kernel.org>
562306a36Sopenharmony_ci */
662306a36Sopenharmony_ci#ifndef __XFS_SCRUB_STATS_H__
762306a36Sopenharmony_ci#define __XFS_SCRUB_STATS_H__
862306a36Sopenharmony_ci
962306a36Sopenharmony_cistruct xchk_stats_run {
1062306a36Sopenharmony_ci	u64			scrub_ns;
1162306a36Sopenharmony_ci	u64			repair_ns;
1262306a36Sopenharmony_ci	unsigned int		retries;
1362306a36Sopenharmony_ci	bool			repair_attempted;
1462306a36Sopenharmony_ci	bool			repair_succeeded;
1562306a36Sopenharmony_ci};
1662306a36Sopenharmony_ci
1762306a36Sopenharmony_ci#ifdef CONFIG_XFS_ONLINE_SCRUB_STATS
1862306a36Sopenharmony_cistruct xchk_stats;
1962306a36Sopenharmony_ci
2062306a36Sopenharmony_ciint __init xchk_global_stats_setup(struct dentry *parent);
2162306a36Sopenharmony_civoid xchk_global_stats_teardown(void);
2262306a36Sopenharmony_ci
2362306a36Sopenharmony_ciint xchk_mount_stats_alloc(struct xfs_mount *mp);
2462306a36Sopenharmony_civoid xchk_mount_stats_free(struct xfs_mount *mp);
2562306a36Sopenharmony_ci
2662306a36Sopenharmony_civoid xchk_stats_register(struct xchk_stats *cs, struct dentry *parent);
2762306a36Sopenharmony_civoid xchk_stats_unregister(struct xchk_stats *cs);
2862306a36Sopenharmony_ci
2962306a36Sopenharmony_civoid xchk_stats_merge(struct xfs_mount *mp, const struct xfs_scrub_metadata *sm,
3062306a36Sopenharmony_ci		const struct xchk_stats_run *run);
3162306a36Sopenharmony_ci
3262306a36Sopenharmony_cistatic inline u64 xchk_stats_now(void) { return ktime_get_ns(); }
3362306a36Sopenharmony_cistatic inline u64 xchk_stats_elapsed_ns(u64 since)
3462306a36Sopenharmony_ci{
3562306a36Sopenharmony_ci	u64 now = xchk_stats_now();
3662306a36Sopenharmony_ci
3762306a36Sopenharmony_ci	/*
3862306a36Sopenharmony_ci	 * If the system doesn't have a high enough resolution clock, charge at
3962306a36Sopenharmony_ci	 * least one nanosecond so that our stats don't report instantaneous
4062306a36Sopenharmony_ci	 * runtimes.
4162306a36Sopenharmony_ci	 */
4262306a36Sopenharmony_ci	if (now == since)
4362306a36Sopenharmony_ci		return 1;
4462306a36Sopenharmony_ci
4562306a36Sopenharmony_ci	return now - since;
4662306a36Sopenharmony_ci}
4762306a36Sopenharmony_ci#else
4862306a36Sopenharmony_ci# define xchk_global_stats_setup(parent)	(0)
4962306a36Sopenharmony_ci# define xchk_global_stats_teardown()		((void)0)
5062306a36Sopenharmony_ci# define xchk_mount_stats_alloc(mp)		(0)
5162306a36Sopenharmony_ci# define xchk_mount_stats_free(mp)		((void)0)
5262306a36Sopenharmony_ci# define xchk_stats_register(cs, parent)	((void)0)
5362306a36Sopenharmony_ci# define xchk_stats_unregister(cs)		((void)0)
5462306a36Sopenharmony_ci# define xchk_stats_now()			(0)
5562306a36Sopenharmony_ci# define xchk_stats_elapsed_ns(x)		(0 * (x))
5662306a36Sopenharmony_ci# define xchk_stats_merge(mp, sm, run)		((void)0)
5762306a36Sopenharmony_ci#endif /* CONFIG_XFS_ONLINE_SCRUB_STATS */
5862306a36Sopenharmony_ci
5962306a36Sopenharmony_ci#endif /* __XFS_SCRUB_STATS_H__ */
60