From: Justin Pettit Date: Fri, 10 Jul 2009 22:09:41 +0000 (-0700) Subject: Provide ability to retrieve coverage information X-Git-Tag: v0.90.3~3^2~21 X-Git-Url: http://git.onelab.eu/?a=commitdiff_plain;h=f5c6854a73cb6242297e3aac02ccf2d6a22876b0;p=sliver-openvswitch.git Provide ability to retrieve coverage information Previously, there was no way to induce coverage information to be displayed; it would only print when the system noticed unusual delays between polling intervals. Now, production of coverage logs can be forced with "coverage/log" command in ovs-appctl. Coverage counters may be reset with "coverage/clear". --- diff --git a/lib/coverage.c b/lib/coverage.c index eaa441c0d..e86aa0299 100644 --- a/lib/coverage.c +++ b/lib/coverage.c @@ -21,6 +21,7 @@ #include "coverage-counters.h" #include "dynamic-string.h" #include "hash.h" +#include "unixctl.h" #include "util.h" #define THIS_MODULE VLM_coverage @@ -28,6 +29,27 @@ static unsigned int epoch; +static void +coverage_unixctl_log(struct unixctl_conn *conn, const char *args UNUSED) +{ + coverage_log(VLL_WARN, false); + unixctl_command_reply(conn, 200, NULL); +} + +static void +coverage_unixctl_clear(struct unixctl_conn *conn, const char *args UNUSED) +{ + coverage_clear(); + unixctl_command_reply(conn, 200, NULL); +} + +void +coverage_init(void) +{ + unixctl_command_register("coverage/log", coverage_unixctl_log); + unixctl_command_register("coverage/clear", coverage_unixctl_clear); +} + /* Sorts coverage counters in descending order by count, within equal counts * alphabetically by name. */ static int @@ -107,9 +129,10 @@ coverage_log_counter(enum vlog_level level, const struct coverage_counter *c) VLOG(level, "%-24s %5u / %9llu", c->name, c->count, c->count + c->total); } -/* Logs the coverage counters at the given vlog 'level'. */ +/* Logs the coverage counters at the given vlog 'level'. If + * 'suppress_dups' is true, then duplicate events are not displayed. */ void -coverage_log(enum vlog_level level) +coverage_log(enum vlog_level level, bool suppress_dups) { size_t n_never_hit; uint32_t hash; @@ -119,11 +142,13 @@ coverage_log(enum vlog_level level) return; } - hash = coverage_hash(); - if (coverage_hit(hash)) { - VLOG(level, "Skipping details of duplicate event coverage for " - "hash=%08"PRIx32" in epoch %u", hash, epoch); - return; + if (suppress_dups) { + hash = coverage_hash(); + if (coverage_hit(hash)) { + VLOG(level, "Skipping details of duplicate event coverage for " + "hash=%08"PRIx32" in epoch %u", hash, epoch); + return; + } } n_never_hit = 0; diff --git a/lib/coverage.h b/lib/coverage.h index f5ae99037..aa93630be 100644 --- a/lib/coverage.h +++ b/lib/coverage.h @@ -52,7 +52,8 @@ struct coverage_counter { NAME##_count.count += AMOUNT; \ } while (0) -void coverage_log(enum vlog_level); +void coverage_init(void); +void coverage_log(enum vlog_level, bool suppress_dups); void coverage_clear(void); #endif /* coverage.h */ diff --git a/lib/timeval.c b/lib/timeval.c index 61f2227f0..4c34a1731 100644 --- a/lib/timeval.c +++ b/lib/timeval.c @@ -63,6 +63,8 @@ time_init(void) return; } + coverage_init(); + inited = true; gettimeofday(&now, NULL); tick = false; @@ -292,7 +294,7 @@ log_poll_interval(long long int last_wakeup, const struct rusage *last_rusage) rusage.ru_nvcsw - last_rusage->ru_nvcsw, rusage.ru_nivcsw - last_rusage->ru_nivcsw); } - coverage_log(VLL_WARN); + coverage_log(VLL_WARN, true); } /* Update exponentially weighted moving average. With these parameters, a