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