From nobody Mon Apr 7 01:28:59 2025 X-Original-To: dev-commits-src-branches@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 4ZWBSZ0VRqz5sNgN; Mon, 07 Apr 2025 01:29:02 +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 "R10" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4ZWBSY3pZ4z3wJ0; Mon, 07 Apr 2025 01:29:01 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1743989341; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=n/XbIWOWj4NWXjhxeQ1mnK2gjLUp46dvkSGrmvRXsic=; b=ZEJP4PVUe0c/lyotPC+uTKEcTVIHxMkhsgQyCylt6H7Bdwubzns/vMe27I0SQVNfxmdQqR aRaEEcvcCGf66nQYAQPkcf1I6RFkKx/PyFDauxcRsXEvZdu0HE+zDBmAokPmc+W4FewBIj MHiAf5F8JSHLAVfheT7d5y2rSZG3TM0bA0uieTZEFpn7CtaWoL9vxkPQvY19vjLIp9dtcS UTd2hV78ugIw4O7ZcsEDcANF7q39GGcEYDYDgEuP2xCwJypgcsg0W3VaIRY1lWkp3nbpq3 X33olcWKhjCyKEd4EeSrnp8EuCLoinJchdaH6yxdzD2hslDga8QXSGSvmK079A== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1743989341; a=rsa-sha256; cv=none; b=aIcbQbtqQIQo9+Tzo9jTa+QXSQV2PYADSz9MOsFHOv3dv09BFPcxJRqFx+EZ1ghn6ABe0s /NsQcpNR4D1tvLIACUPtLe9n3RLHutL7vpwPvizl+7MabpN5+yDOT5ys66JMmyhAUoAlAh T6rAGhoS1fWlzxKj27gTSwJpLqF5GWPrBxbpQhUh6CghAFuLOsG9oZ8uC0W1ZzzeIir9sX zHGFSvlGfHXnIDNIvhcJFagt6qHcolgngtqJKIbw2ke/AnGkw6Absp9jh5cKU02j/bJHh5 JZDh/NJfylOkIqoJ/wPIqXq1BrFdoeqpOwVoYA5ALAY9nL4xBj1srHrm9nX2XA== ARC-Authentication-Results: i=1; mx1.freebsd.org; none ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1743989341; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=n/XbIWOWj4NWXjhxeQ1mnK2gjLUp46dvkSGrmvRXsic=; b=GOeRGHYQEkYQWXkCuVBaKGKRGdrFMDxtbZSxK/69xDlUVfbkRwpVh6xun/sNgsdI9BP78l UJSJE+0zhdQtpJDjz/cCidS6uVvz3+kBloDVvIwrHwBVDSYMXZnrQLW0id7F+ND7xV4S8e PPzMw8V4Z/opQ96XPpI8BNghxxScBJQW/bqfh1wab5pD+fzCs3ddRGEX6RUb+m3BzlqSF4 4mXHCsFmU8xHXNVYZYO/ERaZDT+rPQrTTn08+Dr7veyTL76iXPdtJuhyopD2pYrVWKH+XT aM0MZIe4kKghU+EP6ajhZwxmfpmjQaYk0nNtud3rCe6VmflRt1gJwBIRVxUloA== 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 4ZWBSX0RYCz952; Mon, 07 Apr 2025 01:29:00 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from gitrepo.freebsd.org ([127.0.1.44]) by gitrepo.freebsd.org (8.18.1/8.18.1) with ESMTP id 5371SxZl062903; Mon, 7 Apr 2025 01:28:59 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.18.1/8.18.1/Submit) id 5371SxfI062900; Mon, 7 Apr 2025 01:28:59 GMT (envelope-from git) Date: Mon, 7 Apr 2025 01:28:59 GMT Message-Id: <202504070128.5371SxfI062900@gitrepo.freebsd.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-branches@FreeBSD.org From: Konstantin Belousov Subject: git: 3cb2a80f6bb0 - stable/14 - libprocstat: add helper to query knotes for specific kqueue List-Id: Commits to the stable branches of the FreeBSD src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-branches List-Help: List-Post: List-Subscribe: List-Unsubscribe: X-BeenThere: dev-commits-src-branches@freebsd.org Sender: owner-dev-commits-src-branches@FreeBSD.org MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: kib X-Git-Repository: src X-Git-Refname: refs/heads/stable/14 X-Git-Reftype: branch X-Git-Commit: 3cb2a80f6bb0d8998b441f07057c4ff9863b5fb5 Auto-Submitted: auto-generated The branch stable/14 has been updated by kib: URL: https://cgit.FreeBSD.org/src/commit/?id=3cb2a80f6bb0d8998b441f07057c4ff9863b5fb5 commit 3cb2a80f6bb0d8998b441f07057c4ff9863b5fb5 Author: Konstantin Belousov AuthorDate: 2025-02-24 23:44:10 +0000 Commit: Konstantin Belousov CommitDate: 2025-04-07 01:28:21 +0000 libprocstat: add helper to query knotes for specific kqueue (cherry picked from commit bf46aec4b29a72bcaaa9f1b2fc446ee299f5a6fd) --- lib/libprocstat/Symbol.map | 2 ++ lib/libprocstat/libprocstat.c | 66 +++++++++++++++++++++++++++++++++++++++++++ lib/libprocstat/libprocstat.h | 4 +++ 3 files changed, 72 insertions(+) diff --git a/lib/libprocstat/Symbol.map b/lib/libprocstat/Symbol.map index c2ea7e95312c..3d71c3eaae4a 100644 --- a/lib/libprocstat/Symbol.map +++ b/lib/libprocstat/Symbol.map @@ -50,6 +50,8 @@ FBSD_1.7 { }; FBSD_1.8 { + procstat_get_kqueue_info; procstat_getrlimitusage; + procstat_freekqinfo; procstat_freerlimitusage; }; \ No newline at end of file diff --git a/lib/libprocstat/libprocstat.c b/lib/libprocstat/libprocstat.c index fd9578e9f115..a59dff84f242 100644 --- a/lib/libprocstat/libprocstat.c +++ b/lib/libprocstat/libprocstat.c @@ -2838,3 +2838,69 @@ procstat_freerlimitusage(struct procstat *procstat __unused, rlim_t *resusage) { free(resusage); } + +static struct kinfo_knote * +procstat_get_kqueue_info_sysctl(pid_t pid, int kqfd, unsigned int *cntp, + char *errbuf) +{ + int error, name[5]; + struct kinfo_knote *val; + size_t len; + + name[0] = CTL_KERN; + name[1] = KERN_PROC; + name[2] = KERN_PROC_KQUEUE; + name[3] = pid; + name[4] = kqfd; + + len = 0; + error = sysctl(name, nitems(name), NULL, &len, NULL, 0); + if (error == -1) { + snprintf(errbuf, _POSIX2_LINE_MAX, + "KERN_PROC_KQUEUE.pid<%d>.kq<%d> (size q) failed: %s", + pid, kqfd, strerror(errno)); + return (NULL); + } + val = malloc(len); + if (val == NULL) { + snprintf(errbuf, _POSIX2_LINE_MAX, "no memory"); + return (NULL); + } + + error = sysctl(name, nitems(name), val, &len, NULL, 0); + if (error == -1) { + snprintf(errbuf, _POSIX2_LINE_MAX, + "KERN_PROC_KQUEUE.pid<%d>.kq<%d> failed: %s", + pid, kqfd, strerror(errno)); + free(val); + return (NULL); + } + *cntp = len / sizeof(*val); + return (val); +} + +struct kinfo_knote * +procstat_get_kqueue_info(struct procstat *procstat, + struct kinfo_proc *kp, int kqfd, unsigned int *count, char *errbuf) +{ + switch (procstat->type) { + case PROCSTAT_KVM: + warnx("kvm method is not supported"); + return (NULL); + case PROCSTAT_SYSCTL: + return (procstat_get_kqueue_info_sysctl(kp->ki_pid, kqfd, + count, errbuf)); + case PROCSTAT_CORE: + warnx("core method is not supported"); + return (NULL); + default: + warnx("unknown access method: %d", procstat->type); + return (NULL); + } +} + +void +procstat_freekqinfo(struct procstat *procstat __unused, struct kinfo_knote *v) +{ + free(v); +} diff --git a/lib/libprocstat/libprocstat.h b/lib/libprocstat/libprocstat.h index 99c005ff24a7..3fb73114e9c4 100644 --- a/lib/libprocstat/libprocstat.h +++ b/lib/libprocstat/libprocstat.h @@ -110,6 +110,7 @@ struct kinfo_kstack; struct kinfo_proc; struct kinfo_vmentry; +struct kinfo_knote; struct procstat; struct ptrace_lwpinfo; struct rlimit; @@ -205,6 +206,7 @@ void procstat_freeauxv(struct procstat *procstat, Elf_Auxinfo *auxv); #endif void procstat_freeenvv(struct procstat *procstat); void procstat_freegroups(struct procstat *procstat, gid_t *groups); +void procstat_freekqinfo(struct procstat *procstat, struct kinfo_knote *kni); void procstat_freekstack(struct procstat *procstat, struct kinfo_kstack *kkstp); void procstat_freeprocs(struct procstat *procstat, struct kinfo_proc *p); @@ -220,6 +222,8 @@ struct filestat_list *procstat_getfiles(struct procstat *procstat, struct kinfo_proc *kp, int mmapped); struct kinfo_proc *procstat_getprocs(struct procstat *procstat, int what, int arg, unsigned int *count); +struct kinfo_knote *procstat_get_kqueue_info(struct procstat *procstat, + struct kinfo_proc *kp, int kqfd, unsigned int *count, char *errbuf); int procstat_get_pipe_info(struct procstat *procstat, struct filestat *fst, struct pipestat *pipe, char *errbuf); int procstat_get_pts_info(struct procstat *procstat, struct filestat *fst,