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) 2003, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, Joyent, Inc. All rights reserved.
  */
 
 #include <sys/types.h>
 #include <sys/stat.h>
 #include <sys/wait.h>
@@ -143,24 +144,33 @@
         scf_simple_prop_free(temporary_prop);
         scf_simple_prop_free(persistent_prop);
         scf_handle_destroy(h);
 }
 
+static int
+set_zone_cap(char *zonename, uint64_t mcap)
+{
+        char cmd[128 + ZONENAME_MAX];
+
+        (void) snprintf(cmd, sizeof (cmd), "/usr/bin/prctl -r "
+            "-n zone.max-physical-memory -v %llu -i zone %s", mcap, zonename);
+        return (system(cmd));
+}
+
 /*
  * Update the in-kernel memory cap for the specified zone.
  */
 static int
 update_zone_mcap(char *zonename, char *maxrss)
 {
-        zoneid_t zone_id;
         uint64_t num;
 
         if (getzoneid() != GLOBAL_ZONEID || zonecfg_in_alt_root())
                 return (E_SUCCESS);
 
         /* get the running zone from the kernel */
-        if ((zone_id = getzoneidbyname(zonename)) == -1) {
+        if (getzoneidbyname(zonename) == -1) {
                 (void) fprintf(stderr, gettext("zone '%s' must be running\n"),
                     zonename);
                 return (E_ERROR);
         }
 
@@ -167,11 +177,11 @@
         if (zonecfg_str_to_bytes(maxrss, &num) == -1) {
                 (void) fprintf(stderr, gettext("invalid max-rss value\n"));
                 return (E_ERROR);
         }
 
-        if (zone_setattr(zone_id, ZONE_ATTR_PHYS_MCAP, &num, 0) == -1) {
+        if (set_zone_cap(zonename, num) == -1) {
                 (void) fprintf(stderr, gettext("could not set memory "
                     "cap for zone '%s'\n"), zonename);
                 return (E_ERROR);
         }