aboutsummaryrefslogtreecommitdiffstats
path: root/module
diff options
context:
space:
mode:
authorAlexander Motin <[email protected]>2023-12-06 18:37:27 -0500
committerBrian Behlendorf <[email protected]>2024-01-08 16:11:39 -0800
commite09356fa05ff174ed02ade8ea8e4ab98effa0ccd (patch)
tree71df396b8cec1c95a7ff640af53ca7ecc85f832a /module
parent1e1d748cae2edf4afc08cb4a9d063b843dc9f396 (diff)
BRT: Limit brt_vdev_dump() to only one vdev
Without this patch on pool of 60 vdevs with ZFS_DEBUG enabled clone takes much more time than copy, while heavily trashing dbgmsg for no good reason, repeatedly dumping all vdevs BRTs again and again, even unmodified ones. I am generally not sure this dumping is not excessive, but decided to keep it for now, just restricting its scope to more reasonable. Reviewed-by: Kay Pedersen <[email protected]> Reviewed-by: Brian Behlendorf <[email protected]> Signed-off-by: Alexander Motin <[email protected]> Sponsored by: iXsystems, Inc. Closes #15625
Diffstat (limited to 'module')
-rw-r--r--module/zfs/brt.c80
1 files changed, 33 insertions, 47 deletions
diff --git a/module/zfs/brt.c b/module/zfs/brt.c
index a701c70fc..225ddaca1 100644
--- a/module/zfs/brt.c
+++ b/module/zfs/brt.c
@@ -342,7 +342,7 @@ brt_vdev_entcount_get(const brt_vdev_t *brtvd, uint64_t idx)
ASSERT3U(idx, <, brtvd->bv_size);
- if (brtvd->bv_need_byteswap) {
+ if (unlikely(brtvd->bv_need_byteswap)) {
return (BSWAP_16(brtvd->bv_entcount[idx]));
} else {
return (brtvd->bv_entcount[idx]);
@@ -355,7 +355,7 @@ brt_vdev_entcount_set(brt_vdev_t *brtvd, uint64_t idx, uint16_t entcnt)
ASSERT3U(idx, <, brtvd->bv_size);
- if (brtvd->bv_need_byteswap) {
+ if (unlikely(brtvd->bv_need_byteswap)) {
brtvd->bv_entcount[idx] = BSWAP_16(entcnt);
} else {
brtvd->bv_entcount[idx] = entcnt;
@@ -390,55 +390,39 @@ brt_vdev_entcount_dec(brt_vdev_t *brtvd, uint64_t idx)
#ifdef ZFS_DEBUG
static void
-brt_vdev_dump(brt_t *brt)
+brt_vdev_dump(brt_vdev_t *brtvd)
{
- brt_vdev_t *brtvd;
- uint64_t vdevid;
-
- if ((zfs_flags & ZFS_DEBUG_BRT) == 0) {
- return;
- }
-
- if (brt->brt_nvdevs == 0) {
- zfs_dbgmsg("BRT empty");
- return;
- }
-
- zfs_dbgmsg("BRT vdev dump:");
- for (vdevid = 0; vdevid < brt->brt_nvdevs; vdevid++) {
- uint64_t idx;
+ uint64_t idx;
- brtvd = &brt->brt_vdevs[vdevid];
- zfs_dbgmsg(" vdevid=%llu/%llu meta_dirty=%d entcount_dirty=%d "
- "size=%llu totalcount=%llu nblocks=%llu bitmapsize=%zu\n",
- (u_longlong_t)vdevid, (u_longlong_t)brtvd->bv_vdevid,
- brtvd->bv_meta_dirty, brtvd->bv_entcount_dirty,
- (u_longlong_t)brtvd->bv_size,
- (u_longlong_t)brtvd->bv_totalcount,
- (u_longlong_t)brtvd->bv_nblocks,
- (size_t)BT_SIZEOFMAP(brtvd->bv_nblocks));
- if (brtvd->bv_totalcount > 0) {
- zfs_dbgmsg(" entcounts:");
- for (idx = 0; idx < brtvd->bv_size; idx++) {
- if (brt_vdev_entcount_get(brtvd, idx) > 0) {
- zfs_dbgmsg(" [%04llu] %hu",
- (u_longlong_t)idx,
- brt_vdev_entcount_get(brtvd, idx));
- }
+ zfs_dbgmsg(" BRT vdevid=%llu meta_dirty=%d entcount_dirty=%d "
+ "size=%llu totalcount=%llu nblocks=%llu bitmapsize=%zu\n",
+ (u_longlong_t)brtvd->bv_vdevid,
+ brtvd->bv_meta_dirty, brtvd->bv_entcount_dirty,
+ (u_longlong_t)brtvd->bv_size,
+ (u_longlong_t)brtvd->bv_totalcount,
+ (u_longlong_t)brtvd->bv_nblocks,
+ (size_t)BT_SIZEOFMAP(brtvd->bv_nblocks));
+ if (brtvd->bv_totalcount > 0) {
+ zfs_dbgmsg(" entcounts:");
+ for (idx = 0; idx < brtvd->bv_size; idx++) {
+ uint16_t entcnt = brt_vdev_entcount_get(brtvd, idx);
+ if (entcnt > 0) {
+ zfs_dbgmsg(" [%04llu] %hu",
+ (u_longlong_t)idx, entcnt);
}
}
- if (brtvd->bv_entcount_dirty) {
- char *bitmap;
+ }
+ if (brtvd->bv_entcount_dirty) {
+ char *bitmap;
- bitmap = kmem_alloc(brtvd->bv_nblocks + 1, KM_SLEEP);
- for (idx = 0; idx < brtvd->bv_nblocks; idx++) {
- bitmap[idx] =
- BT_TEST(brtvd->bv_bitmap, idx) ? 'x' : '.';
- }
- bitmap[idx] = '\0';
- zfs_dbgmsg(" bitmap: %s", bitmap);
- kmem_free(bitmap, brtvd->bv_nblocks + 1);
+ bitmap = kmem_alloc(brtvd->bv_nblocks + 1, KM_SLEEP);
+ for (idx = 0; idx < brtvd->bv_nblocks; idx++) {
+ bitmap[idx] =
+ BT_TEST(brtvd->bv_bitmap, idx) ? 'x' : '.';
}
+ bitmap[idx] = '\0';
+ zfs_dbgmsg(" dirty: %s", bitmap);
+ kmem_free(bitmap, brtvd->bv_nblocks + 1);
}
}
#endif
@@ -767,7 +751,8 @@ brt_vdev_addref(brt_t *brt, brt_vdev_t *brtvd, const brt_entry_t *bre,
BT_SET(brtvd->bv_bitmap, idx);
#ifdef ZFS_DEBUG
- brt_vdev_dump(brt);
+ if (zfs_flags & ZFS_DEBUG_BRT)
+ brt_vdev_dump(brtvd);
#endif
}
@@ -803,7 +788,8 @@ brt_vdev_decref(brt_t *brt, brt_vdev_t *brtvd, const brt_entry_t *bre,
BT_SET(brtvd->bv_bitmap, idx);
#ifdef ZFS_DEBUG
- brt_vdev_dump(brt);
+ if (zfs_flags & ZFS_DEBUG_BRT)
+ brt_vdev_dump(brtvd);
#endif
}