Skip to content

backport of IP fragmentation fixes

Florian Fainelli netdev stable 2 versions – In review

Get series with b4
b4 am [email protected]

Versions newest first · linked by author and title

  1. v2 Latest29 patches 3 repliesIn review
  2. v129 patches 4 repliesSuperseded

Changes in v2 from the cover letter

- drop "net: sk_buff rbnode reorg"
- added original "ip: use rb trees for IP frag queue." commit

Patches in v2 No applies recorded yet

#Subject and filesSizeRepliesApplied
1/29inet: frags: change inet_frags_init_net() return valueinclude/net/inet_frag.h net/ieee802154/6lowpan/reassembly.c net/ipv4/ip_fragment.c +2 more+37 -120 replies
2/29inet: frags: add a pointer to struct netns_fragsinclude/net/inet_frag.h include/net/ipv6.h net/ieee802154/6lowpan/reassembly.c +4 more+48 -410 replies
3/29inet: frags: refactor ipfrag_init()net/ipv4/ip_fragment.c+2 -20 replies
4/29inet: frags: refactor ipv6_frag_init()net/ipv6/reassembly.c+14 -110 replies
5/29inet: frags: refactor lowpan_net_frag_init()net/ieee802154/6lowpan/reassembly.c+11 -90 replies
6/29ipv6: export ip6 fragments sysctl to unprivileged usersnet/ipv6/reassembly.c+0 -40 replies
7/29rhashtable: add schedule pointslib/rhashtable.c+4 -10 replies
8/29inet: frags: use rhashtables for reassembly unitsDocumentation/networking/ip-sysctl.txt include/net/inet_frag.h include/net/ipv6.h +6 more+267 -5760 replies
9/29inet: frags: remove some helpersinclude/net/inet_frag.h include/net/ip.h include/net/ipv6.h +3 more+6 -230 replies
10/29inet: frags: get rif of inet_frag_evicting()include/net/inet_frag.h net/ipv4/ip_fragment.c net/ipv6/reassembly.c+32 -420 replies
11/29inet: frags: remove inet_frag_maybe_warn_overflow()include/net/inet_frag.h net/ieee802154/6lowpan/reassembly.c net/ipv4/inet_fragment.c +3 more+8 -250 replies
12/29inet: frags: break the 2GB limit for frags storageDocumentation/networking/ip-sysctl.txt include/net/inet_frag.h net/ieee802154/6lowpan/reassembly.c +5 more+32 -320 replies
13/29inet: frags: do not clone skb in ip_expire()net/ipv4/ip_fragment.c+6 -100 replies
14/29ipv6: frags: rewrite ip6_expire_frag_queue()net/ipv6/reassembly.c+16 -80 replies
15/29rhashtable: reorganize struct rhashtable layoutinclude/linux/rhashtable.h+2 -20 replies
16/29inet: frags: reorganize struct netns_fragsinclude/net/inet_frag.h+5 -40 replies
17/29inet: frags: get rid of ipfrag_skb_cb/FRAG_CBinclude/linux/skbuff.h+5 -00 replies
18/29inet: frags: fix ip6frag_low_thresh boundarynet/ieee802154/6lowpan/reassembly.c net/ipv4/ip_fragment.c net/ipv6/netfilter/nf_conntrack_reasm.c +1 more+17 -310 replies
19/29ip: discard IPv4 datagrams with overlapping segments.include/uapi/linux/snmp.h net/ipv4/ip_fragment.c net/ipv4/proc.c+21 -560 replies
20/29net: speed up skb_rbtree_purge()net/core/skbuff.c+7 -40 replies
21/29net: modify skb_rbtree_purge to return the truesize of all purged skbs.include/linux/skbuff.h net/core/skbuff.c+6 -20 replies
22/29ipv6: defrag: drop non-last frags smaller than min mtunet/ipv6/netfilter/nf_conntrack_reasm.c net/ipv6/reassembly.c+8 -00 replies
23/29net: pskb_trim_rcsum() and CHECKSUM_COMPLETE are friendsinclude/linux/skbuff.h net/core/skbuff.c+16 -30 replies
24/29net: add rb_to_skb() and other rb tree helpersinclude/linux/skbuff.h net/ipv4/tcp_input.c+30 -210 replies
25/29ip: use rb trees for IP frag queue.include/linux/skbuff.h include/net/inet_frag.h net/ipv4/inet_fragment.c +3 more+117 -900 replies
26/29ip: add helpers to process in-order fragments faster.include/net/inet_frag.h net/ipv4/ip_fragment.c+79 -00 replies
27/29ip: process in-order fragments efficientlynet/ipv4/inet_fragment.c net/ipv4/ip_fragment.c+70 -420 replies
28/29ip: frags: fix crash in ip_do_fragment()net/ipv4/ip_fragment.c net/ipv6/netfilter/nf_conntrack_reasm.c+2 -00 replies
29/29ipv4: frags: precedence bug in ip_expire()net/ipv4/ip_fragment.c+1 -10 replies

