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(-) -- 1.7.10.4 _______________________________________________ dev mailing list dev@openvswitch.org http://openvswitch.org/mailman/listinfo/dev