Skip to content
  • Eric Dumazet's avatar
    inetpeer: lower false sharing effect · 2b77bdde
    Eric Dumazet authored
    
    
    Profiles show false sharing in addr_compare() because refcnt/dtime
    changes dirty the first inet_peer cache line, where are lying the keys
    used at lookup time. If many cpus are calling inet_getpeer() and
    inet_putpeer(), or need frag ids, addr_compare() is in 2nd position in
    "perf top".
    
    Before patch, my udpflood bench (16 threads) on my 2x4x2 machine :
    
                 5784.00  9.7% csum_partial_copy_generic [kernel]
                 3356.00  5.6% addr_compare              [kernel]
                 2638.00  4.4% fib_table_lookup          [kernel]
                 2625.00  4.4% ip_fragment               [kernel]
                 1934.00  3.2% neigh_lookup              [kernel]
                 1617.00  2.7% udp_sendmsg               [kernel]
                 1608.00  2.7% __ip_route_output_key     [kernel]
                 1480.00  2.5% __ip_append_data          [kernel]
                 1396.00  2.3% kfree                     [kernel]
                 1195.00  2.0% kmem_cache_free           [kernel]
                 1157.00  1.9% inet_getpeer              [kernel]
                 1121.00  1.9% neigh_resolve_output      [kernel]
                 1012.00  1.7% dev_queue_xmit            [kernel]
    # time ./udpflood.sh
    
    real	0m44.511s
    user	0m20.020s
    sys	11m22.780s
    
    # time ./udpflood.sh
    
    real	0m44.099s
    user	0m20.140s
    sys	11m15.870s
    
    After patch, no more addr_compare() in profiles :
    
                 4171.00 10.7% csum_partial_copy_generic   [kernel]
                 1787.00  4.6% fib_table_lookup            [kernel]
                 1756.00  4.5% ip_fragment                 [kernel]
                 1234.00  3.2% udp_sendmsg                 [kernel]
                 1191.00  3.0% neigh_lookup                [kernel]
                 1118.00  2.9% __ip_append_data            [kernel]
                 1022.00  2.6% kfree                       [kernel]
                  993.00  2.5% __ip_route_output_key       [kernel]
                  841.00  2.2% neigh_resolve_output        [kernel]
                  816.00  2.1% kmem_cache_free             [kernel]
                  658.00  1.7% ia32_sysenter_target        [kernel]
                  632.00  1.6% kmem_cache_alloc_node       [kernel]
    
    # time ./udpflood.sh
    
    real	0m41.587s
    user	0m19.190s
    sys	10m36.370s
    
    # time ./udpflood.sh
    
    real	0m41.486s
    user	0m19.290s
    sys	10m33.650s
    
    Signed-off-by: default avatarEric Dumazet <eric.dumazet@gmail.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    2b77bdde