CFT: TRIM Consolodation on UFS/FFS filesystems
Kirk McKusick
mckusick at mckusick.com
Mon Aug 20 19:53:47 UTC 2018
From: Kirk McKusick <mckusick at mckusick.com>
To: FreeBSD Current <freebsd-current at FreeBSD.org>,
FreeBSD Filesystems <freebsd-fs at FreeBSD.org>
Subject: CFT: TRIM Consolodation on UFS/FFS filesystems
Date: Mon, 20 Aug 2018 12:40:56 -0700
Oops, forgot that attachments get stripped. Below are the diffs for
gathering statistics. Sorry to those of you on Gmail for whom they
will be mangled.
Kirk McKusick
=-=-=
Index: sbin/mount/mount.c
===================================================================
--- sbin/mount/mount.c (revision 338054)
+++ sbin/mount/mount.c (working copy)
@@ -686,6 +686,18 @@ prmount(struct statfs *sfp)
for (i = 0; i < sizeof(sfp->f_fsid); i++)
printf("%02x", ((u_char *)&sfp->f_fsid)[i]);
}
+ if (sfp->f_trim_total != 0 || sfp->f_trim_total_blks != 0)
+ (void)printf(", TRIM: total %ju total blocks %ju",
+ (uintmax_t)sfp->f_trim_total,
+ (uintmax_t)sfp->f_trim_total_blks);
+ if (sfp->f_trim_inflight != 0 || sfp->f_trim_inflight_blks != 0)
+ (void)printf(", TRIM: inflight %ju inflight blocks %ju",
+ (uintmax_t)sfp->f_trim_inflight,
+ (uintmax_t)sfp->f_trim_inflight_blks);
+ if (sfp->f_pendingblks != 0 || sfp->f_pendingfiles != 0)
+ (void)printf(", pending blocks %ju, pending files %ju",
+ (uintmax_t)sfp->f_pendingblks,
+ (uintmax_t)sfp->f_pendingfiles);
}
(void)printf(")\n");
}
Index: sys/sys/mount.h
===================================================================
--- sys/sys/mount.h (revision 338054)
+++ sys/sys/mount.h (working copy)
@@ -85,7 +85,13 @@ struct statfs {
uint64_t f_asyncwrites; /* count of async writes since mount */
uint64_t f_syncreads; /* count of sync reads since mount */
uint64_t f_asyncreads; /* count of async reads since mount */
- uint64_t f_spare[10]; /* unused spare */
+ uint64_t f_trim_total; /* count of TRIM ops since mount */
+ uint64_t f_trim_total_blks; /* count of TRIM blocks since mount */
+ uint64_t f_trim_inflight; /* count of TRIM ops in progress */
+ uint64_t f_trim_inflight_blks; /* count of TRIM blocks in progress */
+ int64_t f_pendingblks; /* pending free blocks */
+ int64_t f_pendingfiles; /* pending free nodes */
+ uint64_t f_spare[4]; /* unused spare */
uint32_t f_namemax; /* maximum filename length */
uid_t f_owner; /* user that mounted the filesystem */
fsid_t f_fsid; /* filesystem id */
Index: sys/ufs/ffs/ffs_vfsops.c
===================================================================
--- sys/ufs/ffs/ffs_vfsops.c (revision 338081)
+++ sys/ufs/ffs/ffs_vfsops.c (working copy)
@@ -1398,7 +1398,13 @@ ffs_statfs(mp, sbp)
sbp->f_bsize = fs->fs_fsize;
sbp->f_iosize = fs->fs_bsize;
sbp->f_blocks = fs->fs_dsize;
+ sbp->f_pendingblks = dbtofsb(fs, fs->fs_pendingblocks);
+ sbp->f_pendingfiles = fs->fs_pendinginodes;
UFS_LOCK(ump);
+ sbp->f_trim_total = ump->um_trim_total;
+ sbp->f_trim_total_blks = ump->um_trim_total_blks;
+ sbp->f_trim_inflight = ump->um_trim_inflight;
+ sbp->f_trim_inflight_blks = ump->um_trim_inflight_blks;
sbp->f_bfree = fs->fs_cstotal.cs_nbfree * fs->fs_frag +
fs->fs_cstotal.cs_nffree + dbtofsb(fs, fs->fs_pendingblocks);
sbp->f_bavail = freespace(fs, fs->fs_minfree) +
More information about the freebsd-current
mailing list