• Francesco Fusco's avatar
    net: ovs: use CRC32 accelerated flow hash if available · 500f8087
    Francesco Fusco authored
    Currently OVS uses jhash2() for calculating flow hashes in its
    internal flow_hash() function. The performance of the flow_hash()
    function is critical, as the input data can be hundreds of bytes
    long.
    
    OVS is largely deployed in x86_64 based datacenters.  Therefore,
    we argue that the performance critical fast path of OVS should
    exploit underlying CPU features in order to reduce the per packet
    processing costs. We replace jhash2 with the hash implementation
    provided by the kernel hash lib, which exploits the crc32l
    instruction to achieve high performance
    
    Our patch greatly reduces the hash footprint from ~200 cycles of
    jhash2() to around ~90 cycles in case of ovs_flow_hash_crc()
    (measured with rdtsc over maximum length flow keys on an i7 Intel
    CPU).
    
    Additionally, we wrote a microbenchmark to stress the flow table
    performance. The benchmark inserts random flows into the flow
    hash and then performs lookups. Our hash deployed on a CRC32
    capable CPU reduces the lookup for 1000 flows, 100 masks from
    ~10,100us to ~6,700us, for example.
    
    Thus, simply use the newly introduced arch_fast_hash2() as a
    drop-in replacement.
    Signed-off-by: default avatarFrancesco Fusco <ffusco@redhat.com>
    Signed-off-by: default avatarDaniel Borkmann <dborkman@redhat.com>
    Signed-off-by: default avatarThomas Graf <tgraf@redhat.com>
    Acked-by: default avatarJesse Gross <jesse@nicira.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    500f8087
flow_table.c 13.1 KB