[ovs-dev] [stress 3/4] coverage: Make the coverage counters catalog program-specific.

Ben Pfaff blp at nicira.com
Tue Nov 30 18:46:27 UTC 2010


Thanks for the reviews of 1, 2, and 3.  I pushed just those out to
master now.

I'm going to re-send #4 since as sent it has some merge conflicts
against current master.

On Mon, Nov 29, 2010 at 03:51:44PM -0800, Ethan Jackson wrote:
> Looks Good.
> 
> On Mon, Nov 1, 2010 at 4:13 PM, Ben Pfaff <blp at nicira.com> wrote:
> > Until now, the collection of coverage counters supported by a given OVS
> > program was not specific to that program.  That means that, for example,
> > even though ovs-dpctl does not have anything to do with mac_learning, it
> > still has a coverage counter for it.  This is confusing, at best.
> >
> > This commit fixes the problem on some systems, in particular on ones that
> > use GCC and the GNU linker.  It uses the feature of the GNU linker
> > described in its manual as:
> >
> >    If an orphaned section's name is representable as a C identifier then
> >    the linker will automatically see PROVIDE two symbols: __start_SECNAME
> >    and __end_SECNAME, where SECNAME is the name of the section.  These
> >    indicate the start address and end address of the orphaned section
> >    respectively.
> >
> > Systems that don't support these features retain the earlier behavior.
> >
> > This commit also fixes the annoyance that files that include coverage
> > counters must be listed on COVERAGE_FILES in lib/automake.mk.
> >
> > This commit also fixes the annoyance that modifying any source file that
> > includes a coverage counter caused all programs that link against
> > libopenvswitch.a to relink, even programs that the source file was not
> > linked into.  For example, modifying ofproto/ofproto.c (which includes
> > coverage counters) caused tests/test-aes128 to relink, even though
> > test-aes128 does not link again ofproto.o.
> > ---
> >  lib/automake.mk         |   37 +++++--------------------------------
> >  lib/coverage-counters.h |   25 -------------------------
> >  lib/coverage-scan.pl    |   47 -----------------------------------------------
> >  lib/coverage.c          |   36 +++++++++++++++++++++++++++---------
> >  lib/coverage.h          |   38 ++++++++++++++++++++++----------------
> >  lib/dpif.c              |   13 +++++++++++++
> >  lib/flow.c              |    2 ++
> >  lib/hmap.c              |    5 +++++
> >  lib/lockfile.c          |    5 +++++
> >  lib/mac-learning.c      |    3 +++
> >  lib/netdev-linux.c      |    8 ++++++++
> >  lib/netdev.c            |    5 +++++
> >  lib/netlink.c           |    6 ++++++
> >  lib/poll-loop.c         |    3 +++
> >  lib/process.c           |    5 +++++
> >  lib/rconn.c             |    5 +++++
> >  lib/rtnetlink.c         |    2 ++
> >  lib/stream-ssl.c        |    3 +++
> >  lib/stream.c            |    3 +++
> >  lib/unixctl.c           |    3 +++
> >  lib/util.c              |    2 ++
> >  lib/vconn.c             |    4 ++++
> >  ofproto/ofproto.c       |   31 +++++++++++++++++++++++++++++++
> >  ofproto/pktbuf.c        |    5 +++++
> >  vswitchd/bridge.c       |    4 ++++
> >  25 files changed, 171 insertions(+), 129 deletions(-)
> >  delete mode 100644 lib/coverage-counters.h
> >  delete mode 100755 lib/coverage-scan.pl
> >
> > diff --git a/lib/automake.mk b/lib/automake.mk
> > index d32caaf..4c9e8f0 100644
> > --- a/lib/automake.mk
> > +++ b/lib/automake.mk
> > @@ -24,7 +24,6 @@ lib_libopenvswitch_a_SOURCES = \
> >        lib/compiler.h \
> >        lib/coverage.c \
> >        lib/coverage.h \
> > -       lib/coverage-counters.h \
> >        lib/csum.c \
> >        lib/csum.h \
> >        lib/daemon.c \
> > @@ -151,7 +150,6 @@ lib_libopenvswitch_a_SOURCES = \
> >        lib/vlog.c \
> >        lib/vlog.h
> >  nodist_lib_libopenvswitch_a_SOURCES = \
> > -       lib/coverage-counters.c \
> >        lib/dirs.c
> >  CLEANFILES += $(nodist_lib_libopenvswitch_a_SOURCES)
> >
> > @@ -237,6 +235,7 @@ lib-install-data-local:
> >        $(MKDIR_P) $(DESTDIR)$(PKIDIR)
> >        $(MKDIR_P) $(DESTDIR)$(LOGDIR)
> >
> > +if !USE_LINKER_SECTIONS
> >  # All distributed sources, with names adjust properly for referencing
> >  # from $(builddir).
> >  all_sources = \
> > @@ -248,37 +247,11 @@ all_sources = \
> >                fi; \
> >         done`
> >
> > -# All the source files that have coverage counters.
> > -COVERAGE_FILES = \
> > -       lib/dpif.c \
> > -       lib/flow.c \
> > -       lib/lockfile.c \
> > -       lib/hmap.c \
> > -       lib/mac-learning.c \
> > -       lib/netdev.c \
> > -       lib/netdev-linux.c \
> > -       lib/netlink.c \
> > -       lib/odp-util.c \
> > -       lib/poll-loop.c \
> > -       lib/process.c \
> > -       lib/rconn.c \
> > -       lib/rtnetlink.c \
> > -       lib/stream.c \
> > -       lib/stream-ssl.c \
> > -       lib/timeval.c \
> > -       lib/unixctl.c \
> > -       lib/util.c \
> > -       lib/vconn.c \
> > -       ofproto/ofproto.c \
> > -       ofproto/pktbuf.c \
> > -       vswitchd/bridge.c \
> > -       vswitchd/ovs-brcompatd.c
> > -lib/coverage-counters.c: $(COVERAGE_FILES) lib/coverage-scan.pl
> > -       (cd $(srcdir) && $(PERL) lib/coverage-scan.pl $(COVERAGE_FILES)) > $@.tmp
> > -       mv $@.tmp $@
> > -EXTRA_DIST += lib/coverage-scan.pl
> > +lib/coverage.$(OBJEXT): lib/coverage.def
> > +lib/coverage.def: $(DIST_SOURCES)
> > +       sed -n 's|^COVERAGE_DEFINE(\([_a-zA-Z0-9]\{1,\}\)).*$$|COVERAGE_COUNTER(\1)|p' $(all_sources) | LC_ALL=C sort -u > $@
> > +CLEANFILES += lib/coverage.def
> >
> > -if !USE_LINKER_SECTIONS
> >  lib/vlog.$(OBJEXT): lib/vlog-modules.def
> >  lib/vlog-modules.def: $(DIST_SOURCES)
> >        sed -n 's|^VLOG_DEFINE_\(THIS_\)\{0,1\}MODULE(\([_a-zA-Z0-9]\{1,\}\)).*$$|VLOG_MODULE(\2)|p' $(all_sources) | LC_ALL=C sort -u > $@
> > diff --git a/lib/coverage-counters.h b/lib/coverage-counters.h
> > deleted file mode 100644
> > index 8bf595c..0000000
> > --- a/lib/coverage-counters.h
> > +++ /dev/null
> > @@ -1,25 +0,0 @@
> > -/*
> > - * Copyright (c) 2009 Nicira Networks.
> > - *
> > - * Licensed under the Apache License, Version 2.0 (the "License");
> > - * you may not use this file except in compliance with the License.
> > - * You may obtain a copy of the License at:
> > - *
> > - *     http://www.apache.org/licenses/LICENSE-2.0
> > - *
> > - * Unless required by applicable law or agreed to in writing, software
> > - * distributed under the License is distributed on an "AS IS" BASIS,
> > - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
> > - * See the License for the specific language governing permissions and
> > - * limitations under the License.
> > - */
> > -
> > -#ifndef COVERAGE_COUNTERS_H
> > -#define COVERAGE_COUNTERS_H 1
> > -
> > -#include <stddef.h>
> > -
> > -extern struct coverage_counter *coverage_counters[];
> > -extern size_t coverage_n_counters;
> > -
> > -#endif /* coverage.h */
> > diff --git a/lib/coverage-scan.pl b/lib/coverage-scan.pl
> > deleted file mode 100755
> > index caea0b7..0000000
> > --- a/lib/coverage-scan.pl
> > +++ /dev/null
> > @@ -1,47 +0,0 @@
> > -# Copyright (c) 2009 Nicira Networks.
> > -#
> > -# Licensed under the Apache License, Version 2.0 (the "License");
> > -# you may not use this file except in compliance with the License.
> > -# You may obtain a copy of the License at:
> > -#
> > -#     http://www.apache.org/licenses/LICENSE-2.0
> > -#
> > -# Unless required by applicable law or agreed to in writing, software
> > -# distributed under the License is distributed on an "AS IS" BASIS,
> > -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
> > -# See the License for the specific language governing permissions and
> > -# limitations under the License.
> > -
> > -use strict;
> > -use warnings;
> > -
> > -my %counters;
> > -while (<>) {
> > -    my ($counter) = /^\s*COVERAGE_(?:INC|ADD)\s*\(\s*([a-zA-Z_][a-zA-Z_0-9]*)/
> > -      or next;
> > -    push (@{$counters{$counter}}, "$ARGV:$.");
> > -} continue {
> > -    # This magic resets $. from one file to the next.  See "perldoc -f eof".
> > -    close ARGV if eof;
> > -}
> > -
> > -print <<EOF;
> > -#include "coverage-counters.h"
> > -#include <stddef.h>
> > -#include "coverage.h"
> > -#include "util.h"
> > -
> > -EOF
> > -
> > -for my $counter (sort(keys(%counters))) {
> > -    my $locations = join(', ', @{$counters{$counter}});
> > -    print <<EOF;
> > -/* $locations */
> > -struct coverage_counter ${counter}_count = { "$counter", 0, 0 };
> > -
> > -EOF
> > -}
> > -print "struct coverage_counter *coverage_counters[] = {\n";
> > -print "    \&${_}_count,\n" foreach (sort(keys(%counters)));
> > -print "};\n";
> > -print "size_t coverage_n_counters = ARRAY_SIZE(coverage_counters);\n";
> > diff --git a/lib/coverage.c b/lib/coverage.c
> > index 40af3ac..2b8b6e6 100644
> > --- a/lib/coverage.c
> > +++ b/lib/coverage.c
> > @@ -18,7 +18,6 @@
> >  #include "coverage.h"
> >  #include <inttypes.h>
> >  #include <stdlib.h>
> > -#include "coverage-counters.h"
> >  #include "dynamic-string.h"
> >  #include "hash.h"
> >  #include "unixctl.h"
> > @@ -27,6 +26,25 @@
> >
> >  VLOG_DEFINE_THIS_MODULE(coverage);
> >
> > +/* The coverage counters. */
> > +#if USE_LINKER_SECTIONS
> > +extern struct coverage_counter *__start_coverage[];
> > +extern struct coverage_counter *__stop_coverage[];
> > +#define coverage_counters __start_coverage
> > +#define n_coverage_counters  (__stop_coverage - __start_coverage)
> > +#else  /* !USE_LINKER_SECTIONS */
> > +#define COVERAGE_COUNTER(NAME) COVERAGE_DEFINE__(NAME);
> > +#include "coverage.def"
> > +#undef COVERAGE_COUNTER
> > +
> > +struct coverage_counter *coverage_counters[] = {
> > +#define COVERAGE_COUNTER(NAME) &counter_##NAME,
> > +#include "coverage.def"
> > +#undef COVERAGE_COUNTER
> > +};
> > +#define n_coverage_counters ARRAY_SIZE(coverage_counters)
> > +#endif  /* !USE_LINKER_SECTIONS */
> > +
> >  static unsigned int epoch;
> >
> >  static void
> > @@ -67,15 +85,15 @@ coverage_hash(void)
> >     int n_groups, i;
> >
> >     /* Sort coverage counters into groups with equal counts. */
> > -    c = xmalloc(coverage_n_counters * sizeof *c);
> > -    for (i = 0; i < coverage_n_counters; i++) {
> > +    c = xmalloc(n_coverage_counters * sizeof *c);
> > +    for (i = 0; i < n_coverage_counters; i++) {
> >         c[i] = coverage_counters[i];
> >     }
> > -    qsort(c, coverage_n_counters, sizeof *c, compare_coverage_counters);
> > +    qsort(c, n_coverage_counters, sizeof *c, compare_coverage_counters);
> >
> >     /* Hash the names in each group along with the rank. */
> >     n_groups = 0;
> > -    for (i = 0; i < coverage_n_counters; ) {
> > +    for (i = 0; i < n_coverage_counters; ) {
> >         int j;
> >
> >         if (!c[i]->count) {
> > @@ -83,7 +101,7 @@ coverage_hash(void)
> >         }
> >         n_groups++;
> >         hash = hash_int(i, hash);
> > -        for (j = i; j < coverage_n_counters; j++) {
> > +        for (j = i; j < n_coverage_counters; j++) {
> >             if (c[j]->count != c[i]->count) {
> >                 break;
> >             }
> > @@ -150,13 +168,13 @@ coverage_log(enum vlog_level level, bool suppress_dups)
> >     n_never_hit = 0;
> >     VLOG(level, "Event coverage (epoch %u/entire run), hash=%08"PRIx32":",
> >          epoch, hash);
> > -    for (i = 0; i < coverage_n_counters; i++) {
> > +    for (i = 0; i < n_coverage_counters; i++) {
> >         struct coverage_counter *c = coverage_counters[i];
> >         if (c->count) {
> >             coverage_log_counter(level, c);
> >         }
> >     }
> > -    for (i = 0; i < coverage_n_counters; i++) {
> > +    for (i = 0; i < n_coverage_counters; i++) {
> >         struct coverage_counter *c = coverage_counters[i];
> >         if (!c->count) {
> >             if (c->total) {
> > @@ -176,7 +194,7 @@ coverage_clear(void)
> >     size_t i;
> >
> >     epoch++;
> > -    for (i = 0; i < coverage_n_counters; i++) {
> > +    for (i = 0; i < n_coverage_counters; i++) {
> >         struct coverage_counter *c = coverage_counters[i];
> >         c->total += c->count;
> >         c->count = 0;
> > diff --git a/lib/coverage.h b/lib/coverage.h
> > index aa93630..d816fb6 100644
> > --- a/lib/coverage.h
> > +++ b/lib/coverage.h
> > @@ -1,5 +1,5 @@
> >  /*
> > - * Copyright (c) 2009 Nicira Networks.
> > + * Copyright (c) 2009, 2010 Nicira Networks.
> >  *
> >  * Licensed under the Apache License, Version 2.0 (the "License");
> >  * you may not use this file except in compliance with the License.
> > @@ -36,24 +36,30 @@ struct coverage_counter {
> >     unsigned long long int total; /* Total count over all epochs. */
> >  };
> >
> > -/* Increments the counter with the given NAME.  Coverage counters need not be
> > - * declared explicitly, but when you add the first coverage counter to a given
> > - * file, you must also add that file to COVERAGE_FILES in lib/automake.mk. */
> > -#define COVERAGE_INC(NAME)                              \
> > -    do {                                                \
> > -        extern struct coverage_counter NAME##_count;    \
> > -        NAME##_count.count++;                           \
> > -    } while (0)
> > -
> > -/* Adds AMOUNT to the coverage counter with the given NAME. */
> > -#define COVERAGE_ADD(NAME, AMOUNT)                      \
> > -    do {                                                \
> > -        extern struct coverage_counter NAME##_count;    \
> > -        NAME##_count.count += AMOUNT;                   \
> > -    } while (0)
> > +/* Defines COUNTER.  There must be exactly one such definition at file scope
> > + * within a program. */
> > +#if USE_LINKER_SECTIONS
> > +#define COVERAGE_DEFINE(COUNTER)                                        \
> > +        COVERAGE_DEFINE__(COUNTER);                                     \
> > +        struct coverage_counter *counter_ptr_##COUNTER                  \
> > +            __attribute__((section("coverage"))) = &counter_##COUNTER
> > +#else
> > +#define COVERAGE_DEFINE(MODULE) \
> > +        extern struct coverage_counter counter_##MODULE
> > +#endif
> > +
> > +/* Adds 1 to COUNTER. */
> > +#define COVERAGE_INC(COUNTER) counter_##COUNTER.count++;
> > +
> > +/* Adds AMOUNT to COUNTER. */
> > +#define COVERAGE_ADD(COUNTER, AMOUNT) counter_##COUNTER.count += (AMOUNT);
> >
> >  void coverage_init(void);
> >  void coverage_log(enum vlog_level, bool suppress_dups);
> >  void coverage_clear(void);
> >
> > +/* Implementation detail. */
> > +#define COVERAGE_DEFINE__(COUNTER)                              \
> > +        struct coverage_counter counter_##COUNTER = { #COUNTER, 0, 0 }
> > +
> >  #endif /* coverage.h */
> > diff --git a/lib/dpif.c b/lib/dpif.c
> > index 2cf6a03..db22946 100644
> > --- a/lib/dpif.c
> > +++ b/lib/dpif.c
> > @@ -41,6 +41,18 @@
> >
> >  VLOG_DEFINE_THIS_MODULE(dpif);
> >
> > +COVERAGE_DEFINE(dpif_destroy);
> > +COVERAGE_DEFINE(dpif_port_add);
> > +COVERAGE_DEFINE(dpif_port_del);
> > +COVERAGE_DEFINE(dpif_flow_flush);
> > +COVERAGE_DEFINE(dpif_flow_get);
> > +COVERAGE_DEFINE(dpif_flow_put);
> > +COVERAGE_DEFINE(dpif_flow_del);
> > +COVERAGE_DEFINE(dpif_flow_query_list);
> > +COVERAGE_DEFINE(dpif_flow_query_list_n);
> > +COVERAGE_DEFINE(dpif_execute);
> > +COVERAGE_DEFINE(dpif_purge);
> > +
> >  static const struct dpif_class *base_dpif_classes[] = {
> >  #ifdef HAVE_NETLINK
> >     &dpif_linux_class,
> > @@ -373,6 +385,7 @@ dpif_get_all_names(const struct dpif *dpif, struct svec *all_names)
> >     }
> >  }
> >
> > +
> >  /* Destroys the datapath that 'dpif' is connected to, first removing all of its
> >  * ports.  After calling this function, it does not make sense to pass 'dpif'
> >  * to any functions other than dpif_name() or dpif_close(). */
> > diff --git a/lib/flow.c b/lib/flow.c
> > index ca74518..4da3580 100644
> > --- a/lib/flow.c
> > +++ b/lib/flow.c
> > @@ -33,6 +33,8 @@
> >
> >  VLOG_DEFINE_THIS_MODULE(flow);
> >
> > +COVERAGE_DEFINE(flow_extract);
> > +
> >  static struct arp_eth_header *
> >  pull_arp(struct ofpbuf *packet)
> >  {
> > diff --git a/lib/hmap.c b/lib/hmap.c
> > index 6bc5ea7..6b850fd 100644
> > --- a/lib/hmap.c
> > +++ b/lib/hmap.c
> > @@ -23,6 +23,11 @@
> >  #include "random.h"
> >  #include "util.h"
> >
> > +COVERAGE_DEFINE(hmap_pathological);
> > +COVERAGE_DEFINE(hmap_expand);
> > +COVERAGE_DEFINE(hmap_shrink);
> > +COVERAGE_DEFINE(hmap_reserve);
> > +
> >  /* Initializes 'hmap' as an empty hash table. */
> >  void
> >  hmap_init(struct hmap *hmap)
> > diff --git a/lib/lockfile.c b/lib/lockfile.c
> > index f056502..771ad70 100644
> > --- a/lib/lockfile.c
> > +++ b/lib/lockfile.c
> > @@ -33,6 +33,11 @@
> >
> >  VLOG_DEFINE_THIS_MODULE(lockfile);
> >
> > +COVERAGE_DEFINE(lockfile_lock);
> > +COVERAGE_DEFINE(lockfile_timeout);
> > +COVERAGE_DEFINE(lockfile_error);
> > +COVERAGE_DEFINE(lockfile_unlock);
> > +
> >  struct lockfile {
> >     struct hmap_node hmap_node;
> >     char *name;
> > diff --git a/lib/mac-learning.c b/lib/mac-learning.c
> > index 9de338c..af46e3c 100644
> > --- a/lib/mac-learning.c
> > +++ b/lib/mac-learning.c
> > @@ -33,6 +33,9 @@
> >
> >  VLOG_DEFINE_THIS_MODULE(mac_learning);
> >
> > +COVERAGE_DEFINE(mac_learning_learned);
> > +COVERAGE_DEFINE(mac_learning_expired);
> > +
> >  /* Returns the number of seconds since 'e' was last learned. */
> >  int
> >  mac_entry_age(const struct mac_entry *e)
> > diff --git a/lib/netdev-linux.c b/lib/netdev-linux.c
> > index a86af4d..583cfd4 100644
> > --- a/lib/netdev-linux.c
> > +++ b/lib/netdev-linux.c
> > @@ -64,6 +64,14 @@
> >  #include "vlog.h"
> >
> >  VLOG_DEFINE_THIS_MODULE(netdev_linux);
> > +
> > +COVERAGE_DEFINE(netdev_get_vlan_vid);
> > +COVERAGE_DEFINE(netdev_set_policing);
> > +COVERAGE_DEFINE(netdev_arp_lookup);
> > +COVERAGE_DEFINE(netdev_get_ifindex);
> > +COVERAGE_DEFINE(netdev_get_hwaddr);
> > +COVERAGE_DEFINE(netdev_set_hwaddr);
> > +COVERAGE_DEFINE(netdev_ethtool);
> >
> >  /* These were introduced in Linux 2.6.14, so they might be missing if we have
> >  * old headers. */
> > diff --git a/lib/netdev.c b/lib/netdev.c
> > index 5cd252c..d096733 100644
> > --- a/lib/netdev.c
> > +++ b/lib/netdev.c
> > @@ -42,6 +42,11 @@
> >
> >  VLOG_DEFINE_THIS_MODULE(netdev);
> >
> > +COVERAGE_DEFINE(netdev_received);
> > +COVERAGE_DEFINE(netdev_sent);
> > +COVERAGE_DEFINE(netdev_add_router);
> > +COVERAGE_DEFINE(netdev_get_stats);
> > +
> >  static struct shash netdev_classes = SHASH_INITIALIZER(&netdev_classes);
> >
> >  /* All created network devices. */
> > diff --git a/lib/netlink.c b/lib/netlink.c
> > index 0d072d0..8806f91 100644
> > --- a/lib/netlink.c
> > +++ b/lib/netlink.c
> > @@ -35,6 +35,12 @@
> >
> >  VLOG_DEFINE_THIS_MODULE(netlink);
> >
> > +COVERAGE_DEFINE(netlink_overflow);
> > +COVERAGE_DEFINE(netlink_received);
> > +COVERAGE_DEFINE(netlink_recv_retry);
> > +COVERAGE_DEFINE(netlink_send);
> > +COVERAGE_DEFINE(netlink_sent);
> > +
> >  /* Linux header file confusion causes this to be undefined. */
> >  #ifndef SOL_NETLINK
> >  #define SOL_NETLINK 270
> > diff --git a/lib/poll-loop.c b/lib/poll-loop.c
> > index 653fdd9..e47cccc 100644
> > --- a/lib/poll-loop.c
> > +++ b/lib/poll-loop.c
> > @@ -32,6 +32,9 @@
> >
> >  VLOG_DEFINE_THIS_MODULE(poll_loop);
> >
> > +COVERAGE_DEFINE(poll_fd_wait);
> > +COVERAGE_DEFINE(poll_zero_timeout);
> > +
> >  /* An event that will wake the following call to poll_block(). */
> >  struct poll_waiter {
> >     /* Set when the waiter is created. */
> > diff --git a/lib/process.c b/lib/process.c
> > index a5f83b4..6e9ea8e 100644
> > --- a/lib/process.c
> > +++ b/lib/process.c
> > @@ -36,6 +36,11 @@
> >
> >  VLOG_DEFINE_THIS_MODULE(process);
> >
> > +COVERAGE_DEFINE(process_run);
> > +COVERAGE_DEFINE(process_run_capture);
> > +COVERAGE_DEFINE(process_sigchld);
> > +COVERAGE_DEFINE(process_start);
> > +
> >  struct process {
> >     struct list node;
> >     char *name;
> > diff --git a/lib/rconn.c b/lib/rconn.c
> > index 45df35d..c21b7e8 100644
> > --- a/lib/rconn.c
> > +++ b/lib/rconn.c
> > @@ -34,6 +34,11 @@
> >
> >  VLOG_DEFINE_THIS_MODULE(rconn);
> >
> > +COVERAGE_DEFINE(rconn_discarded);
> > +COVERAGE_DEFINE(rconn_overflow);
> > +COVERAGE_DEFINE(rconn_queued);
> > +COVERAGE_DEFINE(rconn_sent);
> > +
> >  #define STATES                                  \
> >     STATE(VOID, 1 << 0)                         \
> >     STATE(BACKOFF, 1 << 1)                      \
> > diff --git a/lib/rtnetlink.c b/lib/rtnetlink.c
> > index bce95ce..9beddb1 100644
> > --- a/lib/rtnetlink.c
> > +++ b/lib/rtnetlink.c
> > @@ -31,6 +31,8 @@
> >
> >  VLOG_DEFINE_THIS_MODULE(rtnetlink);
> >
> > +COVERAGE_DEFINE(rtnetlink_changed);
> > +
> >  /* rtnetlink socket. */
> >  static struct nl_sock *notify_sock;
> >
> > diff --git a/lib/stream-ssl.c b/lib/stream-ssl.c
> > index b2a9f84..1fc7446 100644
> > --- a/lib/stream-ssl.c
> > +++ b/lib/stream-ssl.c
> > @@ -47,6 +47,9 @@
> >
> >  VLOG_DEFINE_THIS_MODULE(stream_ssl);
> >
> > +COVERAGE_DEFINE(ssl_session);
> > +COVERAGE_DEFINE(ssl_session_reused);
> > +
> >  /* Active SSL. */
> >
> >  enum ssl_state {
> > diff --git a/lib/stream.c b/lib/stream.c
> > index eb75be8..6c838a9 100644
> > --- a/lib/stream.c
> > +++ b/lib/stream.c
> > @@ -39,6 +39,9 @@
> >
> >  VLOG_DEFINE_THIS_MODULE(stream);
> >
> > +COVERAGE_DEFINE(pstream_open);
> > +COVERAGE_DEFINE(stream_open);
> > +
> >  /* State of an active stream.*/
> >  enum stream_state {
> >     SCS_CONNECTING,             /* Underlying stream is not connected. */
> > diff --git a/lib/unixctl.c b/lib/unixctl.c
> > index 6abb332..280ad3f 100644
> > --- a/lib/unixctl.c
> > +++ b/lib/unixctl.c
> > @@ -43,6 +43,9 @@
> >  #endif
> >
> >  VLOG_DEFINE_THIS_MODULE(unixctl);
> > +
> > +COVERAGE_DEFINE(unixctl_received);
> > +COVERAGE_DEFINE(unixctl_replied);
> >
> >  struct unixctl_command {
> >     unixctl_cb_func *cb;
> > diff --git a/lib/util.c b/lib/util.c
> > index 39ca3b5..7dd22af 100644
> > --- a/lib/util.c
> > +++ b/lib/util.c
> > @@ -27,6 +27,8 @@
> >
> >  VLOG_DEFINE_THIS_MODULE(util);
> >
> > +COVERAGE_DEFINE(util_xalloc);
> > +
> >  const char *program_name;
> >
> >  void
> > diff --git a/lib/vconn.c b/lib/vconn.c
> > index d2a3829..659a574 100644
> > --- a/lib/vconn.c
> > +++ b/lib/vconn.c
> > @@ -40,6 +40,10 @@
> >
> >  VLOG_DEFINE_THIS_MODULE(vconn);
> >
> > +COVERAGE_DEFINE(vconn_open);
> > +COVERAGE_DEFINE(vconn_received);
> > +COVERAGE_DEFINE(vconn_sent);
> > +
> >  /* State of an active vconn.*/
> >  enum vconn_state {
> >     /* This is the ordinary progression of states. */
> > diff --git a/ofproto/ofproto.c b/ofproto/ofproto.c
> > index 0caeef0..c76582e 100644
> > --- a/ofproto/ofproto.c
> > +++ b/ofproto/ofproto.c
> > @@ -62,6 +62,37 @@
> >
> >  VLOG_DEFINE_THIS_MODULE(ofproto);
> >
> > +COVERAGE_DEFINE(odp_overflow);
> > +COVERAGE_DEFINE(ofproto_add_wc_flow);
> > +COVERAGE_DEFINE(ofproto_agg_request);
> > +COVERAGE_DEFINE(ofproto_costly_flags);
> > +COVERAGE_DEFINE(ofproto_ctlr_action);
> > +COVERAGE_DEFINE(ofproto_del_wc_flow);
> > +COVERAGE_DEFINE(ofproto_dp_missed);
> > +COVERAGE_DEFINE(ofproto_error);
> > +COVERAGE_DEFINE(ofproto_expiration);
> > +COVERAGE_DEFINE(ofproto_expired);
> > +COVERAGE_DEFINE(ofproto_flows_req);
> > +COVERAGE_DEFINE(ofproto_flush);
> > +COVERAGE_DEFINE(ofproto_invalidated);
> > +COVERAGE_DEFINE(ofproto_mod_wc_flow);
> > +COVERAGE_DEFINE(ofproto_no_packet_in);
> > +COVERAGE_DEFINE(ofproto_odp_unchanged);
> > +COVERAGE_DEFINE(ofproto_ofconn_stuck);
> > +COVERAGE_DEFINE(ofproto_ofp2odp);
> > +COVERAGE_DEFINE(ofproto_packet_in);
> > +COVERAGE_DEFINE(ofproto_packet_out);
> > +COVERAGE_DEFINE(ofproto_queue_req);
> > +COVERAGE_DEFINE(ofproto_recv_openflow);
> > +COVERAGE_DEFINE(ofproto_reinit_ports);
> > +COVERAGE_DEFINE(ofproto_revalidate);
> > +COVERAGE_DEFINE(ofproto_revalidate_moved);
> > +COVERAGE_DEFINE(ofproto_revalidate_rule);
> > +COVERAGE_DEFINE(ofproto_subrule_create);
> > +COVERAGE_DEFINE(ofproto_unexpected_rule);
> > +COVERAGE_DEFINE(ofproto_uninstallable);
> > +COVERAGE_DEFINE(ofproto_update_port);
> > +
> >  #include "sflow_api.h"
> >
> >  enum {
> > diff --git a/ofproto/pktbuf.c b/ofproto/pktbuf.c
> > index 14781c1..b869802 100644
> > --- a/ofproto/pktbuf.c
> > +++ b/ofproto/pktbuf.c
> > @@ -28,6 +28,11 @@
> >
> >  VLOG_DEFINE_THIS_MODULE(pktbuf);
> >
> > +COVERAGE_DEFINE(pktbuf_buffer_unknown);
> > +COVERAGE_DEFINE(pktbuf_null_cookie);
> > +COVERAGE_DEFINE(pktbuf_retrieved);
> > +COVERAGE_DEFINE(pktbuf_reuse_error);
> > +
> >  /* Buffers are identified by a 32-bit opaque ID.  We divide the ID
> >  * into a buffer number (low bits) and a cookie (high bits).  The buffer number
> >  * is an index into an array of buffers.  The cookie distinguishes between
> > diff --git a/vswitchd/bridge.c b/vswitchd/bridge.c
> > index 53a24e3..38d2ec4 100644
> > --- a/vswitchd/bridge.c
> > +++ b/vswitchd/bridge.c
> > @@ -70,6 +70,10 @@
> >
> >  VLOG_DEFINE_THIS_MODULE(bridge);
> >
> > +COVERAGE_DEFINE(bridge_flush);
> > +COVERAGE_DEFINE(bridge_process_flow);
> > +COVERAGE_DEFINE(bridge_reconfigure);
> > +
> >  struct dst {
> >     uint16_t vlan;
> >     uint16_t dp_ifidx;
> > --
> > 1.7.1
> >
> >
> > _______________________________________________
> > dev mailing list
> > dev at openvswitch.org
> > http://openvswitch.org/mailman/listinfo/dev_openvswitch.org
> >




More information about the dev mailing list