Reviews trailers per patch

3 of 29 patches have a Reviewed-by or Acked-by.

PatchHerbert XuStephen HemmingerEric Dumazet
1/29
2/29
3/29
4/29
5/29
6/29
7/29A-b
8/29
9/29
10/29
11/29
12/29
13/29
14/29
15/29
16/29
17/29
18/29
19/29A-b
20/29
21/29
22/29
23/29
24/29
25/29
26/29
27/29
28/29R-b
29/29

Trailers given in replies are filled; those carried in the patches from earlier versions are outlined with dashes. Scroll the table sideways for all 3 reviewers.

Read the v2 thread

Cover letter [PATCH stable 4.9 v2 00/29] backport of IP fragmentation fixes

This is based on Stephen's v4.14 patches, with the necessary merge conflicts, and the lack of timer_setup() on the 4.9 baseline.

Perf results on a gigabit capable system, before and after are below.

Series can also be found here:

https://github.com/ffainelli/linux/commits/fragment-stack-v4.9-v2

Changes in v2:

- drop "net: sk_buff rbnode reorg"
- added original "ip: use rb trees for IP frag queue." commit

Before patches:

PerfTop: 180 irqs/sec kernel:78.9% exact: 0.0% [4000Hz cycles:ppp], (all, 4 CPUs)
-------------------------------------------------------------------------------

    34.81%  [kernel]       [k] ip_defrag
     4.57%  [kernel]       [k] arch_cpu_idle
     2.09%  [kernel]       [k] fib_table_lookup
     1.74%  [kernel]       [k] finish_task_switch
     1.57%  [kernel]       [k] v7_dma_inv_range
     1.47%  [kernel]       [k] __netif_receive_skb_core
     1.06%  [kernel]       [k] __slab_free
     1.04%  [kernel]       [k] __netdev_alloc_skb
     0.99%  [kernel]       [k] ip_route_input_noref
     0.96%  [kernel]       [k] dev_gro_receive
     0.96%  [kernel]       [k] tick_nohz_idle_enter
     0.93%  [kernel]       [k] bcm_sysport_poll
     0.92%  [kernel]       [k] skb_release_data
     0.91%  [kernel]       [k] __memzero
     0.90%  [kernel]       [k] __free_page_frag
     0.87%  [kernel]       [k] ip_rcv
     0.77%  [kernel]       [k] eth_type_trans
     0.71%  [kernel]       [k] _raw_spin_unlock_irqrestore
     0.68%  [kernel]       [k] tick_nohz_idle_exit
     0.65%  [kernel]       [k] bcm_sysport_rx_refill

After patches:

