Path: blob/main/tools/diag/dumpvfscache/dumpvfscache.c
39478 views
#include <stdio.h>1#include <stdlib.h>2#include <unistd.h>3#include <fcntl.h>4#include <kvm.h>5#include <nlist.h>6#include <sysexits.h>7#include <sys/uio.h>8#include <sys/namei.h>9#include <sys/param.h>10#include <sys/queue.h>11#include <sys/time.h>12#include <sys/vnode.h>13/*----------------------------------*/14static u_int crc16_table[16] = {150x0000, 0xCC01, 0xD801, 0x1400,160xF001, 0x3C00, 0x2800, 0xE401,170xA001, 0x6C00, 0x7800, 0xB401,180x5000, 0x9C01, 0x8801, 0x440019};2021/* XXX Taken from sys/kern/vfs_cache.c */22struct namecache {23LIST_ENTRY(namecache) nc_hash;24LIST_ENTRY(namecache) nc_src;25TAILQ_ENTRY(namecache) nc_dst;26struct vnode *nc_dvp;27struct vnode *nc_vp;28u_char nc_flag;29u_char nc_nlen;30char nc_name[0];31};3233static u_short34wlpsacrc(u_char *buf, u_int len)35{36u_short crc = 0;37int i, r1;3839for (i = 0; i < len; i++, buf++) {40/* lower 4 bits */41r1 = crc16_table[crc & 0xF];42crc = (crc >> 4) & 0x0FFF;43crc = crc ^ r1 ^ crc16_table[*buf & 0xF];4445/* upper 4 bits */46r1 = crc16_table[crc & 0xF];47crc = (crc >> 4) & 0x0FFF;48crc = crc ^ r1 ^ crc16_table[(*buf >> 4) & 0xF];49}50return(crc);51}5253/*----------------------------------*/54struct nlist nl[] = {55{ "_nchash", 0},56{ "_nchashtbl", 0},57{ 0, 0 },58};5960int histo[2047];61int histn[2047];62int *newbucket;6364int65main(int argc, char **argv)66{67int nchash, i, j, k, kn;68int nb, p1, p2;69u_long p;70LIST_HEAD(nchashhead, namecache) *nchashtbl;71struct namecache *nc;72struct vnode vn;7374kvm_t *kvm = kvm_open(NULL, NULL, NULL, O_RDONLY, argv[0]);75if (kvm == NULL)76return(EX_OSERR);7778printf("kvm: %p\n", kvm);79printf("kvm_nlist: %d\n", kvm_nlist(kvm, nl));80kvm_read(kvm, nl[0].n_value, &nchash, sizeof nchash);81nchash++;82nchashtbl = malloc(nchash * sizeof *nchashtbl);83nc = malloc(sizeof *nc + NAME_MAX);84newbucket = malloc(nchash * sizeof (int));85memset(newbucket, 0, nchash * sizeof (int));86kvm_read(kvm, nl[1].n_value, &p, sizeof p);87kvm_read(kvm, p, nchashtbl, nchash * sizeof *nchashtbl);88for (i=0; i < nchash; i++) {89#if 090printf("%d\n", i);91#endif92nb=0;93p = (u_long)LIST_FIRST(nchashtbl+i);94while (p) {95nb++;96kvm_read(kvm, p, nc, sizeof *nc + NAME_MAX);97kvm_read(kvm, (u_long)nc->nc_dvp, &vn, sizeof vn);98nc->nc_name[nc->nc_nlen] = '\0';99for (j=k=kn=0;nc->nc_name[j];j++) {100k+= nc->nc_name[j];101kn <<= 1;102kn+= nc->nc_name[j];103}104/*105kn = k;106*/107kn = wlpsacrc(nc->nc_name,nc->nc_nlen);108109/* kn += (u_long)vn.v_data >> 8; */110/* kn += (u_long)nc->nc_dvp >> 7; */111kn += vn.v_id;112kn &= (nchash - 1);113newbucket[kn]++;114#if 1115printf("%4d dvp %08x hash %08x vp %08x id %08x name <%s>\n",116i,nc->nc_dvp, k, nc->nc_vp, vn.v_id, nc->nc_name);117#endif118p = (u_long)LIST_NEXT(nc, nc_hash);119}120histo[nb]++;121}122for (i=0; i < nchash; i++) {123histn[newbucket[i]]++;124}125p1=p2 = 0;126for (i=0;i<30;i++) {127p1 += histo[i] * i;128p2 += histn[i] * i;129if (histo[i] || histn[i])130printf("H%02d %4d %4d / %4d %4d\n",i,histo[i], p1 , histn[i], p2);131}132133return (0);134}135136137138