0209230bf1261579beab4f55226bb509e6b850cbgjelinek/*
0209230bf1261579beab4f55226bb509e6b850cbgjelinek * CDDL HEADER START
0209230bf1261579beab4f55226bb509e6b850cbgjelinek *
0209230bf1261579beab4f55226bb509e6b850cbgjelinek * The contents of this file are subject to the terms of the
0209230bf1261579beab4f55226bb509e6b850cbgjelinek * Common Development and Distribution License (the "License").
0209230bf1261579beab4f55226bb509e6b850cbgjelinek * You may not use this file except in compliance with the License.
0209230bf1261579beab4f55226bb509e6b850cbgjelinek *
0209230bf1261579beab4f55226bb509e6b850cbgjelinek * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
0209230bf1261579beab4f55226bb509e6b850cbgjelinek * or http://www.opensolaris.org/os/licensing.
0209230bf1261579beab4f55226bb509e6b850cbgjelinek * See the License for the specific language governing permissions
0209230bf1261579beab4f55226bb509e6b850cbgjelinek * and limitations under the License.
0209230bf1261579beab4f55226bb509e6b850cbgjelinek *
0209230bf1261579beab4f55226bb509e6b850cbgjelinek * When distributing Covered Code, include this CDDL HEADER in each
0209230bf1261579beab4f55226bb509e6b850cbgjelinek * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
0209230bf1261579beab4f55226bb509e6b850cbgjelinek * If applicable, add the following below this CDDL HEADER, with the
0209230bf1261579beab4f55226bb509e6b850cbgjelinek * fields enclosed by brackets "[]" replaced with your own identifying
0209230bf1261579beab4f55226bb509e6b850cbgjelinek * information: Portions Copyright [yyyy] [name of copyright owner]
0209230bf1261579beab4f55226bb509e6b850cbgjelinek *
0209230bf1261579beab4f55226bb509e6b850cbgjelinek * CDDL HEADER END
0209230bf1261579beab4f55226bb509e6b850cbgjelinek */
0209230bf1261579beab4f55226bb509e6b850cbgjelinek/*
0209230bf1261579beab4f55226bb509e6b850cbgjelinek * Copyright 2006 Sun Microsystems, Inc. All rights reserved.
0209230bf1261579beab4f55226bb509e6b850cbgjelinek * Use is subject to license terms.
0209230bf1261579beab4f55226bb509e6b850cbgjelinek */
0209230bf1261579beab4f55226bb509e6b850cbgjelinek
0209230bf1261579beab4f55226bb509e6b850cbgjelinek#pragma ident "%Z%%M% %I% %E% SMI"
0209230bf1261579beab4f55226bb509e6b850cbgjelinek
0209230bf1261579beab4f55226bb509e6b850cbgjelinek#include <procfs.h>
0209230bf1261579beab4f55226bb509e6b850cbgjelinek#include <project.h>
0209230bf1261579beab4f55226bb509e6b850cbgjelinek#include <stdlib.h>
0209230bf1261579beab4f55226bb509e6b850cbgjelinek#include <strings.h>
0209230bf1261579beab4f55226bb509e6b850cbgjelinek#include <zone.h>
0209230bf1261579beab4f55226bb509e6b850cbgjelinek#include <libzonecfg.h>
0209230bf1261579beab4f55226bb509e6b850cbgjelinek#include "rcapd.h"
0209230bf1261579beab4f55226bb509e6b850cbgjelinek#include "utils.h"
0209230bf1261579beab4f55226bb509e6b850cbgjelinek
0209230bf1261579beab4f55226bb509e6b850cbgjelinekextern boolean_t gz_capped;
0209230bf1261579beab4f55226bb509e6b850cbgjelinek
0209230bf1261579beab4f55226bb509e6b850cbgjelinek /* round up to next y = 2^n */
0209230bf1261579beab4f55226bb509e6b850cbgjelinek#define ROUNDUP(x, y) (((x) + ((y) - 1)) & ~((y) - 1))
0209230bf1261579beab4f55226bb509e6b850cbgjelinek
0209230bf1261579beab4f55226bb509e6b850cbgjelinekstatic void
0209230bf1261579beab4f55226bb509e6b850cbgjelinekupdate_zone(zone_entry_t *zent, void *walk_data)
0209230bf1261579beab4f55226bb509e6b850cbgjelinek{
0209230bf1261579beab4f55226bb509e6b850cbgjelinek void(*update_notification_cb)(char *, char *, int, uint64_t, int) =
0209230bf1261579beab4f55226bb509e6b850cbgjelinek (void(*)(char *, char *, int, uint64_t, int))walk_data;
0209230bf1261579beab4f55226bb509e6b850cbgjelinek int changes;
0209230bf1261579beab4f55226bb509e6b850cbgjelinek int64_t max_rss;
0209230bf1261579beab4f55226bb509e6b850cbgjelinek uint64_t mcap;
0209230bf1261579beab4f55226bb509e6b850cbgjelinek lcollection_t *lcol;
0209230bf1261579beab4f55226bb509e6b850cbgjelinek rcid_t colid;
0209230bf1261579beab4f55226bb509e6b850cbgjelinek
0209230bf1261579beab4f55226bb509e6b850cbgjelinek if (zone_getattr(zent->zid, ZONE_ATTR_PHYS_MCAP, &mcap,
0209230bf1261579beab4f55226bb509e6b850cbgjelinek sizeof (mcap)) != -1 && mcap != 0)
0209230bf1261579beab4f55226bb509e6b850cbgjelinek max_rss = ROUNDUP(mcap, 1024) / 1024;
0209230bf1261579beab4f55226bb509e6b850cbgjelinek else
0209230bf1261579beab4f55226bb509e6b850cbgjelinek max_rss = 0;
0209230bf1261579beab4f55226bb509e6b850cbgjelinek
0209230bf1261579beab4f55226bb509e6b850cbgjelinek if (zent->zid == GLOBAL_ZONEID) {
0209230bf1261579beab4f55226bb509e6b850cbgjelinek if (max_rss > 0)
0209230bf1261579beab4f55226bb509e6b850cbgjelinek gz_capped = B_TRUE;
0209230bf1261579beab4f55226bb509e6b850cbgjelinek else
0209230bf1261579beab4f55226bb509e6b850cbgjelinek gz_capped = B_FALSE;
0209230bf1261579beab4f55226bb509e6b850cbgjelinek }
0209230bf1261579beab4f55226bb509e6b850cbgjelinek
0209230bf1261579beab4f55226bb509e6b850cbgjelinek
0209230bf1261579beab4f55226bb509e6b850cbgjelinek colid.rcid_type = RCIDT_ZONE;
0209230bf1261579beab4f55226bb509e6b850cbgjelinek colid.rcid_val = zent->zid;
0209230bf1261579beab4f55226bb509e6b850cbgjelinek
0209230bf1261579beab4f55226bb509e6b850cbgjelinek lcol = lcollection_insert_update(&colid, max_rss, zent->zname,
0209230bf1261579beab4f55226bb509e6b850cbgjelinek &changes);
0209230bf1261579beab4f55226bb509e6b850cbgjelinek if (update_notification_cb != NULL)
0209230bf1261579beab4f55226bb509e6b850cbgjelinek update_notification_cb("zone", zent->zname, changes, max_rss,
0209230bf1261579beab4f55226bb509e6b850cbgjelinek (lcol != NULL) ? lcol->lcol_mark : 0);
0209230bf1261579beab4f55226bb509e6b850cbgjelinek}
0209230bf1261579beab4f55226bb509e6b850cbgjelinek
0209230bf1261579beab4f55226bb509e6b850cbgjelinek
0209230bf1261579beab4f55226bb509e6b850cbgjelinek/* ARGSUSED */
0209230bf1261579beab4f55226bb509e6b850cbgjelinekvoid
0209230bf1261579beab4f55226bb509e6b850cbgjelineklcollection_update_zone(lcollection_update_type_t ut,
0209230bf1261579beab4f55226bb509e6b850cbgjelinek void(*update_notification_cb)(char *, char *, int, uint64_t, int))
0209230bf1261579beab4f55226bb509e6b850cbgjelinek{
0209230bf1261579beab4f55226bb509e6b850cbgjelinek int i;
0209230bf1261579beab4f55226bb509e6b850cbgjelinek uint_t nzents;
0209230bf1261579beab4f55226bb509e6b850cbgjelinek zone_entry_t *zents;
0209230bf1261579beab4f55226bb509e6b850cbgjelinek
0209230bf1261579beab4f55226bb509e6b850cbgjelinek /*
0209230bf1261579beab4f55226bb509e6b850cbgjelinek * Enumerate running zones.
0209230bf1261579beab4f55226bb509e6b850cbgjelinek */
0209230bf1261579beab4f55226bb509e6b850cbgjelinek if (get_running_zones(&nzents, &zents) != 0)
0209230bf1261579beab4f55226bb509e6b850cbgjelinek return;
0209230bf1261579beab4f55226bb509e6b850cbgjelinek
0209230bf1261579beab4f55226bb509e6b850cbgjelinek for (i = 0; i < nzents; i++) {
0209230bf1261579beab4f55226bb509e6b850cbgjelinek update_zone(&zents[i], (void *)update_notification_cb);
0209230bf1261579beab4f55226bb509e6b850cbgjelinek
0209230bf1261579beab4f55226bb509e6b850cbgjelinek }
0209230bf1261579beab4f55226bb509e6b850cbgjelinek
0209230bf1261579beab4f55226bb509e6b850cbgjelinek free(zents);
0209230bf1261579beab4f55226bb509e6b850cbgjelinek}