• Tonghao Zhang's avatar
    net: openvswitch: optimize flow-mask looking up · 57f7d7b9
    Tonghao Zhang authored
    The full looking up on flow table traverses all mask array.
    If mask-array is too large, the number of invalid flow-mask
    increase, performance will be drop.
    
    One bad case, for example: M means flow-mask is valid and NULL
    of flow-mask means deleted.
    
    +-------------------------------------------+
    | M | NULL | ...                  | NULL | M|
    +-------------------------------------------+
    
    In that case, without this patch, openvswitch will traverses all
    mask array, because there will be one flow-mask in the tail. This
    patch changes the way of flow-mask inserting and deleting, and the
    mask array will be keep as below: there is not a NULL hole. In the
    fast path, we can "break" "for" (not "continue") in flow_lookup
    when we get a NULL flow-mask.
    
             "break"
                v
    +-------------------------------------------+
    | M | M |  NULL |...           | NULL | NULL|
    +-------------------------------------------+
    
    This patch don't optimize slow or control path, still using ma->max
    to traverse. Slow path:
    * tbl_mask_array_realloc
    * ovs_flow_tbl_lookup_exact
    * flow_mask_find
    Signed-off-by: default avatarTonghao Zhang <xiangxia.m.yue@gmail.com>
    Tested-by: default avatarGreg Rose <gvrose8192@gmail.com>
    Acked-by: default avatarPravin B Shelar <pshelar@ovn.org>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    57f7d7b9
flow_table.c 22.8 KB