• David S. Miller's avatar
    Merge tag 'mlx5-updates-2017-10-06' of git://git.kernel.org/pub/scm/linux/kernel/git/mellanox/linux · 51a0c00c
    David S. Miller authored
    Saeed Mahameed says:
    
    ====================
    Mellanox, mlx5 updates 2017-10-06
    
    This series includes some shared code updates for kernel 4.15 to both
    net-next and rdma-next trees.
    
    The series includes mlx5 low level flow steering updates and optimizations
    to support firmware command parallelism for flow steering requests from
    Maor Gottlieb and two other small fixes from Matan and Maor.
    
    One fix from Matan adds error handling for when the destination
    list of the flow steering rule is full.
    
    Maor introduced a patch to avoid NULL pointer dereference on steering cleanup.
    
    Then Some refactoring patches needed by the series for code sharing purposes.
    and split the Flow Table Entry (FTE) and Flow Group (FG) creation code to two parts:
        1) Object allocation - allocate the steering node and initialize
        its resources.
    
        2) The firmware command execution.
    
    This change will give us the ability to take write lock on the
    parent node (e.g. FG for FTE creating) only on the software data struct allocation
    and creation part of the procedure where the synchronization is really required,
    and will allow us to execute multiple firmware commands simultaneously and overcome the
    firmware bottleneck.
    
    Refactor the locking scheme of the mlx5 core flow steering as follows:
    
    1) Replace the mutex lock with readers-writers semaphore and take
        the write lock only when necessary (e.g. allocating a new flow
        table entry index or adding a node to the parent's children list).
        When we try to find a suitable child in the parent's children list
        (e.g. search for flow group with the same match_criteria of the rule)
        then we only take the read lock.
    
    2) Add versioning mechanism - each steering entity (FT, FG, FTE, DST)
        will have an incremental version. The version is increased when the
        entity is changed (e.g. when a new FTE was added to FG - the FG's
        version is increased).
        Versioning is used in order to determine if the last traverse of an
        entity's children is valid or a rescan under write lock is required.
    
    Last patch adds FGs and FTEs memory pool, It is useful because these objects
    are not small and could be allocated/deallocated many times.
    
    This support improves the insertion rate of steering rules
    from ~5k/sec to ~40k/sec.
    ====================
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    51a0c00c
fs_core.h 7.85 KB