Module Name:    src
Committed By:   ad
Date:           Sun Mar 22 14:41:32 UTC 2020

Modified Files:
        src/usr.bin/pmap: main.c pmap.c pmap.h

Log Message:
- Don't copy the entire namecache only to look up a few names.  Walk the
  data structures like cache_revlookup().

- nchash and mb_map are gone.  module_map replaced lkm_map.


To generate a diff of this commit:
cvs rdiff -u -r1.27 -r1.28 src/usr.bin/pmap/main.c
cvs rdiff -u -r1.54 -r1.55 src/usr.bin/pmap/pmap.c
cvs rdiff -u -r1.11 -r1.12 src/usr.bin/pmap/pmap.h

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/usr.bin/pmap/main.c
diff -u src/usr.bin/pmap/main.c:1.27 src/usr.bin/pmap/main.c:1.28
--- src/usr.bin/pmap/main.c:1.27	Fri Sep 13 13:55:24 2019
+++ src/usr.bin/pmap/main.c	Sun Mar 22 14:41:32 2020
@@ -1,7 +1,7 @@
-/*	$NetBSD: main.c,v 1.27 2019/09/13 13:55:24 christos Exp $ */
+/*	$NetBSD: main.c,v 1.28 2020/03/22 14:41:32 ad Exp $ */
 
 /*
- * Copyright (c) 2002, 2003 The NetBSD Foundation, Inc.
+ * Copyright (c) 2002, 2003, 2020 The NetBSD Foundation, Inc.
  * All rights reserved.
  *
  * This code is derived from software contributed to The NetBSD Foundation
@@ -31,7 +31,7 @@
 
 #include <sys/cdefs.h>
 #ifndef lint
-__RCSID("$NetBSD: main.c,v 1.27 2019/09/13 13:55:24 christos Exp $");
+__RCSID("$NetBSD: main.c,v 1.28 2020/03/22 14:41:32 ad Exp $");
 #endif
 
 #include <sys/param.h>
@@ -54,11 +54,10 @@ __RCSID("$NetBSD: main.c,v 1.27 2019/09/
 #include "main.h"
 
 struct cache_head lcache;
-struct nchashhead *nchashtbl;
 void *uvm_vnodeops, *uvm_deviceops, *aobj_pager, *ubc_pager;
-struct vm_map *kmem_map, *mb_map, *phys_map, *exec_map, *pager_map;
-struct vm_map *st_map, *pt_map, *lkm_map, *buf_map;
-u_long nchash_addr, nchashtbl_addr, kernel_map_addr;
+struct vm_map *kmem_map, *phys_map, *exec_map, *pager_map;
+struct vm_map *st_map, *pt_map, *module_map, *buf_map;
+u_long kernel_map_addr;
 int debug, verbose, recurse, page_size;
 int print_all, print_map, print_maps, print_solaris, print_ddb;
 rlim_t maxssiz;
@@ -76,32 +75,26 @@ struct nlist ksyms[] = {
 #define NL_UBC_PAGER		4
 	{ "_kernel_map", 0, 0, 0, 0 },
 #define NL_KERNEL_MAP		5
-	{ "_nchashtbl", 0, 0, 0, 0 },
-#define NL_NCHASHTBL		6
-	{ "_nchash", 0, 0, 0, 0 },
-#define NL_NCHASH		7
 	{ NULL, 0, 0, 0, 0 }
 };
 
 struct nlist kmaps[] = {
 	{ "_kmem_map", 0, 0, 0, 0 },
 #define NL_kmem_map		0
-	{ "_mb_map", 0, 0, 0, 0 },
-#define NL_mb_map		1
 	{ "_phys_map", 0, 0, 0, 0 },
-#define NL_phys_map		2
+#define NL_phys_map		1
 	{ "_exec_map", 0, 0, 0, 0 },
-#define NL_exec_map		3
+#define NL_exec_map		2
 	{ "_pager_map", 0, 0, 0, 0 },
-#define NL_pager_map		4
+#define NL_pager_map		3
 	{ "_st_map", 0, 0, 0, 0 },
-#define NL_st_map		5
+#define NL_st_map		4
 	{ "_pt_map", 0, 0, 0, 0 },
-#define NL_pt_map		6
-	{ "_lkm_map", 0, 0, 0, 0 },
-#define NL_lkm_map		7
+#define NL_pt_map		5
+	{ "_module_map", 0, 0, 0, 0 },
+#define NL_module_map		6
 	{ "_buf_map", 0, 0, 0, 0 },
-#define NL_buf_map		8
+#define NL_buf_map		7
 	{ NULL, 0, 0, 0, 0 },
 };
 
@@ -398,12 +391,8 @@ load_symbols(kvm_t *kd)
 	aobj_pager =	(void*)ksyms[NL_AOBJ_PAGER].n_value;
 	ubc_pager =	(void*)ksyms[NL_UBC_PAGER].n_value;
 
-	nchash_addr =	ksyms[NL_NCHASH].n_value;
-
 	_KDEREF(kd, ksyms[NL_MAXSSIZ].n_value, &maxssiz,
 		sizeof(maxssiz));
-	_KDEREF(kd, ksyms[NL_NCHASHTBL].n_value, &nchashtbl_addr,
-	       sizeof(nchashtbl_addr));
 	_KDEREF(kd, ksyms[NL_KERNEL_MAP].n_value, &kernel_map_addr,
 		sizeof(kernel_map_addr));
 
@@ -420,13 +409,12 @@ load_symbols(kvm_t *kd)
 	} while (0/*CONSTCOND*/)
 
 	get_map_address(kmem_map);
