summaryrefslogtreecommitdiff
path: root/sys/dev/raidframe/rf_cpuutil.c
diff options
context:
space:
mode:
authorNiklas Hallqvist <niklas@cvs.openbsd.org>1999-01-11 14:29:56 +0000
committerNiklas Hallqvist <niklas@cvs.openbsd.org>1999-01-11 14:29:56 +0000
commit5a29b52d01b420bb61a3112d2d44740a0fa99601 (patch)
tree7d6238740f53a56f5c76ba8256c785b13caaa24a /sys/dev/raidframe/rf_cpuutil.c
parent799a3ea9a9c07e091f5f4e62273c6f105cf86191 (diff)
Import of CMU's RAIDframe via NetBSD.
Diffstat (limited to 'sys/dev/raidframe/rf_cpuutil.c')
-rw-r--r--sys/dev/raidframe/rf_cpuutil.c195
1 files changed, 195 insertions, 0 deletions
diff --git a/sys/dev/raidframe/rf_cpuutil.c b/sys/dev/raidframe/rf_cpuutil.c
new file mode 100644
index 00000000000..1816740bfc3
--- /dev/null
+++ b/sys/dev/raidframe/rf_cpuutil.c
@@ -0,0 +1,195 @@
+/* $OpenBSD: rf_cpuutil.c,v 1.1 1999/01/11 14:29:03 niklas Exp $ */
+/* $NetBSD: rf_cpuutil.c,v 1.1 1998/11/13 04:20:27 oster Exp $ */
+/*
+ * Copyright (c) 1995 Carnegie-Mellon University.
+ * All rights reserved.
+ *
+ * Authors: Mark Holland, Jim Zelenka
+ *
+ * Permission to use, copy, modify and distribute this software and
+ * its documentation is hereby granted, provided that both the copyright
+ * notice and this permission notice appear in all copies of the
+ * software, derivative works or modified versions, and any portions
+ * thereof, and that both notices appear in supporting documentation.
+ *
+ * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
+ * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND
+ * FOR ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
+ *
+ * Carnegie Mellon requests users of this software to return to
+ *
+ * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU
+ * School of Computer Science
+ * Carnegie Mellon University
+ * Pittsburgh PA 15213-3890
+ *
+ * any improvements or extensions that they make and grant Carnegie the
+ * rights to redistribute these changes.
+ */
+/*
+ * rf_cpuutil.c
+ *
+ * track cpu utilization
+ */
+
+#ifdef _KERNEL
+#define KERNEL
+#endif
+
+#include "rf_cpuutil.h"
+
+#ifndef KERNEL
+#include <errno.h>
+#endif /* !KERNEL */
+#include "rf_types.h"
+#include "rf_general.h"
+#include "rf_shutdown.h"
+#include "rf_sys.h"
+#ifdef __osf__
+#include <sys/table.h>
+#endif /* __osf__ */
+#ifdef AIX
+#include <nlist.h>
+#include <sys/sysinfo.h>
+#endif /* AIX */
+#ifdef KERNEL
+#if !defined(__NetBSD__) && !defined(__OpenBSD__)
+#include <sys/dk.h>
+#endif /* __NetBSD__ && !__OpenBSD__ */
+#else /* KERNEL */
+extern int table(int id, int index, void *addr, int nel, u_int lel);
+#endif /* KERNEL */
+
+#ifdef __osf__
+static struct tbl_sysinfo start, stop;
+#endif /* __osf__ */
+
+#ifdef AIX
+static int kmem_fd;
+static off_t sysinfo_offset;
+static struct sysinfo sysinfo_start, sysinfo_stop;
+static struct nlist namelist[] = {
+ {{"sysinfo"}},
+ {{""}},
+};
+#endif /* AIX */
+
+#ifdef AIX
+static void rf_ShutdownCpuMonitor(ignored)
+ void *ignored;
+{
+ close(kmem_fd);
+}
+#endif /* AIX */
+
+int rf_ConfigureCpuMonitor(listp)
+ RF_ShutdownList_t **listp;
+{
+#ifdef AIX
+ int rc;
+
+ rc = knlist(namelist, 1, sizeof(struct nlist));
+ if (rc) {
+ RF_ERRORMSG("Could not knlist() to config CPU monitor\n");
+ return(errno);
+ }
+ if (namelist[0].n_value == 0) {
+ RF_ERRORMSG("Got bogus results from knlist() for CPU monitor\n");
+ return(EIO);
+ }
+ sysinfo_offset = namelist[0].n_value;
+ kmem_fd = open("/dev/kmem", O_RDONLY);
+ if (kmem_fd < 0) {
+ perror("/dev/kmem");
+ return(errno);
+ }
+ rc = rf_ShutdownCreate(listp, rf_ShutdownCpuMonitor, NULL);
+ if (rc) {
+ RF_ERRORMSG3("Unable to add to shutdown list file %s line %d rc=%d\n", __FILE__,
+ __LINE__, rc);
+ rf_ShutdownCpuMonitor(NULL);
+ return(rc);
+ }
+#endif /* AIX */
+ return(0);
+}
+
+void rf_start_cpu_monitor()
+{
+#ifdef __osf__
+#ifndef KERNEL
+ if (table(TBL_SYSINFO, 0, &start, 1, sizeof(start)) != 1) {
+ printf("Unable to get sysinfo for cpu utilization monitor\n");
+ perror("start_cpu_monitor");
+ }
+#else /* !KERNEL */
+ /* start.si_user = cp_time[CP_USER];
+ start.si_nice = cp_time[CP_NICE];
+ start.si_sys = cp_time[CP_SYS];
+ start.si_idle = cp_time[CP_IDLE];
+ start.wait = cp_time[CP_WAIT]; */
+#endif /* !KERNEL */
+#endif /* __osf__ */
+#ifdef AIX
+ off_t off;
+ int rc;
+
+ off = lseek(kmem_fd, sysinfo_offset, SEEK_SET);
+ RF_ASSERT(off == sysinfo_offset);
+ rc = read(kmem_fd, &sysinfo_start, sizeof(struct sysinfo));
+ if (rc != sizeof(struct sysinfo)) {
+ RF_ERRORMSG2("Starting CPU monitor: rc=%d != %d\n", rc,
+ sizeof(struct sysinfo));
+ }
+#endif /* AIX */
+}
+
+void rf_stop_cpu_monitor()
+{
+#ifdef __osf__
+#ifndef KERNEL
+ if (table(TBL_SYSINFO, 0, &stop, 1, sizeof(stop)) != 1) {
+ printf("Unable to get sysinfo for cpu utilization monitor\n");
+ perror("stop_cpu_monitor");
+ }
+#else /* !KERNEL */
+ /* stop.si_user = cp_time[CP_USER];
+ stop.si_nice = cp_time[CP_NICE];
+ stop.si_sys = cp_time[CP_SYS];
+ stop.si_idle = cp_time[CP_IDLE];
+ stop.wait = cp_time[CP_WAIT]; */
+#endif /* !KERNEL */
+#endif /* __osf__ */
+#ifdef AIX
+ off_t off;
+ int rc;
+
+ off = lseek(kmem_fd, sysinfo_offset, SEEK_SET);
+ RF_ASSERT(off == sysinfo_offset);
+ rc = read(kmem_fd, &sysinfo_stop, sizeof(struct sysinfo));
+ if (rc != sizeof(struct sysinfo)) {
+ RF_ERRORMSG2("Stopping CPU monitor: rc=%d != %d\n", rc,
+ sizeof(struct sysinfo));
+ }
+#endif /* AIX */
+}
+
+void rf_print_cpu_util(s)
+ char *s;
+{
+#ifdef __osf__
+ long totalticks, idleticks;
+
+ idleticks = stop.si_idle - start.si_idle + stop.wait - start.wait;
+ totalticks = stop.si_user - start.si_user + stop.si_nice - start.si_nice +
+ stop.si_sys - start.si_sys + idleticks;
+ printf("CPU utilization during %s was %d %%\n", s, 100 - 100*idleticks/totalticks);
+#endif /* __osf__ */
+#ifdef AIX
+ long idle;
+
+ /* XXX compute a percentage here */
+ idle = (long)(sysinfo_stop.cpu[CPU_IDLE] - sysinfo_start.cpu[CPU_IDLE]);
+ printf("%ld idle ticks during %s.\n", idle, s);
+#endif /* AIX */
+}