Hi,

On 9/8/21 11:47 AM, Gaetan Rivet wrote:
> This patch series aims to improve the performance of the management
> of hw-offloads in dpif-netdev. In the current version, some setup
> will experience high memory usage and poor latency between a flow
> decision and its execution regarding hardware offloading.
> 
> This series starts by measuring key metrics regarding both issues
> Those patches are introduced first to compare the current status
> with each improvements introduced.
> Offloads enqueued and inserted, as well as the latency
> from queue insertion to hardware insertion is measured. A new
> command 'ovs-appctl dpctl/offload-stats-show' is introduced
> to show the current measure.
> 
> In my current performance test setup I am measuring an
> average latency hovering between 1~2 seconds.
> After the optimizations, it is reduced to 500~900 ms.
> Finally when using multiple threads and with proper driver
> support[1], it is measured in the order of 1 ms.
> 
> A few modules are introduced:
> 
>   * An ID pool with reduced capabilities, simplifying its
>     operations and allowing better performances in both
>     single and multi-thread setup.
> 
>   * A lockless queue between PMDs / revalidators and
>     offload thread(s). As the number of PMDs increases,
>     contention can be high on the shared queue.
>     This queue is designed to serve as message queue
>     between threads.
> 
>   * A bounded lockless MPMC ring and some helpers for
>     calculating moving averages.
> 
>   * A moving average module for Cumulative and Exponential
>     moving averages.
> 
> The netdev-offload-dpdk module is made thread-safe.
> Internal maps are made per-netdev instead, and locks are
> taken for shorter critical sections within the module.
> 
> CI result: https://github.com/grivet/ovs/actions/runs/554918929
> 
> [1]: The rte_flow API was made thread-safe in the 20.11 DPDK
>      release. Drivers that do not implement those operations
>      concurrently are protected by a lock. Others will
>      allow better concurrency, that improve the result
>      of this series.
> 
> v2:
> 
>   * Improved the MPSC queue API to simplify usage.
> 
>   * Moved flush operation from initiator thread to offload
>     thread(s). This ensures offload metadata are shared only
>     among the offload thread pool.
> 
>   * Flush operation needs additional thread synchronization.
>     The ovs_barrier currently triggers a UAF. Add a unit-test to
>     validate its operations and a fix for the UAF.
> 
> CI result: https://github.com/grivet/ovs/actions/runs/741430135
>            The error comes from a failure to download 'automake' on
>            osx, unrelated to any change in this series.
> 
> v3:
> 
>   * Re-ordered commits so fixes are first. No conflict seen currently,
>     but it might prevent them if some requested changes to the series
>     were to move code in the same parts.
> 
>   * Modified the reduced quiescing the thread to use ovsrcu_quiesce(),
>     and base next_rcu on the current time value (after quiescing happened,
>     however long it takes).
> 
>   * Added Reviewed-by tags to the relevant commits.
> 
> CI result: https://github.com/grivet/ovs/actions/runs/782655601
> 
> v4:
> 
>   * Modified the seq-pool to use batches of IDs with a spinlock
>     instead of lockless rings.
> 
>   * The llring structure is removed.
> 
>   * Due to the length of the changes to the structure, some
>     acked-by or reviewed-by were not ported to the id-fpool patch.
> 
> CI result: https://github.com/grivet/ovs/actions/runs/921095015
> 
> v5:
> 
>   * Rebase on master.
>     Conflicts were seen related to the vxlan-decap and pmd rebalance
>     series.
> 
>   * Fix typo in xchg patch spotted by Maxime Coquelin.
> 
>   * Added Reviewed-by Maxime Coquelin on 4 patches.


I went through the changes between v4 and v5, and would like to confirm
these are are minor and OK to me.

Regards,
Maxime