-	get_map_address(mb_map);
 	get_map_address(phys_map);
 	get_map_address(exec_map);
 	get_map_address(pager_map);
 	get_map_address(st_map);
 	get_map_address(pt_map);
-	get_map_address(lkm_map);
+	get_map_address(module_map);
 	get_map_address(buf_map);
 
 	mib[0] = CTL_HW;
@@ -444,8 +432,6 @@ mapname(void *addr)
 		return ("kernel_map");
 	else if (addr == kmem_map)
 		return ("kmem_map");
-	else if (addr == mb_map)
-		return ("mb_map");
 	else if (addr == phys_map)
 		return ("phys_map");
 	else if (addr == exec_map)
@@ -456,83 +442,10 @@ mapname(void *addr)
 		return ("st_map");
 	else if (addr == pt_map)
 		return ("pt_map");
-	else if (addr == lkm_map)
-		return ("lkm_map");
+	else if (addr == module_map)
+		return ("module_map");
 	else if (addr == buf_map)
 		return ("buf_map");
 	else
 		return (NULL);
 }
-
-void
-load_name_cache(kvm_t *kd)
-{
-	struct namecache *ncp, *oncp;
-	union {
-		struct namecache ncp;
-		char buf[sizeof(*ncp) + USHRT_MAX];
-	} _n;
-#define _ncp _n.ncp
-	struct nchashhead _ncpp, *ncpp; 
-	u_long lnchash;
-	size_t nchash, i;
-
-	LIST_INIT(&lcache);
-
-	_KDEREF(kd, nchash_addr, &lnchash, sizeof(lnchash));
-	nchash = (size_t)lnchash + 1;
-	nchashtbl = ecalloc(nchash, sizeof(*nchashtbl));
-	_KDEREF(kd, nchashtbl_addr, nchashtbl, sizeof(*nchashtbl) * nchash);
-
-	ncpp = &_ncpp;
-
-	for (i = 0; i < nchash; i++) {
-		ncpp = &nchashtbl[i];
-		oncp = NULL;
-		LIST_FOREACH(ncp, ncpp, nc_hash) {
-			size_t len;
-
-			if (ncp == oncp ||
-			    ncp == (void*)0xdeadbeef)
-				break;
-			oncp = ncp;
-			len = NCHNAMLEN;
-again:
-			_KDEREF(kd, (u_long)ncp, &_ncp, (len + sizeof(*ncp)));
-			if (_ncp.nc_nlen > len && _ncp.nc_nlen < 1024) {
-				len = _ncp.nc_nlen;
-				goto again;
-			}
-			ncp = &_ncp;
-			if (ncp->nc_nlen > 0) {
-				if (ncp->nc_nlen > 2 ||
-				    ncp->nc_name[0] != '.' ||
-				    (ncp->nc_name[1] != '.' &&
-				     ncp->nc_nlen != 1))
-					cache_enter(i, ncp);
-			}
-		}
-	}
-}
-
-void
-cache_enter(u_long i, struct namecache *ncp)
-{
-	struct cache_entry *ce;
-
-	if (debug & DUMP_NAMEI_CACHE)
-		printf("[%lu] ncp->nc_vp %10p, ncp->nc_dvp %10p, "
-		       "ncp->nc_nlen %3d [%.*s]\n",
-		       i, ncp->nc_vp, ncp->nc_dvp,
-		       ncp->nc_nlen, ncp->nc_nlen, ncp->nc_name);
-
-	ce = emalloc(sizeof(struct cache_entry));
-	
-	ce->ce_vp = ncp->nc_vp;
-	ce->ce_pvp = ncp->nc_dvp;
-	ce->ce_nlen = ncp->nc_nlen;
-	strncpy(ce->ce_name, ncp->nc_name, sizeof(ce->ce_name));
-	ce->ce_name[MIN(ce->ce_nlen, (int)(sizeof(ce->ce_name) - 1))] = '\0';
-
-	LIST_INSERT_HEAD(&lcache, ce, ce_next);
-}

