• Parav Pandit's avatar
    IB/core: Refactor GID modify code for RoCE · 598ff6ba
    Parav Pandit authored
    Code is refactored to prepare separate functions for RoCE which can do more
    complex operations related to reference counting, while still
    maintainining code readability. This includes
    (a) Simplification to not perform netdevice checks and modifications
    for IB link layer.
    (b) Do not add RoCE GID entry which has NULL netdevice; instead return
    an error.
    (c) If GID addition fails at provider level add_gid(), do not add the
    entry in the cache and keep the entry marked as INVALID.
    (d) Simplify and reuse the ib_cache_gid_add()/del() routines so that they
    can be used even for modifying default GIDs. This avoid some code
    duplication in modifying default GIDs.
    (e) find_gid() routine refers to the data entry flags to qualify a GID
    as valid or invalid GID rather than depending on attributes and zeroness
    of the GID content.
    (f) gid_table_reserve_default() sets the GID default attribute at
    beginning while setting up the GID table. There is no need to use
    default_gid flag in low level functions such as write_gid(), add_gid(),
    del_gid(), as they never need to update the DEFAULT property of the GID
    entry while during GID table update.
    
    As as result of this refactor, reserved GID 0:0:0:0:0:0:0:0 is no longer
    searchable as described below.
    
    A unicast GID entry of 0:0:0:0:0:0:0:0 is Reserved GID as per the IB
    spec version 1.3 section 4.1.1, point (6) whose snippet is below.
    
    "The unicast GID address 0:0:0:0:0:0:0:0 is reserved - referred to as
    the Reserved GID. It shall never be assigned to any endport. It shall
    not be used as a destination address or in a global routing header
    (GRH)."
    
    GID table cache now only stores valid GID entries. Before this patch,
    Reserved GID 0:0:0:0:0:0:0:0 was searchable in the GID table using
    ib_find_cached_gid_by_port() and other similar find routines.
    
    Zero GID is no longer searchable as it shall not to be present in GRH or
    path recored entry as described in IB spec version 1.3 section 4.1.1,
    point (6), section 12.7.10 and section 12.7.20.
    
    ib_cache_update() is simplified to check link layer once, use unified
    locking scheme for all link layers, removed temporary gid table
    allocation/free logic.
    
    Additionally,
    (a) Expand ib_gid_attr to store port and index so that GID query
    routines can get port and index information from the attribute structure.
    (b) Expand ib_gid_attr to store device as well so that in future code when
    GID reference counting is done, device is used to reach back to the GID
    table entry.
    Signed-off-by: default avatarParav Pandit <parav@mellanox.com>
    Signed-off-by: default avatarLeon Romanovsky <leonro@mellanox.com>
    Signed-off-by: default avatarJason Gunthorpe <jgg@mellanox.com>
    598ff6ba
cache.c 32.3 KB