--- ./panel-plugin/devperf.c.orig 2012-04-03 10:22:41.000000000 -0300 +++ ./panel-plugin/devperf.c 2013-09-11 17:45:00.000000000 -0300 @@ -225,6 +225,94 @@ /************************** Linux End ***************/ +#elif defined(__FreeBSD__) + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define MAXNAMELEN 256 + +int DevPerfInit () +{ + return (0); +} + +int DevCheckStatAvailability(char const **strptr) +{ + return (0); +} + +int DevGetPerfData (const void *p_pvDevice, struct devperf_t *perf) +{ + struct timeval tv; + struct timespec ts; + struct statinfo stats; + struct devinfo dinfo; + struct devstat dev; + kvm_t *kd = NULL; + int i, found = 0; + char *check_dev = (char *) p_pvDevice; + + memset(&stats, 0, sizeof(stats)); + memset(&dinfo, 0, sizeof(dinfo)); + stats.dinfo = &dinfo; + + if(devstat_getdevs(kd, &stats) == -1) { + syslog(0, "DISKPERF: getdevs fail"); + } + + for(found = 0, i = 0; i < (stats.dinfo)->numdevs; i++) { + char dev_name[MAXNAMELEN]; + dev = (stats.dinfo)->devices[i]; + snprintf(dev_name, MAXNAMELEN-1, "%s%d", + dev.device_name, dev.unit_number); + if ((check_dev != NULL) && (strcmp(check_dev, dev_name) != 0)) + continue; + else { + found = 1; + break; + } + + } + + if(check_dev != NULL && found) { + perf->wbytes = dev.bytes[DEVSTAT_WRITE]; + perf->rbytes = dev.bytes[DEVSTAT_READ]; + gettimeofday (&tv, 0); + perf->timestamp_ns = (uint64_t)1000ull * 1000ull * 1000ull * + tv.tv_sec + 1000ull * tv.tv_usec; + perf->qlen = dev.start_count - dev.end_count; + // I'm not sure about rbusy and wbusy calculation + bintime2timespec(&dev.busy_time, &ts); + perf->rbusy_ns = (uint64_t) ts.tv_nsec; + perf->wbusy_ns = perf->rbusy_ns; + } + + return (0); +} + +#if 0 /* Standalone test purpose */ +int main () +{ + struct devperf_t oPerf; + DevGetPerfData ((void*)"ada0", &oPerf); + printf ("%lu\t%lu\n", oPerf.rbytes, oPerf.wbytes); + return (0); +} +#endif + + #elif defined(__NetBSD__) /**************************************************************/