From 7326f8816d025a31b9625e9b1776c1bf455f5793 Mon Sep 17 00:00:00 2001 From: Jasper Lievisse Adriaanse Date: Mon, 1 Sep 2014 15:21:31 +0200 Subject: [PATCH] Add SMP support for OpenBSD --- sysdeps/openbsd/cpu.c | 73 ++++++++++++++++++++++++++++++++++-------- sysdeps/openbsd/open.c | 21 ++++++++++++ 2 files changed, 81 insertions(+), 13 deletions(-) diff --git a/sysdeps/openbsd/cpu.c b/sysdeps/openbsd/cpu.c index efc25c64..e15f7cbe 100644 --- a/sysdeps/openbsd/cpu.c +++ b/sysdeps/openbsd/cpu.c @@ -26,18 +26,22 @@ #include -#include - static const unsigned long _glibtop_sysdeps_cpu = (1L << GLIBTOP_CPU_TOTAL) + (1L << GLIBTOP_CPU_USER) + (1L << GLIBTOP_CPU_NICE) + (1L << GLIBTOP_CPU_SYS) + (1L << GLIBTOP_CPU_IDLE) + (1L << GLIBTOP_CPU_FREQUENCY) + (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 */ static int mib_length=2; -static int mib [] = { CTL_KERN, KERN_CLOCKRATE }; -static int mib2 [] = { CTL_KERN, KERN_CPTIME }; +static int mib_cr [] = { CTL_KERN, KERN_CLOCKRATE }; +static int mib_cptime [] = { CTL_KERN, KERN_CPTIME }; +static int mib_cptime_s [] = { CTL_KERN, KERN_CPTIME2, 0 }; /* Init function. */ @@ -45,6 +49,9 @@ void _glibtop_init_cpu_s (glibtop *server) { server->sysdeps.cpu = _glibtop_sysdeps_cpu; + + if (server->ncpu) + server->sysdeps.cpu |= _glibtop_sysdeps_cpu_smp; } /* Provides information about cpu usage. */ @@ -52,13 +59,13 @@ _glibtop_init_cpu_s (glibtop *server) void glibtop_get_cpu_s (glibtop *server, glibtop_cpu *buf) { - gulong cpts [CPUSTATES]; - - /* sysctl vars*/ + long cpts [CPUSTATES]; + int64_t *cp_times = NULL; struct clockinfo ci; 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)); @@ -67,14 +74,14 @@ glibtop_get_cpu_s (glibtop *server, glibtop_cpu *buf) return; 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)"); return; } /* Get the clockrate data */ 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)"); return; } @@ -87,15 +94,55 @@ glibtop_get_cpu_s (glibtop *server, glibtop_cpu *buf) buf->sys = cpts [CP_SYS]; /* set idle time */ buf->idle = cpts [CP_IDLE]; - /* set interrupt time */ + /* set irq */ buf->irq = cpts [CP_INTR]; /* set frequency */ - buf->frequency = ci.hz; + buf->frequency = (ci.stathz ? ci.stathz : ci.hz); /* 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]; + 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. */ buf->flags = _glibtop_sysdeps_cpu; + + if (ncpu > 1) { + buf->flags |= _glibtop_sysdeps_cpu_smp; + } } diff --git a/sysdeps/openbsd/open.c b/sysdeps/openbsd/open.c index 53e3f83e..ad945e96 100644 --- a/sysdeps/openbsd/open.c +++ b/sysdeps/openbsd/open.c @@ -23,6 +23,8 @@ #include #include #include +#include +#include #include @@ -32,5 +34,24 @@ glibtop_open_s (glibtop *server, const char *program_name, const unsigned long features, 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; + + 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); + } }