• V
    net: sched: flower: insert filter to ht before offloading it to hw · 1f17f774
    Vlad Buslov 提交于
    John reports:
    
    Recent refactoring of fl_change aims to use the classifier spinlock to
    avoid the need for rtnl lock. In doing so, the fl_hw_replace_filer()
    function was moved to before the lock is taken. This can create problems
    for drivers if duplicate filters are created (commmon in ovs tc offload
    due to filters being triggered by user-space matches).
    
    Drivers registered for such filters will now receive multiple copies of
    the same rule, each with a different cookie value. This means that the
    drivers would need to do a full match field lookup to determine
    duplicates, repeating work that will happen in flower __fl_lookup().
    Currently, drivers do not expect to receive duplicate filters.
    
    To fix this, verify that filter with same key is not present in flower
    classifier hash table and insert the new filter to the flower hash table
    before offloading it to hardware. Implement helper function
    fl_ht_insert_unique() to atomically verify/insert a filter.
    
    This change makes filter visible to fast path at the beginning of
    fl_change() function, which means it can no longer be freed directly in
    case of error. Refactor fl_change() error handling code to deallocate the
    filter with rcu timeout.
    
    Fixes: 620da486 ("net: sched: flower: refactor fl_change")
    Reported-by: NJohn Hurley <john.hurley@netronome.com>
    Signed-off-by: NVlad Buslov <vladbu@mellanox.com>
    Acked-by: NJiri Pirko <jiri@mellanox.com>
    Signed-off-by: NDavid S. Miller <davem@davemloft.net>
    1f17f774
cls_flower.c 68.2 KB