da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/*
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * CDDL HEADER START
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner *
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner * The contents of this file are subject to the terms of the
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner * Common Development and Distribution License, Version 1.0 only
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner * (the "License"). You may not use this file except in compliance
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner * with the License.
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner *
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner * or http://www.opensolaris.org/os/licensing.
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner * See the License for the specific language governing permissions
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner * and limitations under the License.
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner *
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner * When distributing Covered Code, include this CDDL HEADER in each
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner * If applicable, add the following below this CDDL HEADER, with the
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner * fields enclosed by brackets "[]" replaced with your own identifying
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner * information: Portions Copyright [yyyy] [name of copyright owner]
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner *
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner * CDDL HEADER END
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner */
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner/*
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner * Copyright 2002 Sun Microsystems, Inc. All rights reserved.
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner * Use is subject to license terms.
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner */
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner/* Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/* All Rights Reserved */
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/*
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * University Copyright- Copyright (c) 1982, 1986, 1988
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * The Regents of the University of California
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * All Rights Reserved
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * University Acknowledgment- Portions of this document are derived from
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner * software developed by the University of California, Berkeley, and its
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin * contributors.
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin */
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#pragma ident "%Z%%M% %I% %E% SMI"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#include <sys/types.h>
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#include <sys/param.h>
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#include <sys/sysmacros.h>
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#include <sys/systm.h>
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#include <sys/vmsystm.h>
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#include <sys/cpuvar.h>
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#include <sys/sysinfo.h>
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/*
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * This define represents the number of
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * useful pages transferred per paging i/o operation, under the assumption
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * that half of the total number is actually useful. However, if there's
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * only one page transferred per operation, we assume that it's useful.
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#ifdef lint
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define UsefulPagesPerIO 1
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#else /* lint */
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner#define UsefulPagesPerIO nz((MAXBSIZE/PAGESIZE)/2)
#endif /* lint */
extern int dopageout;
/* Average new into old with aging factor time */
#define ave(smooth, cnt, time) \
smooth = ((time - 1) * (smooth) + (cnt)) / (time)
/*
* pagein and pageout rates for use by swapper.
*/
ulong_t pginrate; /* 5 second average */
ulong_t pgoutrate; /* 5 second average */
static ulong_t ogpagein; /* pagein rate a sec ago */
static ulong_t ogpageout; /* pageout rate a sec ago */
/*
* Called once a second to gather statistics.
*/
void
vmmeter(void)
{
cpu_t *cp;
ulong_t gpagein, gpageout;
/*
* Compute 5 sec and 30 sec average free memory values.
*/
ave(avefree, freemem, 5);
ave(avefree30, freemem, 30);
/*
* Compute the 5 secs average of pageins and pageouts.
*/
gpagein = gpageout = 0;
cp = cpu_list;
do {
gpagein += (ulong_t)CPU_STATS(cp, vm.pgin);
gpageout += (ulong_t)CPU_STATS(cp, vm.pgout);
} while ((cp = cp->cpu_next) != cpu_list);
if ((gpagein >= ogpagein) && (gpageout >= ogpageout)) {
ave(pginrate, gpagein - ogpagein, 5);
ave(pgoutrate, gpageout - ogpageout, 5);
}
/*
* Save the current pagein/pageout values.
*/
ogpagein = gpagein;
ogpageout = gpageout;
if (!lotsfree || !dopageout)
return;
/*
* Decay deficit by the expected number of pages brought in since
* the last call (i.e., in the last second). The calculation
* assumes that one half of the pages brought in are actually
* useful (see comment above), and that half of the overall
* paging i/o activity is pageins as opposed to pageouts (the
* trailing factor of 2) It also assumes that paging i/o is done
* in units of MAXBSIZE bytes, which is a dubious assumption to
* apply to all file system types.
*/
deficit -= MIN(deficit,
MAX(deficit / 10, UsefulPagesPerIO * maxpgio / 2));
}