[ovs-dev] [RFC 00/14] Revalidate flows with unique identifiers.

Joe Stringer joestringer at nicira.com
Thu Aug 21 05:41:55 UTC 2014

One of the current bottlenecks for revalidation performance is the cost of
assembling flow keys, masks and actions in the (linux) datapath. This series
seeks to reduce this cost by caching these elements in the udpif, and modifying
the datapath to skip sending these. To distinguish flows in the datapath, a
128-bit "unique flow identifier" will be used instead.

For the linux datapath, a user feature flag OVS_DP_F_INDEX_BY_UID is sent to
tell the datapath to expect UID fields in OVS_FLOW_CMD_* requests, to index
based on the OVS_UID_ATTR_ID field for userspace flow access, and to reply with
this field in the responses. Each request may include a set of flags specified
as a bitmask of OVS_UID_F_* which determine what is expected in the response.
For instance, OVS_UID_F_SKIP_KEY indicates that the key may be omitted from the
response. If no flags are specified, then the key, mask and actions will be
included in the response. (In a more general sense, these flags are
modifications on the behaviour of OVS_FLOW_CMD_* requests, so if there are no
flags specified, then the behaviour should match the existing behaviour).

By default, revalidators will tell the datapath to skip serializing the key,
mask, and actions fields in flow dumps to achieve improved flow dump
performance. Debug clients such as ovs-dpctl will continue to request all
details of a flow as they do currently.

This series proposes most of the changes required, including an initial
implementation of the new interface for datapath flow commands. The linux
datapath implementation of these features is yet to come. Previous testing with
a linux datapath implementation using a 64-bit identifier showed reasonable
performance improvements over master. I plan to rework that code and send it
for review next week.

Joe Stringer (14):
  tests: Fix race conditions.
  dpif: Zero flow before dpif_flow_get().
  revalidator: Use 'cmap' for storing ukeys.
  revalidator: Protect ukeys with a mutex.
  udpif: Separate ukey maps from revalidators.
  upcall: Rename dump_op -> ukey_op.
  upcall: Create ukeys in handler threads.
  upcall: Revalidate using cache of mask, actions.
  hash: Add 128-bit murmurhash.
  dpif: Add Unique flow identifiers.
  upcall: Generate unique flow identifiers.
  dpif-netdev: Support unique flow identifiers.
  dpif-linux: Support unique flow identifiers.
  revalidator: Reduce ukey contention.

 datapath/linux/compat/include/linux/openvswitch.h |   26 +
 include/openvswitch/types.h                       |    5 +
 lib/dpctl.c                                       |    6 +-
 lib/dpif-linux.c                                  |   88 ++-
 lib/dpif-netdev.c                                 |  203 +++--
 lib/dpif-provider.h                               |    8 +-
 lib/dpif.c                                        |   37 +-
 lib/dpif.h                                        |   34 +-
 lib/flow.h                                        |    6 +
 lib/hash.c                                        |  194 ++++-
 lib/hash.h                                        |    4 +-
 lib/odp-util.c                                    |   51 ++
 lib/odp-util.h                                    |   25 +
 ofproto/ofproto-dpif-upcall.c                     |  826 ++++++++++++++-------
 ofproto/ofproto-dpif-upcall.h                     |    3 +
 ofproto/ofproto-dpif.c                            |  108 ++-
 ofproto/ofproto-dpif.h                            |    2 +
 tests/dpif-netdev.at                              |    3 +
 tests/ofproto-dpif.at                             |   26 +-
 tests/ofproto-macros.at                           |    1 +
 20 files changed, 1256 insertions(+), 400 deletions(-)


More information about the dev mailing list