Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 7 Apr 2025 01:29:12 GMT
From:      Konstantin Belousov <kib@FreeBSD.org>
To:        src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-branches@FreeBSD.org
Subject:   git: 6c0c6ad350c9 - stable/14 - libprocstat: add knowledge about NT_PROCSTAT_KQUEUES core file section
Message-ID:  <202504070129.5371TCNb063295@gitrepo.freebsd.org>

next in thread | raw e-mail | index | archive | help
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);



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?202504070129.5371TCNb063295>