> CI result: https://github.com/grivet/ovs/actions/runs/1212804378
> 
> Gaetan Rivet (27):
>   ovs-thread: Fix barrier use-after-free
>   dpif-netdev: Rename flow offload thread
>   tests: Add ovs-barrier unit test
>   netdev: Add flow API uninit function
>   netdev-offload-dpdk: Use per-netdev offload metadata
>   netdev-offload-dpdk: Implement hw-offload statistics read
>   dpctl: Add function to read hardware offload statistics
>   dpif-netdev: Rename offload thread structure
>   mov-avg: Add a moving average helper structure
>   dpif-netdev: Implement hardware offloads stats query
>   ovs-atomic: Expose atomic exchange operation
>   mpsc-queue: Module for lock-free message passing
>   id-fpool: Module for fast ID generation
>   netdev-offload: Add multi-thread API
>   dpif-netdev: Quiesce offload thread periodically
>   dpif-netdev: Postpone flow offload item freeing
>   dpif-netdev: Use id-fpool for mark allocation
>   dpif-netdev: Introduce tagged union of offload requests
>   dpif-netdev: Execute flush from offload thread
>   netdev-offload-dpdk: Use per-thread HW offload stats
>   netdev-offload-dpdk: Lock rte_flow map access
>   netdev-offload-dpdk: Protect concurrent offload destroy/query
>   dpif-netdev: Use lockless queue to manage offloads
>   dpif-netdev: Make megaflow and mark mappings thread objects
>   dpif-netdev: Replace port mutex by rwlock
>   dpif-netdev: Use one or more offload threads
>   netdev-dpdk: Remove rte-flow API access locks
> 
>  lib/automake.mk               |   5 +
>  lib/dpctl.c                   |  36 ++
>  lib/dpif-netdev.c             | 734 ++++++++++++++++++++++++--------
>  lib/dpif-netlink.c            |   1 +
>  lib/dpif-provider.h           |   7 +
>  lib/dpif.c                    |   8 +
>  lib/dpif.h                    |   9 +
>  lib/id-fpool.c                | 279 ++++++++++++
>  lib/id-fpool.h                |  66 +++
>  lib/mov-avg.h                 | 171 ++++++++
>  lib/mpsc-queue.c              | 251 +++++++++++
>  lib/mpsc-queue.h              | 190 +++++++++
>  lib/netdev-dpdk.c             |   6 -
>  lib/netdev-offload-dpdk.c     | 274 ++++++++++--
>  lib/netdev-offload-provider.h |   4 +
>  lib/netdev-offload.c          |  92 +++-
>  lib/netdev-offload.h          |  21 +
>  lib/ovs-atomic-c++.h          |   3 +
>  lib/ovs-atomic-clang.h        |   5 +
>  lib/ovs-atomic-gcc4+.h        |   5 +
>  lib/ovs-atomic-gcc4.7+.h      |   5 +
>  lib/ovs-atomic-i586.h         |   5 +
>  lib/ovs-atomic-locked.h       |   9 +
>  lib/ovs-atomic-msvc.h         |  22 +
>  lib/ovs-atomic-pthreads.h     |   5 +
>  lib/ovs-atomic-x86_64.h       |   5 +
>  lib/ovs-atomic.h              |   8 +-
>  lib/ovs-thread.c              |  61 ++-
>  lib/ovs-thread.h              |   6 +-
>  tests/automake.mk             |   3 +
>  tests/library.at              |  14 +
>  tests/test-barrier.c          | 264 ++++++++++++
>  tests/test-id-fpool.c         | 615 +++++++++++++++++++++++++++
>  tests/test-mpsc-queue.c       | 772 ++++++++++++++++++++++++++++++++++
>  vswitchd/vswitch.xml          |  16 +
>  35 files changed, 3749 insertions(+), 228 deletions(-)
>  create mode 100644 lib/id-fpool.c
>  create mode 100644 lib/id-fpool.h
>  create mode 100644 lib/mov-avg.h
>  create mode 100644 lib/mpsc-queue.c
>  create mode 100644 lib/mpsc-queue.h
>  create mode 100644 tests/test-barrier.c
>  create mode 100644 tests/test-id-fpool.c
>  create mode 100644 tests/test-mpsc-queue.c
> 
> --
> 2.31.1
> 
> _______________________________________________
> dev mailing list
> d...@openvswitch.org
> https://mail.openvswitch.org/mailman/listinfo/ovs-dev
> 

_______________________________________________
dev mailing list
d...@openvswitch.org
https://mail.openvswitch.org/mailman/listinfo/ovs-dev

Reply via email to