Print this page

        

@@ -20,11 +20,11 @@
  */
 
 /*
  * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
  * Use is subject to license terms.
- * Copyright 2012 Joyent, Inc.  All rights reserved.
+ * Copyright 2011 Joyent, Inc.  All rights reserved.
  */
 
 /*      Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */
 /*        All Rights Reserved   */
 

@@ -178,27 +178,30 @@
                 return (physinstalled);
 
         case _CONFIG_AVPHYS_PAGES:
                 /*
                  * If the non-global zone has a phys. memory cap, use
-                 * the phys. memory cap - zone's rss.  We always
+                 * the phys. memory cap - zone's current rss.  We always
                  * report the system-wide value for the global zone, even
-                 * though memory capping can be used on the global zone too.
-                 * We use the cached value for the RSS since vm_getusage()
-                 * is so expensive and we don't need this value to be exact.
+                 * though rcapd can be used on the global zone too.
                  */
                 if (!INGLOBALZONE(curproc) &&
                     curproc->p_zone->zone_phys_mem_ctl != UINT64_MAX) {
                         pgcnt_t cap, rss, free;
+                        vmusage_t in_use;
+                        size_t cnt = 1;
 
                         cap = btop(curproc->p_zone->zone_phys_mem_ctl);
                         if (cap > physinstalled)
                                 return (freemem);
 
-                        rss = btop(curproc->p_zone->zone_phys_mem);
+                        if (vm_getusage(VMUSAGE_ZONE, 1, &in_use, &cnt,
+                            FKIOCTL) != 0)
+                                in_use.vmu_rss_all = 0;
+                        rss = btop(in_use.vmu_rss_all);
                         /*
-                         * Because this is a soft cap, it is possible
+                         * Because rcapd implements a soft cap, it is possible
                          * for rss to be temporarily over the cap.
                          */
                         if (cap > rss)
                                 free = cap - rss;
                         else