Print this page
OS-399 zone phys. mem. cap should be a rctl and have associated kstat
        
@@ -19,10 +19,11 @@
  * CDDL HEADER END
  */
 
 /*
  * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, Joyent, Inc. All rights reserved.
  */
 #include <alloca.h>
 #include <assert.h>
 #include <dirent.h>
 #include <dlfcn.h>
@@ -2188,11 +2189,11 @@
                 return (0);
         }
         return (rctlblk_get_value(rblk));
 }
 
-#define ZSD_NUM_RCTL_VALS 19
+#define ZSD_NUM_RCTL_VALS 20
 
 /*
  * Fetch the limit information for a zone.  This uses zone_enter() as the
  * getrctl(2) system call only returns rctl information for the zone of
  * the caller.
@@ -2235,16 +2236,10 @@
         *shmids = 0;
         *semids = 0;
         *msgids = 0;
         *lofi = 0;
 
-        /* Get the ram cap first since it is a zone attr */
-        ret = zone_getattr(zone->zsz_id, ZONE_ATTR_PHYS_MCAP,
-            ram_cap, sizeof (*ram_cap));
-        if (ret < 0 || *ram_cap == 0)
-                *ram_cap = ZS_LIMIT_NONE;
-
         /* Get the zone's default scheduling class */
         ret = zone_getattr(zone->zsz_id, ZONE_ATTR_SCHED_CLASS,
             class, sizeof (class));
         if (ret < 0)
                 return (-1);
@@ -2296,10 +2291,11 @@
                 vals[i++] = zsd_get_zone_rctl_usage("zone.max-sem-ids");
                 vals[i++] = zsd_get_zone_rctl_limit("zone.max-msg-ids");
                 vals[i++] = zsd_get_zone_rctl_usage("zone.max-msg-ids");
                 vals[i++] = zsd_get_zone_rctl_limit("zone.max-lofi");
                 vals[i++] = zsd_get_zone_rctl_usage("zone.max-lofi");
+                vals[i++] = zsd_get_zone_rctl_usage("zone.max-physical-memory");
 
                 if (write(p[1], vals, ZSD_NUM_RCTL_VALS * sizeof (uint64_t)) !=
                     ZSD_NUM_RCTL_VALS * sizeof (uint64_t)) {
                         (void) close(p[1]);
                         _exit(1);
@@ -2340,10 +2336,11 @@
         *semids = vals[i++];
         *msgids_cap = vals[i++];
         *msgids = vals[i++];
         *lofi_cap = vals[i++];
         *lofi = vals[i++];
+        *ram_cap = vals[i++];
 
         /* Interpret maximum values as no cap */
         if (*cpu_cap == UINT32_MAX || *cpu_cap == 0)
                 *cpu_cap = ZS_LIMIT_NONE;
         if (*processes_cap == sys->zss_processes_max)