For this series:

Reviewed-and-tested-by: Bill Fischofer <bill.fischo...@linaro.org>

On Thu, Nov 10, 2016 at 5:07 AM, Petri Savolainen <
petri.savolai...@nokia.com> wrote:

> Pool performance is optimized by using a ring as the global buffer storage.
> IPC build is disabled, since it needs large modifications due to
> dependency to
> pool internals. Old pool implementation was based on locks and linked list
> of
> buffer headers. New implementation maintain a ring of buffer handles, which
> enable fast, burst based allocs and frees. Also ring scales better with
> number
> of cpus than a list (enq and deq operations update opposite ends of the
> pool).
>
> L2fwd link rate (%), 2 x 40GE, 64 byte packets
>
>         direct-                 parallel-               atomic-
> cpus    orig    direct  diff    orig    parall  diff    orig    atomic
> diff
> 1       7 %     8 %     1 %     6 %     6 %     2 %     5.4 %   5.6 %   4 %
> 2       14 %    15 %    7 %     9 %     9 %     5 %     8 %     9 %     8 %
> 4       28 %    30 %    6 %     13 %    14 %    13 %    12 %    15 %    19
> %
> 6       42 %    44 %    6 %     16 %    19 %    19 %    8 %     20 %
> 150 %
> 8       46 %    59 %    28 %    19 %    23 %    26 %    18 %    24 %    34
> %
> 10      55 %    57 %    3 %     20 %    27 %    37 %    8 %     28 %
> 264 %
> 12      56 %    56 %    -1 %    22 %    31 %    43 %    7 %     32 %
> 357 %
>
> Max packet rate of NICs are reached with 10-12 cpu on direct mode.
> Otherwise,
> all cases were improved. Especially, scheduler driven cases suffered on bad
> pool scalability.
>
> changed in v3:
> * rebased
> * ipc disabled with #ifdef
> * added support for multi-segment packets
> * API: added explicit limits for packet length in alloc calls
> * Corrected validation test and example application bugs found during
>   segmentation implementation
>
> changed in v2:
> * rebased to api-next branch
> * added a comment that ring size must be larger than number of items in it
> * fixed clang build issue
> * added parens in align macro
>
> v1 reviews:
> Reviewed-by: Brian Brooks <brian.bro...@linaro.org>
>
>
>
> Petri Savolainen (19):
>   linux-gen: ipc: disable build of ipc pktio
>   linux-gen: pktio: do not free zero packets
>   linux-gen: ring: created common ring implementation
>   linux-gen: align: added round up power of two
>   linux-gen: pool: reimplement pool with ring
>   linux-gen: ring: added multi enq and deq
>   linux-gen: pool: use ring multi enq and deq operations
>   linux-gen: pool: optimize buffer alloc
>   linux-gen: pool: clean up pool inlines functions
>   linux-gen: pool: ptr instead of hdl in buffer_alloc_multi
>   test: validation: buf: test alignment
>   test: performance: crypto: use capability to select max packet
>   test: correctly initialize pool parameters
>   test: validation: packet: fix bugs in tailroom and concat tests
>   linux-gen: packet: added support for segmented packets
>   test: validation: packet: improved multi-segment alloc test
>   api: packet: added limits for packet len on alloc
>   linux-gen: packet: remove zero len support from alloc
>   linux-gen: packet: enable multi-segment packets
>
>  example/generator/odp_generator.c                  |    2 +-
>  include/odp/api/spec/packet.h                      |    9 +-
>  include/odp/api/spec/pool.h                        |    6 +
>  platform/linux-generic/Makefile.am                 |    1 +
>  .../include/odp/api/plat/packet_types.h            |    6 +-
>  .../include/odp/api/plat/pool_types.h              |    6 -
>  .../linux-generic/include/odp_align_internal.h     |   34 +-
>  .../linux-generic/include/odp_buffer_inlines.h     |  167 +--
>  .../linux-generic/include/odp_buffer_internal.h    |  120 +-
>  .../include/odp_classification_datamodel.h         |    2 +-
>  .../linux-generic/include/odp_config_internal.h    |   55 +-
>  .../linux-generic/include/odp_packet_internal.h    |   87 +-
>  platform/linux-generic/include/odp_pool_internal.h |  289 +---
>  platform/linux-generic/include/odp_ring_internal.h |  176 +++
>  .../linux-generic/include/odp_timer_internal.h     |    4 -
>  platform/linux-generic/odp_buffer.c                |   22 +-
>  platform/linux-generic/odp_classification.c        |   25 +-
>  platform/linux-generic/odp_crypto.c                |   12 +-
>  platform/linux-generic/odp_packet.c                |  717 ++++++++--
>  platform/linux-generic/odp_packet_io.c             |    2 +-
>  platform/linux-generic/odp_pool.c                  | 1440
> ++++++++------------
>  platform/linux-generic/odp_queue.c                 |    4 +-
>  platform/linux-generic/odp_schedule.c              |  102 +-
>  platform/linux-generic/odp_schedule_ordered.c      |    4 +-
>  platform/linux-generic/odp_timer.c                 |    3 +-
>  platform/linux-generic/pktio/dpdk.c                |   10 +-
>  platform/linux-generic/pktio/ipc.c                 |    3 +-
>  platform/linux-generic/pktio/loop.c                |    2 +-
>  platform/linux-generic/pktio/netmap.c              |   14 +-
>  platform/linux-generic/pktio/socket.c              |   17 +-
>  platform/linux-generic/pktio/socket_mmap.c         |   10 +-
>  test/common_plat/performance/odp_crypto.c          |   47 +-
>  test/common_plat/performance/odp_pktio_perf.c      |    2 +-
>  test/common_plat/performance/odp_scheduling.c      |    8 +-
>  test/common_plat/validation/api/buffer/buffer.c    |  113 +-
>  test/common_plat/validation/api/crypto/crypto.c    |    2 +-
>  test/common_plat/validation/api/packet/packet.c    |   96 +-
>  test/common_plat/validation/api/pktio/pktio.c      |   21 +-
>  38 files changed, 1745 insertions(+), 1895 deletions(-)
>  create mode 100644 platform/linux-generic/include/odp_ring_internal.h
>
> --
> 2.8.1
>
>

Reply via email to