git: 6c0c6ad350c9 - stable/14 - libprocstat: add knowledge about NT_PROCSTAT_KQUEUES core file section
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Mon, 07 Apr 2025 01:29:12 UTC
The branch stable/14 has been updated by kib:
URL: https://cgit.FreeBSD.org/src/commit/?id=6c0c6ad350c9e35291d0fb1eda8f889eef655f83
commit 6c0c6ad350c9e35291d0fb1eda8f889eef655f83
Author: Konstantin Belousov <kib@FreeBSD.org>
AuthorDate: 2025-03-13 23:06:05 +0000
Commit: Konstantin Belousov <kib@FreeBSD.org>
CommitDate: 2025-04-07 01:28:22 +0000
libprocstat: add knowledge about NT_PROCSTAT_KQUEUES core file section
(cherry picked from commit 1c3d6532ca29c7aa7d26edd4074bc91671ac1bc2)
---
lib/libprocstat/core.c | 4 ++++
lib/libprocstat/core.h | 1 +
lib/libprocstat/libprocstat.c | 33 +++++++++++++++++++++++++++++++--
3 files changed, 36 insertions(+), 2 deletions(-)
diff --git a/lib/libprocstat/core.c b/lib/libprocstat/core.c
index a3e500367920..f74303cdb876 100644
--- a/lib/libprocstat/core.c
+++ b/lib/libprocstat/core.c
@@ -110,6 +110,10 @@ static const struct psc_type_info {
.n_type = NT_PTLWPINFO,
.structsize = sizeof(struct ptrace_lwpinfo)
},
+ [PSC_TYPE_KQUEUES] = {
+ .n_type = NT_PROCSTAT_KQUEUES,
+ .structsize = sizeof(struct kinfo_knote)
+ },
};
static bool core_offset(struct procstat_core *core, off_t offset);
diff --git a/lib/libprocstat/core.h b/lib/libprocstat/core.h
index 8f6aa40192da..f4276fbdf09e 100644
--- a/lib/libprocstat/core.h
+++ b/lib/libprocstat/core.h
@@ -43,6 +43,7 @@ enum psc_type {
PSC_TYPE_ENVV,
PSC_TYPE_AUXV,
PSC_TYPE_PTLWPINFO,
+ PSC_TYPE_KQUEUES,
PSC_TYPE_MAX
};
diff --git a/lib/libprocstat/libprocstat.c b/lib/libprocstat/libprocstat.c
index a59dff84f242..bd314f481e32 100644
--- a/lib/libprocstat/libprocstat.c
+++ b/lib/libprocstat/libprocstat.c
@@ -2883,6 +2883,9 @@ struct kinfo_knote *
procstat_get_kqueue_info(struct procstat *procstat,
struct kinfo_proc *kp, int kqfd, unsigned int *count, char *errbuf)
{
+ struct kinfo_knote *kn, *k, *res, *rn;
+ size_t len, kqn;
+
switch (procstat->type) {
case PROCSTAT_KVM:
warnx("kvm method is not supported");
@@ -2891,8 +2894,34 @@ procstat_get_kqueue_info(struct procstat *procstat,
return (procstat_get_kqueue_info_sysctl(kp->ki_pid, kqfd,
count, errbuf));
case PROCSTAT_CORE:
- warnx("core method is not supported");
- return (NULL);
+ k = procstat_core_get(procstat->core, PSC_TYPE_KQUEUES,
+ NULL, &len);
+ if (k == NULL) {
+ snprintf(errbuf, _POSIX2_LINE_MAX,
+ "getting NT_PROCSTAT_KQUEUES note failed");
+ *count = 0;
+ return (NULL);
+ }
+ for (kqn = 0, kn = k; kn < k + len / sizeof(*kn); kn++) {
+ if (kn->knt_kq_fd == kqfd)
+ kqn++;
+ }
+ res = calloc(kqn, sizeof(*res));
+ if (res == NULL) {
+ free(k);
+ snprintf(errbuf, _POSIX2_LINE_MAX,
+ "no memory");
+ return (NULL);
+ }
+ for (kn = k, rn = res; kn < k + len / sizeof(*kn); kn++) {
+ if (kn->knt_kq_fd != kqfd)
+ continue;
+ *rn = *kn;
+ rn++;
+ }
+ *count = kqn;
+ free(k);
+ return (res);
default:
warnx("unknown access method: %d", procstat->type);
return (NULL);