CVS commit: [netbsd-9] src/sys/kern
Module Name:src Committed By: martin Date: Tue Mar 7 20:01:07 UTC 2023 Modified Files: src/sys/kern [netbsd-9]: vfs_syscalls.c Log Message: Pull up following revision(s) (requested by riastradh in ticket #1610): sys/kern/vfs_syscalls.c: revision 1.557 open(2): Don't map ERESTART to EINTR. If a file or device's open function returns ERESTART, respect that -- restart the syscall; don't pretend a signal has been delivered when it was not. If an SA_RESTART signal was delivered, POSIX does not allow it to fail with EINTR: SA_RESTART This flag affects the behavior of interruptible functions; that is, those specified to fail with errno set to [EINTR]. If set, and a function specified as interruptible is interrupted by this signal, the function shall restart and shall not fail with [EINTR] unless otherwise specified. If an interruptible function which uses a timeout is restarted, the duration of the timeout following the restart is set to an unspecified value that does not exceed the original timeout value. If the flag is not set, interruptible functions interrupted by this signal shall fail with errno set to [EINTR]. https://pubs.opengroup.org/onlinepubs/9699919799/functions/sigaction.html Nothing in the POSIX definition of open specifies otherwise. In 1990, Kirk McKusick added these lines with a mysterious commit message: Author: Kirk McKusick Date: Tue Apr 10 19:36:33 1990 -0800 eliminate longjmp from the kernel (for karels) diff --git a/sys/kern/vfs_syscalls.c b/sys/kern/vfs_syscalls.c index 7bc7b39bbf..d572d3a32d 100644 --- a/sys/kern/vfs_syscalls.c +++ b/sys/kern/vfs_syscalls.c @@ -14,7 +14,7 @@ * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. * - * @(#)vfs_syscalls.c 7.42 (Berkeley) 3/26/90 + * @(#)vfs_syscalls.c 7.43 (Berkeley) 4/10/90 */ #include "param.h" @@ -530,8 +530,10 @@ copen(scp, fmode, cmode, ndp, resultfd) if (error = vn_open(ndp, fmode, (cmode & 0) &~ S_ISVTX)) { crfree(fp->f_cred); fp->f_count--; - if (error == -1)/* XXX from fdopen */ - return (0); /* XXX from fdopen */ + if (error == EJUSTRETURN) /* XXX from fdopen */ + return (0); /* XXX from fdopen */ + if (error == ERESTART) + error = EINTR; scp->sc_ofile[indx] = NULL; return (error); } (found via this git import of the CSRG history: https://github.com/robohack/ucb-csrg-bsd/commit/cce2869b7ae5d360921eb411005b328a29c4a3fe This change appears to have served two related purposes: 1. The fdopen function (the erstwhile open routine for /dev/fd/N) used to return -1 as a hack to mean it had just duplicated the fd; it was recently changed by Mike Karels, in kern_descrip.c 7.9, to return EJUSTRETURN, now defined to be -2, presumably to avoid a conflict with ERESTART, defined to be -1. So this change finished part of the change by Mike Karels to use a different magic return code from fdopen. Of course, today we use still another disgusting hack, EDUPFD, for the same purpose, so none of this is relevant any more. 2. Prior to April 1990, the kernel handled signals during tsleep(9) by longjmping out to the system call entry point or similar. In April 1990, Mike Karels worked to convert all of that into explicit unwind logic by passing through EINTR or ERESTART as appropriate, instead of setjmp at each entry point. However, it's not clear to me why this setjmp/longjmp and fdopen/-1/EJUSTRETURN renovation justifies unconditional logic to map ERESTART to EINTR in open(2). I suspect it was a mistake. In 2013, the corresponding logic to map ERESTART to EINTR in open(2) was removed from FreeBSD: r246472 | kib | 2013-02-07 14:53:33 + (Thu, 07 Feb 2013) | 11 lines Stop translating the ERESTART error from the open(2) into EINTR. Posix requires that open(2) is restartable for SA_RESTART. For non-posix objects, in particular, devfs nodes, still disable automatic restart of the opens. The open call to a driver could have significant side effects for the hardware. Noted and reviewed by: jilles Discussed with: bde MFC after: 2 weeks Index: vfs_syscalls.c === --- vfs_syscalls.c (revision 246471) +++ vfs_syscalls.c (revision 246472) @@ -1106,8 +1106,6 @@ goto success; } - if (error == ERESTART) - error = EINTR; goto bad; } td->td_dupfd = 0;
CVS commit: [netbsd-9] src/sys/kern
Module Name:src Committed By: martin Date: Tue Mar 7 20:01:07 UTC 2023 Modified Files: src/sys/kern [netbsd-9]: vfs_syscalls.c Log Message: Pull up following revision(s) (requested by riastradh in ticket #1610): sys/kern/vfs_syscalls.c: revision 1.557 open(2): Don't map ERESTART to EINTR. If a file or device's open function returns ERESTART, respect that -- restart the syscall; don't pretend a signal has been delivered when it was not. If an SA_RESTART signal was delivered, POSIX does not allow it to fail with EINTR: SA_RESTART This flag affects the behavior of interruptible functions; that is, those specified to fail with errno set to [EINTR]. If set, and a function specified as interruptible is interrupted by this signal, the function shall restart and shall not fail with [EINTR] unless otherwise specified. If an interruptible function which uses a timeout is restarted, the duration of the timeout following the restart is set to an unspecified value that does not exceed the original timeout value. If the flag is not set, interruptible functions interrupted by this signal shall fail with errno set to [EINTR]. https://pubs.opengroup.org/onlinepubs/9699919799/functions/sigaction.html Nothing in the POSIX definition of open specifies otherwise. In 1990, Kirk McKusick added these lines with a mysterious commit message: Author: Kirk McKusick Date: Tue Apr 10 19:36:33 1990 -0800 eliminate longjmp from the kernel (for karels) diff --git a/sys/kern/vfs_syscalls.c b/sys/kern/vfs_syscalls.c index 7bc7b39bbf..d572d3a32d 100644 --- a/sys/kern/vfs_syscalls.c +++ b/sys/kern/vfs_syscalls.c @@ -14,7 +14,7 @@ * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. * - * @(#)vfs_syscalls.c 7.42 (Berkeley) 3/26/90 + * @(#)vfs_syscalls.c 7.43 (Berkeley) 4/10/90 */ #include "param.h" @@ -530,8 +530,10 @@ copen(scp, fmode, cmode, ndp, resultfd) if (error = vn_open(ndp, fmode, (cmode & 0) &~ S_ISVTX)) { crfree(fp->f_cred); fp->f_count--; - if (error == -1)/* XXX from fdopen */ - return (0); /* XXX from fdopen */ + if (error == EJUSTRETURN) /* XXX from fdopen */ + return (0); /* XXX from fdopen */ + if (error == ERESTART) + error = EINTR; scp->sc_ofile[indx] = NULL; return (error); } (found via this git import of the CSRG history: https://github.com/robohack/ucb-csrg-bsd/commit/cce2869b7ae5d360921eb411005b328a29c4a3fe This change appears to have served two related purposes: 1. The fdopen function (the erstwhile open routine for /dev/fd/N) used to return -1 as a hack to mean it had just duplicated the fd; it was recently changed by Mike Karels, in kern_descrip.c 7.9, to return EJUSTRETURN, now defined to be -2, presumably to avoid a conflict with ERESTART, defined to be -1. So this change finished part of the change by Mike Karels to use a different magic return code from fdopen. Of course, today we use still another disgusting hack, EDUPFD, for the same purpose, so none of this is relevant any more. 2. Prior to April 1990, the kernel handled signals during tsleep(9) by longjmping out to the system call entry point or similar. In April 1990, Mike Karels worked to convert all of that into explicit unwind logic by passing through EINTR or ERESTART as appropriate, instead of setjmp at each entry point. However, it's not clear to me why this setjmp/longjmp and fdopen/-1/EJUSTRETURN renovation justifies unconditional logic to map ERESTART to EINTR in open(2). I suspect it was a mistake. In 2013, the corresponding logic to map ERESTART to EINTR in open(2) was removed from FreeBSD: r246472 | kib | 2013-02-07 14:53:33 + (Thu, 07 Feb 2013) | 11 lines Stop translating the ERESTART error from the open(2) into EINTR. Posix requires that open(2) is restartable for SA_RESTART. For non-posix objects, in particular, devfs nodes, still disable automatic restart of the opens. The open call to a driver could have significant side effects for the hardware. Noted and reviewed by: jilles Discussed with: bde MFC after: 2 weeks Index: vfs_syscalls.c === --- vfs_syscalls.c (revision 246471) +++ vfs_syscalls.c (revision 246472) @@ -1106,8 +1106,6 @@ goto success; } - if (error == ERESTART) - error = EINTR; goto bad; } td->td_dupfd = 0;
CVS commit: [netbsd-9] src/sys/kern
Module Name:src Committed By: martin Date: Tue Feb 14 16:19:00 UTC 2023 Modified Files: src/sys/kern [netbsd-9]: subr_devsw.c Log Message: Pull up following revision(s) (requested by buhrow in ticket #1595): sys/kern/subr_devsw.c: revision 1.50 When a device driver calls devsw_attach() it has the option of attaching a block device structure and a character device structure, or, just the character device structure. With the existing code, if a driver elects not to attach a block device structure and if it asks for a major number to be dynamically assigned to its character interface, that driver will not be able to detach and reattach its character driver interface. This is a very long standing bug which didn't come to light until we began using loadable kernel modules more heavily. this patch fixes this problem. With this patch in place, drivers that implement only a character device interface may detach and reattach that character interface as often as they need to. Fixes PR kern/57229 To generate a diff of this commit: cvs rdiff -u -r1.38 -r1.38.8.1 src/sys/kern/subr_devsw.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
CVS commit: [netbsd-9] src/sys/kern
Module Name:src Committed By: martin Date: Tue Feb 14 16:19:00 UTC 2023 Modified Files: src/sys/kern [netbsd-9]: subr_devsw.c Log Message: Pull up following revision(s) (requested by buhrow in ticket #1595): sys/kern/subr_devsw.c: revision 1.50 When a device driver calls devsw_attach() it has the option of attaching a block device structure and a character device structure, or, just the character device structure. With the existing code, if a driver elects not to attach a block device structure and if it asks for a major number to be dynamically assigned to its character interface, that driver will not be able to detach and reattach its character driver interface. This is a very long standing bug which didn't come to light until we began using loadable kernel modules more heavily. this patch fixes this problem. With this patch in place, drivers that implement only a character device interface may detach and reattach that character interface as often as they need to. Fixes PR kern/57229 To generate a diff of this commit: cvs rdiff -u -r1.38 -r1.38.8.1 src/sys/kern/subr_devsw.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/kern/subr_devsw.c diff -u src/sys/kern/subr_devsw.c:1.38 src/sys/kern/subr_devsw.c:1.38.8.1 --- src/sys/kern/subr_devsw.c:1.38 Tue Nov 7 18:35:57 2017 +++ src/sys/kern/subr_devsw.c Tue Feb 14 16:19:00 2023 @@ -1,4 +1,4 @@ -/* $NetBSD: subr_devsw.c,v 1.38 2017/11/07 18:35:57 christos Exp $ */ +/* $NetBSD: subr_devsw.c,v 1.38.8.1 2023/02/14 16:19:00 martin Exp $ */ /*- * Copyright (c) 2001, 2002, 2007, 2008 The NetBSD Foundation, Inc. @@ -69,7 +69,7 @@ */ #include -__KERNEL_RCSID(0, "$NetBSD: subr_devsw.c,v 1.38 2017/11/07 18:35:57 christos Exp $"); +__KERNEL_RCSID(0, "$NetBSD: subr_devsw.c,v 1.38.8.1 2023/02/14 16:19:00 martin Exp $"); #ifdef _KERNEL_OPT #include "opt_dtrace.h" @@ -139,7 +139,7 @@ devsw_attach(const char *devname, if (conv->d_name == NULL || strcmp(devname, conv->d_name) != 0) continue; - if (*bmajor < 0) + if ((bdev != NULL) && (*bmajor < 0)) *bmajor = conv->d_bmajor; if (*cmajor < 0) *cmajor = conv->d_cmajor;
CVS commit: [netbsd-9] src/sys/kern
Module Name:src Committed By: martin Date: Sat Sep 10 08:19:35 UTC 2022 Modified Files: src/sys/kern [netbsd-9]: kern_core.c Log Message: Pull up following revision(s) (requested by mrg in ticket #1517): sys/kern/kern_core.c: revision 1.37 avoid a GCC warning (happens on -current, -9, and -8.) To generate a diff of this commit: cvs rdiff -u -r1.24.22.2 -r1.24.22.3 src/sys/kern/kern_core.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/kern/kern_core.c diff -u src/sys/kern/kern_core.c:1.24.22.2 src/sys/kern/kern_core.c:1.24.22.3 --- src/sys/kern/kern_core.c:1.24.22.2 Fri Sep 9 18:20:51 2022 +++ src/sys/kern/kern_core.c Sat Sep 10 08:19:34 2022 @@ -1,4 +1,4 @@ -/* $NetBSD: kern_core.c,v 1.24.22.2 2022/09/09 18:20:51 martin Exp $ */ +/* $NetBSD: kern_core.c,v 1.24.22.3 2022/09/10 08:19:34 martin Exp $ */ /* * Copyright (c) 1982, 1986, 1989, 1991, 1993 @@ -37,7 +37,7 @@ */ #include -__KERNEL_RCSID(0, "$NetBSD: kern_core.c,v 1.24.22.2 2022/09/09 18:20:51 martin Exp $"); +__KERNEL_RCSID(0, "$NetBSD: kern_core.c,v 1.24.22.3 2022/09/10 08:19:34 martin Exp $"); #include #include @@ -104,7 +104,7 @@ coredump(struct lwp *l, const char *patt struct coredump_iostate io; struct plimit *lim; int error, error1; - char *name, *lastslash; + char *name, *lastslash = NULL /* XXXgcc */; name = PNBUF_GET();
CVS commit: [netbsd-9] src/sys/kern
Module Name:src Committed By: martin Date: Sat Sep 10 08:19:35 UTC 2022 Modified Files: src/sys/kern [netbsd-9]: kern_core.c Log Message: Pull up following revision(s) (requested by mrg in ticket #1517): sys/kern/kern_core.c: revision 1.37 avoid a GCC warning (happens on -current, -9, and -8.) To generate a diff of this commit: cvs rdiff -u -r1.24.22.2 -r1.24.22.3 src/sys/kern/kern_core.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
CVS commit: [netbsd-9] src/sys/kern
Module Name:src Committed By: martin Date: Fri Sep 9 18:20:51 UTC 2022 Modified Files: src/sys/kern [netbsd-9]: kern_core.c Log Message: Pull up following revision(s) (requested by christos in ticket #1516): sys/kern/kern_core.c: revision 1.36 Don't forget to free the cred we just held. Thanks to Chris J-D (chris at accessvector dot net) While here, de-duplicate the mutex exit sequence. To generate a diff of this commit: cvs rdiff -u -r1.24.22.1 -r1.24.22.2 src/sys/kern/kern_core.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
CVS commit: [netbsd-9] src/sys/kern
Module Name:src Committed By: martin Date: Fri Sep 9 18:20:51 UTC 2022 Modified Files: src/sys/kern [netbsd-9]: kern_core.c Log Message: Pull up following revision(s) (requested by christos in ticket #1516): sys/kern/kern_core.c: revision 1.36 Don't forget to free the cred we just held. Thanks to Chris J-D (chris at accessvector dot net) While here, de-duplicate the mutex exit sequence. To generate a diff of this commit: cvs rdiff -u -r1.24.22.1 -r1.24.22.2 src/sys/kern/kern_core.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/kern/kern_core.c diff -u src/sys/kern/kern_core.c:1.24.22.1 src/sys/kern/kern_core.c:1.24.22.2 --- src/sys/kern/kern_core.c:1.24.22.1 Mon Nov 11 17:11:07 2019 +++ src/sys/kern/kern_core.c Fri Sep 9 18:20:51 2022 @@ -1,4 +1,4 @@ -/* $NetBSD: kern_core.c,v 1.24.22.1 2019/11/11 17:11:07 martin Exp $ */ +/* $NetBSD: kern_core.c,v 1.24.22.2 2022/09/09 18:20:51 martin Exp $ */ /* * Copyright (c) 1982, 1986, 1989, 1991, 1993 @@ -37,7 +37,7 @@ */ #include -__KERNEL_RCSID(0, "$NetBSD: kern_core.c,v 1.24.22.1 2019/11/11 17:11:07 martin Exp $"); +__KERNEL_RCSID(0, "$NetBSD: kern_core.c,v 1.24.22.2 2022/09/09 18:20:51 martin Exp $"); #include #include @@ -97,7 +97,7 @@ coredump(struct lwp *l, const char *patt struct vnode *vp; struct proc *p; struct vmspace *vm; - kauth_cred_t cred; + kauth_cred_t cred = NULL; struct pathbuf *pb; struct nameidata nd; struct vattr vattr; @@ -122,9 +122,7 @@ coredump(struct lwp *l, const char *patt if (USPACE + ctob(vm->vm_dsize + vm->vm_ssize) >= p->p_rlimit[RLIMIT_CORE].rlim_cur) { error = EFBIG; /* better error code? */ - mutex_exit(p->p_lock); - mutex_exit(proc_lock); - goto done; + goto release; } /* @@ -141,9 +139,7 @@ coredump(struct lwp *l, const char *patt if (p->p_flag & PK_SUGID) { if (!security_setidcore_dump) { error = EPERM; - mutex_exit(p->p_lock); - mutex_exit(proc_lock); - goto done; + goto release; } pattern = security_setidcore_path; } @@ -157,11 +153,8 @@ coredump(struct lwp *l, const char *patt error = coredump_buildname(p, name, pattern, MAXPATHLEN); mutex_exit(>pl_lock); - if (error) { - mutex_exit(p->p_lock); - mutex_exit(proc_lock); - goto done; - } + if (error) + goto release; /* * On a simple filename, see if the filesystem allow us to write @@ -175,6 +168,7 @@ coredump(struct lwp *l, const char *patt error = EPERM; } +release: mutex_exit(p->p_lock); mutex_exit(proc_lock); if (error) @@ -262,6 +256,8 @@ coredump(struct lwp *l, const char *patt if (error == 0) error = error1; done: + if (cred != NULL) + kauth_cred_free(cred); if (name != NULL) PNBUF_PUT(name); return error;
CVS commit: [netbsd-9] src/sys/kern
Module Name:src Committed By: martin Date: Wed Aug 17 16:43:01 UTC 2022 Modified Files: src/sys/kern [netbsd-9]: uipc_sem.c Log Message: Pull up following revision(s) (requested by chs in ticket #1501): sys/kern/uipc_sem.c: revision 1.60 when updating the per-uid "semcnt", decrement the counter for the uid that created the ksem, not the uid of the process freeing the ksem. fixes PR 55509. To generate a diff of this commit: cvs rdiff -u -r1.55.4.2 -r1.55.4.3 src/sys/kern/uipc_sem.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
CVS commit: [netbsd-9] src/sys/kern
Module Name:src Committed By: martin Date: Wed Aug 17 16:43:01 UTC 2022 Modified Files: src/sys/kern [netbsd-9]: uipc_sem.c Log Message: Pull up following revision(s) (requested by chs in ticket #1501): sys/kern/uipc_sem.c: revision 1.60 when updating the per-uid "semcnt", decrement the counter for the uid that created the ksem, not the uid of the process freeing the ksem. fixes PR 55509. To generate a diff of this commit: cvs rdiff -u -r1.55.4.2 -r1.55.4.3 src/sys/kern/uipc_sem.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/kern/uipc_sem.c diff -u src/sys/kern/uipc_sem.c:1.55.4.2 src/sys/kern/uipc_sem.c:1.55.4.3 --- src/sys/kern/uipc_sem.c:1.55.4.2 Tue May 5 20:12:37 2020 +++ src/sys/kern/uipc_sem.c Wed Aug 17 16:43:01 2022 @@ -1,4 +1,4 @@ -/* $NetBSD: uipc_sem.c,v 1.55.4.2 2020/05/05 20:12:37 martin Exp $ */ +/* $NetBSD: uipc_sem.c,v 1.55.4.3 2022/08/17 16:43:01 martin Exp $ */ /*- * Copyright (c) 2011, 2019 The NetBSD Foundation, Inc. @@ -60,7 +60,7 @@ */ #include -__KERNEL_RCSID(0, "$NetBSD: uipc_sem.c,v 1.55.4.2 2020/05/05 20:12:37 martin Exp $"); +__KERNEL_RCSID(0, "$NetBSD: uipc_sem.c,v 1.55.4.3 2022/08/17 16:43:01 martin Exp $"); #include #include @@ -470,8 +470,6 @@ ksem_create(lwp_t *l, const char *name, len = 0; } - chgsemcnt(kauth_cred_getuid(l->l_cred), 1); - ks = kmem_zalloc(sizeof(ksem_t), KM_SLEEP); mutex_init(>ks_lock, MUTEX_DEFAULT, IPL_NONE); cv_init(>ks_cv, "psem"); @@ -484,8 +482,9 @@ ksem_create(lwp_t *l, const char *name, uc = l->l_cred; ks->ks_uid = kauth_cred_geteuid(uc); ks->ks_gid = kauth_cred_getegid(uc); - + chgsemcnt(ks->ks_uid, 1); atomic_inc_uint(_total); + *ksret = ks; return 0; } @@ -496,6 +495,9 @@ ksem_free(ksem_t *ks) KASSERT(!cv_has_waiters(>ks_cv)); + chgsemcnt(ks->ks_uid, -1); + atomic_dec_uint(_total); + if (ks->ks_pshared_id) { KASSERT(ks->ks_pshared_proc == NULL); ksem_remove_pshared(ks); @@ -507,9 +509,6 @@ ksem_free(ksem_t *ks) mutex_destroy(>ks_lock); cv_destroy(>ks_cv); kmem_free(ks, sizeof(ksem_t)); - - atomic_dec_uint(_total); - chgsemcnt(kauth_cred_getuid(curproc->p_cred), -1); } #define KSEM_ID_IS_PSHARED(id) \
CVS commit: [netbsd-9] src/sys/kern
Module Name:src Committed By: martin Date: Sun Jul 17 10:34:10 UTC 2022 Modified Files: src/sys/kern [netbsd-9]: subr_pool.c Log Message: Pull up following revision(s) (requested by simonb in ticket #1479): sys/kern/subr_pool.c: revision 1.285 Use 64-bit math to calculate pool sizes. Fixes overflow errors for pools larger than 4GB and gives the correct output for kernel pool pages in "vmstat -s" output. To generate a diff of this commit: cvs rdiff -u -r1.252.2.3 -r1.252.2.4 src/sys/kern/subr_pool.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/kern/subr_pool.c diff -u src/sys/kern/subr_pool.c:1.252.2.3 src/sys/kern/subr_pool.c:1.252.2.4 --- src/sys/kern/subr_pool.c:1.252.2.3 Sun Mar 8 11:04:43 2020 +++ src/sys/kern/subr_pool.c Sun Jul 17 10:34:10 2022 @@ -1,4 +1,4 @@ -/* $NetBSD: subr_pool.c,v 1.252.2.3 2020/03/08 11:04:43 martin Exp $ */ +/* $NetBSD: subr_pool.c,v 1.252.2.4 2022/07/17 10:34:10 martin Exp $ */ /* * Copyright (c) 1997, 1999, 2000, 2002, 2007, 2008, 2010, 2014, 2015, 2018 @@ -33,7 +33,7 @@ */ #include -__KERNEL_RCSID(0, "$NetBSD: subr_pool.c,v 1.252.2.3 2020/03/08 11:04:43 martin Exp $"); +__KERNEL_RCSID(0, "$NetBSD: subr_pool.c,v 1.252.2.4 2022/07/17 10:34:10 martin Exp $"); #ifdef _KERNEL_OPT #include "opt_ddb.h" @@ -1678,10 +1678,11 @@ pool_totalpages_locked(void) uint64_t total = 0; TAILQ_FOREACH(pp, _head, pr_poollist) { - uint64_t bytes = pp->pr_npages * pp->pr_alloc->pa_pagesz; + uint64_t bytes = + (uint64_t)pp->pr_npages * pp->pr_alloc->pa_pagesz; if ((pp->pr_roflags & PR_RECURSIVE) != 0) - bytes -= (pp->pr_nout * pp->pr_size); + bytes -= ((uint64_t)pp->pr_nout * pp->pr_size); total += bytes; }
CVS commit: [netbsd-9] src/sys/kern
Module Name:src Committed By: martin Date: Sun Jul 17 10:34:10 UTC 2022 Modified Files: src/sys/kern [netbsd-9]: subr_pool.c Log Message: Pull up following revision(s) (requested by simonb in ticket #1479): sys/kern/subr_pool.c: revision 1.285 Use 64-bit math to calculate pool sizes. Fixes overflow errors for pools larger than 4GB and gives the correct output for kernel pool pages in "vmstat -s" output. To generate a diff of this commit: cvs rdiff -u -r1.252.2.3 -r1.252.2.4 src/sys/kern/subr_pool.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
CVS commit: [netbsd-9] src/sys/kern
Module Name:src Committed By: martin Date: Fri Oct 8 14:58:08 UTC 2021 Modified Files: src/sys/kern [netbsd-9]: sys_pipe.c Log Message: Pull up following revision(s) (requested by hannken in ticket #1357): sys/kern/sys_pipe.c: revision 1.157 Fix a deadlock where one thread writes to a pipe, has more data and no space in the pipe and waits on "pipe_wcv" while the reader is closing the pipe and waits on "pipe_draincv". Swap the test for "PIPE_EOF" and the "cv_wait_sig()" in "pipe_write()". PR bin/56422 "zgrep -l sometimes hangs" To generate a diff of this commit: cvs rdiff -u -r1.148 -r1.148.2.1 src/sys/kern/sys_pipe.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/kern/sys_pipe.c diff -u src/sys/kern/sys_pipe.c:1.148 src/sys/kern/sys_pipe.c:1.148.2.1 --- src/sys/kern/sys_pipe.c:1.148 Fri Apr 26 17:24:23 2019 +++ src/sys/kern/sys_pipe.c Fri Oct 8 14:58:08 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: sys_pipe.c,v 1.148 2019/04/26 17:24:23 mlelstv Exp $ */ +/* $NetBSD: sys_pipe.c,v 1.148.2.1 2021/10/08 14:58:08 martin Exp $ */ /*- * Copyright (c) 2003, 2007, 2008, 2009 The NetBSD Foundation, Inc. @@ -68,7 +68,7 @@ */ #include -__KERNEL_RCSID(0, "$NetBSD: sys_pipe.c,v 1.148 2019/04/26 17:24:23 mlelstv Exp $"); +__KERNEL_RCSID(0, "$NetBSD: sys_pipe.c,v 1.148.2.1 2021/10/08 14:58:08 martin Exp $"); #include #include @@ -1006,11 +1006,6 @@ pipe_write(file_t *fp, off_t *offset, st break; } - pipeunlock(wpipe); - error = cv_wait_sig(>pipe_wcv, lock); - (void)pipelock(wpipe, false); - if (error != 0) -break; /* * If read side wants to go away, we just issue a signal * to ourselves. @@ -1019,6 +1014,12 @@ pipe_write(file_t *fp, off_t *offset, st error = EPIPE; break; } + + pipeunlock(wpipe); + error = cv_wait_sig(>pipe_wcv, lock); + (void)pipelock(wpipe, false); + if (error != 0) +break; wakeup_state = wpipe->pipe_state; } }
CVS commit: [netbsd-9] src/sys/kern
Module Name:src Committed By: martin Date: Fri Oct 8 14:58:08 UTC 2021 Modified Files: src/sys/kern [netbsd-9]: sys_pipe.c Log Message: Pull up following revision(s) (requested by hannken in ticket #1357): sys/kern/sys_pipe.c: revision 1.157 Fix a deadlock where one thread writes to a pipe, has more data and no space in the pipe and waits on "pipe_wcv" while the reader is closing the pipe and waits on "pipe_draincv". Swap the test for "PIPE_EOF" and the "cv_wait_sig()" in "pipe_write()". PR bin/56422 "zgrep -l sometimes hangs" To generate a diff of this commit: cvs rdiff -u -r1.148 -r1.148.2.1 src/sys/kern/sys_pipe.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
CVS commit: [netbsd-9] src/sys/kern
Module Name:src Committed By: martin Date: Mon Nov 25 17:00:22 UTC 2019 Modified Files: src/sys/kern [netbsd-9]: subr_cprng.c Log Message: Pull up following revision(s) (requested by riastradh in ticket #481): sys/kern/subr_cprng.c: revision 1.33 Use cprng_strong, not cprng_fast, for sysctl kern.arnd. To generate a diff of this commit: cvs rdiff -u -r1.30.2.1 -r1.30.2.2 src/sys/kern/subr_cprng.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/kern/subr_cprng.c diff -u src/sys/kern/subr_cprng.c:1.30.2.1 src/sys/kern/subr_cprng.c:1.30.2.2 --- src/sys/kern/subr_cprng.c:1.30.2.1 Tue Sep 3 07:48:00 2019 +++ src/sys/kern/subr_cprng.c Mon Nov 25 17:00:22 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: subr_cprng.c,v 1.30.2.1 2019/09/03 07:48:00 martin Exp $ */ +/* $NetBSD: subr_cprng.c,v 1.30.2.2 2019/11/25 17:00:22 martin Exp $ */ /*- * Copyright (c) 2011-2013 The NetBSD Foundation, Inc. @@ -30,7 +30,7 @@ */ #include -__KERNEL_RCSID(0, "$NetBSD: subr_cprng.c,v 1.30.2.1 2019/09/03 07:48:00 martin Exp $"); +__KERNEL_RCSID(0, "$NetBSD: subr_cprng.c,v 1.30.2.2 2019/11/25 17:00:22 martin Exp $"); #include #include @@ -539,6 +539,7 @@ cprng_strong_rndsink_callback(void *cont mutex_exit(>cs_lock); } +static ONCE_DECL(sysctl_prng_once); static cprng_strong_t *sysctl_prng; static int @@ -558,10 +559,9 @@ makeprng(void) static int sysctl_kern_urnd(SYSCTLFN_ARGS) { - static ONCE_DECL(control); int v, rv; - RUN_ONCE(, makeprng); + RUN_ONCE(_prng_once, makeprng); rv = cprng_strong(sysctl_prng, , sizeof(v), 0); if (rv == sizeof(v)) { struct sysctlnode node = *rnode; @@ -590,6 +590,7 @@ sysctl_kern_arnd(SYSCTLFN_ARGS) int error; void *v; struct sysctlnode node = *rnode; + size_t n __diagused; switch (*oldlenp) { case 0: @@ -598,8 +599,10 @@ sysctl_kern_arnd(SYSCTLFN_ARGS) if (*oldlenp > 256) { return E2BIG; } + RUN_ONCE(_prng_once, makeprng); v = kmem_alloc(*oldlenp, KM_SLEEP); - cprng_fast(v, *oldlenp); + n = cprng_strong(sysctl_prng, v, *oldlenp, 0); + KASSERT(n == *oldlenp); node.sysctl_data = v; node.sysctl_size = *oldlenp; error = sysctl_lookup(SYSCTLFN_CALL());
CVS commit: [netbsd-9] src/sys/kern
Module Name:src Committed By: martin Date: Mon Nov 25 17:00:22 UTC 2019 Modified Files: src/sys/kern [netbsd-9]: subr_cprng.c Log Message: Pull up following revision(s) (requested by riastradh in ticket #481): sys/kern/subr_cprng.c: revision 1.33 Use cprng_strong, not cprng_fast, for sysctl kern.arnd. To generate a diff of this commit: cvs rdiff -u -r1.30.2.1 -r1.30.2.2 src/sys/kern/subr_cprng.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
CVS commit: [netbsd-9] src/sys/kern
Module Name:src Committed By: martin Date: Sun Nov 24 08:16:53 UTC 2019 Modified Files: src/sys/kern [netbsd-9]: sys_ptrace_common.c Log Message: Pull up following revision(s) (requested by rin in ticket #465): sys/kern/sys_ptrace_common.c: revision 1.73 Fix regression introduced to ptrace_regs() in rev 1.27: http://cvsweb.netbsd.org/bsdweb.cgi/src/sys/kern/sys_ptrace_common.c#rev1.27 Size of registers should be determined from tracer, NOT tracee. Now, 64-bit tracer can manipulate registers of 32-bit tracee again. gdb for amd64 works for i386 binaries to some extent. XXX pullup to netbsd-9 and -8. To generate a diff of this commit: cvs rdiff -u -r1.58.2.11 -r1.58.2.12 src/sys/kern/sys_ptrace_common.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
CVS commit: [netbsd-9] src/sys/kern
Module Name:src Committed By: martin Date: Sun Nov 24 08:16:53 UTC 2019 Modified Files: src/sys/kern [netbsd-9]: sys_ptrace_common.c Log Message: Pull up following revision(s) (requested by rin in ticket #465): sys/kern/sys_ptrace_common.c: revision 1.73 Fix regression introduced to ptrace_regs() in rev 1.27: http://cvsweb.netbsd.org/bsdweb.cgi/src/sys/kern/sys_ptrace_common.c#rev1.27 Size of registers should be determined from tracer, NOT tracee. Now, 64-bit tracer can manipulate registers of 32-bit tracee again. gdb for amd64 works for i386 binaries to some extent. XXX pullup to netbsd-9 and -8. To generate a diff of this commit: cvs rdiff -u -r1.58.2.11 -r1.58.2.12 src/sys/kern/sys_ptrace_common.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/kern/sys_ptrace_common.c diff -u src/sys/kern/sys_ptrace_common.c:1.58.2.11 src/sys/kern/sys_ptrace_common.c:1.58.2.12 --- src/sys/kern/sys_ptrace_common.c:1.58.2.11 Tue Nov 19 13:22:01 2019 +++ src/sys/kern/sys_ptrace_common.c Sun Nov 24 08:16:52 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: sys_ptrace_common.c,v 1.58.2.11 2019/11/19 13:22:01 martin Exp $ */ +/* $NetBSD: sys_ptrace_common.c,v 1.58.2.12 2019/11/24 08:16:52 martin Exp $ */ /*- * Copyright (c) 2008, 2009 The NetBSD Foundation, Inc. @@ -118,7 +118,7 @@ */ #include -__KERNEL_RCSID(0, "$NetBSD: sys_ptrace_common.c,v 1.58.2.11 2019/11/19 13:22:01 martin Exp $"); +__KERNEL_RCSID(0, "$NetBSD: sys_ptrace_common.c,v 1.58.2.12 2019/11/24 08:16:52 martin Exp $"); #ifdef _KERNEL_OPT #include "opt_ptrace.h" @@ -831,9 +831,12 @@ ptrace_regs(struct lwp *l, struct lwp ** void *addr, size_t data) { int error; - struct proc *t = (*lt)->l_proc; + struct proc *p, *t; struct vmspace *vm; + p = l->l_proc; /* tracer */ + t = (*lt)->l_proc; /* traced */ + if ((error = ptrace_update_lwp(t, lt, data)) != 0) return error; @@ -849,7 +852,7 @@ ptrace_regs(struct lwp *l, struct lwp ** case_PT_SETREGS if (!process_validregs(*lt)) return EINVAL; - size = PROC_REGSZ(t); + size = PROC_REGSZ(p); func = ptm->ptm_doregs; break; #endif @@ -858,7 +861,7 @@ ptrace_regs(struct lwp *l, struct lwp ** case_PT_SETFPREGS if (!process_validfpregs(*lt)) return EINVAL; - size = PROC_FPREGSZ(t); + size = PROC_FPREGSZ(p); func = ptm->ptm_dofpregs; break; #endif @@ -867,7 +870,7 @@ ptrace_regs(struct lwp *l, struct lwp ** case_PT_SETDBREGS if (!process_validdbregs(*lt)) return EINVAL; - size = PROC_DBREGSZ(t); + size = PROC_DBREGSZ(p); func = ptm->ptm_dodbregs; break; #endif
CVS commit: [netbsd-9] src/sys/kern
Module Name:src Committed By: martin Date: Tue Nov 19 13:22:01 UTC 2019 Modified Files: src/sys/kern [netbsd-9]: sys_ptrace_common.c Log Message: Pull up following revision(s) (requested by rin in ticket #455): sys/kern/sys_ptrace_common.c: revision 1.72 Fix pointer arithmetic for 32-bit process on LP64 kernel in process_auxv_offset(). Now, PIOD_READ_AUXV works fine with COMPAT_NETBSD32. XXX pullup to netbsd-9 and netbsd-8 To generate a diff of this commit: cvs rdiff -u -r1.58.2.10 -r1.58.2.11 src/sys/kern/sys_ptrace_common.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
CVS commit: [netbsd-9] src/sys/kern
Module Name:src Committed By: martin Date: Tue Nov 19 13:22:01 UTC 2019 Modified Files: src/sys/kern [netbsd-9]: sys_ptrace_common.c Log Message: Pull up following revision(s) (requested by rin in ticket #455): sys/kern/sys_ptrace_common.c: revision 1.72 Fix pointer arithmetic for 32-bit process on LP64 kernel in process_auxv_offset(). Now, PIOD_READ_AUXV works fine with COMPAT_NETBSD32. XXX pullup to netbsd-9 and netbsd-8 To generate a diff of this commit: cvs rdiff -u -r1.58.2.10 -r1.58.2.11 src/sys/kern/sys_ptrace_common.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/kern/sys_ptrace_common.c diff -u src/sys/kern/sys_ptrace_common.c:1.58.2.10 src/sys/kern/sys_ptrace_common.c:1.58.2.11 --- src/sys/kern/sys_ptrace_common.c:1.58.2.10 Mon Nov 11 17:11:07 2019 +++ src/sys/kern/sys_ptrace_common.c Tue Nov 19 13:22:01 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: sys_ptrace_common.c,v 1.58.2.10 2019/11/11 17:11:07 martin Exp $ */ +/* $NetBSD: sys_ptrace_common.c,v 1.58.2.11 2019/11/19 13:22:01 martin Exp $ */ /*- * Copyright (c) 2008, 2009 The NetBSD Foundation, Inc. @@ -118,7 +118,7 @@ */ #include -__KERNEL_RCSID(0, "$NetBSD: sys_ptrace_common.c,v 1.58.2.10 2019/11/11 17:11:07 martin Exp $"); +__KERNEL_RCSID(0, "$NetBSD: sys_ptrace_common.c,v 1.58.2.11 2019/11/19 13:22:01 martin Exp $"); #ifdef _KERNEL_OPT #include "opt_ptrace.h" @@ -1635,7 +1635,15 @@ process_auxv_offset(struct proc *p, stru if (pss.ps_envstr == NULL) return EIO; - uio->uio_offset += (off_t)(vaddr_t)(pss.ps_envstr + pss.ps_nenvstr + 1); +#ifdef COMPAT_NETBSD32 + if (p->p_flag & PK_32) + uio->uio_offset += (off_t)((vaddr_t)pss.ps_envstr + + sizeof(uint32_t) * (pss.ps_nenvstr + 1)); + else +#endif + uio->uio_offset += (off_t)(vaddr_t)(pss.ps_envstr + + pss.ps_nenvstr + 1); + #ifdef __MACHINE_STACK_GROWS_UP if (uio->uio_offset < off) return EIO;
CVS commit: [netbsd-9] src/sys/kern
Module Name:src Committed By: martin Date: Sun Nov 10 13:24:50 UTC 2019 Modified Files: src/sys/kern [netbsd-9]: sys_sig.c Log Message: Pull up following revision(s) (requested by pgoyette in ticket #412): sys/kern/sys_sig.c: revision 1.49 If we need to handle old-version signals, load the version-specific "compat_16" module. There is no longer a monolithic "compat" module! XXX pullup-9 needed To generate a diff of this commit: cvs rdiff -u -r1.47.4.1 -r1.47.4.2 src/sys/kern/sys_sig.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
CVS commit: [netbsd-9] src/sys/kern
Module Name:src Committed By: martin Date: Sun Nov 10 13:24:50 UTC 2019 Modified Files: src/sys/kern [netbsd-9]: sys_sig.c Log Message: Pull up following revision(s) (requested by pgoyette in ticket #412): sys/kern/sys_sig.c: revision 1.49 If we need to handle old-version signals, load the version-specific "compat_16" module. There is no longer a monolithic "compat" module! XXX pullup-9 needed To generate a diff of this commit: cvs rdiff -u -r1.47.4.1 -r1.47.4.2 src/sys/kern/sys_sig.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/kern/sys_sig.c diff -u src/sys/kern/sys_sig.c:1.47.4.1 src/sys/kern/sys_sig.c:1.47.4.2 --- src/sys/kern/sys_sig.c:1.47.4.1 Mon Oct 21 20:13:09 2019 +++ src/sys/kern/sys_sig.c Sun Nov 10 13:24:50 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: sys_sig.c,v 1.47.4.1 2019/10/21 20:13:09 martin Exp $ */ +/* $NetBSD: sys_sig.c,v 1.47.4.2 2019/11/10 13:24:50 martin Exp $ */ /*- * Copyright (c) 2006, 2007, 2008 The NetBSD Foundation, Inc. @@ -66,7 +66,7 @@ */ #include -__KERNEL_RCSID(0, "$NetBSD: sys_sig.c,v 1.47.4.1 2019/10/21 20:13:09 martin Exp $"); +__KERNEL_RCSID(0, "$NetBSD: sys_sig.c,v 1.47.4.2 2019/11/10 13:24:50 martin Exp $"); #include "opt_dtrace.h" @@ -414,7 +414,7 @@ sigaction1(struct lwp *l, int signum, co else if ((p->p_lflag & PL_SIGCOMPAT) == 0) { kernconfig_lock(); if (sendsig_sigcontext_vec == NULL) { - (void)module_autoload("compat", + (void)module_autoload("compat_16", MODULE_CLASS_ANY); } if (sendsig_sigcontext_vec != NULL) {
CVS commit: [netbsd-9] src/sys/kern
Module Name:src Committed By: martin Date: Tue Oct 15 19:28:17 UTC 2019 Modified Files: src/sys/kern [netbsd-9]: kern_sig.c Log Message: Pull up following revision(s) (requested by kamil in ticket #330): sys/kern/kern_sig.c: revision 1.372 Avoid double lwp_exit() in eventswitch() For the PTRACE_LWP_EXIT event, the eventswitch() call is triggered from lwp_exit(). In the case of setting the program status to PS_WEXIT, do not try to demise in place, by calling lwp_exit() as it causes panic. In this scenario bail out from the function and resume the lwp_exit() procedure. To generate a diff of this commit: cvs rdiff -u -r1.364.2.6 -r1.364.2.7 src/sys/kern/kern_sig.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/kern/kern_sig.c diff -u src/sys/kern/kern_sig.c:1.364.2.6 src/sys/kern/kern_sig.c:1.364.2.7 --- src/sys/kern/kern_sig.c:1.364.2.6 Tue Oct 15 19:27:04 2019 +++ src/sys/kern/kern_sig.c Tue Oct 15 19:28:16 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: kern_sig.c,v 1.364.2.6 2019/10/15 19:27:04 martin Exp $ */ +/* $NetBSD: kern_sig.c,v 1.364.2.7 2019/10/15 19:28:16 martin Exp $ */ /*- * Copyright (c) 2006, 2007, 2008 The NetBSD Foundation, Inc. @@ -70,7 +70,7 @@ */ #include -__KERNEL_RCSID(0, "$NetBSD: kern_sig.c,v 1.364.2.6 2019/10/15 19:27:04 martin Exp $"); +__KERNEL_RCSID(0, "$NetBSD: kern_sig.c,v 1.364.2.7 2019/10/15 19:28:16 martin Exp $"); #include "opt_ptrace.h" #include "opt_dtrace.h" @@ -1612,6 +1612,12 @@ repeat: if (__predict_false(ISSET(p->p_sflag, PS_WEXIT))) { mutex_exit(p->p_lock); mutex_exit(proc_lock); + + if (pe_report_event == PTRACE_LWP_EXIT) { + /* Avoid double lwp_exit() and panic. */ + return; + } + lwp_exit(l); panic("eventswitch"); /* NOTREACHED */
CVS commit: [netbsd-9] src/sys/kern
Module Name:src Committed By: martin Date: Tue Oct 15 19:28:17 UTC 2019 Modified Files: src/sys/kern [netbsd-9]: kern_sig.c Log Message: Pull up following revision(s) (requested by kamil in ticket #330): sys/kern/kern_sig.c: revision 1.372 Avoid double lwp_exit() in eventswitch() For the PTRACE_LWP_EXIT event, the eventswitch() call is triggered from lwp_exit(). In the case of setting the program status to PS_WEXIT, do not try to demise in place, by calling lwp_exit() as it causes panic. In this scenario bail out from the function and resume the lwp_exit() procedure. To generate a diff of this commit: cvs rdiff -u -r1.364.2.6 -r1.364.2.7 src/sys/kern/kern_sig.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
CVS commit: [netbsd-9] src/sys/kern
Module Name:src Committed By: martin Date: Tue Oct 15 19:27:04 UTC 2019 Modified Files: src/sys/kern [netbsd-9]: kern_sig.c Log Message: Pull up following revision(s) (requested by kamil in ticket #329): sys/kern/kern_sig.c: revision 1.371 Fix one the the root causes of unreliability of the ptrace(2)ed threads In case of sigswitchin away in issignal() and continuing the execution on PT_CONTINUE (or equivalent call), there is a time window when another thread could cause the process state to be changed to PS_STOPPING. In the current logic, a thread would receive signal 0 (no-signal) and exit from issignal(), returning to userland and never finishing the process of stopping all LWPs. This causes hangs waitpid() waiting for SIGCHLD and the callout polling for the state of the process in an infinite loop. Instead of prompting for a returned signal from a debugger, repeat the issignal() loop, this will cause checking the PS_STOPPING flag again and sigswitching away in the scenario of stopping the process. To generate a diff of this commit: cvs rdiff -u -r1.364.2.5 -r1.364.2.6 src/sys/kern/kern_sig.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
CVS commit: [netbsd-9] src/sys/kern
Module Name:src Committed By: martin Date: Tue Oct 15 19:27:04 UTC 2019 Modified Files: src/sys/kern [netbsd-9]: kern_sig.c Log Message: Pull up following revision(s) (requested by kamil in ticket #329): sys/kern/kern_sig.c: revision 1.371 Fix one the the root causes of unreliability of the ptrace(2)ed threads In case of sigswitchin away in issignal() and continuing the execution on PT_CONTINUE (or equivalent call), there is a time window when another thread could cause the process state to be changed to PS_STOPPING. In the current logic, a thread would receive signal 0 (no-signal) and exit from issignal(), returning to userland and never finishing the process of stopping all LWPs. This causes hangs waitpid() waiting for SIGCHLD and the callout polling for the state of the process in an infinite loop. Instead of prompting for a returned signal from a debugger, repeat the issignal() loop, this will cause checking the PS_STOPPING flag again and sigswitching away in the scenario of stopping the process. To generate a diff of this commit: cvs rdiff -u -r1.364.2.5 -r1.364.2.6 src/sys/kern/kern_sig.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/kern/kern_sig.c diff -u src/sys/kern/kern_sig.c:1.364.2.5 src/sys/kern/kern_sig.c:1.364.2.6 --- src/sys/kern/kern_sig.c:1.364.2.5 Tue Oct 15 19:25:11 2019 +++ src/sys/kern/kern_sig.c Tue Oct 15 19:27:04 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: kern_sig.c,v 1.364.2.5 2019/10/15 19:25:11 martin Exp $ */ +/* $NetBSD: kern_sig.c,v 1.364.2.6 2019/10/15 19:27:04 martin Exp $ */ /*- * Copyright (c) 2006, 2007, 2008 The NetBSD Foundation, Inc. @@ -70,7 +70,7 @@ */ #include -__KERNEL_RCSID(0, "$NetBSD: kern_sig.c,v 1.364.2.5 2019/10/15 19:25:11 martin Exp $"); +__KERNEL_RCSID(0, "$NetBSD: kern_sig.c,v 1.364.2.6 2019/10/15 19:27:04 martin Exp $"); #include "opt_ptrace.h" #include "opt_dtrace.h" @@ -1863,7 +1863,7 @@ issignal(struct lwp *l) if (p->p_stat == SSTOP || (p->p_sflag & PS_STOPPING) != 0) { sigswitch_unlock_and_switch_away(l); mutex_enter(p->p_lock); - signo = sigchecktrace(); + continue; } else if (p->p_stat == SACTIVE) signo = sigchecktrace(); else
CVS commit: [netbsd-9] src/sys/kern
Module Name:src Committed By: martin Date: Tue Oct 15 19:25:12 UTC 2019 Modified Files: src/sys/kern [netbsd-9]: kern_sig.c Log Message: Pull up following revision(s) (requested by kamil in ticket #327): sys/kern/kern_sig.c: revision 1.370 Add sigswitch_unlock_and_switch_away(), extracted from sigswitch() Use sigswitch_unlock_and_switch_away() whenever there is no need for sigswitch(). To generate a diff of this commit: cvs rdiff -u -r1.364.2.4 -r1.364.2.5 src/sys/kern/kern_sig.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/kern/kern_sig.c diff -u src/sys/kern/kern_sig.c:1.364.2.4 src/sys/kern/kern_sig.c:1.364.2.5 --- src/sys/kern/kern_sig.c:1.364.2.4 Tue Oct 15 19:23:09 2019 +++ src/sys/kern/kern_sig.c Tue Oct 15 19:25:11 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: kern_sig.c,v 1.364.2.4 2019/10/15 19:23:09 martin Exp $ */ +/* $NetBSD: kern_sig.c,v 1.364.2.5 2019/10/15 19:25:11 martin Exp $ */ /*- * Copyright (c) 2006, 2007, 2008 The NetBSD Foundation, Inc. @@ -70,7 +70,7 @@ */ #include -__KERNEL_RCSID(0, "$NetBSD: kern_sig.c,v 1.364.2.4 2019/10/15 19:23:09 martin Exp $"); +__KERNEL_RCSID(0, "$NetBSD: kern_sig.c,v 1.364.2.5 2019/10/15 19:25:11 martin Exp $"); #include "opt_ptrace.h" #include "opt_dtrace.h" @@ -126,6 +126,7 @@ static int sigpost(struct lwp *, sig_t, static int sigput(sigpend_t *, struct proc *, ksiginfo_t *); static int sigunwait(struct proc *, const ksiginfo_t *); static void sigswitch(int, int, bool); +static void sigswitch_unlock_and_switch_away(struct lwp *); static void sigacts_poolpage_free(struct pool *, void *); static void *sigacts_poolpage_alloc(struct pool *, int); @@ -932,10 +933,11 @@ repeat: * The process is already stopping. */ if ((p->p_sflag & PS_STOPPING) != 0) { - sigswitch(0, p->p_xsig, true); + mutex_exit(proc_lock); + sigswitch_unlock_and_switch_away(l); mutex_enter(proc_lock); mutex_enter(p->p_lock); - goto repeat; /* XXX */ + goto repeat; } mask = >l_sigmask; @@ -1640,10 +1642,11 @@ repeat: * The process is already stopping. */ if ((p->p_sflag & PS_STOPPING) != 0) { - sigswitch(0, p->p_xsig, true); + mutex_exit(proc_lock); + sigswitch_unlock_and_switch_away(l); mutex_enter(proc_lock); mutex_enter(p->p_lock); - goto repeat; /* XXX */ + goto repeat; } KSI_INIT_TRAP(); @@ -1690,7 +1693,6 @@ sigswitch(int ppmask, int signo, bool pr { struct lwp *l = curlwp; struct proc *p = l->l_proc; - int biglocks; KASSERT(mutex_owned(p->p_lock)); KASSERT(l->l_stat == LSONPROC); @@ -1750,10 +1752,26 @@ sigswitch(int ppmask, int signo, bool pr mutex_exit(proc_lock); } - /* - * Unlock and switch away. - */ + sigswitch_unlock_and_switch_away(l); +} + +/* + * Unlock and switch away. + */ +static void +sigswitch_unlock_and_switch_away(struct lwp *l) +{ + struct proc *p; + int biglocks; + + p = l->l_proc; + + KASSERT(mutex_owned(p->p_lock)); KASSERT(!mutex_owned(proc_lock)); + + KASSERT(l->l_stat == LSONPROC); + KASSERT(p->p_nrlwps > 0); + KERNEL_UNLOCK_ALL(l, ); if (p->p_stat == SSTOP || (p->p_sflag & PS_STOPPING) != 0) { p->p_nrlwps--; @@ -1843,7 +1861,7 @@ issignal(struct lwp *l) * we awaken, check for a signal from the debugger. */ if (p->p_stat == SSTOP || (p->p_sflag & PS_STOPPING) != 0) { - sigswitch(PS_NOCLDSTOP, 0, false); + sigswitch_unlock_and_switch_away(l); mutex_enter(p->p_lock); signo = sigchecktrace(); } else if (p->p_stat == SACTIVE) @@ -2525,9 +2543,9 @@ repeat: * The process is already stopping. */ if ((p->p_sflag & PS_STOPPING) != 0) { - sigswitch(0, p->p_xsig, false); + sigswitch_unlock_and_switch_away(l); mutex_enter(p->p_lock); - goto repeat; /* XXX */ + goto repeat; } /* Needed for ktrace */
CVS commit: [netbsd-9] src/sys/kern
Module Name:src Committed By: martin Date: Tue Oct 15 19:25:12 UTC 2019 Modified Files: src/sys/kern [netbsd-9]: kern_sig.c Log Message: Pull up following revision(s) (requested by kamil in ticket #327): sys/kern/kern_sig.c: revision 1.370 Add sigswitch_unlock_and_switch_away(), extracted from sigswitch() Use sigswitch_unlock_and_switch_away() whenever there is no need for sigswitch(). To generate a diff of this commit: cvs rdiff -u -r1.364.2.4 -r1.364.2.5 src/sys/kern/kern_sig.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
CVS commit: [netbsd-9] src/sys/kern
Module Name:src Committed By: martin Date: Tue Oct 15 19:08:46 UTC 2019 Modified Files: src/sys/kern [netbsd-9]: kern_sig.c Log Message: Pull up following revision(s) (requested by kamil in ticket #324): sys/kern/kern_sig.c: revision 1.367 Enhance reliability of ptrace(2) in a debuggee with multiple LWPs Stop competing between threads which one emits event signal quicker and overwriting the signal from another thread. This fixes missed in action signals. NetBSD truss can now report reliably all TRAP_SCE/SCX/etc events without reports of missed ones. his was one of the reasons why debuggee with multiple threads misbehaved under a debugger. This change is v.2 of the previously reverted commit for the same fix. This version contains recovery path that stopps triggering event SIGTRAP for a detached debugger. To generate a diff of this commit: cvs rdiff -u -r1.364.2.2 -r1.364.2.3 src/sys/kern/kern_sig.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
CVS commit: [netbsd-9] src/sys/kern
Module Name:src Committed By: martin Date: Tue Oct 15 19:08:46 UTC 2019 Modified Files: src/sys/kern [netbsd-9]: kern_sig.c Log Message: Pull up following revision(s) (requested by kamil in ticket #324): sys/kern/kern_sig.c: revision 1.367 Enhance reliability of ptrace(2) in a debuggee with multiple LWPs Stop competing between threads which one emits event signal quicker and overwriting the signal from another thread. This fixes missed in action signals. NetBSD truss can now report reliably all TRAP_SCE/SCX/etc events without reports of missed ones. his was one of the reasons why debuggee with multiple threads misbehaved under a debugger. This change is v.2 of the previously reverted commit for the same fix. This version contains recovery path that stopps triggering event SIGTRAP for a detached debugger. To generate a diff of this commit: cvs rdiff -u -r1.364.2.2 -r1.364.2.3 src/sys/kern/kern_sig.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/kern/kern_sig.c diff -u src/sys/kern/kern_sig.c:1.364.2.2 src/sys/kern/kern_sig.c:1.364.2.3 --- src/sys/kern/kern_sig.c:1.364.2.2 Tue Oct 15 19:01:06 2019 +++ src/sys/kern/kern_sig.c Tue Oct 15 19:08:46 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: kern_sig.c,v 1.364.2.2 2019/10/15 19:01:06 martin Exp $ */ +/* $NetBSD: kern_sig.c,v 1.364.2.3 2019/10/15 19:08:46 martin Exp $ */ /*- * Copyright (c) 2006, 2007, 2008 The NetBSD Foundation, Inc. @@ -70,7 +70,7 @@ */ #include -__KERNEL_RCSID(0, "$NetBSD: kern_sig.c,v 1.364.2.2 2019/10/15 19:01:06 martin Exp $"); +__KERNEL_RCSID(0, "$NetBSD: kern_sig.c,v 1.364.2.3 2019/10/15 19:08:46 martin Exp $"); #include "opt_ptrace.h" #include "opt_dtrace.h" @@ -913,6 +913,7 @@ trapsignal(struct lwp *l, ksiginfo_t *ks mutex_enter(proc_lock); mutex_enter(p->p_lock); +repeat: /* * If we are exiting, demise now. * @@ -926,6 +927,16 @@ trapsignal(struct lwp *l, ksiginfo_t *ks /* NOTREACHED */ } + /* + * The process is already stopping. + */ + if ((p->p_sflag & PS_STOPPING) != 0) { + sigswitch(0, p->p_xsig, false); + mutex_enter(proc_lock); + mutex_enter(p->p_lock); + goto repeat; /* XXX */ + } + mask = >l_sigmask; ps = p->p_sigacts; action = SIGACTION_PS(ps, signo).sa_handler; @@ -1589,11 +1600,12 @@ eventswitch(int code, int pe_report_even KASSERT((code == TRAP_CHLD) || (code == TRAP_LWP) || (code == TRAP_EXEC)); +repeat: /* * If we are exiting, demise now. * * This avoids notifying tracer and deadlocking. - */ + */ if (__predict_false(ISSET(p->p_sflag, PS_WEXIT))) { mutex_exit(p->p_lock); mutex_exit(proc_lock); @@ -1603,6 +1615,17 @@ eventswitch(int code, int pe_report_even } /* + * If we are no longer traced, abandon this event signal. + * + * This avoids killing a process after detaching the debugger. + */ + if (__predict_false(!ISSET(p->p_slflag, PSL_TRACED))) { + mutex_exit(p->p_lock); + mutex_exit(proc_lock); + return; + } + + /* * If there's a pending SIGKILL process it immediately. */ if (p->p_xsig == SIGKILL || @@ -1612,6 +1635,16 @@ eventswitch(int code, int pe_report_even return; } + /* + * The process is already stopping. + */ + if ((p->p_sflag & PS_STOPPING) != 0) { + sigswitch(0, p->p_xsig, false); + mutex_enter(proc_lock); + mutex_enter(p->p_lock); + goto repeat; /* XXX */ + } + KSI_INIT_TRAP(); ksi.ksi_lid = l->l_lid; ksi.ksi_signo = signo; @@ -2448,6 +2481,7 @@ proc_stoptrace(int trapno, int sysnum, c mutex_enter(p->p_lock); +repeat: /* * If we are exiting, demise now. * @@ -2469,6 +2503,25 @@ proc_stoptrace(int trapno, int sysnum, c return; } + /* + * If we are no longer traced, abandon this event signal. + * + * This avoids killing a process after detaching the debugger. + */ + if (__predict_false(!ISSET(p->p_slflag, PSL_TRACED))) { + mutex_exit(p->p_lock); + return; + } + + /* + * The process is already stopping. + */ + if ((p->p_sflag & PS_STOPPING) != 0) { + sigswitch(0, p->p_xsig, true); + mutex_enter(p->p_lock); + goto repeat; /* XXX */ + } + /* Needed for ktrace */ ps = p->p_sigacts; action = SIGACTION_PS(ps, signo).sa_handler;
CVS commit: [netbsd-9] src/sys/kern
Module Name:src Committed By: martin Date: Tue Oct 15 19:07:14 UTC 2019 Modified Files: src/sys/kern [netbsd-9]: sys_ptrace_common.c Log Message: Pull up following revision(s) (requested by kamil in ticket #323): sys/kern/sys_ptrace_common.c: revision 1.65 Correct the same expression on both sides of | PR sw-bug/54610 by David Binderman To generate a diff of this commit: cvs rdiff -u -r1.58.2.6 -r1.58.2.7 src/sys/kern/sys_ptrace_common.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
CVS commit: [netbsd-9] src/sys/kern
Module Name:src Committed By: martin Date: Tue Oct 15 19:07:14 UTC 2019 Modified Files: src/sys/kern [netbsd-9]: sys_ptrace_common.c Log Message: Pull up following revision(s) (requested by kamil in ticket #323): sys/kern/sys_ptrace_common.c: revision 1.65 Correct the same expression on both sides of | PR sw-bug/54610 by David Binderman To generate a diff of this commit: cvs rdiff -u -r1.58.2.6 -r1.58.2.7 src/sys/kern/sys_ptrace_common.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/kern/sys_ptrace_common.c diff -u src/sys/kern/sys_ptrace_common.c:1.58.2.6 src/sys/kern/sys_ptrace_common.c:1.58.2.7 --- src/sys/kern/sys_ptrace_common.c:1.58.2.6 Tue Oct 15 19:03:20 2019 +++ src/sys/kern/sys_ptrace_common.c Tue Oct 15 19:07:14 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: sys_ptrace_common.c,v 1.58.2.6 2019/10/15 19:03:20 martin Exp $ */ +/* $NetBSD: sys_ptrace_common.c,v 1.58.2.7 2019/10/15 19:07:14 martin Exp $ */ /*- * Copyright (c) 2008, 2009 The NetBSD Foundation, Inc. @@ -118,7 +118,7 @@ */ #include -__KERNEL_RCSID(0, "$NetBSD: sys_ptrace_common.c,v 1.58.2.6 2019/10/15 19:03:20 martin Exp $"); +__KERNEL_RCSID(0, "$NetBSD: sys_ptrace_common.c,v 1.58.2.7 2019/10/15 19:07:14 martin Exp $"); #ifdef _KERNEL_OPT #include "opt_ptrace.h" @@ -1265,7 +1265,7 @@ do_ptrace(struct ptrace_methods *ptm, st break; } } else { - if (lt->l_flag & (LW_WSUSPEND | LW_WSUSPEND)) { + if (lt->l_flag & (LW_WSUSPEND | LW_DBGSUSPEND)) { error = EDEADLK; break; }
CVS commit: [netbsd-9] src/sys/kern
Module Name:src Committed By: martin Date: Tue Oct 15 19:05:38 UTC 2019 Modified Files: src/sys/kern [netbsd-9]: sysv_msg.c Log Message: Pull up following revision(s) (requested by kamil in ticket #322): sys/kern/sysv_msg.c: revision 1.76 Avoid -LONG_MIN msgtyp in msgrcv(2) and treat it as LONG_MAX This logic (found in Linux) avoids undefined behavior. To generate a diff of this commit: cvs rdiff -u -r1.74 -r1.74.4.1 src/sys/kern/sysv_msg.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/kern/sysv_msg.c diff -u src/sys/kern/sysv_msg.c:1.74 src/sys/kern/sysv_msg.c:1.74.4.1 --- src/sys/kern/sysv_msg.c:1.74 Wed Apr 10 10:03:50 2019 +++ src/sys/kern/sysv_msg.c Tue Oct 15 19:05:38 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: sysv_msg.c,v 1.74 2019/04/10 10:03:50 pgoyette Exp $ */ +/* $NetBSD: sysv_msg.c,v 1.74.4.1 2019/10/15 19:05:38 martin Exp $ */ /*- * Copyright (c) 1999, 2006, 2007 The NetBSD Foundation, Inc. @@ -50,7 +50,7 @@ */ #include -__KERNEL_RCSID(0, "$NetBSD: sysv_msg.c,v 1.74 2019/04/10 10:03:50 pgoyette Exp $"); +__KERNEL_RCSID(0, "$NetBSD: sysv_msg.c,v 1.74.4.1 2019/10/15 19:05:38 martin Exp $"); #ifdef _KERNEL_OPT #include "opt_sysv.h" @@ -1104,6 +1104,7 @@ restart: */ if (msgtyp != msghdr->msg_type && +msgtyp != LONG_MIN && msghdr->msg_type > -msgtyp) continue;
CVS commit: [netbsd-9] src/sys/kern
Module Name:src Committed By: martin Date: Tue Oct 15 19:05:38 UTC 2019 Modified Files: src/sys/kern [netbsd-9]: sysv_msg.c Log Message: Pull up following revision(s) (requested by kamil in ticket #322): sys/kern/sysv_msg.c: revision 1.76 Avoid -LONG_MIN msgtyp in msgrcv(2) and treat it as LONG_MAX This logic (found in Linux) avoids undefined behavior. To generate a diff of this commit: cvs rdiff -u -r1.74 -r1.74.4.1 src/sys/kern/sysv_msg.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
CVS commit: [netbsd-9] src/sys/kern
Module Name:src Committed By: martin Date: Tue Oct 15 19:03:20 UTC 2019 Modified Files: src/sys/kern [netbsd-9]: sys_ptrace_common.c Log Message: Pull up following revision(s) (requested by kamil in ticket #321): sys/kern/sys_ptrace_common.c: revision 1.63 Add two KASSERTS in the ptrace(2) kernel code Verify that we will never return empty ptrace_state for CHILD/LWP event. To generate a diff of this commit: cvs rdiff -u -r1.58.2.5 -r1.58.2.6 src/sys/kern/sys_ptrace_common.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/kern/sys_ptrace_common.c diff -u src/sys/kern/sys_ptrace_common.c:1.58.2.5 src/sys/kern/sys_ptrace_common.c:1.58.2.6 --- src/sys/kern/sys_ptrace_common.c:1.58.2.5 Tue Oct 15 19:01:06 2019 +++ src/sys/kern/sys_ptrace_common.c Tue Oct 15 19:03:20 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: sys_ptrace_common.c,v 1.58.2.5 2019/10/15 19:01:06 martin Exp $ */ +/* $NetBSD: sys_ptrace_common.c,v 1.58.2.6 2019/10/15 19:03:20 martin Exp $ */ /*- * Copyright (c) 2008, 2009 The NetBSD Foundation, Inc. @@ -118,7 +118,7 @@ */ #include -__KERNEL_RCSID(0, "$NetBSD: sys_ptrace_common.c,v 1.58.2.5 2019/10/15 19:01:06 martin Exp $"); +__KERNEL_RCSID(0, "$NetBSD: sys_ptrace_common.c,v 1.58.2.6 2019/10/15 19:03:20 martin Exp $"); #ifdef _KERNEL_OPT #include "opt_ptrace.h" @@ -702,6 +702,10 @@ ptrace_get_process_state(struct proc *t, memset(, 0, sizeof(ps)); } else { si = >p_sigctx.ps_info; + + KASSERT(si->_reason._ptrace_state._pe_report_event > 0); + KASSERT(si->_reason._ptrace_state._option._pe_other_pid > 0); + ps.pe_report_event = si->_reason._ptrace_state._pe_report_event; CTASSERT(sizeof(ps.pe_other_pid) == sizeof(ps.pe_lwp));
CVS commit: [netbsd-9] src/sys/kern
Module Name:src Committed By: martin Date: Tue Oct 15 19:03:20 UTC 2019 Modified Files: src/sys/kern [netbsd-9]: sys_ptrace_common.c Log Message: Pull up following revision(s) (requested by kamil in ticket #321): sys/kern/sys_ptrace_common.c: revision 1.63 Add two KASSERTS in the ptrace(2) kernel code Verify that we will never return empty ptrace_state for CHILD/LWP event. To generate a diff of this commit: cvs rdiff -u -r1.58.2.5 -r1.58.2.6 src/sys/kern/sys_ptrace_common.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
CVS commit: [netbsd-9] src/sys/kern
Module Name:src Committed By: martin Date: Tue Oct 15 19:01:06 UTC 2019 Modified Files: src/sys/kern [netbsd-9]: kern_exit.c kern_lwp.c kern_sig.c kern_synch.c sys_ptrace_common.c Log Message: Pull up following revision(s) (requested by kamil in ticket #320): sys/kern/kern_synch.c: revision 1.324 sys/kern/kern_sig.c: revision 1.366 sys/kern/kern_exit.c: revision 1.277 sys/kern/kern_lwp.c: revision 1.204 sys/kern/sys_ptrace_common.c: revision 1.62 Separate flag for suspended by _lwp_suspend and suspended by a debugger Once a thread was stopped with ptrace(2), userland process must not be able to unstop it deliberately or by an accident. This was a Windows-style behavior that makes threading tracing fragile. To generate a diff of this commit: cvs rdiff -u -r1.276 -r1.276.2.1 src/sys/kern/kern_exit.c cvs rdiff -u -r1.202.2.1 -r1.202.2.2 src/sys/kern/kern_lwp.c cvs rdiff -u -r1.364.2.1 -r1.364.2.2 src/sys/kern/kern_sig.c cvs rdiff -u -r1.323 -r1.323.4.1 src/sys/kern/kern_synch.c cvs rdiff -u -r1.58.2.4 -r1.58.2.5 src/sys/kern/sys_ptrace_common.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/kern/kern_exit.c diff -u src/sys/kern/kern_exit.c:1.276 src/sys/kern/kern_exit.c:1.276.2.1 --- src/sys/kern/kern_exit.c:1.276 Thu Jun 13 20:20:18 2019 +++ src/sys/kern/kern_exit.c Tue Oct 15 19:01:06 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: kern_exit.c,v 1.276 2019/06/13 20:20:18 kamil Exp $ */ +/* $NetBSD: kern_exit.c,v 1.276.2.1 2019/10/15 19:01:06 martin Exp $ */ /*- * Copyright (c) 1998, 1999, 2006, 2007, 2008 The NetBSD Foundation, Inc. @@ -67,7 +67,7 @@ */ #include -__KERNEL_RCSID(0, "$NetBSD: kern_exit.c,v 1.276 2019/06/13 20:20:18 kamil Exp $"); +__KERNEL_RCSID(0, "$NetBSD: kern_exit.c,v 1.276.2.1 2019/10/15 19:01:06 martin Exp $"); #include "opt_ktrace.h" #include "opt_dtrace.h" @@ -617,6 +617,7 @@ retry: l2->l_flag |= LW_WEXIT; if ((l2->l_stat == LSSLEEP && (l2->l_flag & LW_SINTR)) || l2->l_stat == LSSUSPENDED || l2->l_stat == LSSTOP) { + l2->l_flag &= ~LW_DBGSUSPEND; /* setrunnable() will release the lock. */ setrunnable(l2); continue; Index: src/sys/kern/kern_lwp.c diff -u src/sys/kern/kern_lwp.c:1.202.2.1 src/sys/kern/kern_lwp.c:1.202.2.2 --- src/sys/kern/kern_lwp.c:1.202.2.1 Tue Oct 15 18:32:13 2019 +++ src/sys/kern/kern_lwp.c Tue Oct 15 19:01:06 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: kern_lwp.c,v 1.202.2.1 2019/10/15 18:32:13 martin Exp $ */ +/* $NetBSD: kern_lwp.c,v 1.202.2.2 2019/10/15 19:01:06 martin Exp $ */ /*- * Copyright (c) 2001, 2006, 2007, 2008, 2009 The NetBSD Foundation, Inc. @@ -211,7 +211,7 @@ */ #include -__KERNEL_RCSID(0, "$NetBSD: kern_lwp.c,v 1.202.2.1 2019/10/15 18:32:13 martin Exp $"); +__KERNEL_RCSID(0, "$NetBSD: kern_lwp.c,v 1.202.2.2 2019/10/15 19:01:06 martin Exp $"); #include "opt_ddb.h" #include "opt_lockdebug.h" @@ -408,6 +408,11 @@ lwp_suspend(struct lwp *curl, struct lwp return (EDEADLK); } + if ((t->l_flag & LW_DBGSUSPEND) != 0) { + lwp_unlock(t); + return 0; + } + error = 0; switch (t->l_stat) { @@ -472,7 +477,7 @@ lwp_continue(struct lwp *l) l->l_flag &= ~LW_WSUSPEND; - if (l->l_stat != LSSUSPENDED) { + if (l->l_stat != LSSUSPENDED || (l->l_flag & LW_DBGSUSPEND) != 0) { lwp_unlock(l); return; } @@ -497,6 +502,8 @@ lwp_unstop(struct lwp *l) lwp_lock(l); + KASSERT((l->l_flag & LW_DBGSUSPEND) == 0); + /* If not stopped, then just bail out. */ if (l->l_stat != LSSTOP) { lwp_unlock(l); Index: src/sys/kern/kern_sig.c diff -u src/sys/kern/kern_sig.c:1.364.2.1 src/sys/kern/kern_sig.c:1.364.2.2 --- src/sys/kern/kern_sig.c:1.364.2.1 Tue Oct 15 18:32:13 2019 +++ src/sys/kern/kern_sig.c Tue Oct 15 19:01:06 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: kern_sig.c,v 1.364.2.1 2019/10/15 18:32:13 martin Exp $ */ +/* $NetBSD: kern_sig.c,v 1.364.2.2 2019/10/15 19:01:06 martin Exp $ */ /*- * Copyright (c) 2006, 2007, 2008 The NetBSD Foundation, Inc. @@ -70,7 +70,7 @@ */ #include -__KERNEL_RCSID(0, "$NetBSD: kern_sig.c,v 1.364.2.1 2019/10/15 18:32:13 martin Exp $"); +__KERNEL_RCSID(0, "$NetBSD: kern_sig.c,v 1.364.2.2 2019/10/15 19:01:06 martin Exp $"); #include "opt_ptrace.h" #include "opt_dtrace.h" @@ -1108,11 +1108,20 @@ sigpost(struct lwp *l, sig_t action, int SDT_PROBE(proc, kernel, , signal__send, l, p, sig, 0, 0); + lwp_lock(l); + if (__predict_false((l->l_flag & LW_DBGSUSPEND) != 0)) { + if ((prop & SA_KILL) != 0) + l->l_flag &= ~LW_DBGSUSPEND; + else { + lwp_unlock(l); + return 0; + } + } + /* * Have the LWP check for signals. This ensures that even if no LWP * is found to take the signal immediately, it should be taken soon. */ - lwp_lock(l); l->l_flag |= LW_PENDSIG; /* @@ -2179,7 +2188,8 @@ sigexit(struct lwp *l, int signo) LIST_FOREACH(t, >p_lwps, l_sibling) {
CVS commit: [netbsd-9] src/sys/kern
Module Name:src Committed By: martin Date: Tue Oct 15 19:01:06 UTC 2019 Modified Files: src/sys/kern [netbsd-9]: kern_exit.c kern_lwp.c kern_sig.c kern_synch.c sys_ptrace_common.c Log Message: Pull up following revision(s) (requested by kamil in ticket #320): sys/kern/kern_synch.c: revision 1.324 sys/kern/kern_sig.c: revision 1.366 sys/kern/kern_exit.c: revision 1.277 sys/kern/kern_lwp.c: revision 1.204 sys/kern/sys_ptrace_common.c: revision 1.62 Separate flag for suspended by _lwp_suspend and suspended by a debugger Once a thread was stopped with ptrace(2), userland process must not be able to unstop it deliberately or by an accident. This was a Windows-style behavior that makes threading tracing fragile. To generate a diff of this commit: cvs rdiff -u -r1.276 -r1.276.2.1 src/sys/kern/kern_exit.c cvs rdiff -u -r1.202.2.1 -r1.202.2.2 src/sys/kern/kern_lwp.c cvs rdiff -u -r1.364.2.1 -r1.364.2.2 src/sys/kern/kern_sig.c cvs rdiff -u -r1.323 -r1.323.4.1 src/sys/kern/kern_synch.c cvs rdiff -u -r1.58.2.4 -r1.58.2.5 src/sys/kern/sys_ptrace_common.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
CVS commit: [netbsd-9] src/sys/kern
Module Name:src Committed By: martin Date: Tue Oct 15 18:50:44 UTC 2019 Modified Files: src/sys/kern [netbsd-9]: sys_ptrace_common.c Log Message: Pull up following revision(s) (requested by kamil in ticket #319): sys/kern/sys_ptrace_common.c: revision 1.61 Remove 2 static asserts from the kernel ptrace code sizeof(pid) and sizeof(lwp) will unlikely ever change and the check can confuse. The assert has been moved to ATF t_ptrace_wait.c r.1.132. Requested by To generate a diff of this commit: cvs rdiff -u -r1.58.2.3 -r1.58.2.4 src/sys/kern/sys_ptrace_common.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/kern/sys_ptrace_common.c diff -u src/sys/kern/sys_ptrace_common.c:1.58.2.3 src/sys/kern/sys_ptrace_common.c:1.58.2.4 --- src/sys/kern/sys_ptrace_common.c:1.58.2.3 Tue Oct 15 18:38:39 2019 +++ src/sys/kern/sys_ptrace_common.c Tue Oct 15 18:50:44 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: sys_ptrace_common.c,v 1.58.2.3 2019/10/15 18:38:39 martin Exp $ */ +/* $NetBSD: sys_ptrace_common.c,v 1.58.2.4 2019/10/15 18:50:44 martin Exp $ */ /*- * Copyright (c) 2008, 2009 The NetBSD Foundation, Inc. @@ -118,7 +118,7 @@ */ #include -__KERNEL_RCSID(0, "$NetBSD: sys_ptrace_common.c,v 1.58.2.3 2019/10/15 18:38:39 martin Exp $"); +__KERNEL_RCSID(0, "$NetBSD: sys_ptrace_common.c,v 1.58.2.4 2019/10/15 18:50:44 martin Exp $"); #ifdef _KERNEL_OPT #include "opt_ptrace.h" @@ -704,12 +704,7 @@ ptrace_get_process_state(struct proc *t, si = >p_sigctx.ps_info; ps.pe_report_event = si->_reason._ptrace_state._pe_report_event; - CTASSERT(sizeof(ps.pe_other_pid) == - sizeof(si->_reason._ptrace_state._option._pe_other_pid)); - CTASSERT(sizeof(ps.pe_lwp) == - sizeof(si->_reason._ptrace_state._option._pe_other_pid)); CTASSERT(sizeof(ps.pe_other_pid) == sizeof(ps.pe_lwp)); - ps.pe_other_pid = si->_reason._ptrace_state._option._pe_other_pid; }
CVS commit: [netbsd-9] src/sys/kern
Module Name:src Committed By: martin Date: Tue Oct 15 18:50:44 UTC 2019 Modified Files: src/sys/kern [netbsd-9]: sys_ptrace_common.c Log Message: Pull up following revision(s) (requested by kamil in ticket #319): sys/kern/sys_ptrace_common.c: revision 1.61 Remove 2 static asserts from the kernel ptrace code sizeof(pid) and sizeof(lwp) will unlikely ever change and the check can confuse. The assert has been moved to ATF t_ptrace_wait.c r.1.132. Requested by To generate a diff of this commit: cvs rdiff -u -r1.58.2.3 -r1.58.2.4 src/sys/kern/sys_ptrace_common.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
CVS commit: [netbsd-9] src/sys/kern
Module Name:src Committed By: martin Date: Tue Oct 15 18:38:40 UTC 2019 Modified Files: src/sys/kern [netbsd-9]: sys_ptrace_common.c Log Message: Pull up following revision(s) (requested by kamil in ticket #313): sys/kern/sys_ptrace_common.c: revision 1.60 Restore the old behavior in PT_GET_PROCESS_STATE For !child and !lwp events return zeroed struct ptrace_state. There is code that depends on it (GDB). Fixes PR toolchain/54590 by martin@ To generate a diff of this commit: cvs rdiff -u -r1.58.2.2 -r1.58.2.3 src/sys/kern/sys_ptrace_common.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/kern/sys_ptrace_common.c diff -u src/sys/kern/sys_ptrace_common.c:1.58.2.2 src/sys/kern/sys_ptrace_common.c:1.58.2.3 --- src/sys/kern/sys_ptrace_common.c:1.58.2.2 Tue Oct 15 18:32:13 2019 +++ src/sys/kern/sys_ptrace_common.c Tue Oct 15 18:38:39 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: sys_ptrace_common.c,v 1.58.2.2 2019/10/15 18:32:13 martin Exp $ */ +/* $NetBSD: sys_ptrace_common.c,v 1.58.2.3 2019/10/15 18:38:39 martin Exp $ */ /*- * Copyright (c) 2008, 2009 The NetBSD Foundation, Inc. @@ -118,7 +118,7 @@ */ #include -__KERNEL_RCSID(0, "$NetBSD: sys_ptrace_common.c,v 1.58.2.2 2019/10/15 18:32:13 martin Exp $"); +__KERNEL_RCSID(0, "$NetBSD: sys_ptrace_common.c,v 1.58.2.3 2019/10/15 18:38:39 martin Exp $"); #ifdef _KERNEL_OPT #include "opt_ptrace.h" @@ -688,6 +688,7 @@ ptrace_set_event_mask(struct proc *t, vo static int ptrace_get_process_state(struct proc *t, void *addr, size_t data) { + struct _ksiginfo *si; struct ptrace_state ps; if (data != sizeof(ps)) { @@ -698,20 +699,20 @@ ptrace_get_process_state(struct proc *t, if (t->p_sigctx.ps_info._signo != SIGTRAP || (t->p_sigctx.ps_info._code != TRAP_CHLD && t->p_sigctx.ps_info._code != TRAP_LWP)) { - return EINVAL; - } - - ps.pe_report_event = - t->p_sigctx.ps_info._reason._ptrace_state._pe_report_event; + memset(, 0, sizeof(ps)); + } else { + si = >p_sigctx.ps_info; + ps.pe_report_event = si->_reason._ptrace_state._pe_report_event; - CTASSERT(sizeof(ps.pe_other_pid) == - sizeof(t->p_sigctx.ps_info._reason._ptrace_state._option._pe_other_pid)); - CTASSERT(sizeof(ps.pe_lwp) == - sizeof(t->p_sigctx.ps_info._reason._ptrace_state._option._pe_other_pid)); - CTASSERT(sizeof(ps.pe_other_pid) == sizeof(ps.pe_lwp)); + CTASSERT(sizeof(ps.pe_other_pid) == + sizeof(si->_reason._ptrace_state._option._pe_other_pid)); + CTASSERT(sizeof(ps.pe_lwp) == + sizeof(si->_reason._ptrace_state._option._pe_other_pid)); + CTASSERT(sizeof(ps.pe_other_pid) == sizeof(ps.pe_lwp)); - ps.pe_other_pid = - t->p_sigctx.ps_info._reason._ptrace_state._option._pe_other_pid; + ps.pe_other_pid = + si->_reason._ptrace_state._option._pe_other_pid; + } DPRINTF(("%s: lwp=%d event=%#x pid=%d lwp=%d\n", __func__, t->p_sigctx.ps_lwp, ps.pe_report_event,
CVS commit: [netbsd-9] src/sys/kern
Module Name:src Committed By: martin Date: Tue Oct 15 18:38:40 UTC 2019 Modified Files: src/sys/kern [netbsd-9]: sys_ptrace_common.c Log Message: Pull up following revision(s) (requested by kamil in ticket #313): sys/kern/sys_ptrace_common.c: revision 1.60 Restore the old behavior in PT_GET_PROCESS_STATE For !child and !lwp events return zeroed struct ptrace_state. There is code that depends on it (GDB). Fixes PR toolchain/54590 by martin@ To generate a diff of this commit: cvs rdiff -u -r1.58.2.2 -r1.58.2.3 src/sys/kern/sys_ptrace_common.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
CVS commit: [netbsd-9] src/sys/kern
Module Name:src Committed By: martin Date: Tue Oct 15 18:21:06 UTC 2019 Modified Files: src/sys/kern [netbsd-9]: sys_ptrace_common.c Log Message: Pull up following revision(s) (requested by kamil in ticket #309): sys/kern/sys_ptrace_common.c: revision 1.67 Avoid signed integer overflow for -lwp where lwp is INT_MIN To generate a diff of this commit: cvs rdiff -u -r1.58 -r1.58.2.1 src/sys/kern/sys_ptrace_common.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
CVS commit: [netbsd-9] src/sys/kern
Module Name:src Committed By: martin Date: Tue Oct 15 18:21:06 UTC 2019 Modified Files: src/sys/kern [netbsd-9]: sys_ptrace_common.c Log Message: Pull up following revision(s) (requested by kamil in ticket #309): sys/kern/sys_ptrace_common.c: revision 1.67 Avoid signed integer overflow for -lwp where lwp is INT_MIN To generate a diff of this commit: cvs rdiff -u -r1.58 -r1.58.2.1 src/sys/kern/sys_ptrace_common.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/kern/sys_ptrace_common.c diff -u src/sys/kern/sys_ptrace_common.c:1.58 src/sys/kern/sys_ptrace_common.c:1.58.2.1 --- src/sys/kern/sys_ptrace_common.c:1.58 Thu Jul 18 20:10:46 2019 +++ src/sys/kern/sys_ptrace_common.c Tue Oct 15 18:21:06 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: sys_ptrace_common.c,v 1.58 2019/07/18 20:10:46 kamil Exp $ */ +/* $NetBSD: sys_ptrace_common.c,v 1.58.2.1 2019/10/15 18:21:06 martin Exp $ */ /*- * Copyright (c) 2008, 2009 The NetBSD Foundation, Inc. @@ -118,7 +118,7 @@ */ #include -__KERNEL_RCSID(0, "$NetBSD: sys_ptrace_common.c,v 1.58 2019/07/18 20:10:46 kamil Exp $"); +__KERNEL_RCSID(0, "$NetBSD: sys_ptrace_common.c,v 1.58.2.1 2019/10/15 18:21:06 martin Exp $"); #ifdef _KERNEL_OPT #include "opt_ptrace.h" @@ -1205,8 +1205,12 @@ do_ptrace(struct ptrace_methods *ptm, st signo = tmp; tmp = 0; /* don't search for LWP */ } - } else + } else if (tmp == INT_MIN) { + error = ESRCH; + break; + } else { tmp = -tmp; + } if (tmp > 0) { if (req == PT_DETACH) {
CVS commit: [netbsd-9] src/sys/kern
Module Name:src Committed By: martin Date: Tue Oct 15 18:13:56 UTC 2019 Modified Files: src/sys/kern [netbsd-9]: vnode_if.c Log Message: Regen (for ticket #307) To generate a diff of this commit: cvs rdiff -u -r1.107 -r1.107.10.1 src/sys/kern/vnode_if.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/kern/vnode_if.c diff -u src/sys/kern/vnode_if.c:1.107 src/sys/kern/vnode_if.c:1.107.10.1 --- src/sys/kern/vnode_if.c:1.107 Wed Jul 12 09:31:59 2017 +++ src/sys/kern/vnode_if.c Tue Oct 15 18:13:55 2019 @@ -1,13 +1,13 @@ -/* $NetBSD: vnode_if.c,v 1.107 2017/07/12 09:31:59 hannken Exp $ */ +/* $NetBSD: vnode_if.c,v 1.107.10.1 2019/10/15 18:13:55 martin Exp $ */ /* * Warning: DO NOT EDIT! This file is automatically generated! * (Modifications made here may easily be lost!) * * Created from the file: - * NetBSD: vnode_if.src,v 1.77 2017/07/12 09:31:07 hannken Exp + * NetBSD: vnode_if.src,v 1.77.10.1 2019/10/15 18:12:25 martin Exp * by the script: - * NetBSD: vnode_if.sh,v 1.66 2017/06/04 08:03:26 hannken Exp + * NetBSD: vnode_if.sh,v 1.66.10.1 2019/10/15 18:12:25 martin Exp */ /* @@ -40,7 +40,7 @@ */ #include -__KERNEL_RCSID(0, "$NetBSD: vnode_if.c,v 1.107 2017/07/12 09:31:59 hannken Exp $"); +__KERNEL_RCSID(0, "$NetBSD: vnode_if.c,v 1.107.10.1 2019/10/15 18:13:55 martin Exp $"); #include #include @@ -49,7 +49,7 @@ __KERNEL_RCSID(0, "$NetBSD: vnode_if.c,v #include #include -enum fst_op { FST_NO, FST_YES, FST_TRY }; +enum fst_op { FST_NO, FST_YES, FST_LAZY, FST_TRY }; static inline int vop_pre(vnode_t *vp, struct mount **mp, bool *mpsafe, enum fst_op op) @@ -62,7 +62,7 @@ vop_pre(vnode_t *vp, struct mount **mp, KERNEL_LOCK(1, curlwp); } - if (op == FST_YES || op == FST_TRY) { + if (op == FST_YES || op == FST_LAZY || op == FST_TRY) { for (;;) { *mp = vp->v_mount; if (op == FST_TRY) { @@ -73,6 +73,8 @@ vop_pre(vnode_t *vp, struct mount **mp, } return error; } + } else if (op == FST_LAZY) { +fstrans_start_lazy(*mp); } else { fstrans_start(*mp); } @@ -91,7 +93,7 @@ static inline void vop_post(vnode_t *vp, struct mount *mp, bool mpsafe, enum fst_op op) { - if (op == FST_YES) { + if (op == FST_YES || op == FST_LAZY) { fstrans_done(mp); } @@ -1378,11 +1380,11 @@ VOP_STRATEGY(struct vnode *vp, a.a_desc = VDESC(vop_strategy); a.a_vp = vp; a.a_bp = bp; - error = vop_pre(vp, , , FST_YES); + error = vop_pre(vp, , , FST_LAZY); if (error) return error; error = (VCALL(vp, VOFFSET(vop_strategy), )); - vop_post(vp, mp, mpsafe, FST_YES); + vop_post(vp, mp, mpsafe, FST_LAZY); return error; }
CVS commit: [netbsd-9] src/sys/kern
Module Name:src Committed By: martin Date: Tue Oct 15 18:13:56 UTC 2019 Modified Files: src/sys/kern [netbsd-9]: vnode_if.c Log Message: Regen (for ticket #307) To generate a diff of this commit: cvs rdiff -u -r1.107 -r1.107.10.1 src/sys/kern/vnode_if.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
CVS commit: [netbsd-9] src/sys/kern
Module Name:src Committed By: martin Date: Tue Oct 15 18:12:25 UTC 2019 Modified Files: src/sys/kern [netbsd-9]: vnode_if.sh vnode_if.src Log Message: Pull up following revision(s) (requested by hannken in ticket #307): sys/kern/vnode_if.sh: revision 1.67 sys/kern/vnode_if.src: revision 1.78 As VOP_STRATEGY() usually calls itself on the file system holding "/dev" it may deadlock on suspension of this file system. Add fstrans type LAZY and use it for VOP_STRATEGY(). Adress PR kern/53624 (dom0 freeze on domU exit) is still there To generate a diff of this commit: cvs rdiff -u -r1.66 -r1.66.10.1 src/sys/kern/vnode_if.sh cvs rdiff -u -r1.77 -r1.77.10.1 src/sys/kern/vnode_if.src Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files. Modified files: Index: src/sys/kern/vnode_if.sh diff -u src/sys/kern/vnode_if.sh:1.66 src/sys/kern/vnode_if.sh:1.66.10.1 --- src/sys/kern/vnode_if.sh:1.66 Sun Jun 4 08:03:26 2017 +++ src/sys/kern/vnode_if.sh Tue Oct 15 18:12:25 2019 @@ -29,7 +29,7 @@ copyright="\ * SUCH DAMAGE. */ " -SCRIPT_ID='$NetBSD: vnode_if.sh,v 1.66 2017/06/04 08:03:26 hannken Exp $' +SCRIPT_ID='$NetBSD: vnode_if.sh,v 1.66.10.1 2019/10/15 18:12:25 martin Exp $' # Script to produce VFS front-end sugar. # @@ -318,7 +318,7 @@ echo ' if [ -z "${rump}" ] ; then echo " -enum fst_op { FST_NO, FST_YES, FST_TRY }; +enum fst_op { FST_NO, FST_YES, FST_LAZY, FST_TRY }; static inline int vop_pre(vnode_t *vp, struct mount **mp, bool *mpsafe, enum fst_op op) @@ -331,7 +331,7 @@ vop_pre(vnode_t *vp, struct mount **mp, KERNEL_LOCK(1, curlwp); } - if (op == FST_YES || op == FST_TRY) { + if (op == FST_YES || op == FST_LAZY || op == FST_TRY) { for (;;) { *mp = vp->v_mount; if (op == FST_TRY) { @@ -342,6 +342,8 @@ vop_pre(vnode_t *vp, struct mount **mp, } return error; } + } else if (op == FST_LAZY) { +fstrans_start_lazy(*mp); } else { fstrans_start(*mp); } @@ -360,7 +362,7 @@ static inline void vop_post(vnode_t *vp, struct mount *mp, bool mpsafe, enum fst_op op) { - if (op == FST_YES) { + if (op == FST_YES || op == FST_LAZY) { fstrans_done(mp); } Index: src/sys/kern/vnode_if.src diff -u src/sys/kern/vnode_if.src:1.77 src/sys/kern/vnode_if.src:1.77.10.1 --- src/sys/kern/vnode_if.src:1.77 Wed Jul 12 09:31:07 2017 +++ src/sys/kern/vnode_if.src Tue Oct 15 18:12:25 2019 @@ -1,4 +1,4 @@ -# $NetBSD: vnode_if.src,v 1.77 2017/07/12 09:31:07 hannken Exp $ +# $NetBSD: vnode_if.src,v 1.77.10.1 2019/10/15 18:12:25 martin Exp $ # # Copyright (c) 1992, 1993 # The Regents of the University of California. All rights reserved. @@ -436,6 +436,7 @@ vop_bmap { #% strategy vp = = = # vop_strategy { + FSTRANS=LAZY IN struct vnode *vp; IN struct buf *bp; };
CVS commit: [netbsd-9] src/sys/kern
Module Name:src Committed By: martin Date: Tue Oct 15 18:12:25 UTC 2019 Modified Files: src/sys/kern [netbsd-9]: vnode_if.sh vnode_if.src Log Message: Pull up following revision(s) (requested by hannken in ticket #307): sys/kern/vnode_if.sh: revision 1.67 sys/kern/vnode_if.src: revision 1.78 As VOP_STRATEGY() usually calls itself on the file system holding "/dev" it may deadlock on suspension of this file system. Add fstrans type LAZY and use it for VOP_STRATEGY(). Adress PR kern/53624 (dom0 freeze on domU exit) is still there To generate a diff of this commit: cvs rdiff -u -r1.66 -r1.66.10.1 src/sys/kern/vnode_if.sh cvs rdiff -u -r1.77 -r1.77.10.1 src/sys/kern/vnode_if.src Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
CVS commit: [netbsd-9] src/sys/kern
Module Name:src Committed By: martin Date: Thu Oct 10 17:23:45 UTC 2019 Modified Files: src/sys/kern [netbsd-9]: sysv_shm.c Log Message: Pull up following revision(s) (requested by chs in ticket #294): sys/kern/sysv_shm.c: revision 1.140,1.141 revert rev 1.139 (fixing a race between shmat() and shmdt()) that approach turned out to be too complicated. - simpler fix for the race between shmat() and shmdt(): change shmat() to hold shm_lock until it is completely done. To generate a diff of this commit: cvs rdiff -u -r1.135.2.3 -r1.135.2.4 src/sys/kern/sysv_shm.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
CVS commit: [netbsd-9] src/sys/kern
Module Name:src Committed By: martin Date: Thu Oct 10 17:23:45 UTC 2019 Modified Files: src/sys/kern [netbsd-9]: sysv_shm.c Log Message: Pull up following revision(s) (requested by chs in ticket #294): sys/kern/sysv_shm.c: revision 1.140,1.141 revert rev 1.139 (fixing a race between shmat() and shmdt()) that approach turned out to be too complicated. - simpler fix for the race between shmat() and shmdt(): change shmat() to hold shm_lock until it is completely done. To generate a diff of this commit: cvs rdiff -u -r1.135.2.3 -r1.135.2.4 src/sys/kern/sysv_shm.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/kern/sysv_shm.c diff -u src/sys/kern/sysv_shm.c:1.135.2.3 src/sys/kern/sysv_shm.c:1.135.2.4 --- src/sys/kern/sysv_shm.c:1.135.2.3 Thu Oct 3 17:20:33 2019 +++ src/sys/kern/sysv_shm.c Thu Oct 10 17:23:45 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: sysv_shm.c,v 1.135.2.3 2019/10/03 17:20:33 martin Exp $ */ +/* $NetBSD: sysv_shm.c,v 1.135.2.4 2019/10/10 17:23:45 martin Exp $ */ /*- * Copyright (c) 1999, 2007 The NetBSD Foundation, Inc. @@ -61,7 +61,7 @@ */ #include -__KERNEL_RCSID(0, "$NetBSD: sysv_shm.c,v 1.135.2.3 2019/10/03 17:20:33 martin Exp $"); +__KERNEL_RCSID(0, "$NetBSD: sysv_shm.c,v 1.135.2.4 2019/10/10 17:23:45 martin Exp $"); #ifdef _KERNEL_OPT #include "opt_sysv.h" @@ -87,7 +87,6 @@ struct shmmap_entry { SLIST_ENTRY(shmmap_entry) next; vaddr_t va; int shmid; - bool busy; }; int shm_nused __cacheline_aligned; @@ -314,10 +313,8 @@ sys_shmdt(struct lwp *l, const struct sy struct uvm_object *uobj; struct shmid_ds *shmseg; size_t size; - int segnum; mutex_enter(_lock); -restart: /* In case of reallocation, we will wait for completion */ while (__predict_false(shm_realloc_state)) cv_wait(_realloc_cv, _lock); @@ -349,18 +346,12 @@ restart: } } - segnum = IPCID_TO_IX(shmmap_se->shmid); - if (shmmap_se->busy) { - cv_wait(_cv[segnum], _lock); - goto restart; - } - SHMPRINTF(("shmdt: vm %p: remove %d @%lx\n", p->p_vmspace, shmmap_se->shmid, shmmap_se->va)); /* Delete the entry from shm map */ uobj = shm_delete_mapping(shmmap_s, shmmap_se); - shmseg = [segnum]; + shmseg = [IPCID_TO_IX(shmmap_se->shmid)]; size = (shmseg->shm_segsz + PGOFSET) & ~PGOFSET; mutex_exit(_lock); @@ -395,13 +386,10 @@ sys_shmat(struct lwp *l, const struct sy vaddr_t attach_va; vm_prot_t prot; vsize_t size; - int segnum; /* Allocate a new map entry and set it */ shmmap_se = kmem_alloc(sizeof(struct shmmap_entry), KM_SLEEP); shmmap_se->shmid = SCARG(uap, shmid); - shmmap_se->busy = true; - segnum = IPCID_TO_IX(shmmap_se->shmid); mutex_enter(_lock); /* In case of reallocation, we will wait for completion */ @@ -449,44 +437,30 @@ sys_shmat(struct lwp *l, const struct sy /* * Create a map entry, add it to the list and increase the counters. - * The lock will be dropped before the mapping, disable reallocation. */ shmmap_s = shmmap_getprivate(p); SLIST_INSERT_HEAD(_s->entries, shmmap_se, next); shmmap_s->nitems++; shmseg->shm_lpid = p->p_pid; shmseg->shm_nattch++; - shm_realloc_disable++; /* - * Add a reference to the uvm object while we hold the - * shm_lock. + * Map the segment into the address space. */ uobj = shmseg->_shm_internal; uao_reference(uobj); - mutex_exit(_lock); - - /* - * Drop the shm_lock to map it into the address space, and lock - * the memory, if needed (XXX where does this lock memory?). - */ error = uvm_map(>vm_map, _va, size, uobj, 0, 0, UVM_MAPFLAG(prot, prot, UVM_INH_SHARE, UVM_ADV_RANDOM, flags)); if (error) goto err_detach; /* Set the new address, and update the time */ - mutex_enter(_lock); shmmap_se->va = attach_va; - shmmap_se->busy = false; shmseg->shm_atime = time_second; - shm_realloc_disable--; retval[0] = attach_va; SHMPRINTF(("shmat: vm %p: add %d @%lx\n", p->p_vmspace, shmmap_se->shmid, attach_va)); - cv_broadcast(_cv[segnum]); err: - cv_broadcast(_realloc_cv); mutex_exit(_lock); if (error && shmmap_se) { kmem_free(shmmap_se, sizeof(struct shmmap_entry)); @@ -495,11 +469,7 @@ err: err_detach: uao_detach(uobj); - mutex_enter(_lock); uobj = shm_delete_mapping(shmmap_s, shmmap_se); - shm_realloc_disable--; - cv_broadcast(_cv[segnum]); - cv_broadcast(_realloc_cv); mutex_exit(_lock); if (uobj != NULL) { uao_detach(uobj);
CVS commit: [netbsd-9] src/sys/kern
Module Name:src Committed By: martin Date: Thu Oct 3 17:20:33 UTC 2019 Modified Files: src/sys/kern [netbsd-9]: sysv_shm.c Log Message: Pull up following revision(s) (requested by chs in ticket #275): sys/kern/sysv_shm.c: revision 1.139 in shmdt(), wait until shmat() completes before detaching. To generate a diff of this commit: cvs rdiff -u -r1.135.2.2 -r1.135.2.3 src/sys/kern/sysv_shm.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/kern/sysv_shm.c diff -u src/sys/kern/sysv_shm.c:1.135.2.2 src/sys/kern/sysv_shm.c:1.135.2.3 --- src/sys/kern/sysv_shm.c:1.135.2.2 Fri Sep 13 06:25:26 2019 +++ src/sys/kern/sysv_shm.c Thu Oct 3 17:20:33 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: sysv_shm.c,v 1.135.2.2 2019/09/13 06:25:26 martin Exp $ */ +/* $NetBSD: sysv_shm.c,v 1.135.2.3 2019/10/03 17:20:33 martin Exp $ */ /*- * Copyright (c) 1999, 2007 The NetBSD Foundation, Inc. @@ -61,7 +61,7 @@ */ #include -__KERNEL_RCSID(0, "$NetBSD: sysv_shm.c,v 1.135.2.2 2019/09/13 06:25:26 martin Exp $"); +__KERNEL_RCSID(0, "$NetBSD: sysv_shm.c,v 1.135.2.3 2019/10/03 17:20:33 martin Exp $"); #ifdef _KERNEL_OPT #include "opt_sysv.h" @@ -87,6 +87,7 @@ struct shmmap_entry { SLIST_ENTRY(shmmap_entry) next; vaddr_t va; int shmid; + bool busy; }; int shm_nused __cacheline_aligned; @@ -313,8 +314,10 @@ sys_shmdt(struct lwp *l, const struct sy struct uvm_object *uobj; struct shmid_ds *shmseg; size_t size; + int segnum; mutex_enter(_lock); +restart: /* In case of reallocation, we will wait for completion */ while (__predict_false(shm_realloc_state)) cv_wait(_realloc_cv, _lock); @@ -346,12 +349,18 @@ sys_shmdt(struct lwp *l, const struct sy } } + segnum = IPCID_TO_IX(shmmap_se->shmid); + if (shmmap_se->busy) { + cv_wait(_cv[segnum], _lock); + goto restart; + } + SHMPRINTF(("shmdt: vm %p: remove %d @%lx\n", p->p_vmspace, shmmap_se->shmid, shmmap_se->va)); /* Delete the entry from shm map */ uobj = shm_delete_mapping(shmmap_s, shmmap_se); - shmseg = [IPCID_TO_IX(shmmap_se->shmid)]; + shmseg = [segnum]; size = (shmseg->shm_segsz + PGOFSET) & ~PGOFSET; mutex_exit(_lock); @@ -386,10 +395,13 @@ sys_shmat(struct lwp *l, const struct sy vaddr_t attach_va; vm_prot_t prot; vsize_t size; + int segnum; /* Allocate a new map entry and set it */ shmmap_se = kmem_alloc(sizeof(struct shmmap_entry), KM_SLEEP); shmmap_se->shmid = SCARG(uap, shmid); + shmmap_se->busy = true; + segnum = IPCID_TO_IX(shmmap_se->shmid); mutex_enter(_lock); /* In case of reallocation, we will wait for completion */ @@ -466,11 +478,13 @@ sys_shmat(struct lwp *l, const struct sy /* Set the new address, and update the time */ mutex_enter(_lock); shmmap_se->va = attach_va; + shmmap_se->busy = false; shmseg->shm_atime = time_second; shm_realloc_disable--; retval[0] = attach_va; SHMPRINTF(("shmat: vm %p: add %d @%lx\n", p->p_vmspace, shmmap_se->shmid, attach_va)); + cv_broadcast(_cv[segnum]); err: cv_broadcast(_realloc_cv); mutex_exit(_lock); @@ -484,6 +498,7 @@ err_detach: mutex_enter(_lock); uobj = shm_delete_mapping(shmmap_s, shmmap_se); shm_realloc_disable--; + cv_broadcast(_cv[segnum]); cv_broadcast(_realloc_cv); mutex_exit(_lock); if (uobj != NULL) {
CVS commit: [netbsd-9] src/sys/kern
Module Name:src Committed By: martin Date: Thu Oct 3 17:20:33 UTC 2019 Modified Files: src/sys/kern [netbsd-9]: sysv_shm.c Log Message: Pull up following revision(s) (requested by chs in ticket #275): sys/kern/sysv_shm.c: revision 1.139 in shmdt(), wait until shmat() completes before detaching. To generate a diff of this commit: cvs rdiff -u -r1.135.2.2 -r1.135.2.3 src/sys/kern/sysv_shm.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
CVS commit: [netbsd-9] src/sys/kern
Module Name:src Committed By: martin Date: Wed Sep 11 16:36:13 UTC 2019 Modified Files: src/sys/kern [netbsd-9]: kern_time.c Log Message: Additionally pull up the following revision for ticket #192, to fix the build: src/sys/kern/kern_time.c1.199 mark a variable __diagused to fix this problem affecting many builds: kern/kern_time.c:1413:6: error: variable 'error' set but not used [-Werror=unused-but-set-variable] To generate a diff of this commit: cvs rdiff -u -r1.197.4.1 -r1.197.4.2 src/sys/kern/kern_time.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
CVS commit: [netbsd-9] src/sys/kern
Module Name:src Committed By: martin Date: Wed Sep 11 16:36:13 UTC 2019 Modified Files: src/sys/kern [netbsd-9]: kern_time.c Log Message: Additionally pull up the following revision for ticket #192, to fix the build: src/sys/kern/kern_time.c1.199 mark a variable __diagused to fix this problem affecting many builds: kern/kern_time.c:1413:6: error: variable 'error' set but not used [-Werror=unused-but-set-variable] To generate a diff of this commit: cvs rdiff -u -r1.197.4.1 -r1.197.4.2 src/sys/kern/kern_time.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/kern/kern_time.c diff -u src/sys/kern/kern_time.c:1.197.4.1 src/sys/kern/kern_time.c:1.197.4.2 --- src/sys/kern/kern_time.c:1.197.4.1 Tue Sep 10 16:16:46 2019 +++ src/sys/kern/kern_time.c Wed Sep 11 16:36:13 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: kern_time.c,v 1.197.4.1 2019/09/10 16:16:46 martin Exp $ */ +/* $NetBSD: kern_time.c,v 1.197.4.2 2019/09/11 16:36:13 martin Exp $ */ /*- * Copyright (c) 2000, 2004, 2005, 2007, 2008, 2009 The NetBSD Foundation, Inc. @@ -61,7 +61,7 @@ */ #include -__KERNEL_RCSID(0, "$NetBSD: kern_time.c,v 1.197.4.1 2019/09/10 16:16:46 martin Exp $"); +__KERNEL_RCSID(0, "$NetBSD: kern_time.c,v 1.197.4.2 2019/09/11 16:36:13 martin Exp $"); #include #include @@ -1410,7 +1410,7 @@ static int itimerdecr(struct ptimer *pt, int nsec) { struct itimerspec *itp; - int error; + int error __diagused; KASSERT(mutex_owned(_lock)); KASSERT(CLOCK_VIRTUAL_P(pt->pt_type));
CVS commit: [netbsd-9] src/sys/kern
Module Name:src Committed By: martin Date: Tue Sep 10 16:14:53 UTC 2019 Modified Files: src/sys/kern [netbsd-9]: sysv_shm.c Log Message: Pull up following revision(s) (requested by maxv in ticket #191): sys/kern/sysv_shm.c: revision 1.136 Acquire shmseg uobj reference while we hold shm_lock. Otherwise nothing prevents it from being detached under our feet when we drop shm_lock. To generate a diff of this commit: cvs rdiff -u -r1.135 -r1.135.2.1 src/sys/kern/sysv_shm.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/kern/sysv_shm.c diff -u src/sys/kern/sysv_shm.c:1.135 src/sys/kern/sysv_shm.c:1.135.2.1 --- src/sys/kern/sysv_shm.c:1.135 Mon Jun 10 00:35:47 2019 +++ src/sys/kern/sysv_shm.c Tue Sep 10 16:14:53 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: sysv_shm.c,v 1.135 2019/06/10 00:35:47 chs Exp $ */ +/* $NetBSD: sysv_shm.c,v 1.135.2.1 2019/09/10 16:14:53 martin Exp $ */ /*- * Copyright (c) 1999, 2007 The NetBSD Foundation, Inc. @@ -61,7 +61,7 @@ */ #include -__KERNEL_RCSID(0, "$NetBSD: sysv_shm.c,v 1.135 2019/06/10 00:35:47 chs Exp $"); +__KERNEL_RCSID(0, "$NetBSD: sysv_shm.c,v 1.135.2.1 2019/09/10 16:14:53 martin Exp $"); #ifdef _KERNEL_OPT #include "opt_sysv.h" @@ -425,14 +425,19 @@ sys_shmat(struct lwp *l, const struct sy shmseg->shm_lpid = p->p_pid; shmseg->shm_nattch++; shm_realloc_disable++; - mutex_exit(_lock); /* - * Add a reference to the memory object, map it to the - * address space, and lock the memory, if needed. + * Add a reference to the uvm object while we hold the + * shm_lock. */ uobj = shmseg->_shm_internal; uao_reference(uobj); + mutex_exit(_lock); + + /* + * Drop the shm_lock to map it into the address space, and lock + * the memory, if needed (XXX where does this lock memory?). + */ error = uvm_map(>vm_map, _va, size, uobj, 0, 0, UVM_MAPFLAG(prot, prot, UVM_INH_SHARE, UVM_ADV_RANDOM, flags)); if (error)
CVS commit: [netbsd-9] src/sys/kern
Module Name:src Committed By: martin Date: Tue Sep 10 16:14:53 UTC 2019 Modified Files: src/sys/kern [netbsd-9]: sysv_shm.c Log Message: Pull up following revision(s) (requested by maxv in ticket #191): sys/kern/sysv_shm.c: revision 1.136 Acquire shmseg uobj reference while we hold shm_lock. Otherwise nothing prevents it from being detached under our feet when we drop shm_lock. To generate a diff of this commit: cvs rdiff -u -r1.135 -r1.135.2.1 src/sys/kern/sysv_shm.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
CVS commit: [netbsd-9] src/sys/kern
Module Name:src Committed By: martin Date: Fri Sep 6 19:37:51 UTC 2019 Modified Files: src/sys/kern [netbsd-9]: subr_ipi.c Log Message: Pull up following revision(s) (requested by ryo in ticket #181): sys/kern/subr_ipi.c: revision 1.5 Requires memory barrier before IPI ack. Problem was seen on the aarch64 cpus. Fixes PR/54009 To generate a diff of this commit: cvs rdiff -u -r1.4 -r1.4.4.1 src/sys/kern/subr_ipi.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/kern/subr_ipi.c diff -u src/sys/kern/subr_ipi.c:1.4 src/sys/kern/subr_ipi.c:1.4.4.1 --- src/sys/kern/subr_ipi.c:1.4 Sat Apr 6 02:59:05 2019 +++ src/sys/kern/subr_ipi.c Fri Sep 6 19:37:51 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: subr_ipi.c,v 1.4 2019/04/06 02:59:05 thorpej Exp $ */ +/* $NetBSD: subr_ipi.c,v 1.4.4.1 2019/09/06 19:37:51 martin Exp $ */ /*- * Copyright (c) 2014 The NetBSD Foundation, Inc. @@ -36,7 +36,7 @@ */ #include -__KERNEL_RCSID(0, "$NetBSD: subr_ipi.c,v 1.4 2019/04/06 02:59:05 thorpej Exp $"); +__KERNEL_RCSID(0, "$NetBSD: subr_ipi.c,v 1.4.4.1 2019/09/06 19:37:51 martin Exp $"); #include #include @@ -331,6 +331,9 @@ ipi_msg_cpu_handler(void *arg __unused) msg->func(msg->arg); /* Ack the request. */ +#ifndef __HAVE_ATOMIC_AS_MEMBAR + membar_producer(); +#endif atomic_dec_uint(>_pending); } }
CVS commit: [netbsd-9] src/sys/kern
Module Name:src Committed By: martin Date: Fri Sep 6 19:37:51 UTC 2019 Modified Files: src/sys/kern [netbsd-9]: subr_ipi.c Log Message: Pull up following revision(s) (requested by ryo in ticket #181): sys/kern/subr_ipi.c: revision 1.5 Requires memory barrier before IPI ack. Problem was seen on the aarch64 cpus. Fixes PR/54009 To generate a diff of this commit: cvs rdiff -u -r1.4 -r1.4.4.1 src/sys/kern/subr_ipi.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
CVS commit: [netbsd-9] src/sys/kern
Module Name:src Committed By: martin Date: Sun Sep 1 10:56:00 UTC 2019 Modified Files: src/sys/kern [netbsd-9]: subr_pool.c Log Message: Pull up following revision(s) (requested by maxv in ticket #129): sys/kern/subr_pool.c: revision 1.256 sys/kern/subr_pool.c: revision 1.257 Kernel Heap Hardening: use bitmaps on all off-page pools. This migrates 29 MI pools on amd64 from linked lists to bitmaps, which have higher security properties. Then, change the computation of the size of the PH pools: take into account the bitmap area available by default in the ph_u2 union, and don't go with [>0] if [0] already has enough space to embed a bitmap. The pools that are migrated in this change all use bitmaps small enough to fit in [0], therefore there is no increase in memory consumption. - Revert r1.254, put back || for KASAN, some destructors like lwp_dtor() caused false positives. Needs more work. To generate a diff of this commit: cvs rdiff -u -r1.252.2.1 -r1.252.2.2 src/sys/kern/subr_pool.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/kern/subr_pool.c diff -u src/sys/kern/subr_pool.c:1.252.2.1 src/sys/kern/subr_pool.c:1.252.2.2 --- src/sys/kern/subr_pool.c:1.252.2.1 Sun Aug 18 09:52:12 2019 +++ src/sys/kern/subr_pool.c Sun Sep 1 10:56:00 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: subr_pool.c,v 1.252.2.1 2019/08/18 09:52:12 martin Exp $ */ +/* $NetBSD: subr_pool.c,v 1.252.2.2 2019/09/01 10:56:00 martin Exp $ */ /* * Copyright (c) 1997, 1999, 2000, 2002, 2007, 2008, 2010, 2014, 2015, 2018 @@ -33,7 +33,7 @@ */ #include -__KERNEL_RCSID(0, "$NetBSD: subr_pool.c,v 1.252.2.1 2019/08/18 09:52:12 martin Exp $"); +__KERNEL_RCSID(0, "$NetBSD: subr_pool.c,v 1.252.2.2 2019/09/01 10:56:00 martin Exp $"); #ifdef _KERNEL_OPT #include "opt_ddb.h" @@ -81,7 +81,7 @@ TAILQ_HEAD(, pool) pool_head = TAILQ_HEA #define PHPOOL_MAX 8 static struct pool phpool[PHPOOL_MAX]; #define PHPOOL_FREELIST_NELEM(idx) \ - (((idx) == 0) ? 0 : BITMAP_SIZE * (1 << (idx))) + (((idx) == 0) ? BITMAP_MIN_SIZE : BITMAP_SIZE * (1 << (idx))) #if defined(KASAN) #define POOL_REDZONE @@ -162,6 +162,7 @@ static unsigned int poolid_counter = 0; typedef uint32_t pool_item_bitmap_t; #define BITMAP_SIZE (CHAR_BIT * sizeof(pool_item_bitmap_t)) #define BITMAP_MASK (BITMAP_SIZE - 1) +#define BITMAP_MIN_SIZE (CHAR_BIT * sizeof(((struct pool_item_header *)NULL)->ph_u2)) struct pool_item_header { /* Page headers */ @@ -201,6 +202,9 @@ struct pool_item_header { #define PHSIZE ALIGN(sizeof(struct pool_item_header)) +CTASSERT(offsetof(struct pool_item_header, ph_u2) + +BITMAP_MIN_SIZE / CHAR_BIT == sizeof(struct pool_item_header)); + #if defined(DIAGNOSTIC) && !defined(KASAN) #define POOL_CHECK_MAGIC #endif @@ -588,13 +592,11 @@ pool_subsystem_init(void) size_t sz; nelem = PHPOOL_FREELIST_NELEM(idx); + KASSERT(nelem != 0); snprintf(phpool_names[idx], sizeof(phpool_names[idx]), "phpool-%d", nelem); - sz = sizeof(struct pool_item_header); - if (nelem) { - sz = offsetof(struct pool_item_header, - ph_bitmap[howmany(nelem, BITMAP_SIZE)]); - } + sz = offsetof(struct pool_item_header, + ph_bitmap[howmany(nelem, BITMAP_SIZE)]); pool_init([idx], sz, 0, 0, 0, phpool_names[idx], _allocator_meta, IPL_VM); } @@ -657,12 +659,16 @@ pool_init_is_usebmap(const struct pool * } /* - * If we're on-page, and the page header can already contain a bitmap - * big enough to cover all the items of the page, go with a bitmap. + * If we're off-page, go with a bitmap. */ if (!(pp->pr_roflags & PR_PHINPAGE)) { - return false; + return true; } + + /* + * If we're on-page, and the page header can already contain a bitmap + * big enough to cover all the items of the page, go with a bitmap. + */ bmapsize = roundup(PHSIZE, pp->pr_align) - offsetof(struct pool_item_header, ph_bitmap[0]); KASSERT(bmapsize % sizeof(pool_item_bitmap_t) == 0); @@ -801,14 +807,15 @@ pool_init(struct pool *pp, size_t size, } /* - * If we're off-page and use a bitmap, choose the appropriate pool to - * allocate page headers, whose size varies depending on the bitmap. If - * we're just off-page, take the first pool, no extra size. If we're - * on-page, nothing to do. + * If we're off-page, then we're using a bitmap; choose the appropriate + * pool to allocate page headers, whose size varies depending on the + * bitmap. If we're on-page, nothing to do. */ - if (!(pp->pr_roflags & PR_PHINPAGE) && (pp->pr_roflags & PR_USEBMAP)) { + if (!(pp->pr_roflags & PR_PHINPAGE)) { int idx; + KASSERT(pp->pr_roflags & PR_USEBMAP); + for (idx = 0; pp->pr_itemsperpage > PHPOOL_FREELIST_NELEM(idx); idx++) { /* nothing */ @@ -823,8 +830,6 @@ pool_init(struct pool *pp, size_t size, pp->pr_wchan, pp->pr_itemsperpage); } pp->pr_phpool = [idx]; - }
CVS commit: [netbsd-9] src/sys/kern
Module Name:src Committed By: martin Date: Sun Sep 1 10:56:00 UTC 2019 Modified Files: src/sys/kern [netbsd-9]: subr_pool.c Log Message: Pull up following revision(s) (requested by maxv in ticket #129): sys/kern/subr_pool.c: revision 1.256 sys/kern/subr_pool.c: revision 1.257 Kernel Heap Hardening: use bitmaps on all off-page pools. This migrates 29 MI pools on amd64 from linked lists to bitmaps, which have higher security properties. Then, change the computation of the size of the PH pools: take into account the bitmap area available by default in the ph_u2 union, and don't go with [>0] if [0] already has enough space to embed a bitmap. The pools that are migrated in this change all use bitmaps small enough to fit in [0], therefore there is no increase in memory consumption. - Revert r1.254, put back || for KASAN, some destructors like lwp_dtor() caused false positives. Needs more work. To generate a diff of this commit: cvs rdiff -u -r1.252.2.1 -r1.252.2.2 src/sys/kern/subr_pool.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
CVS commit: [netbsd-9] src/sys/kern
Module Name:src Committed By: martin Date: Sun Aug 18 09:52:12 UTC 2019 Modified Files: src/sys/kern [netbsd-9]: subr_pool.c Log Message: Pull up following revision(s) (requested by maxv in ticket #81): sys/kern/subr_pool.c: revision 1.253 sys/kern/subr_pool.c: revision 1.254 sys/kern/subr_pool.c: revision 1.255 Kernel Heap Hardening: perform certain sanity checks on the pool caches directly, to immediately detect certain bugs that would otherwise have been detected only later on the pool layer, if the buffer ever reached the pool layer. - Replace || by && in KASAN, to increase the pool coverage. Strictly speaking, what we want to avoid is poisoning buffers that were referenced in a global list as part of the ctor. But, if a buffer indeed got referenced as part of the ctor, it necessarily has to be unreferenced in the dtor; which implies it has to have a dtor. So we want both a ctor and a dtor, and not just one of them. Note that POOL_QUARANTINE already implicitly provides this increased coverage. - Initialize pp->pr_redzone to false. For some reason with KUBSAN GCC does not eliminate the unused branch in pr_item_linkedlist_put(), and this leads to a unused uninitialized access which triggers KUBSAN messages. To generate a diff of this commit: cvs rdiff -u -r1.252 -r1.252.2.1 src/sys/kern/subr_pool.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
CVS commit: [netbsd-9] src/sys/kern
Module Name:src Committed By: martin Date: Sun Aug 18 09:52:12 UTC 2019 Modified Files: src/sys/kern [netbsd-9]: subr_pool.c Log Message: Pull up following revision(s) (requested by maxv in ticket #81): sys/kern/subr_pool.c: revision 1.253 sys/kern/subr_pool.c: revision 1.254 sys/kern/subr_pool.c: revision 1.255 Kernel Heap Hardening: perform certain sanity checks on the pool caches directly, to immediately detect certain bugs that would otherwise have been detected only later on the pool layer, if the buffer ever reached the pool layer. - Replace || by && in KASAN, to increase the pool coverage. Strictly speaking, what we want to avoid is poisoning buffers that were referenced in a global list as part of the ctor. But, if a buffer indeed got referenced as part of the ctor, it necessarily has to be unreferenced in the dtor; which implies it has to have a dtor. So we want both a ctor and a dtor, and not just one of them. Note that POOL_QUARANTINE already implicitly provides this increased coverage. - Initialize pp->pr_redzone to false. For some reason with KUBSAN GCC does not eliminate the unused branch in pr_item_linkedlist_put(), and this leads to a unused uninitialized access which triggers KUBSAN messages. To generate a diff of this commit: cvs rdiff -u -r1.252 -r1.252.2.1 src/sys/kern/subr_pool.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/kern/subr_pool.c diff -u src/sys/kern/subr_pool.c:1.252 src/sys/kern/subr_pool.c:1.252.2.1 --- src/sys/kern/subr_pool.c:1.252 Sat Jun 29 11:13:23 2019 +++ src/sys/kern/subr_pool.c Sun Aug 18 09:52:12 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: subr_pool.c,v 1.252 2019/06/29 11:13:23 maxv Exp $ */ +/* $NetBSD: subr_pool.c,v 1.252.2.1 2019/08/18 09:52:12 martin Exp $ */ /* * Copyright (c) 1997, 1999, 2000, 2002, 2007, 2008, 2010, 2014, 2015, 2018 @@ -33,7 +33,7 @@ */ #include -__KERNEL_RCSID(0, "$NetBSD: subr_pool.c,v 1.252 2019/06/29 11:13:23 maxv Exp $"); +__KERNEL_RCSID(0, "$NetBSD: subr_pool.c,v 1.252.2.1 2019/08/18 09:52:12 martin Exp $"); #ifdef _KERNEL_OPT #include "opt_ddb.h" @@ -216,6 +216,8 @@ struct pool_item { #define POOL_NEEDS_CATCHUP(pp) \ ((pp)->pr_nitems < (pp)->pr_minitems) +#define POOL_OBJ_TO_PAGE(pp, v) \ + (void *)((uintptr_t)v & pp->pr_alloc->pa_pagemask) /* * Pool cache management. @@ -408,6 +410,40 @@ pr_item_linkedlist_get(struct pool *pp, /* -- */ +static inline void +pr_phinpage_check(struct pool *pp, struct pool_item_header *ph, void *page, +void *object) +{ + if (__predict_false((void *)ph->ph_page != page)) { + panic("%s: [%s] item %p not part of pool", __func__, + pp->pr_wchan, object); + } + if (__predict_false((char *)object < (char *)page + ph->ph_off)) { + panic("%s: [%s] item %p below item space", __func__, + pp->pr_wchan, object); + } + if (__predict_false(ph->ph_poolid != pp->pr_poolid)) { + panic("%s: [%s] item %p poolid %u != %u", __func__, + pp->pr_wchan, object, ph->ph_poolid, pp->pr_poolid); + } +} + +static inline void +pc_phinpage_check(pool_cache_t pc, void *object) +{ + struct pool_item_header *ph; + struct pool *pp; + void *page; + + pp = >pc_pool; + page = POOL_OBJ_TO_PAGE(pp, object); + ph = (struct pool_item_header *)page; + + pr_phinpage_check(pp, ph, page, object); +} + +/* -- */ + static inline int phtree_compare(struct pool_item_header *a, struct pool_item_header *b) { @@ -456,25 +492,10 @@ pr_find_pagehead(struct pool *pp, void * if ((pp->pr_roflags & PR_NOALIGN) != 0) { ph = pr_find_pagehead_noalign(pp, v); } else { - void *page = - (void *)((uintptr_t)v & pp->pr_alloc->pa_pagemask); - + void *page = POOL_OBJ_TO_PAGE(pp, v); if ((pp->pr_roflags & PR_PHINPAGE) != 0) { ph = (struct pool_item_header *)page; - if (__predict_false((void *)ph->ph_page != page)) { -panic("%s: [%s] item %p not part of pool", -__func__, pp->pr_wchan, v); - } - if (__predict_false((char *)v < (char *)page + - ph->ph_off)) { -panic("%s: [%s] item %p below item space", -__func__, pp->pr_wchan, v); - } - if (__predict_false(ph->ph_poolid != pp->pr_poolid)) { -panic("%s: [%s] item %p poolid %u != %u", -__func__, pp->pr_wchan, v, ph->ph_poolid, -pp->pr_poolid); - } + pr_phinpage_check(pp, ph, page, v); } else { tmp.ph_page = page; ph = SPLAY_FIND(phtree, >pr_phtree, ); @@ -746,6 +767,7 @@ pool_init(struct pool *pp, size_t size, pp->pr_drain_hook = NULL; pp->pr_drain_hook_arg = NULL; pp->pr_freecheck = NULL; + pp->pr_redzone = false; pool_redzone_init(pp, size); pool_quarantine_init(pp); @@ -1832,7 +1854,7 @@ pool_chk_page(struct pool *pp, const cha int n; if ((pp->pr_roflags
CVS commit: [netbsd-9] src/sys/kern
Module Name:src Committed By: martin Date: Tue Aug 6 16:16:55 UTC 2019 Modified Files: src/sys/kern [netbsd-9]: kern_proc.c Log Message: Pull up following revision(s) (requested by kamil in ticket #20): sys/kern/kern_proc.c: revision 1.234 Update our vm resource use for sysctl(3) call reading kinfo_proc* Without this change RSS properties are zeroed unless a process exits or calls getrusage(2). To generate a diff of this commit: cvs rdiff -u -r1.233 -r1.233.2.1 src/sys/kern/kern_proc.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/kern/kern_proc.c diff -u src/sys/kern/kern_proc.c:1.233 src/sys/kern/kern_proc.c:1.233.2.1 --- src/sys/kern/kern_proc.c:1.233 Tue Jun 11 23:18:55 2019 +++ src/sys/kern/kern_proc.c Tue Aug 6 16:16:55 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: kern_proc.c,v 1.233 2019/06/11 23:18:55 kamil Exp $ */ +/* $NetBSD: kern_proc.c,v 1.233.2.1 2019/08/06 16:16:55 martin Exp $ */ /*- * Copyright (c) 1999, 2006, 2007, 2008 The NetBSD Foundation, Inc. @@ -62,7 +62,7 @@ */ #include -__KERNEL_RCSID(0, "$NetBSD: kern_proc.c,v 1.233 2019/06/11 23:18:55 kamil Exp $"); +__KERNEL_RCSID(0, "$NetBSD: kern_proc.c,v 1.233.2.1 2019/08/06 16:16:55 martin Exp $"); #ifdef _KERNEL_OPT #include "opt_kstack.h" @@ -1819,6 +1819,8 @@ sysctl_doeproc(SYSCTLFN_ARGS) if (buflen >= elem_size && (type == KERN_PROC || elem_count > 0)) { + ruspace(p); /* Update process vm resource use */ + if (type == KERN_PROC) { fill_proc(p, >kproc.kp_proc, allowaddr); fill_eproc(p, >kproc.kp_eproc, zombie,
CVS commit: [netbsd-9] src/sys/kern
Module Name:src Committed By: martin Date: Tue Aug 6 16:16:55 UTC 2019 Modified Files: src/sys/kern [netbsd-9]: kern_proc.c Log Message: Pull up following revision(s) (requested by kamil in ticket #20): sys/kern/kern_proc.c: revision 1.234 Update our vm resource use for sysctl(3) call reading kinfo_proc* Without this change RSS properties are zeroed unless a process exits or calls getrusage(2). To generate a diff of this commit: cvs rdiff -u -r1.233 -r1.233.2.1 src/sys/kern/kern_proc.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.