diff --git a/sys/miscfs/procfs/procfs.h b/sys/miscfs/procfs/procfs.h index 6e43cf6a1dd9..80a5b6fa7f7e 100644 --- a/sys/miscfs/procfs/procfs.h +++ b/sys/miscfs/procfs/procfs.h @@ -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 proc *, struct pfsnode *, 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 **); diff --git a/sys/miscfs/procfs/procfs_vfsops.c b/sys/miscfs/procfs/procfs_vfsops.c index 4c0fdb23e75f..78e0f162a474 100644 --- a/sys/miscfs/procfs/procfs_vfsops.c +++ b/sys/miscfs/procfs/procfs_vfsops.c @@ -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 -__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_common"); 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, struct vnode *vp, 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, struct vnode *vp, 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; diff --git a/sys/miscfs/procfs/procfs_vnops.c b/sys/miscfs/procfs/procfs_vnops.c index 326f6b51f9ec..dfacf5bb781c 100644 --- a/sys/miscfs/procfs/procfs_vnops.c +++ b/sys/miscfs/procfs/procfs_vnops.c @@ -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 -__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 #include @@ -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; }