Module Name: src Committed By: hannken Date: Wed Jan 17 10:19:21 UTC 2024
Modified Files: src/sys/miscfs/procfs: procfs.h procfs_vfsops.c procfs_vnops.c Log Message: Add a hashmap to access all procfs nodes by pid. To generate a diff of this commit: cvs rdiff -u -r1.82 -r1.83 src/sys/miscfs/procfs/procfs.h cvs rdiff -u -r1.111 -r1.112 src/sys/miscfs/procfs/procfs_vfsops.c cvs rdiff -u -r1.229 -r1.230 src/sys/miscfs/procfs/procfs_vnops.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/miscfs/procfs/procfs.h diff -u src/sys/miscfs/procfs/procfs.h:1.82 src/sys/miscfs/procfs/procfs.h:1.83 --- src/sys/miscfs/procfs/procfs.h:1.82 Wed Jan 19 10:23:00 2022 +++ src/sys/miscfs/procfs/procfs.h Wed Jan 17 10:19:21 2024 @@ -1,4 +1,4 @@ -/* $NetBSD: procfs.h,v 1.82 2022/01/19 10:23:00 martin Exp $ */ +/* $NetBSD: procfs.h,v 1.83 2024/01/17 10:19:21 hannken Exp $ */ /* * Copyright (c) 1993 @@ -129,7 +129,9 @@ struct pfskey { int pk_fd; /* associated fd if not -1 */ }; struct pfsnode { + LIST_ENTRY(pfsnode) pfs_hash; /* per pid hash list */ struct vnode *pfs_vnode; /* vnode associated with this pfsnode */ + struct mount *pfs_mount; /* mount associated with this pfsnode */ struct pfskey pfs_key; #define pfs_type pfs_key.pk_type #define pfs_pid pfs_key.pk_pid @@ -269,6 +271,7 @@ int procfs_doauxv(struct lwp *, struct p int procfs_dolimit(struct lwp *, struct proc *, struct pfsnode *, struct uio *); +void procfs_hashrem(struct pfsnode *); void procfs_revoke_vnodes(struct proc *, void *); int procfs_getfp(struct pfsnode *, struct proc *, struct file **); Index: src/sys/miscfs/procfs/procfs_vfsops.c diff -u src/sys/miscfs/procfs/procfs_vfsops.c:1.111 src/sys/miscfs/procfs/procfs_vfsops.c:1.112 --- src/sys/miscfs/procfs/procfs_vfsops.c:1.111 Mon Jan 17 11:20:00 2022 +++ src/sys/miscfs/procfs/procfs_vfsops.c Wed Jan 17 10:19:21 2024 @@ -1,4 +1,4 @@ -/* $NetBSD: procfs_vfsops.c,v 1.111 2022/01/17 11:20:00 bouyer Exp $ */ +/* $NetBSD: procfs_vfsops.c,v 1.112 2024/01/17 10:19:21 hannken Exp $ */ /* * Copyright (c) 1993 @@ -76,7 +76,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: procfs_vfsops.c,v 1.111 2022/01/17 11:20:00 bouyer Exp $"); +__KERNEL_RCSID(0, "$NetBSD: procfs_vfsops.c,v 1.112 2024/01/17 10:19:21 hannken Exp $"); #if defined(_KERNEL_OPT) #include "opt_compat_netbsd.h" @@ -110,7 +110,29 @@ MODULE(MODULE_CLASS_VFS, procfs, "ptrace VFS_PROTOS(procfs); +#define PROCFS_HASHSIZE 256 + static kauth_listener_t procfs_listener; +LIST_HEAD(hashhead, pfsnode); +static u_long procfs_hashmask; +static struct hashhead *procfs_hashtab; +static kmutex_t procfs_hashlock; + +static struct hashhead * +procfs_hashhead(pid_t pid) +{ + + return &procfs_hashtab[pid & procfs_hashmask]; +} + +void +procfs_hashrem(struct pfsnode *pfs) +{ + + mutex_enter(&procfs_hashlock); + LIST_REMOVE(pfs, pfs_hash); + mutex_exit(&procfs_hashlock); +} /* * VFS Operations. @@ -279,6 +301,7 @@ procfs_loadvnode(struct mount *mp, struc pfs->pfs_type = pfskey.pk_type; pfs->pfs_fd = pfskey.pk_fd; pfs->pfs_vnode = vp; + pfs->pfs_mount = mp; pfs->pfs_flags = 0; pfs->pfs_fileno = PROCFS_FILENO(pfs->pfs_pid, pfs->pfs_type, pfs->pfs_fd); @@ -421,6 +444,10 @@ procfs_loadvnode(struct mount *mp, struc panic("procfs_allocvp"); } + mutex_enter(&procfs_hashlock); + LIST_INSERT_HEAD(procfs_hashhead(pfs->pfs_pid), pfs, pfs_hash); + mutex_exit(&procfs_hashlock); + uvm_vnp_setsize(vp, 0); *new_key = &pfs->pfs_key; Index: src/sys/miscfs/procfs/procfs_vnops.c diff -u src/sys/miscfs/procfs/procfs_vnops.c:1.229 src/sys/miscfs/procfs/procfs_vnops.c:1.230 --- src/sys/miscfs/procfs/procfs_vnops.c:1.229 Fri Jun 17 14:30:37 2022 +++ src/sys/miscfs/procfs/procfs_vnops.c Wed Jan 17 10:19:21 2024 @@ -1,4 +1,4 @@ -/* $NetBSD: procfs_vnops.c,v 1.229 2022/06/17 14:30:37 shm Exp $ */ +/* $NetBSD: procfs_vnops.c,v 1.230 2024/01/17 10:19:21 hannken Exp $ */ /*- * Copyright (c) 2006, 2007, 2008, 2020 The NetBSD Foundation, Inc. @@ -105,7 +105,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: procfs_vnops.c,v 1.229 2022/06/17 14:30:37 shm Exp $"); +__KERNEL_RCSID(0, "$NetBSD: procfs_vnops.c,v 1.230 2024/01/17 10:19:21 hannken Exp $"); #include <sys/param.h> #include <sys/atomic.h> @@ -437,6 +437,7 @@ procfs_reclaim(void *v) mutex_enter(vp->v_interlock); vp->v_data = NULL; mutex_exit(vp->v_interlock); + procfs_hashrem(pfs); kmem_free(pfs, sizeof(*pfs)); return 0; }