• Erez Shitrit's avatar
    net/mlx5: Delay events till ib registration ends · 97834eba
    Erez Shitrit authored
    When mlx5_ib registers itself to mlx5_core as an interface, it will
    call mlx5_add_device which will call mlx5_ib interface add callback,
    in case the latter successfully returns, only then mlx5_core will add
    it to the interface list and async events will be forwarded to mlx5_ib.
    Between mlx5_ib interface add callback and mlx5_core adding the mlx5_ib
    interface to its devices list, arriving mlx5_core events can be missed
    by the new mlx5_ib registering interface.
    
    In other words:
    thread 1: mlx5_ib: mlx5_register_interface(dev)
    thread 1: mlx5_core: mlx5_add_device(dev)
    thread 1: mlx5_core: ctx = dev->add => (mlx5_ib)->mlx5_ib_add
    thread 2: mlx5_core_event: **new event arrives, forward to dev_list
    thread 1: mlx5_core: add_ctx_to_dev_list(ctx)
    /* previous event was missed by the new interface.*/
    It is ok to miss events before dev->add (mlx5_ib)->mlx5_ib_add_device
    but not after.
    
    We fix this race by accumulating the events that come between the
    ib_register_device (inside mlx5_add_device->(dev->add)) till the adding
    to the list completes and fire them to the new registering interface
    after that.
    
    Fixes: f1ee87fe ("net/mlx5: Organize device list API in one place")
    Signed-off-by: default avatarErez Shitrit <erezsh@mellanox.com>
    Signed-off-by: default avatarSaeed Mahameed <saeedm@mellanox.com>
    97834eba
main.c 39 KB