Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/trunk]: src/usr.bin/pmap - Don't copy the entire namecache only to look ...
details: https://anonhg.NetBSD.org/src/rev/ff2b2e361058
branches: trunk
changeset: 970383:ff2b2e361058
user: ad <ad%NetBSD.org@localhost>
date: Sun Mar 22 14:41:32 2020 +0000
description:
- 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.
diffstat:
usr.bin/pmap/main.c | 121 +++++++--------------------------------------------
usr.bin/pmap/pmap.c | 55 +++++++++++++----------
usr.bin/pmap/pmap.h | 5 +-
3 files changed, 51 insertions(+), 130 deletions(-)
diffs (truncated from 334 to 300 lines):
diff -r 145f44ee487c -r ff2b2e361058 usr.bin/pmap/main.c
--- a/usr.bin/pmap/main.c Sun Mar 22 14:39:28 2020 +0000
+++ b/usr.bin/pmap/main.c Sun Mar 22 14:41:32 2020 +0000
@@ -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 @@
#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 @@
#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 @@
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 @@
} 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 @@
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 @@
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);
-}
diff -r 145f44ee487c -r ff2b2e361058 usr.bin/pmap/pmap.c
--- a/usr.bin/pmap/pmap.c Sun Mar 22 14:39:28 2020 +0000
+++ b/usr.bin/pmap/pmap.c Sun Mar 22 14:41:32 2020 +0000
@@ -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 @@
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 @@
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 @@
}
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;
+ struct namecache nc;
+ struct vnode_impl vi;
+ u_long vip, ncp, ncp2;
- if (nchashtbl == NULL)
- load_name_cache(kd);
-
- P(&svp) = P(vp);
- S(&svp) = sizeof(struct vnode);
-
+ 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;
Home |
Main Index |
Thread Index |
Old Index