PerfTop: 214 irqs/sec kernel:80.4% exact: 0.0% [4000Hz cycles:ppp], (all, 4 CPUs)
-------------------------------------------------------------------------------

     6.61%  [kernel]       [k] arch_cpu_idle
     3.77%  [kernel]       [k] ip_defrag
     3.65%  [kernel]       [k] v7_dma_inv_range
     3.18%  [kernel]       [k] fib_table_lookup
     3.04%  [kernel]       [k] __netif_receive_skb_core
     2.31%  [kernel]       [k] finish_task_switch
     2.31%  [kernel]       [k] _raw_spin_unlock_irqrestore
     1.65%  [kernel]       [k] bcm_sysport_poll
     1.63%  [kernel]       [k] ip_route_input_noref
     1.63%  [kernel]       [k] __memzero
     1.58%  [kernel]       [k] __netdev_alloc_skb
     1.47%  [kernel]       [k] tick_nohz_idle_enter
     1.40%  [kernel]       [k] __slab_free
     1.32%  [kernel]       [k] ip_rcv
     1.32%  [kernel]       [k] __softirqentry_text_start
     1.30%  [kernel]       [k] dev_gro_receive
     1.23%  [kernel]       [k] bcm_sysport_rx_refill
     1.11%  [kernel]       [k] tick_nohz_idle_exit
     1.06%  [kernel]       [k] memcmp
     1.02%  [kernel]       [k] dma_cache_maint_page

Dan Carpenter (1):
ipv4: frags: precedence bug in ip_expire()

Eric Dumazet (21):
inet: frags: change inet_frags_init_net() return value
inet: frags: add a pointer to struct netns_frags
inet: frags: refactor ipfrag_init()
inet: frags: refactor ipv6_frag_init()
inet: frags: refactor lowpan_net_frag_init()
ipv6: export ip6 fragments sysctl to unprivileged users
rhashtable: add schedule points
inet: frags: use rhashtables for reassembly units
inet: frags: remove some helpers
inet: frags: get rif of inet_frag_evicting()
inet: frags: remove inet_frag_maybe_warn_overflow()
inet: frags: break the 2GB limit for frags storage
inet: frags: do not clone skb in ip_expire()
ipv6: frags: rewrite ip6_expire_frag_queue()
rhashtable: reorganize struct rhashtable layout
inet: frags: reorganize struct netns_frags
inet: frags: get rid of ipfrag_skb_cb/FRAG_CB
inet: frags: fix ip6frag_low_thresh boundary
net: speed up skb_rbtree_purge()
net: pskb_trim_rcsum() and CHECKSUM_COMPLETE are friends
net: add rb_to_skb() and other rb tree helpers

Florian Westphal (1):
ipv6: defrag: drop non-last frags smaller than min mtu

Peter Oskolkov (5):
ip: discard IPv4 datagrams with overlapping segments.
net: modify skb_rbtree_purge to return the truesize of all purged
skbs.
ip: use rb trees for IP frag queue.
ip: add helpers to process in-order fragments faster.
ip: process in-order fragments efficiently

Taehee Yoo (1):
ip: frags: fix crash in ip_do_fragment()

 Documentation/networking/ip-sysctl.txt  |  13 +-
 include/linux/rhashtable.h              |   4 +-
 include/linux/skbuff.h                  |  34 +-
 include/net/inet_frag.h                 | 133 +++---
 include/net/ip.h                        |   1 -
 include/net/ipv6.h                      |  26 +-
 include/uapi/linux/snmp.h               |   1 +
 lib/rhashtable.c                        |   5 +-
 net/core/skbuff.c                       |  31 +-
 net/ieee802154/6lowpan/6lowpan_i.h      |  26 +-
 net/ieee802154/6lowpan/reassembly.c     | 148 +++---
 net/ipv4/inet_fragment.c                | 379 ++++------------
 net/ipv4/ip_fragment.c                  | 573 +++++++++++++-----------
 net/ipv4/proc.c                         |   7 +-
 net/ipv4/tcp_input.c                    |  33 +-
 net/ipv6/netfilter/nf_conntrack_reasm.c | 100 ++---
 net/ipv6/proc.c                         |   5 +-
 net/ipv6/reassembly.c                   | 212 ++++-----
 18 files changed, 774 insertions(+), 957 deletions(-)
Signature · 1 line
2.17.1