Index: src/usr.bin/pmap/pmap.c
diff -u src/usr.bin/pmap/pmap.c:1.54 src/usr.bin/pmap/pmap.c:1.55
--- src/usr.bin/pmap/pmap.c:1.54	Wed May  9 01:04:01 2018
+++ src/usr.bin/pmap/pmap.c	Sun Mar 22 14:41:32 2020
@@ -1,7 +1,7 @@
-/*	$NetBSD: pmap.c,v 1.54 2018/05/09 01:04:01 christos Exp $ */
+/*	$NetBSD: pmap.c,v 1.55 2020/03/22 14:41:32 ad Exp $ */
 
 /*
- * Copyright (c) 2002, 2003 The NetBSD Foundation, Inc.
+ * Copyright (c) 2002, 2003, 2020 The NetBSD Foundation, Inc.
  * All rights reserved.
  *
  * This code is derived from software contributed to The NetBSD Foundation
@@ -31,7 +31,7 @@
 
 #include <sys/cdefs.h>
 #ifndef lint
-__RCSID("$NetBSD: pmap.c,v 1.54 2018/05/09 01:04:01 christos Exp $");
+__RCSID("$NetBSD: pmap.c,v 1.55 2020/03/22 14:41:32 ad Exp $");
 #endif
 
 #include <string.h>
@@ -43,7 +43,7 @@ __RCSID("$NetBSD: pmap.c,v 1.54 2018/05/
 static void dump_vm_anon(kvm_t *, struct vm_anon **, int);
 static char *findname(kvm_t *, struct kbit *, struct kbit *, struct kbit *,
 	struct kbit *, struct kbit *);
-static int search_cache(kvm_t *, struct kbit *, char **, char *, size_t);
+static int search_cache(kvm_t *, struct vnode *, char **, char *, size_t);
 
 /* when recursing, output is indented */
 #define indent(n) ((n) * (recurse > 1 ? recurse - 1 : 0))
