From 54151d50e1b2ba9ca468d295e07271cadf3f783b Mon Sep 17 00:00:00 2001 From: mmdolze Date: Sun, 22 Mar 2009 09:03:55 +0000 Subject: [PATCH] Use kvm_getpcpu to access per-CPU usage data available since FreeBSD 7.1 --- ChangeLog | 1 + clients/lcdproc/machine_FreeBSD.c | 77 +++++++++++++++++++++++-------- configure.in | 2 +- 3 files changed, 61 insertions(+), 19 deletions(-) diff --git a/ChangeLog b/ChangeLog index f328a8d..c1fe3cb 100644 --- a/ChangeLog +++ b/ChangeLog @@ -65,6 +65,7 @@ v.0.5dev (ongoing development) * server: prevent stalling if time goes backwards (M. Vallevand) * hd44780 driver: update the backlight setting only on change + hd44780 driver: add lineaddress option to support ST7036 (Malte Poeggel) + + lcdproc: Retrieve per CPU usage statistics on FreeBSD (M. Dolze) v.0.5.2 * fix switching on/off the Load screen in lcdproc client using the menu diff --git a/clients/lcdproc/machine_FreeBSD.c b/clients/lcdproc/machine_FreeBSD.c index aa286c7..7a7a47e 100644 --- a/clients/lcdproc/machine_FreeBSD.c +++ b/clients/lcdproc/machine_FreeBSD.c @@ -59,11 +59,16 @@ # include #endif +#ifdef HAVE_SYS_PCPU_H +# include +#endif + #include "main.h" #include "machine.h" #include "shared/LL.h" static int pageshift; +static kvm_t *kvmd; #define pagetok(size) ((size) << pageshift) static int swapmode(int *retavail, int *retfree); @@ -82,11 +87,19 @@ int machine_init(void) /* we only need the amount of log(2)1024 for our conversion */ pageshift -= 10; + /* open kernel virtual memory */ + if ((kvmd = kvm_open(NULL, NULL, NULL, O_RDONLY, "kvm_open")) == NULL) + { + perror("kvm_open"); + return(FALSE); + } + return(TRUE); } int machine_close(void) { + kvm_close(kvmd); return(TRUE); } @@ -298,13 +311,6 @@ int machine_get_procs(LinkedList *procs) struct kinfo_proc *kprocs; int nproc, i; procinfo_type *p; - kvm_t *kvmd; - - if ((kvmd = kvm_open(NULL, NULL, NULL, O_RDONLY, "kvm_open")) == NULL) - { - perror("kvm_open"); - return(FALSE); - } kprocs = kvm_getprocs(kvmd, KERN_PROC_ALL, 0, &nproc); if (kprocs == NULL) @@ -341,8 +347,6 @@ int machine_get_procs(LinkedList *procs) kprocs++; } - kvm_close(kvmd); - return(TRUE); } @@ -350,7 +354,14 @@ int machine_get_smpload(load_type *result, int *numcpus) { int i, num; size_t size; - load_type curr_load; + load_type load; +#ifdef HAVE_SYS_PCPU_H + static load_type last_load[MAX_CPUS]; + struct pcpu *pcpudata; +#endif + + if (numcpus == NULL) + return(FALSE); size = sizeof(int); if (sysctlbyname("hw.ncpu", &num, &size, NULL, 0) < 0) { @@ -358,19 +369,49 @@ int machine_get_smpload(load_type *result, int *numcpus) return(FALSE); } - if (machine_get_load(&curr_load) == FALSE) - return(FALSE); - - if (numcpus == NULL) - return(FALSE); - /* restrict #CPUs to max. *numcpus */ num = (*numcpus >= num) ? num : *numcpus; *numcpus = num; - /* Don't know how to get per-cpu-load values */ +#ifndef HAVE_SYS_PCPU_H + if (machine_get_load(&load) == FALSE) + return(FALSE); +#endif + for (i = 0; i < num; i++) { - result[i] = curr_load; +#ifdef HAVE_SYS_PCPU_H + pcpudata = kvm_getpcpu(kvmd, i); + + if (pcpudata == NULL || pcpudata == -1) + return(FALSE); + + /* extract the data for single CPU */ + load.user = (unsigned long) (pcpudata->pc_cp_time[CP_USER]); + load.nice = (unsigned long) (pcpudata->pc_cp_time[CP_NICE]); + load.system = (unsigned long) (pcpudata->pc_cp_time[CP_SYS] + + pcpudata->pc_cp_time[CP_INTR]); + load.idle = (unsigned long) (pcpudata->pc_cp_time[CP_IDLE]); + load.total = load.user + load.nice + load.system + load.idle; + + /* store difference in result */ + result[i].user = load.user - last_load[i].user; + result[i].nice = load.nice - last_load[i].nice; + result[i].system = load.system - last_load[i].system; + result[i].idle = load.idle - last_load[i].idle; + result[i].total = load.total - last_load[i].total; + + /* store current value for next round */ + last_load[i].user = load.user; + last_load[i].nice = load.nice; + last_load[i].system = load.system; + last_load[i].idle = load.idle; + last_load[i].total = load.total; + + /* free pcpu buffer */ + free(pcpudata); +#else + result[i] = load; +#endif } return(TRUE); diff --git a/configure.in b/configure.in index c60c856..c034d85 100644 --- a/configure.in +++ b/configure.in @@ -108,7 +108,7 @@ AC_CHECK_LIB(kvm, kvm_open,[ ]) dnl NetBSD, OpenBSD and FreeBSD -AC_CHECK_HEADERS(sched.h sys/types.h machine/pio.h machine/sysarch.h sys/cpuvar.h machine/apm_bios.h) +AC_CHECK_HEADERS(sched.h sys/types.h machine/pio.h machine/sysarch.h sys/cpuvar.h machine/apm_bios.h sys/pcpu.h) ETR_SYSV_IPC ETR_UNION_SEMUN