Author: kib
Date: Thu Dec 28 13:16:32 2017
New Revision: 327285
URL: https://svnweb.freebsd.org/changeset/base/327285

Log:
  Make kern_proc_vmmap_resident() externally accesible, and move the
  vmmap_skip_res_cnt control check inside it.
  
  Sponsored by: The FreeBSD Foundation
  MFC after:    1 week
  Differential revision:        https://reviews.freebsd.org/D13595

Modified:
  head/sys/kern/kern_proc.c
  head/sys/sys/proc.h

Modified: head/sys/kern/kern_proc.c
==============================================================================
--- head/sys/kern/kern_proc.c   Thu Dec 28 13:01:27 2017        (r327284)
+++ head/sys/kern/kern_proc.c   Thu Dec 28 13:16:32 2017        (r327285)
@@ -2280,9 +2280,9 @@ sysctl_kern_proc_ovmmap(SYSCTL_HANDLER_ARGS)
 CTASSERT(sizeof(struct kinfo_vmentry) == KINFO_VMENTRY_SIZE);
 #endif
 
-static void
+void
 kern_proc_vmmap_resident(vm_map_t map, vm_map_entry_t entry,
-    struct kinfo_vmentry *kve)
+    int *resident_count, bool *super)
 {
        vm_object_t obj, tobj;
        vm_page_t m, m_adv;
@@ -2290,6 +2290,11 @@ kern_proc_vmmap_resident(vm_map_t map, vm_map_entry_t 
        vm_paddr_t locked_pa;
        vm_pindex_t pi, pi_adv, pindex;
 
+       *super = false;
+       *resident_count = 0;
+       if (vmmap_skip_res_cnt)
+               return;
+
        locked_pa = 0;
        obj = entry->object.vm_object;
        addr = entry->start;
@@ -2322,7 +2327,7 @@ kern_proc_vmmap_resident(vm_map_t map, vm_map_entry_t 
                    (addr & (pagesizes[1] - 1)) == 0 &&
                    (pmap_mincore(map->pmap, addr, &locked_pa) &
                    MINCORE_SUPER) != 0) {
-                       kve->kve_flags |= KVME_FLAG_SUPER;
+                       *super = true;
                        pi_adv = atop(pagesizes[1]);
                } else {
                        /*
@@ -2334,7 +2339,7 @@ kern_proc_vmmap_resident(vm_map_t map, vm_map_entry_t 
                         */
                        pi_adv = 1;
                }
-               kve->kve_resident += pi_adv;
+               *resident_count += pi_adv;
 next:;
        }
        PA_UNLOCK_COND(locked_pa);
@@ -2358,6 +2363,7 @@ kern_proc_vmmap_out(struct proc *p, struct sbuf *sb, s
        vm_offset_t addr;
        unsigned int last_timestamp;
        int error;
+       bool super;
 
        PROC_LOCK_ASSERT(p, MA_OWNED);
 
@@ -2390,8 +2396,10 @@ kern_proc_vmmap_out(struct proc *p, struct sbuf *sb, s
                        if (obj->backing_object == NULL)
                                kve->kve_private_resident =
                                    obj->resident_page_count;
-                       if (!vmmap_skip_res_cnt)
-                               kern_proc_vmmap_resident(map, entry, kve);
+                       kern_proc_vmmap_resident(map, entry,
+                           &kve->kve_resident, &super);
+                       if (super)
+                               kve->kve_flags |= KVME_FLAG_SUPER;
                        for (tobj = obj; tobj != NULL;
                            tobj = tobj->backing_object) {
                                if (tobj != obj && tobj != lobj)
@@ -3112,6 +3120,7 @@ resume_all_proc(void)
 
        cp = curproc;
        sx_xlock(&allproc_lock);
+again:
        LIST_REMOVE(cp, p_list);
        LIST_INSERT_HEAD(&allproc, cp, p_list);
        for (;;) {
@@ -3131,6 +3140,12 @@ resume_all_proc(void)
                } else {
                        PROC_UNLOCK(p);
                }
+       }
+       /*  Did the loop above missed any stopped process ? */
+       LIST_FOREACH(p, &allproc, p_list) {
+               /* No need for proc lock. */
+               if ((p->p_flag & P_TOTAL_STOP) != 0)
+                       goto again;
        }
        sx_xunlock(&allproc_lock);
 }

Modified: head/sys/sys/proc.h
==============================================================================
--- head/sys/sys/proc.h Thu Dec 28 13:01:27 2017        (r327284)
+++ head/sys/sys/proc.h Thu Dec 28 13:16:32 2017        (r327285)
@@ -184,6 +184,8 @@ struct td_sched;
 struct thread;
 struct trapframe;
 struct turnstile;
+struct vm_map;
+struct vm_map_entry;
 
 /*
  * XXX: Does this belong in resource.h or resourcevar.h instead?
@@ -1004,6 +1006,8 @@ void      fork_exit(void (*)(void *, struct trapframe *), 
v
            struct trapframe *);
 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);
 void   kern_yield(int);
 void   kick_proc0(void);
 void   killjobc(void);
_______________________________________________
svn-src-head@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to