]> git.proxmox.com Git - mirror_zfs.git/commitdiff
BRT: Limit brt_vdev_dump() to only one vdev
authorAlexander Motin <mav@FreeBSD.org>
Wed, 6 Dec 2023 23:37:27 +0000 (18:37 -0500)
committerGitHub <noreply@github.com>
Wed, 6 Dec 2023 23:37:27 +0000 (15:37 -0800)
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 <mail@mkwg.de>
Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
Signed-off-by: Alexander Motin <mav@FreeBSD.org>
Sponsored by: iXsystems, Inc.
Closes #15625

module/zfs/brt.c

index a701c70fcfb5d6355126e3c8503e3f58680d33af..225ddaca1e5410c7245645a4fbf45255c20c18a8 100644 (file)
@@ -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
 }