Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 31 Jul 2026 15:54:52 +0000
From:      Adrian Chadd <adrian@FreeBSD.org>
To:        src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org
Cc:        Abdelkader Boudih <freebsd@seuros.com>
Subject:   git: ff97443beef6 - main - kqueue: do not buffer the whole knote report when sizing it
Message-ID:  <6a6cc54c.32695.765f48cb@gitrepo.freebsd.org>

index | next in thread | raw e-mail

The branch main has been updated by adrian:

URL: https://cgit.FreeBSD.org/src/commit/?id=ff97443beef614a12652cb96ccebe95e9046e82a

commit ff97443beef614a12652cb96ccebe95e9046e82a
Author:     Abdelkader Boudih <freebsd@seuros.com>
AuthorDate: 2026-07-31 15:46:38 +0000
Commit:     Adrian Chadd <adrian@FreeBSD.org>
CommitDate: 2026-07-31 15:46:45 +0000

    kqueue: do not buffer the whole knote report when sizing it
    
    kern_proc_kqueues_out() reported into an intermediate sbuf and copied the
    result into the caller's.
    
    A process that had leaked 468k kqueue descriptors wired 757 MB of M_SBUF
    while dumping core, over roughly 9M reallocations, then copied the whole
    thing again.
    
    Reviewed by:    adrian, markj
    Differential Revision:  https://reviews.freebsd.org/D58536
    PR: 296835
    MFC after: 1 week
---
 sys/kern/kern_event.c | 14 +++++++-------
 1 file changed, 7 insertions(+), 7 deletions(-)

diff --git a/sys/kern/kern_event.c b/sys/kern/kern_event.c
index 28e31a227357..e8395707a29d 100644
--- a/sys/kern/kern_event.c
+++ b/sys/kern/kern_event.c
@@ -3359,18 +3359,18 @@ kern_proc_kqueues_out(struct proc *p, struct sbuf *sb, size_t maxlen,
 	size_t sb_len;
 	int error;
 
-	if (maxlen == -1 || maxlen == 0)
+	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, maxlen == -1 ? SBUF_AUTOEXTEND :
-	    SBUF_FIXEDLEN);
+	s = sbuf_new(&sm, NULL, sb_len, SBUF_FIXEDLEN);
 	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 == -1 ?
-		    SIZE_T_MAX : maxlen));
-	}
+	if (error == 0)
+		sbuf_bcat(sb, sbuf_data(s), MIN(sbuf_len(s), maxlen));
 	sbuf_delete(s);
 	return (error);
 }


home | help

Want to link to this message? Use this
URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?6a6cc54c.32695.765f48cb>