• John Hurley's avatar
    net: sched: prevent duplicate flower rules from tcf_proto destroy race · 59eb87cb
    John Hurley authored
    When a new filter is added to cls_api, the function
    tcf_chain_tp_insert_unique() looks up the protocol/priority/chain to
    determine if the tcf_proto is duplicated in the chain's hashtable. It then
    creates a new entry or continues with an existing one. In cls_flower, this
    allows the function fl_ht_insert_unque to determine if a filter is a
    duplicate and reject appropriately, meaning that the duplicate will not be
    passed to drivers via the offload hooks. However, when a tcf_proto is
    destroyed it is removed from its chain before a hardware remove hook is
    hit. This can lead to a race whereby the driver has not received the
    remove message but duplicate flows can be accepted. This, in turn, can
    lead to the offload driver receiving incorrect duplicate flows and out of
    order add/delete messages.
    
    Prevent duplicates by utilising an approach suggested by Vlad Buslov. A
    hash table per block stores each unique chain/protocol/prio being
    destroyed. This entry is only removed when the full destroy (and hardware
    offload) has completed. If a new flow is being added with the same
    identiers as a tc_proto being detroyed, then the add request is replayed
    until the destroy is complete.
    
    Fixes: 8b64678e ("net: sched: refactor tp insert/delete for concurrent execution")
    Signed-off-by: default avatarJohn Hurley <john.hurley@netronome.com>
    Signed-off-by: default avatarVlad Buslov <vladbu@mellanox.com>
    Reviewed-by: default avatarSimon Horman <simon.horman@netronome.com>
    Reported-by: default avatarLouis Peens <louis.peens@netronome.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    59eb87cb
cls_api.c 89.9 KB