@@ -680,13 +680,15 @@ findname(kvm_t *kd, struct kbit *vmspace
 	static char buf[1024], *name;
 	struct vm_map_entry *vme;
 	size_t l;
+	int rv;
 
 	vme = D(vm_map_entry, vm_map_entry);
 
 	if (UVM_ET_ISOBJ(vme)) {
 		if (A(vfs)) {
 			l = (unsigned)strlen(D(vfs, mount)->mnt_stat.f_mntonname);
-			switch (search_cache(kd, vp, &name, buf, sizeof(buf))) { 
+			rv = search_cache(kd, P(vp), &name, buf, sizeof(buf));
+			switch (rv) {
 			    case 0: /* found something */
                                 name--;
                                 *name = '/';
@@ -776,32 +778,38 @@ findname(kvm_t *kd, struct kbit *vmspace
 }
 
 static int
-search_cache(kvm_t *kd, struct kbit *vp, char **name, char *buf, size_t blen)
+search_cache(kvm_t *kd, struct vnode *vp, char **name, char *buf, size_t blen)
 {
 	char *o, *e;
-	struct cache_entry *ce;
-	struct kbit svp;
-
-	if (nchashtbl == NULL)
-		load_name_cache(kd);
-
-	P(&svp) = P(vp);
-	S(&svp) = sizeof(struct vnode);
+	struct namecache nc;
+	struct vnode_impl vi;
+	u_long vip, ncp, ncp2;
 
+	vip = (u_long)vp;
 	e = &buf[blen - 1];
 	o = e;
+	ncp2 = 0;
 	do {
-		LIST_FOREACH(ce, &lcache, ce_next)
-			if (ce->ce_vp == P(&svp))
+		/* Pull down vnode_impl for vnode. */
+		_KDEREF(kd, vip, &vi, sizeof(vi));
+
+		/* From that, get first cached name for vnode. */
+		ncp = (u_long)vi.vi_nc_list.tqh_first;
+		if (ncp != 0 && ncp != ncp2) {
+			/* Pull down the cache entry. */
+			_KDEREF(kd, ncp, &nc, sizeof(nc));
+			/* Done if own parent or at the root. */
+			if ((u_long)nc.nc_dvp == vip ||
+			    (vi.vi_vnode.v_vflag & VV_ROOT) != 0)
 				break;
-		if (ce && ce->ce_vp == P(&svp)) {
+			/* Otherwise pull first NCHNAMLEN chars of name. */
 			if (o != e)
 				*(--o) = '/';
-			o -= ce->ce_nlen;
-			memcpy(o, ce->ce_name, (unsigned)ce->ce_nlen);
-			P(&svp) = ce->ce_pvp;
-		}
-		else
+			o -= MIN((size_t)nc.nc_nlen, NCHNAMLEN);
+			memcpy(o, nc.nc_name, (unsigned)nc.nc_nlen);
+			vip = (u_long)nc.nc_dvp;
+			ncp2 = ncp;
+		} else
 			break;
 	} while (1/*CONSTCOND*/);
 	*e = '\0';
@@ -810,6 +818,5 @@ search_cache(kvm_t *kd, struct kbit *vp,
 	if (e == o)
 		return (2);
 
-	KDEREF(kd, &svp);
-	return (D(&svp, vnode)->v_vflag & VV_ROOT);
+	return (vi.vi_vnode.v_vflag & VV_ROOT);
 }

Index: src/usr.bin/pmap/pmap.h
diff -u src/usr.bin/pmap/pmap.h:1.11 src/usr.bin/pmap/pmap.h:1.12
--- src/usr.bin/pmap/pmap.h:1.11	Fri Sep 13 13:56:04 2019
+++ src/usr.bin/pmap/pmap.h	Sun Mar 22 14:41:32 2020
@@ -1,7 +1,7 @@
-/*	$NetBSD: pmap.h,v 1.11 2019/09/13 13:56:04 christos Exp $ */
+/*	$NetBSD: pmap.h,v 1.12 2020/03/22 14:41:32 ad Exp $ */
 
 /*
- * Copyright (c) 2002, 2003 The NetBSD Foundation, Inc.
+ * Copyright (c) 2002, 2003, 2020 The NetBSD Foundation, Inc.
  * All rights reserved.
  *
  * This code is derived from software contributed to The NetBSD Foundation
@@ -46,6 +46,7 @@
 #include <sys/param.h>
 #include <sys/time.h>
 #include <sys/vnode.h>
+#include <sys/vnode_impl.h>
 #define __EXPOSE_MOUNT
 #include <sys/mount.h>
 #include <sys/uio.h>

Reply via email to