Home | History | Annotate | Download | only in syscall
      1 /*
      2  * CDDL HEADER START
      3  *
      4  * The contents of this file are subject to the terms of the
      5  * Common Development and Distribution License, Version 1.0 only
      6  * (the "License").  You may not use this file except in compliance
      7  * with the License.
      8  *
      9  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
     10  * or http://www.opensolaris.org/os/licensing.
     11  * See the License for the specific language governing permissions
     12  * and limitations under the License.
     13  *
     14  * When distributing Covered Code, include this CDDL HEADER in each
     15  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
     16  * If applicable, add the following below this CDDL HEADER, with the
     17  * fields enclosed by brackets "[]" replaced with your own identifying
     18  * information: Portions Copyright [yyyy] [name of copyright owner]
     19  *
     20  * CDDL HEADER END
     21  */
     22 /*
     23  * Copyright 2004 Sun Microsystems, Inc.  All rights reserved.
     24  * Use is subject to license terms.
     25  */
     26 
     27 #pragma ident	"@(#)getloadavg.c	1.3	05/06/08 SMI"
     28 
     29 #include <sys/types.h>
     30 #include <sys/systm.h>
     31 #include <sys/errno.h>
     32 #include <sys/loadavg.h>
     33 #include <sys/zone.h>
     34 #include <sys/pool_pset.h>
     35 
     36 /*
     37  * Extract elements of the raw avenrun array from the kernel for the
     38  * implementation of getloadavg(3c)
     39  */
     40 int
     41 getloadavg(int *buf, int nelem)
     42 {
     43 	int *loadbuf = &avenrun[0];
     44 	int loadavg[LOADAVG_NSTATS];
     45 	int error;
     46 
     47 	if (nelem < 0)
     48 		return (set_errno(EINVAL));
     49 	if (nelem > LOADAVG_NSTATS)
     50 		nelem = LOADAVG_NSTATS;
     51 
     52 	if (!INGLOBALZONE(curproc)) {
     53 		mutex_enter(&cpu_lock);
     54 		if (pool_pset_enabled()) {
     55 			psetid_t psetid = zone_pset_get(curproc->p_zone);
     56 
     57 			error = cpupart_get_loadavg(psetid, &loadavg[0], nelem);
     58 			ASSERT(error == 0);	/* pset isn't going anywhere */
     59 			loadbuf = &loadavg[0];
     60 		}
     61 		mutex_exit(&cpu_lock);
     62 	}
     63 
     64 	error = copyout(loadbuf, buf, nelem * sizeof (avenrun[0]));
     65 	if (error)
     66 		return (set_errno(EFAULT));
     67 	return (nelem);
     68 }
     69