All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH net-next v2 00/11] udp gso
@ 2018-04-26 17:42 Willem de Bruijn
  2018-04-26 17:42 ` [PATCH net-next v2 01/11] udp: expose inet cork to udp Willem de Bruijn
                   ` (11 more replies)
  0 siblings, 12 replies; 14+ messages in thread
From: Willem de Bruijn @ 2018-04-26 17:42 UTC (permalink / raw)
  To: netdev; +Cc: davem, alexander.duyck, Willem de Bruijn

From: Willem de Bruijn <willemb@google.com>

Segmentation offload reduces cycles/byte for large packets by
amortizing the cost of protocol stack traversal.

This patchset implements GSO for UDP. A process can concatenate and
submit multiple datagrams to the same destination in one send call
by setting socket option SOL_UDP/UDP_SEGMENT with the segment size,
or passing an analogous cmsg at send time.

The stack will send the entire large (up to network layer max size)
datagram through the protocol layer. At the GSO layer, it is broken
up in individual segments. All receive the same network layer header
and UDP src and dst port. All but the last segment have the same UDP
header, but the last may differ in length and checksum.

Initial results show a significant reduction in UDP cycles/byte.
See the main patch for more details and benchmark results.

        udp
          876 MB/s 14873 msg/s 624666 calls/s
            11,205,777,429      cycles
    
        udp gso
         2139 MB/s 36282 msg/s 36282 calls/s
            11,204,374,561      cycles


The patch set is broken down as follows:
- patch 1 is a prerequisite: code rearrangement, noop otherwise
- patch 2 implements the gso logic
- patch 3 adds protocol stack support for UDP_SEGMENT
- patch 4,5,7 are refinements
- patch 6 adds the cmsg interface
- patch 8..11 are tests

This idea was presented previously at netconf 2017-2
http://vger.kernel.org/netconf2017_files/rx_hardening_and_udp_gso.pdf

Changes v1 -> v2
  - Convert __udp_gso_segment to modify headers after skb_segment
  - Split main patch into two, one for gso logic, one for UDP_SEGMENT

Changes RFC -> v1
  - MSG_MORE:
      fixed, by allowing checksum offload with corking if gso
  - SKB_GSO_UDP_L4:
      made independent from SKB_GSO_UDP
      and removed skb_is_ufo() wrapper
  - NETIF_F_GSO_UDP_L4:
      add to netdev_features_string
      and to netdev-features.txt
      add BUILD_BUG_ON to match SKB_GSO_UDP_L4 value
  - UDP_MAX_SEGMENTS:
      introduce limit on number of segments per gso skb
      to avoid extreme cases like IP_MAX_MTU/IPV4_MIN_MTU
  - CHECKSUM_PARTIAL:
      test against missing feature after ndo_features_check
      if not supported return error, analogous to udp_send_check
  - MSG_ZEROCOPY: removed, deferred for now

Willem de Bruijn (11):
  udp: expose inet cork to udp
  udp: add udp gso
  udp: generate gso with UDP_SEGMENT
  udp: better wmem accounting on gso
  udp: paged allocation with gso
  udp: add gso segment cmsg
  udp: add gso support to virtual devices
  selftests: udp gso
  selftests: udp gso with connected sockets
  selftests: udp gso with corking
  selftests: udp gso benchmark

 Documentation/networking/netdev-features.txt  |   7 +
 include/linux/netdev_features.h               |   5 +-
 include/linux/netdevice.h                     |   1 +
 include/linux/skbuff.h                        |   2 +
 include/linux/udp.h                           |   3 +
 include/net/inet_sock.h                       |   1 +
 include/net/ip.h                              |   3 +-
 include/net/ipv6.h                            |   2 +
 include/net/udp.h                             |   5 +
 include/uapi/linux/udp.h                      |   1 +
 net/core/ethtool.c                            |   1 +
 net/core/skbuff.c                             |   2 +
 net/ipv4/ip_output.c                          |  41 +-
 net/ipv4/udp.c                                |  80 ++-
 net/ipv4/udp_offload.c                        |  66 +-
 net/ipv6/ip6_offload.c                        |   6 +-
 net/ipv6/ip6_output.c                         |  45 +-
 net/ipv6/udp.c                                |  31 +-
 net/ipv6/udp_offload.c                        |  19 +-
 tools/testing/selftests/net/.gitignore        |   3 +
 tools/testing/selftests/net/Makefile          |   4 +-
 tools/testing/selftests/net/udpgso.c          | 621 ++++++++++++++++++
 tools/testing/selftests/net/udpgso.sh         |  29 +
 tools/testing/selftests/net/udpgso_bench.sh   |  74 +++
 tools/testing/selftests/net/udpgso_bench_rx.c | 265 ++++++++
 tools/testing/selftests/net/udpgso_bench_tx.c | 420 ++++++++++++
 26 files changed, 1686 insertions(+), 51 deletions(-)
 create mode 100644 tools/testing/selftests/net/udpgso.c
 create mode 100755 tools/testing/selftests/net/udpgso.sh
 create mode 100755 tools/testing/selftests/net/udpgso_bench.sh
 create mode 100644 tools/testing/selftests/net/udpgso_bench_rx.c
 create mode 100644 tools/testing/selftests/net/udpgso_bench_tx.c

-- 
2.17.0.484.g0c8726318c-goog

^ permalink raw reply	[flat|nested] 14+ messages in thread

end of thread, other threads:[~2018-04-26 19:47 UTC | newest]

Thread overview: 14+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2018-04-26 17:42 [PATCH net-next v2 00/11] udp gso Willem de Bruijn
2018-04-26 17:42 ` [PATCH net-next v2 01/11] udp: expose inet cork to udp Willem de Bruijn
2018-04-26 17:42 ` [PATCH net-next v2 02/11] udp: add udp gso Willem de Bruijn
2018-04-26 17:42 ` [PATCH net-next v2 03/11] udp: generate gso with UDP_SEGMENT Willem de Bruijn
2018-04-26 17:42 ` [PATCH net-next v2 04/11] udp: better wmem accounting on gso Willem de Bruijn
2018-04-26 17:42 ` [PATCH net-next v2 05/11] udp: paged allocation with gso Willem de Bruijn
2018-04-26 17:42 ` [PATCH net-next v2 06/11] udp: add gso segment cmsg Willem de Bruijn
2018-04-26 17:42 ` [PATCH net-next v2 07/11] udp: add gso support to virtual devices Willem de Bruijn
2018-04-26 17:42 ` [PATCH net-next v2 08/11] selftests: udp gso Willem de Bruijn
2018-04-26 17:42 ` [PATCH net-next v2 09/11] selftests: udp gso with connected sockets Willem de Bruijn
2018-04-26 17:42 ` [PATCH net-next v2 10/11] selftests: udp gso with corking Willem de Bruijn
2018-04-26 17:42 ` [PATCH net-next v2 11/11] selftests: udp gso benchmark Willem de Bruijn
2018-04-26 19:23 ` [PATCH net-next v2 00/11] udp gso David Miller
2018-04-26 19:46   ` Willem de Bruijn

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.