From 053269e4332055226f3c7bd7c59bd1d0a0f6fe4d Mon Sep 17 00:00:00 2001 From: Mark Johnston Date: Fri, 27 Jan 2023 19:05:44 -0500 Subject: [PATCH 42/52] proc: Export the number of superpage mappings in vmmap output Also modify procstat -v to add a column with this information. --- sys/fs/procfs/procfs_map.c | 2 +- sys/kern/kern_proc.c | 18 ++++++++---------- sys/sys/proc.h | 2 +- sys/sys/user.h | 3 ++- usr.bin/procstat/procstat_vm.c | 6 ++++-- 5 files changed, 16 insertions(+), 15 deletions(-) diff --git a/sys/fs/procfs/procfs_map.c b/sys/fs/procfs/procfs_map.c index f62a6ea555eb..b9d7c40a0b55 100644 --- a/sys/fs/procfs/procfs_map.c +++ b/sys/fs/procfs/procfs_map.c @@ -90,7 +90,7 @@ procfs_doprocmap(PFS_FILL_ARGS) vm_eflags_t e_eflags; vm_prot_t e_prot; unsigned int last_timestamp; - bool super; + int super; #ifdef COMPAT_FREEBSD32 bool wrap32; #endif diff --git a/sys/kern/kern_proc.c b/sys/kern/kern_proc.c index 08a5ec6d20e3..bcbf884e86ef 100644 --- a/sys/kern/kern_proc.c +++ b/sys/kern/kern_proc.c @@ -2290,7 +2290,7 @@ CTASSERT(sizeof(struct kinfo_vmentry) == KINFO_VMENTRY_SIZE); void kern_proc_vmmap_resident(vm_map_t map, vm_map_entry_t entry, - int *resident_count, bool *super) + int *resident_count, int *super_count) { vm_object_t obj, tobj; vm_page_t m, m_adv; @@ -2298,8 +2298,7 @@ kern_proc_vmmap_resident(vm_map_t map, vm_map_entry_t entry, vm_paddr_t locked_pa; vm_pindex_t pi, pi_adv, pindex; - *super = false; - *resident_count = 0; + *resident_count = *super_count = 0; if (vmmap_skip_res_cnt) return; @@ -2331,12 +2330,12 @@ kern_proc_vmmap_resident(vm_map_t map, vm_map_entry_t entry, } } m_adv = NULL; - if (m->psind != 0 && addr + pagesizes[1] <= entry->end && - (addr & (pagesizes[1] - 1)) == 0 && + if (m->psind != 0 && addr + pagesizes[m->psind] <= entry->end && + (addr & (pagesizes[m->psind] - 1)) == 0 && (pmap_mincore(map->pmap, addr, &locked_pa) & MINCORE_SUPER) != 0) { - *super = true; - pi_adv = atop(pagesizes[1]); + (*super_count)++; + pi_adv = atop(pagesizes[m->psind]); } else { /* * We do not test the found page on validity. @@ -2371,7 +2370,6 @@ kern_proc_vmmap_out(struct proc *p, struct sbuf *sb, ssize_t maxlen, int flags) vm_offset_t addr; unsigned int last_timestamp; int error; - bool super; PROC_LOCK_ASSERT(p, MA_OWNED); @@ -2406,8 +2404,8 @@ kern_proc_vmmap_out(struct proc *p, struct sbuf *sb, ssize_t maxlen, int flags) kve->kve_private_resident = obj->resident_page_count; kern_proc_vmmap_resident(map, entry, - &kve->kve_resident, &super); - if (super) + &kve->kve_resident, &kve->kve_resident_super); + if (kve->kve_resident_super > 0) kve->kve_flags |= KVME_FLAG_SUPER; for (tobj = obj; tobj != NULL; tobj = tobj->backing_object) { diff --git a/sys/sys/proc.h b/sys/sys/proc.h index d2fad6b3894c..4c52b02e6d35 100644 --- a/sys/sys/proc.h +++ b/sys/sys/proc.h @@ -1052,7 +1052,7 @@ void fork_exit(void (*)(void *, struct trapframe *), void *, void fork_return(struct thread *, struct trapframe *); int inferior(struct proc *p); void kern_proc_vmmap_resident(struct vm_map *map, struct vm_map_entry *entry, - int *resident_count, bool *super); + int *resident_count, int *super_count); void kern_yield(int); void kick_proc0(void); void killjobc(void); diff --git a/sys/sys/user.h b/sys/sys/user.h index 75661257528b..f18c4b898360 100644 --- a/sys/sys/user.h +++ b/sys/sys/user.h @@ -524,7 +524,8 @@ struct kinfo_vmentry { uint16_t kve_status; /* Status flags. */ uint64_t kve_vn_fsid; /* dev_t of vnode location */ uint64_t kve_vn_rdev; /* Device id if device. */ - int _kve_ispare[8]; /* Space for more stuff. */ + int kve_resident_super; + int _kve_ispare[7]; /* Space for more stuff. */ /* Truncated before copyout in sysctl */ char kve_path[PATH_MAX]; /* Path to VM obj, if any. */ }; diff --git a/usr.bin/procstat/procstat_vm.c b/usr.bin/procstat/procstat_vm.c index aa8bc3a10096..d37eeb446911 100644 --- a/usr.bin/procstat/procstat_vm.c +++ b/usr.bin/procstat/procstat_vm.c @@ -53,9 +53,9 @@ procstat_vm(struct procstat *procstat, struct kinfo_proc *kipp) ptrwidth = 2*sizeof(void *) + 2; if ((procstat_opts & PS_OPT_NOHEADER) == 0) - xo_emit("{T:/%5s %*s %*s %3s %4s %4s %3s %3s %-5s %-2s %-s}\n", + xo_emit("{T:/%5s %*s %*s %3s %4s %4s %3s %3s %3s %-5s %-2s %-s}\n", "PID", ptrwidth, "START", ptrwidth, "END", "PRT", "RES", - "PRES", "REF", "SHD", "FLAG", "TP", "PATH"); + "PRES", "SRES", "REF", "SHD", "FLAG", "TP", "PATH"); xo_emit("{ek:process_id/%d}", kipp->ki_pid); @@ -90,6 +90,8 @@ procstat_vm(struct procstat *procstat, struct kinfo_proc *kipp) xo_emit("{:kve_resident/%4d/%d} ", kve->kve_resident); xo_emit("{:kve_private_resident/%4d/%d} ", kve->kve_private_resident); + xo_emit("{:kve_super_resident/%4d/%d} ", + kve->kve_resident_super); xo_emit("{:kve_ref_count/%3d/%d} ", kve->kve_ref_count); xo_emit("{:kve_shadow_count/%3d/%d} ", kve->kve_shadow_count); xo_emit("{d:copy_on_write/%-1s}", kve->kve_flags & -- 2.41.0