Print this page
patch nuke-the-dbuf-hash

Split Close
Expand all
Collapse all
          --- old/usr/src/cmd/mdb/common/modules/zfs/zfs.c
          +++ new/usr/src/cmd/mdb/common/modules/zfs/zfs.c
↓ open down ↓ 492 lines elided ↑ open up ↑
 493  493                  return (DCMD_ERR);
 494  494          }
 495  495  
 496  496          mdb_printf("%p %8s %1u %9s %2llu %s\n", addr,
 497  497              objectname, (int)db.db_level, blkidname,
 498  498              db.db_holds.rc_count, path);
 499  499  
 500  500          return (DCMD_OK);
 501  501  }
 502  502  
 503      -/* ARGSUSED */
 504      -static int
 505      -dbuf_stats(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
 506      -{
 507      -#define HISTOSZ 32
 508      -        uintptr_t dbp;
 509      -        dmu_buf_impl_t db;
 510      -        dbuf_hash_table_t ht;
 511      -        uint64_t bucket, ndbufs;
 512      -        uint64_t histo[HISTOSZ];
 513      -        uint64_t histo2[HISTOSZ];
 514      -        int i, maxidx;
 515      -
 516      -        if (mdb_readvar(&ht, "dbuf_hash_table") == -1) {
 517      -                mdb_warn("failed to read 'dbuf_hash_table'");
 518      -                return (DCMD_ERR);
 519      -        }
 520      -
 521      -        for (i = 0; i < HISTOSZ; i++) {
 522      -                histo[i] = 0;
 523      -                histo2[i] = 0;
 524      -        }
 525      -
 526      -        ndbufs = 0;
 527      -        for (bucket = 0; bucket < ht.hash_table_mask+1; bucket++) {
 528      -                int len;
 529      -
 530      -                if (mdb_vread(&dbp, sizeof (void *),
 531      -                    (uintptr_t)(ht.hash_table+bucket)) == -1) {
 532      -                        mdb_warn("failed to read hash bucket %u at %p",
 533      -                            bucket, ht.hash_table+bucket);
 534      -                        return (DCMD_ERR);
 535      -                }
 536      -
 537      -                len = 0;
 538      -                while (dbp != 0) {
 539      -                        if (mdb_vread(&db, sizeof (dmu_buf_impl_t),
 540      -                            dbp) == -1) {
 541      -                                mdb_warn("failed to read dbuf at %p", dbp);
 542      -                                return (DCMD_ERR);
 543      -                        }
 544      -                        dbp = (uintptr_t)db.db_hash_next;
 545      -                        for (i = MIN(len, HISTOSZ - 1); i >= 0; i--)
 546      -                                histo2[i]++;
 547      -                        len++;
 548      -                        ndbufs++;
 549      -                }
 550      -
 551      -                if (len >= HISTOSZ)
 552      -                        len = HISTOSZ-1;
 553      -                histo[len]++;
 554      -        }
 555      -
 556      -        mdb_printf("hash table has %llu buckets, %llu dbufs "
 557      -            "(avg %llu buckets/dbuf)\n",
 558      -            ht.hash_table_mask+1, ndbufs,
 559      -            (ht.hash_table_mask+1)/ndbufs);
 560      -
 561      -        mdb_printf("\n");
 562      -        maxidx = 0;
 563      -        for (i = 0; i < HISTOSZ; i++)
 564      -                if (histo[i] > 0)
 565      -                        maxidx = i;
 566      -        mdb_printf("hash chain length   number of buckets\n");
 567      -        for (i = 0; i <= maxidx; i++)
 568      -                mdb_printf("%u                  %llu\n", i, histo[i]);
 569      -
 570      -        mdb_printf("\n");
 571      -        maxidx = 0;
 572      -        for (i = 0; i < HISTOSZ; i++)
 573      -                if (histo2[i] > 0)
 574      -                        maxidx = i;
 575      -        mdb_printf("hash chain depth    number of dbufs\n");
 576      -        for (i = 0; i <= maxidx; i++)
 577      -                mdb_printf("%u or more          %llu    %llu%%\n",
 578      -                    i, histo2[i], histo2[i]*100/ndbufs);
 579      -
 580      -
 581      -        return (DCMD_OK);
 582      -}
 583      -
 584  503  #define CHAIN_END 0xffff
 585  504  /*
 586  505   * ::zap_leaf [-v]
 587  506   *
 588  507   * Print a zap_leaf_phys_t, assumed to be 16k
 589  508   */
 590  509  /* ARGSUSED */
 591  510  static int
 592  511  zap_leaf(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
 593  512  {
↓ open down ↓ 2669 lines elided ↑ open up ↑
3263 3182   * MDB module linkage information:
3264 3183   *
3265 3184   * We declare a list of structures describing our dcmds, and a function
3266 3185   * named _mdb_init to return a pointer to our module information.
3267 3186   */
3268 3187  
3269 3188  static const mdb_dcmd_t dcmds[] = {
3270 3189          { "arc", "[-bkmg]", "print ARC variables", arc_print },
3271 3190          { "blkptr", ":", "print blkptr_t", blkptr },
3272 3191          { "dbuf", ":", "print dmu_buf_impl_t", dbuf },
3273      -        { "dbuf_stats", ":", "dbuf stats", dbuf_stats },
3274 3192          { "dbufs",
3275 3193              "\t[-O objset_t*] [-n objset_name | \"mos\"] "
3276 3194              "[-o object | \"mdn\"] \n"
3277 3195              "\t[-l level] [-b blkid | \"bonus\"]",
3278 3196              "find dmu_buf_impl_t's that match specified criteria", dbufs },
3279 3197          { "abuf_find", "dva_word[0] dva_word[1]",
3280 3198              "find arc_buf_hdr_t of a specified DVA",
3281 3199              abuf_find },
3282 3200          { "spa", "?[-cevmMh]\n"
3283 3201              "\t-c display spa config\n"
↓ open down ↓ 92 lines elided ↑ open up ↑
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX