1 /* $FreeBSD: src/tools/diag/dumpvfscache/dumpvfscache.c,v 1.1.6.1 2001/03/05 12:17:00 kris Exp $ */ 2 /* $DragonFly: src/tools/diag/dumpvfscache/dumpvfscache.c,v 1.2 2003/06/17 04:29:11 dillon Exp $ */ 3 #include <stdio.h> 4 #include <stdlib.h> 5 #include <unistd.h> 6 #include <fcntl.h> 7 #include <kvm.h> 8 #include <nlist.h> 9 #include <sys/uio.h> 10 #include <sys/namei.h> 11 #include <sys/param.h> 12 #include <sys/time.h> 13 #include <sys/vnode.h> 14 /*----------------------------------*/ 15 static u_int crc16_table[16] = { 16 0x0000, 0xCC01, 0xD801, 0x1400, 17 0xF001, 0x3C00, 0x2800, 0xE401, 18 0xA001, 0x6C00, 0x7800, 0xB401, 19 0x5000, 0x9C01, 0x8801, 0x4400 20 }; 21 22 static u_short 23 wlpsacrc(u_char *buf, u_int len) 24 { 25 u_short crc = 0; 26 int i, r1; 27 28 for (i = 0; i < len; i++, buf++) { 29 /* lower 4 bits */ 30 r1 = crc16_table[crc & 0xF]; 31 crc = (crc >> 4) & 0x0FFF; 32 crc = crc ^ r1 ^ crc16_table[*buf & 0xF]; 33 34 /* upper 4 bits */ 35 r1 = crc16_table[crc & 0xF]; 36 crc = (crc >> 4) & 0x0FFF; 37 crc = crc ^ r1 ^ crc16_table[(*buf >> 4) & 0xF]; 38 } 39 return(crc); 40 } 41 42 /*----------------------------------*/ 43 struct nlist nl[] = { 44 { "_nchash", 0}, 45 { "_nchashtbl", 0}, 46 { 0, 0 }, 47 }; 48 49 int histo[2047]; 50 int histn[2047]; 51 int *newbucket; 52 53 int 54 main(int argc, char **argv) 55 { 56 int nchash, i, j, k, kn; 57 int nb, p1, p2; 58 u_long p; 59 LIST_HEAD(nchashhead, namecache) *nchashtbl; 60 struct namecache *nc; 61 struct vnode vn; 62 63 kvm_t *kvm = kvm_open(0, 0, 0, O_RDONLY, 0); 64 65 printf("kvm: %p\n", kvm); 66 printf("kvm_nlist: %d\n", kvm_nlist(kvm, nl)); 67 kvm_read(kvm, nl[0].n_value, &nchash, sizeof nchash); 68 nchash++; 69 nchashtbl = malloc(nchash * sizeof *nchashtbl); 70 nc = malloc(sizeof *nc + 400); 71 newbucket = malloc(nchash * sizeof (int)); 72 memset(newbucket, 0, nchash * sizeof (int)); 73 kvm_read(kvm, nl[1].n_value, &p, sizeof p); 74 kvm_read(kvm, p, nchashtbl, nchash * sizeof *nchashtbl); 75 for (i=0; i < nchash; i++) { 76 #if 0 77 printf("%d\n", i); 78 #endif 79 nb=0; 80 p = (u_long)LIST_FIRST(nchashtbl+i); 81 while (p) { 82 nb++; 83 kvm_read(kvm, p, nc, sizeof *nc + 400); 84 kvm_read(kvm, (u_long)nc->nc_dvp, &vn, sizeof vn); 85 nc->nc_name[nc->nc_nlen] = '\0'; 86 for (j=k=kn=0;nc->nc_name[j];j++) { 87 k+= nc->nc_name[j]; 88 kn <<= 1; 89 kn+= nc->nc_name[j]; 90 } 91 /* 92 kn = k; 93 */ 94 kn = wlpsacrc(nc->nc_name,nc->nc_nlen); 95 96 /* kn += (u_long)vn.v_data >> 8; */ 97 /* kn += (u_long)nc->nc_dvp >> 7; */ 98 kn += vn.v_id; 99 kn &= (nchash - 1); 100 newbucket[kn]++; 101 #if 1 102 printf("%4d dvp %08x hash %08x vp %08x id %08x name <%s>\n", 103 i,nc->nc_dvp, k, nc->nc_vp, vn.v_id, nc->nc_name); 104 #endif 105 p = (u_long)LIST_NEXT(nc, nc_hash); 106 } 107 histo[nb]++; 108 } 109 for (i=0; i < nchash; i++) { 110 histn[newbucket[i]]++; 111 } 112 p1=p2 = 0; 113 for (i=0;i<30;i++) { 114 p1 += histo[i] * i; 115 p2 += histn[i] * i; 116 if (histo[i] || histn[i]) 117 printf("H%02d %4d %4d / %4d %4d\n",i,histo[i], p1 , histn[i], p2); 118 } 119 120 return (0); 121 } 122 123