From mboxrd@z Thu Jan 1 00:00:00 1970 From: Eric Dumazet Subject: [PATCH v2 net-next 00/12] inet: frags: bring rhashtables to IP defrag Date: Fri, 30 Mar 2018 13:42:24 -0700 Message-ID: <20180330204236.43675-1-edumazet@google.com> Cc: netdev , Florian Westphal , Herbert Xu , Thomas Graf , Jesper Dangaard Brouer , Alexander Aring , Stefan Schmidt , Kirill Tkhai , Eric Dumazet , Eric Dumazet To: "David S . Miller" Return-path: Received: from mail-pg0-f45.google.com ([74.125.83.45]:39258 "EHLO mail-pg0-f45.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752536AbeC3Umn (ORCPT ); Fri, 30 Mar 2018 16:42:43 -0400 Received: by mail-pg0-f45.google.com with SMTP id b9so5656158pgf.6 for ; Fri, 30 Mar 2018 13:42:42 -0700 (PDT) Sender: netdev-owner@vger.kernel.org List-ID: IP defrag processing is one of the remaining problematic layer in linux. It uses static hash tables of 1024 buckets, and up to 128 items per bucket. A work queue is supposed to garbage collect items when host is under memory pressure, and doing a hash rebuild, changing seed used in hash computations. This work queue blocks softirqs for up to 25 ms when doing a hash rebuild, occurring every 5 seconds if host is under fire. Then there is the problem of sharing this hash table for all netns. It is time to switch to rhashtables, and allocate one of them per netns to speedup netns dismantle, since this is a critical metric these days. Lookup is now using RCU, and 64bit hosts can now provision whatever amount of memory needed to handle the expected workloads. v2: Addressed Herbert and Kirill feedbacks Eric Dumazet (12): ipv6: frag: remove unused field inet: frags: change inet_frags_init_net() return value inet: frags: add a pointer to struct netns_frags inet: frags: refactor ipv6_frag_init() inet: frags: refactor lowpan_net_frag_init() inet: frags: refactor ipfrag_init() 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 Documentation/networking/ip-sysctl.txt | 11 +- include/net/inet_frag.h | 123 ++++---- include/net/ip.h | 1 - include/net/ipv6.h | 27 +- lib/rhashtable.c | 2 + net/ieee802154/6lowpan/6lowpan_i.h | 26 +- net/ieee802154/6lowpan/reassembly.c | 150 +++++----- net/ipv4/inet_fragment.c | 362 +++++------------------- net/ipv4/ip_fragment.c | 214 +++++++------- net/ipv4/proc.c | 6 +- net/ipv6/netfilter/nf_conntrack_reasm.c | 90 +++--- net/ipv6/proc.c | 5 +- net/ipv6/reassembly.c | 181 ++++++------ 13 files changed, 441 insertions(+), 757 deletions(-) -- 2.17.0.rc1.321.gba9d0f2565-goog