Add SMP support for OpenBSD

This commit is contained in:
Jasper Lievisse Adriaanse
2014-09-01 15:21:31 +02:00
parent ed1b3f5834
commit 7326f8816d
2 changed files with 81 additions and 13 deletions

View File

@@ -26,18 +26,22 @@
#include <glibtop_suid.h> #include <glibtop_suid.h>
#include <sys/sched.h>
static const unsigned long _glibtop_sysdeps_cpu = static const unsigned long _glibtop_sysdeps_cpu =
(1L << GLIBTOP_CPU_TOTAL) + (1L << GLIBTOP_CPU_USER) + (1L << GLIBTOP_CPU_TOTAL) + (1L << GLIBTOP_CPU_USER) +
(1L << GLIBTOP_CPU_NICE) + (1L << GLIBTOP_CPU_SYS) + (1L << GLIBTOP_CPU_NICE) + (1L << GLIBTOP_CPU_SYS) +
(1L << GLIBTOP_CPU_IDLE) + (1L << GLIBTOP_CPU_FREQUENCY) + (1L << GLIBTOP_CPU_IDLE) + (1L << GLIBTOP_CPU_FREQUENCY) +
(1L << GLIBTOP_CPU_IRQ); (1L << GLIBTOP_CPU_IRQ);
static const unsigned long _glibtop_sysdeps_cpu_smp =
(1L << GLIBTOP_XCPU_TOTAL) + (1L << GLIBTOP_XCPU_USER) +
(1L << GLIBTOP_XCPU_NICE) + (1L << GLIBTOP_XCPU_SYS) +
(1L << GLIBTOP_XCPU_IDLE) + (1L << GLIBTOP_XCPU_IRQ);
/* MIB array for sysctl */ /* MIB array for sysctl */
static int mib_length=2; static int mib_length=2;
static int mib [] = { CTL_KERN, KERN_CLOCKRATE }; static int mib_cr [] = { CTL_KERN, KERN_CLOCKRATE };
static int mib2 [] = { CTL_KERN, KERN_CPTIME }; static int mib_cptime [] = { CTL_KERN, KERN_CPTIME };
static int mib_cptime_s [] = { CTL_KERN, KERN_CPTIME2, 0 };
/* Init function. */ /* Init function. */
@@ -45,6 +49,9 @@ void
_glibtop_init_cpu_s (glibtop *server) _glibtop_init_cpu_s (glibtop *server)
{ {
server->sysdeps.cpu = _glibtop_sysdeps_cpu; server->sysdeps.cpu = _glibtop_sysdeps_cpu;
if (server->ncpu)
server->sysdeps.cpu |= _glibtop_sysdeps_cpu_smp;
} }
/* Provides information about cpu usage. */ /* Provides information about cpu usage. */
@@ -52,13 +59,13 @@ _glibtop_init_cpu_s (glibtop *server)
void void
glibtop_get_cpu_s (glibtop *server, glibtop_cpu *buf) glibtop_get_cpu_s (glibtop *server, glibtop_cpu *buf)
{ {
gulong cpts [CPUSTATES]; long cpts [CPUSTATES];
int64_t *cp_times = NULL;
/* sysctl vars*/
struct clockinfo ci; struct clockinfo ci;
size_t length; size_t length;
int ncpu, i;
glibtop_init_p (server, (1L << GLIBTOP_SYSDEPS_CPU), 0); glibtop_init_s (&server, GLIBTOP_SYSDEPS_CPU, 0);
memset (buf, 0, sizeof (glibtop_cpu)); memset (buf, 0, sizeof (glibtop_cpu));
@@ -67,14 +74,14 @@ glibtop_get_cpu_s (glibtop *server, glibtop_cpu *buf)
return; return;
length = sizeof (cpts); length = sizeof (cpts);
if (sysctl (mib2, mib_length, cpts, &length, NULL, 0)) { if (sysctl (mib_cptime, mib_length, cpts, &length, NULL, 0)) {
glibtop_warn_io_r (server, "sysctl (kern.cptime)"); glibtop_warn_io_r (server, "sysctl (kern.cptime)");
return; return;
} }
/* Get the clockrate data */ /* Get the clockrate data */
length = sizeof (struct clockinfo); length = sizeof (struct clockinfo);
if (sysctl (mib, mib_length, &ci, &length, NULL, 0)) { if (sysctl (mib_cr, mib_length, &ci, &length, NULL, 0)) {
glibtop_warn_io_r (server, "sysctl (kern.clockrate)"); glibtop_warn_io_r (server, "sysctl (kern.clockrate)");
return; return;
} }
@@ -87,15 +94,55 @@ glibtop_get_cpu_s (glibtop *server, glibtop_cpu *buf)
buf->sys = cpts [CP_SYS]; buf->sys = cpts [CP_SYS];
/* set idle time */ /* set idle time */
buf->idle = cpts [CP_IDLE]; buf->idle = cpts [CP_IDLE];
/* set interrupt time */ /* set irq */
buf->irq = cpts [CP_INTR]; buf->irq = cpts [CP_INTR];
/* set frequency */ /* set frequency */
buf->frequency = ci.hz; buf->frequency = (ci.stathz ? ci.stathz : ci.hz);
/* set total */ /* set total */
buf->total = cpts [CP_USER] + cpts [CP_NICE] buf->total = cpts [CP_USER] + cpts [CP_NICE] \
+ cpts [CP_SYS] + cpts [CP_IDLE] + cpts [CP_INTR]; + cpts [CP_SYS] + cpts [CP_IDLE] + cpts [CP_INTR];
ncpu = server->ncpu + 1;
/*
if (!cp_times) {
if ((cp_times = calloc(sizeof(int64_t *), ncpu)) == NULL)
return;
}
*/
length = CPUSTATES * sizeof(int64_t);
for (i = 0; i < ncpu; i++) {
mib_cptime_s[2] = i;
cp_times = g_malloc (length);
if (sysctl (mib_cptime_s, 3, cp_times, &length, NULL, 0) < 0)
free(cp_times);
if (cp_times) {
buf->xcpu_user[i] = cp_times[CP_USER];
buf->xcpu_nice[i] = cp_times[CP_NICE];
buf->xcpu_sys[i] = cp_times[CP_SYS];
buf->xcpu_idle[i] = cp_times[CP_IDLE];
buf->xcpu_irq[i] = cp_times[CP_INTR];
} else {
buf->xcpu_user[i] = cpts [CP_USER] / ncpu;
buf->xcpu_nice[i] = cpts [CP_NICE] / ncpu;
buf->xcpu_sys[i] = cpts [CP_SYS] / ncpu;
buf->xcpu_idle[i] = cpts [CP_IDLE] / ncpu;
buf->xcpu_irq[i] = cpts [CP_INTR] / ncpu;
}
buf->xcpu_total[i] = buf->xcpu_user[i] + buf->xcpu_nice[i] \
+ buf->xcpu_sys[i] + buf->xcpu_idle[i] \
+ buf->xcpu_irq[i];
}
g_free (cp_times);
/* Set the flags last. */ /* Set the flags last. */
buf->flags = _glibtop_sysdeps_cpu; buf->flags = _glibtop_sysdeps_cpu;
if (ncpu > 1) {
buf->flags |= _glibtop_sysdeps_cpu_smp;
}
} }

View File

@@ -23,6 +23,8 @@
#include <sys/types.h> #include <sys/types.h>
#include <glibtop.h> #include <glibtop.h>
#include <glibtop/open.h> #include <glibtop/open.h>
#include <glibtop/cpu.h>
#include <glibtop/error.h>
#include <glibtop_private.h> #include <glibtop_private.h>
@@ -32,5 +34,24 @@ glibtop_open_s (glibtop *server, const char *program_name,
const unsigned long features, const unsigned long features,
const unsigned flags) const unsigned flags)
{ {
int ncpus = 1;
int mib[2] = { CTL_HW, HW_NCPU };
size_t len;
len = sizeof(ncpus);
if (sysctl(mib, 2, &ncpus, &len, NULL, 0) != 0)
printf("Couldn't determine hw.ncpu.\n");
server->real_ncpu = ncpus - 1;
server->ncpu = MIN(GLIBTOP_NCPU - 1, server->real_ncpu);
server->os_version_code = OpenBSD; server->os_version_code = OpenBSD;
if (server->real_ncpu != server->ncpu) {
glibtop_warn_r(server,
"This machine has %d CPUs, "
"%d are being monitored.",
server->real_ncpu + 1,
server->ncpu + 1);
}
} }