Use kvm_getpcpu to access per-CPU usage data available since FreeBSD 7.1
This commit is contained in:
@@ -65,6 +65,7 @@ v.0.5dev (ongoing development)
|
|||||||
* server: prevent stalling if time goes backwards (M. Vallevand)
|
* server: prevent stalling if time goes backwards (M. Vallevand)
|
||||||
* hd44780 driver: update the backlight setting only on change
|
* hd44780 driver: update the backlight setting only on change
|
||||||
+ hd44780 driver: add lineaddress option to support ST7036 (Malte Poeggel)
|
+ hd44780 driver: add lineaddress option to support ST7036 (Malte Poeggel)
|
||||||
|
+ lcdproc: Retrieve per CPU usage statistics on FreeBSD (M. Dolze)
|
||||||
|
|
||||||
v.0.5.2
|
v.0.5.2
|
||||||
* fix switching on/off the Load screen in lcdproc client using the menu
|
* fix switching on/off the Load screen in lcdproc client using the menu
|
||||||
|
|||||||
@@ -59,11 +59,16 @@
|
|||||||
# include <machine/apm_bios.h>
|
# include <machine/apm_bios.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef HAVE_SYS_PCPU_H
|
||||||
|
# include <sys/pcpu.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
#include "main.h"
|
#include "main.h"
|
||||||
#include "machine.h"
|
#include "machine.h"
|
||||||
#include "shared/LL.h"
|
#include "shared/LL.h"
|
||||||
|
|
||||||
static int pageshift;
|
static int pageshift;
|
||||||
|
static kvm_t *kvmd;
|
||||||
#define pagetok(size) ((size) << pageshift)
|
#define pagetok(size) ((size) << pageshift)
|
||||||
static int swapmode(int *retavail, int *retfree);
|
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 */
|
/* we only need the amount of log(2)1024 for our conversion */
|
||||||
pageshift -= 10;
|
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);
|
return(TRUE);
|
||||||
}
|
}
|
||||||
|
|
||||||
int machine_close(void)
|
int machine_close(void)
|
||||||
{
|
{
|
||||||
|
kvm_close(kvmd);
|
||||||
return(TRUE);
|
return(TRUE);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -298,13 +311,6 @@ int machine_get_procs(LinkedList *procs)
|
|||||||
struct kinfo_proc *kprocs;
|
struct kinfo_proc *kprocs;
|
||||||
int nproc, i;
|
int nproc, i;
|
||||||
procinfo_type *p;
|
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);
|
kprocs = kvm_getprocs(kvmd, KERN_PROC_ALL, 0, &nproc);
|
||||||
if (kprocs == NULL)
|
if (kprocs == NULL)
|
||||||
@@ -341,8 +347,6 @@ int machine_get_procs(LinkedList *procs)
|
|||||||
kprocs++;
|
kprocs++;
|
||||||
}
|
}
|
||||||
|
|
||||||
kvm_close(kvmd);
|
|
||||||
|
|
||||||
return(TRUE);
|
return(TRUE);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -350,7 +354,14 @@ int machine_get_smpload(load_type *result, int *numcpus)
|
|||||||
{
|
{
|
||||||
int i, num;
|
int i, num;
|
||||||
size_t size;
|
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);
|
size = sizeof(int);
|
||||||
if (sysctlbyname("hw.ncpu", &num, &size, NULL, 0) < 0) {
|
if (sysctlbyname("hw.ncpu", &num, &size, NULL, 0) < 0) {
|
||||||
@@ -358,19 +369,49 @@ int machine_get_smpload(load_type *result, int *numcpus)
|
|||||||
return(FALSE);
|
return(FALSE);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (machine_get_load(&curr_load) == FALSE)
|
|
||||||
return(FALSE);
|
|
||||||
|
|
||||||
if (numcpus == NULL)
|
|
||||||
return(FALSE);
|
|
||||||
|
|
||||||
/* restrict #CPUs to max. *numcpus */
|
/* restrict #CPUs to max. *numcpus */
|
||||||
num = (*numcpus >= num) ? num : *numcpus;
|
num = (*numcpus >= num) ? num : *numcpus;
|
||||||
*numcpus = num;
|
*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++) {
|
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);
|
return(TRUE);
|
||||||
|
|||||||
+1
-1
@@ -108,7 +108,7 @@ AC_CHECK_LIB(kvm, kvm_open,[
|
|||||||
])
|
])
|
||||||
|
|
||||||
dnl NetBSD, OpenBSD and FreeBSD
|
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_SYSV_IPC
|
||||||
ETR_UNION_SEMUN
|
ETR_UNION_SEMUN
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user