dumpvfscache.c revision 60833
1162856Sdes/* $FreeBSD: head/tools/diag/dumpvfscache/dumpvfscache.c 60833 2000-05-23 20:41:01Z jake $ */ 292559Sdes#include <stdio.h> 365668Skris#include <stdlib.h> 465668Skris#include <unistd.h> 565668Skris#include <fcntl.h> 665668Skris#include <kvm.h> 765668Skris#include <nlist.h> 865668Skris#include <sys/uio.h> 965668Skris#include <sys/namei.h> 1065668Skris#include <sys/param.h> 1165668Skris#include <sys/time.h> 1265668Skris#include <sys/vnode.h> 1365668Skris/*----------------------------------*/ 1465668Skrisstatic u_int crc16_table[16] = { 1592559Sdes 0x0000, 0xCC01, 0xD801, 0x1400, 1665668Skris 0xF001, 0x3C00, 0x2800, 0xE401, 1765668Skris 0xA001, 0x6C00, 0x7800, 0xB401, 1865668Skris 0x5000, 0x9C01, 0x8801, 0x4400 1965668Skris}; 2065668Skris 2165668Skrisstatic u_short 2265668Skriswlpsacrc(u_char *buf, u_int len) 2365668Skris{ 2465668Skris u_short crc = 0; 2565668Skris int i, r1; 2665668Skris 2765668Skris for (i = 0; i < len; i++, buf++) { 2865668Skris /* lower 4 bits */ 2965668Skris r1 = crc16_table[crc & 0xF]; 3065668Skris crc = (crc >> 4) & 0x0FFF; 3165668Skris crc = crc ^ r1 ^ crc16_table[*buf & 0xF]; 3265668Skris 3365668Skris /* upper 4 bits */ 3465668Skris r1 = crc16_table[crc & 0xF]; 3565668Skris crc = (crc >> 4) & 0x0FFF; 3665668Skris crc = crc ^ r1 ^ crc16_table[(*buf >> 4) & 0xF]; 3757429Smarkm } 3892559Sdes return(crc); 3992559Sdes} 4057429Smarkm 4157429Smarkm/*----------------------------------*/ 4257429Smarkmstruct nlist nl[] = { 4357429Smarkm { "_nchash", 0}, 4457429Smarkm { "_nchashtbl", 0}, 4557429Smarkm { 0, 0 }, 4657429Smarkm}; 4760573Skris 4860573Skrisint histo[2047]; 4960573Skrisint histn[2047]; 5060573Skrisint *newbucket; 5160573Skris 5276262Sgreenint 5376262Sgreenmain(int argc, char **argv) 5476262Sgreen{ 5592559Sdes int nchash, i, j, k, kn; 5692559Sdes int nb, p1, p2; 5757429Smarkm u_long p; 5892559Sdes LIST_HEAD(nchashhead, struct namecache) *nchashtbl; 5992559Sdes struct namecache *nc; 6065668Skris struct vnode vn; 6165668Skris 6265668Skris kvm_t *kvm = kvm_open(0, 0, 0, O_RDONLY, 0); 6392559Sdes 64157019Sdes printf("kvm: %p\n", kvm); 65157019Sdes printf("kvm_nlist: %d\n", kvm_nlist(kvm, nl)); 6657429Smarkm kvm_read(kvm, nl[0].n_value, &nchash, sizeof nchash); 6765668Skris nchash++; 6857429Smarkm nchashtbl = malloc(nchash * sizeof *nchashtbl); 6957429Smarkm nc = malloc(sizeof *nc + 400); 7057429Smarkm newbucket = malloc(nchash * sizeof (int)); 7192559Sdes memset(newbucket, 0, nchash * sizeof (int)); 7292559Sdes kvm_read(kvm, nl[1].n_value, &p, sizeof p); 7360573Skris kvm_read(kvm, p, nchashtbl, nchash * sizeof *nchashtbl); 7460573Skris for (i=0; i < nchash; i++) { 7560573Skris#if 0 7660573Skris printf("%d\n", i); 7760573Skris#endif 78137019Sdes nb=0; 7974500Sgreen p = (u_long)LIST_FIRST(nchashtbl+i); 80106130Sdes while (p) { 81147005Sdes nb++; 8292559Sdes kvm_read(kvm, p, nc, sizeof *nc + 400); 8392559Sdes kvm_read(kvm, (u_long)nc->nc_dvp, &vn, sizeof vn); 8457429Smarkm nc->nc_name[nc->nc_nlen] = '\0'; 8557429Smarkm for (j=k=kn=0;nc->nc_name[j];j++) { 8657429Smarkm k+= nc->nc_name[j]; 8757429Smarkm kn <<= 1; 8860573Skris kn+= nc->nc_name[j]; 8992559Sdes } 9092559Sdes /* 9157429Smarkm kn = k; 9257429Smarkm */ 9357429Smarkm kn = wlpsacrc(nc->nc_name,nc->nc_nlen); 9460573Skris 9599063Sdes /* kn += (u_long)vn.v_data >> 8; */ 9699063Sdes /* kn += (u_long)nc->nc_dvp >> 7; */ 9799063Sdes kn += vn.v_id; 9899063Sdes kn &= (nchash - 1); 9999063Sdes newbucket[kn]++; 10099063Sdes#if 1 10160573Skris printf("%4d dvp %08x hash %08x vp %08x id %08x name <%s>\n", 10292559Sdes i,nc->nc_dvp, k, nc->nc_vp, vn.v_id, nc->nc_name); 10360573Skris#endif 10460573Skris p = (u_long)LIST_NEXT(nc, nc_hash); 10560573Skris } 10660573Skris histo[nb]++; 10792559Sdes } 108157019Sdes for (i=0; i < nchash; i++) { 10992559Sdes histn[newbucket[i]]++; 110157019Sdes } 11160573Skris p1=p2 = 0; 11265668Skris for (i=0;i<30;i++) { 113157019Sdes p1 += histo[i] * i; 114157019Sdes p2 += histn[i] * i; 115157019Sdes if (histo[i] || histn[i]) 116157019Sdes printf("H%02d %4d %4d / %4d %4d\n",i,histo[i], p1 , histn[i], p2); 11765668Skris } 11865668Skris 11960573Skris return (0); 12060573Skris} 12160573Skris 12260573Skris