Print this page
OS-399 zone phys. mem. cap should be a rctl and have associated kstat

*** 19,28 **** --- 19,29 ---- * 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,166 **** scf_simple_prop_free(temporary_prop); scf_simple_prop_free(persistent_prop); scf_handle_destroy(h); } /* * 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) { (void) fprintf(stderr, gettext("zone '%s' must be running\n"), zonename); return (E_ERROR); } --- 144,176 ---- 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) { uint64_t num; if (getzoneid() != GLOBAL_ZONEID || zonecfg_in_alt_root()) return (E_SUCCESS); /* get the running zone from the kernel */ ! if (getzoneidbyname(zonename) == -1) { (void) fprintf(stderr, gettext("zone '%s' must be running\n"), zonename); return (E_ERROR); }
*** 167,177 **** 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) { (void) fprintf(stderr, gettext("could not set memory " "cap for zone '%s'\n"), zonename); return (E_ERROR); } --- 177,187 ---- if (zonecfg_str_to_bytes(maxrss, &num) == -1) { (void) fprintf(stderr, gettext("invalid max-rss value\n")); return (E_ERROR); } ! if (set_zone_cap(zonename, num) == -1) { (void) fprintf(stderr, gettext("could not set memory " "cap for zone '%s'\n"), zonename); return (E_ERROR); }