From nobody Sat Oct 31 18:21:46 2026 X-Original-To: dev-commits-src-all@mlmmj.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mlmmj.nyi.freebsd.org (Postfix) with ESMTP id 4jH5s64h9lz6x2v3 for ; Sat, 31 Oct 2026 18:21:46 +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) (No client certificate requested) by mx1.freebsd.org (Postfix) with ESMTPS id 4jH5s62cw7z4vmx for ; Sat, 31 Oct 2026 18:21:46 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1793470906; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=6jp7jP8jE0eNNatSM5jaPlEqe9PmdTTeYMJn+KmTwrk=; b=PSs9Eg7R4+jtSnyAj6ybt8oAW7lgdnFNhMcKSnfuQqC7iO77nipmZSiuVU/HI8tsq7sLod e0NC4kew9pmG1J4UQ3Q9FYtdC+qzLduXQv4xUzR6xYp5OhEwbokhpQAo0nZTO5WVdMGHZk iOoWDzMpF/HhlWMiTu3JMFXoKiePv5wbpQFgnEA+r7/gtSsOfG6u0mJ8VZMpqL7A36zNPK LCR0PKI2n/Xzpz8zeEPQlW00WBPjTJJpYDgDRIz4NAF2oFwNly1PjhW6RKFDXkyKnFvv2R CDqLcmB1BUVRoqENu2SoiAEoxszD5I9tgTop/0r6eI6jiJY2TAolrFmzDqP6Qg== ARC-Seal: i=1; a=rsa-sha256; d=freebsd.org; s=dkim; cv=none; t=1793470906; b=iN9PX5i7c8nEjkmXJCug9b0dWoFKfAk5x0uIcTTvgvwHsKG6jbFeo+XCoiHjxWVJtX5vqK Izfx47eZ/MENK4WT6E2c8rpizoUu898gQc+l35gPLWjvbxiAbKtKBik0Y1Bqd8PQpgC90J Eg1eghyu2UdIAgG/QQYBM5xm9De6In5MN2TGqYMe8TkYo4s6M7Dh2iWNUhlGtWS2Mtz4ji yf5NINGAj3MnsdC8NeI8gFNG2WyLNh18zEU6Vj6CxdPRcluOZXMHDBUuSGUPWGb3MICAw+ 5FwAFTtaHS0Xy7ABCjoHxSX17KdmwR6wIFfFLfxjSaoIQBcalCJrT60DKNuC6A== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1793470906; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=6jp7jP8jE0eNNatSM5jaPlEqe9PmdTTeYMJn+KmTwrk=; b=YeA73VTteT25UVFdXhfyv/n+km0Ltv6zZ6+D+SgfVOsPnvKIm199Y0PcxJkQ0EGEAV9XPt wjOYqtBWfU8Py0+ztRcCL4yO/J/NVC7ILcGpq19CrFuF1TMfbbv6ye30WHFs9TIjVxUyym yE2QJrdi06tvifH7yazFKtXp5Lj1PE+gj4IK0WFEADBRGCqy8Ohh84HUXNYim6FWr3gwus V87Un7OBLxuzPMr+rgRHvKDy65v0wKP0yUX2AGg2EO/hmgYj7grUKb4fhWleSEVWVUgn8/ 8CE1F4CsfUXAe9iMLw3oDEYV+w7e+AjOCJKT3l6+GSt+aF3EirCKXRDwRL+qvg== ARC-Authentication-Results: i=1; mx1.freebsd.org; none Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) by mxrelay.nyi.freebsd.org (Postfix) with ESMTP id 4jH5s6214pzMlP for ; Sat, 31 Oct 2026 18:21:46 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from git (uid 1279) (envelope-from git@FreeBSD.org) id 2125f by gitrepo.freebsd.org (DragonFly Mail Agent v0.13+ on gitrepo.freebsd.org); Sat, 31 Oct 2026 18:21:46 +0000 To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-branches@FreeBSD.org Cc: Abdelkader Boudih From: Adrian Chadd Subject: git: b61fdb5484fe - stable/15 - kqueue: stream the knote report instead of buffering all of it List-Archive: https://lists.freebsd.org/archives/dev-commits-src-all X-BeenThere: dev-commits-src-all@freebsd.org Sender: owner-dev-commits-src-all@FreeBSD.org List-Id: Commit messages for all branches of the src repository List-Post: List-Help: List-Subscribe: List-Unsubscribe: List-Owner: Precedence: list MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: adrian X-Git-Repository: src X-Git-Refname: refs/heads/stable/15 X-Git-Reftype: branch X-Git-Commit: b61fdb5484fe12407d2cf3bcff544dc0ec528d7e Auto-Submitted: auto-generated Date: Sat, 31 Oct 2026 18:21:46 +0000 Message-Id: <6ae631ba.2125f.26d6420@gitrepo.freebsd.org> The branch stable/15 has been updated by adrian: URL: https://cgit.FreeBSD.org/src/commit/?id=b61fdb5484fe12407d2cf3bcff544dc0ec528d7e commit b61fdb5484fe12407d2cf3bcff544dc0ec528d7e Author: Abdelkader Boudih AuthorDate: 2026-08-03 18:12:19 +0000 Commit: Adrian Chadd CommitDate: 2026-10-31 18:20:29 +0000 kqueue: stream the knote report instead of buffering all of it kern_proc_kqueues_out() sized its intermediate sbuf from the preceding sizing pass, so dumping core for a process with many knotes wired a buffer as large as the entire report. Shrank the intermediate to one page and added a drain that copied into the caller's sbuf up to maxlen, stopping the walk once it was reached. Truncation stayed byte exact. A dump of 384k knotes peaked at 20 KB of M_SBUF instead of 445 MB. Reviewed by: adrian, markj Differential Revision: https://reviews.freebsd.org/D58584 MFC after: 1 week (cherry picked from commit 9590878fca68e62c63d607da73139698e204d0f0) --- sys/kern/kern_event.c | 42 ++++++++++++++++++++++++++++++++++-------- 1 file changed, 34 insertions(+), 8 deletions(-) diff --git a/sys/kern/kern_event.c b/sys/kern/kern_event.c index 6a256cdbf606..92f7833db282 100644 --- a/sys/kern/kern_event.c +++ b/sys/kern/kern_event.c @@ -3360,27 +3360,53 @@ kern_proc_kqueues_out1(struct thread *td, struct proc *p, struct sbuf *s, return (fget_remote_foreach(td, p, kern_proc_kqueues_out1_cb, &a)); } +struct kern_proc_kqueues_drain_ctx { + struct sbuf *sb; + size_t remaining; + bool full; +}; + +static int +kern_proc_kqueues_drain(void *arg, const char *data, int len) +{ + struct kern_proc_kqueues_drain_ctx *c; + size_t n; + + c = arg; + n = MIN((size_t)len, c->remaining); + if (n != 0) { + if (sbuf_bcat(c->sb, data, n) != 0) + return (-ENOMEM); + c->remaining -= n; + } + if (c->remaining == 0) { + c->full = true; + return (-ENOSPC); + } + return (len); +} + int kern_proc_kqueues_out(struct proc *p, struct sbuf *sb, size_t maxlen, bool compat32) { + struct kern_proc_kqueues_drain_ctx c; struct sbuf *s, sm; - size_t sb_len; int error; if (maxlen == -1) return (kern_proc_kqueues_out1(curthread, p, sb, compat32)); - if (maxlen == 0) - sb_len = 128; - else - sb_len = maxlen; - s = sbuf_new(&sm, NULL, sb_len + 1, SBUF_FIXEDLEN); + c.sb = sb; + c.remaining = maxlen; + c.full = false; + s = sbuf_new(&sm, NULL, PAGE_SIZE, SBUF_FIXEDLEN); + sbuf_set_drain(s, kern_proc_kqueues_drain, &c); error = kern_proc_kqueues_out1(curthread, p, s, compat32); sbuf_finish(s); - if (error == 0) - sbuf_bcat(sb, sbuf_data(s), MIN(sbuf_len(s), maxlen)); sbuf_delete(s); + if (c.full) + error = 0; return (error); }