From owner-dev-commits-src-main@freebsd.org Fri Jan 1 00:04:00 2021 Return-Path: Delivered-To: dev-commits-src-main@mailman.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mailman.nyi.freebsd.org (Postfix) with ESMTP id 214634D5884; Fri, 1 Jan 2021 00:04:00 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "mxrelay.nyi.freebsd.org", Issuer "Let's Encrypt Authority X3" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4D6QH40LZlz4ZRk; Fri, 1 Jan 2021 00:04:00 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (Client did not present a certificate) by mxrelay.nyi.freebsd.org (Postfix) with ESMTPS id F13BE1988A; Fri, 1 Jan 2021 00:03:59 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from gitrepo.freebsd.org ([127.0.1.44]) by gitrepo.freebsd.org (8.16.1/8.16.1) with ESMTP id 10103xe8093765; Fri, 1 Jan 2021 00:03:59 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.16.1/8.16.1/Submit) id 10103xBn093764; Fri, 1 Jan 2021 00:03:59 GMT (envelope-from git) Date: Fri, 1 Jan 2021 00:03:59 GMT Message-Id: <202101010003.10103xBn093764@gitrepo.freebsd.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org From: John Baldwin Subject: git: 9acce1c99299 - main - Enumerate processes via the pid hash table in kdb_thr_*(). MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: jhb X-Git-Repository: src X-Git-Refname: refs/heads/main X-Git-Reftype: branch X-Git-Commit: 9acce1c99299b5b59998e2d0c461bcf01d959374 Auto-Submitted: auto-generated X-BeenThere: dev-commits-src-main@freebsd.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: Commit messages for the main branch of the src repository List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 01 Jan 2021 00:04:00 -0000 The branch main has been updated by jhb: URL: https://cgit.FreeBSD.org/src/commit/?id=9acce1c99299b5b59998e2d0c461bcf01d959374 commit 9acce1c99299b5b59998e2d0c461bcf01d959374 Author: John Baldwin AuthorDate: 2021-01-01 00:00:54 +0000 Commit: John Baldwin CommitDate: 2021-01-01 00:00:54 +0000 Enumerate processes via the pid hash table in kdb_thr_*(). Processes part way through exit1() are not included in allproc. Using allproc to enumerate processes prevented getting the stack trace of a thread in this part of exit1() via ddb. Reviewed by: kib Sponsored by: Netflix Differential Revision: https://reviews.freebsd.org/D27826 --- sys/kern/subr_kdb.c | 39 ++++++++++++++++++++++++--------------- 1 file changed, 24 insertions(+), 15 deletions(-) diff --git a/sys/kern/subr_kdb.c b/sys/kern/subr_kdb.c index 4fa35064cb54..04b9b5a838df 100644 --- a/sys/kern/subr_kdb.c +++ b/sys/kern/subr_kdb.c @@ -586,12 +586,15 @@ kdb_thr_first(void) { struct proc *p; struct thread *thr; - - FOREACH_PROC_IN_SYSTEM(p) { - if (p->p_flag & P_INMEM) { - thr = FIRST_THREAD_IN_PROC(p); - if (thr != NULL) - return (thr); + u_int i; + + for (i = 0; i <= pidhash; i++) { + LIST_FOREACH(p, &pidhashtbl[i], p_hash) { + if (p->p_flag & P_INMEM) { + thr = FIRST_THREAD_IN_PROC(p); + if (thr != NULL) + return (thr); + } } } return (NULL); @@ -602,7 +605,7 @@ kdb_thr_from_pid(pid_t pid) { struct proc *p; - FOREACH_PROC_IN_SYSTEM(p) { + LIST_FOREACH(p, PIDHASH(pid), p_hash) { if (p->p_flag & P_INMEM && p->p_pid == pid) return (FIRST_THREAD_IN_PROC(p)); } @@ -624,17 +627,23 @@ struct thread * kdb_thr_next(struct thread *thr) { struct proc *p; + u_int hash; p = thr->td_proc; thr = TAILQ_NEXT(thr, td_plist); - do { - if (thr != NULL) - return (thr); - p = LIST_NEXT(p, p_list); - if (p != NULL && (p->p_flag & P_INMEM)) - thr = FIRST_THREAD_IN_PROC(p); - } while (p != NULL); - return (NULL); + if (thr != NULL) + return (thr); + hash = p->p_pid & pidhash; + for (;;) { + p = LIST_NEXT(p, p_hash); + while (p == NULL) { + if (++hash > pidhash) + return (NULL); + p = LIST_FIRST(&pidhashtbl[hash]); + } + if (p->p_flag & P_INMEM) + return (FIRST_THREAD_IN_PROC(p)); + } } int