X-Git-Url: http://git.cascardo.eti.br/?a=blobdiff_plain;f=lib%2Fperf-counter.c;h=62e2d76ddfc816c026ae413c5f9f4ef58241e62e;hb=968eec593cc61690c9e0ed97450c4889258381af;hp=e2eaefc02b979b1282699a05a8ce7ba4de5ed758;hpb=619c3a42dc1e3fb4e5d0afb3c926ac3d1e7ea7a2;p=cascardo%2Fovs.git diff --git a/lib/perf-counter.c b/lib/perf-counter.c index e2eaefc02..62e2d76dd 100644 --- a/lib/perf-counter.c +++ b/lib/perf-counter.c @@ -15,7 +15,9 @@ */ /* This implementation only applies to the Linux platform. */ -#ifdef __linux__ + +#include +#if defined(__linux__) && defined(HAVE_LINUX_PERF_EVENT_H) #include #include @@ -24,24 +26,20 @@ #include #include #include -#include #include "dynamic-string.h" -#include "openvswitch/vlog.h" #include "perf-counter.h" #include "shash.h" #include "util.h" -VLOG_DEFINE_THIS_MODULE(perf_counter); - -static struct shash perf_counters; +static struct shash perf_counters = SHASH_INITIALIZER(&perf_counters); static int fd__ = 0; uint64_t perf_counter_read(uint64_t *counter) { - if (fd__ > 0) { - read(fd__, counter, sizeof(*counter)); - } else { + int size = sizeof *counter; + + if (fd__ <= 0 || read(fd__, counter, size) < size) { *counter = 0; } @@ -75,9 +73,7 @@ perf_event_setup(void) pe.exclude_hv = 1; fd__ = perf_event_open(&pe, 0, -1, -1, 0); - if (fd__ == -1) { - VLOG_ERR("Peformance counter is not available on this platform.\n"); - } else { + if (fd__ > 0) { ioctl(fd__, PERF_EVENT_IOC_RESET, 0); ioctl(fd__, PERF_EVENT_IOC_ENABLE, 0); } @@ -115,8 +111,8 @@ perf_counter_to_ds(struct ds *ds, struct perf_counter *pfc) ratio = 0.0; } - ds_put_format(ds, "%-40s%12lu%12lu%12.1f\n", pfc->name, pfc->n_events, - pfc->total_count, ratio); + ds_put_format(ds, "%-40s%12"PRIu64"%12"PRIu64"%12.1f\n", + pfc->name, pfc->n_events, pfc->total_count, ratio); } static void