• Jesper Dangaard Brouer's avatar
    net: frag queue per hash bucket locking · 19952cc4
    Jesper Dangaard Brouer authored
    This patch implements per hash bucket locking for the frag queue
    hash.  This removes two write locks, and the only remaining write
    lock is for protecting hash rebuild.  This essentially reduce the
    readers-writer lock to a rebuild lock.
    
    This patch is part of "net: frag performance followup"
     http://thread.gmane.org/gmane.linux.network/263644
    of which two patches have already been accepted:
    
    Same test setup as previous:
     (http://thread.gmane.org/gmane.linux.network/257155)
     Two 10G interfaces, on seperate NUMA nodes, are under-test, and uses
     Ethernet flow-control.  A third interface is used for generating the
     DoS attack (with trafgen).
    
    Notice, I have changed the frag DoS generator script to be more
    efficient/deadly.  Before it would only hit one RX queue, now its
    sending packets causing multi-queue RX, due to "better" RX hashing.
    
    Test types summary (netperf UDP_STREAM):
     Test-20G64K     == 2x10G with 65K fragments
     Test-20G3F      == 2x10G with 3x fragments (3*1472 bytes)
     Test-20G64K+DoS == Same as 20G64K with frag DoS
     Test-20G3F+DoS  == Same as 20G3F  with frag DoS
     Test-20G64K+MQ  == Same as 20G64K with Multi-Queue frag DoS
     Test-20G3F+MQ   == Same as 20G3F  with Multi-Queue frag DoS
    
    When I rebased this-patch(03) (on top of net-next commit a210576c) and
    removed the _bh spinlock, I saw a performance regression.  BUT this
    was caused by some unrelated change in-between.  See tests below.
    
    Test (A) is what I reported before for patch-02, accepted in commit 1b5ab0de.
    Test (B) verifying-retest of commit 1b5ab0de corrospond to patch-02.
    Test (C) is what I reported before for this-patch
    
    Test (D) is net-next master HEAD (commit a210576c), which reveals some
    (unknown) performance regression (compared against test (B)).
    Test (D) function as a new base-test.
    
    Performance table summary (in Mbit/s):
    
    (#) Test-type:  20G64K    20G3F    20G64K+DoS  20G3F+DoS  20G64K+MQ 20G3F+MQ
        ----------  -------   -------  ----------  ---------  --------  -------
    (A) Patch-02  : 18848.7   13230.1   4103.04     5310.36     130.0    440.2
    (B) 1b5ab0de  : 18841.5   13156.8   4101.08     5314.57     129.0    424.2
    (C) Patch-03v1: 18838.0   13490.5   4405.11     6814.72     196.6    461.6
    
    (D) a210576c  : 18321.5   11250.4   3635.34     5160.13     119.1    405.2
    (E) with _bh  : 17247.3   11492.6   3994.74     6405.29     166.7    413.6
    (F) without bh: 17471.3   11298.7   3818.05     6102.11     165.7    406.3
    
    Test (E) and (F) is this-patch(03), with(V1) and without(V2) the _bh spinlocks.
    
    I cannot explain the slow down for 20G64K (but its an artificial
    "lab-test" so I'm not worried).  But the other results does show
    improvements.  And test (E) "with _bh" version is slightly better.
    Signed-off-by: default avatarJesper Dangaard Brouer <brouer@redhat.com>
    Acked-by: default avatarHannes Frederic Sowa <hannes@stressinduktion.org>
    Acked-by: default avatarEric Dumazet <edumazet@google.com>
    
    ----
    V2:
    - By analysis from Hannes Frederic Sowa and Eric Dumazet, we don't
      need the spinlock _bh versions, as Netfilter currently does a
      local_bh_disable() before entering inet_fragment.
    - Fold-in desc from cover-mail
    V3:
    - Drop the chain_len counter per hash bucket.
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    19952cc4
inet_frag.h 4.77 KB