• Feras Daoud's avatar
    IB/ipoib: Fix race between light events and interface restart · edf3f301
    Feras Daoud authored
    A potential race between light_event and interface restart
    may attach multicast group to an already attached QP.
    
    Scenario:
    light_event flow goes through ipoib_mcast_dev_flush function,
    if a context switch occurs before calling ipoib_mcast_remove_list,
    then we may face a situation where the broadcast of the priv is null
    and the corresponding QP is not detached yet.
    If an "interface restart" runs during the previous context switch,
    the following scenario occurs:
    When the device goes up, ipoib_ib_dev_up function will be called,
    it will send a new registration request to the broadcast group and then
    attach the group to the QP that was not detached before.
    
         IPOIB_FLUSH_LIGHT                                          INTERFACE RESTART
    
        __ipoib_ib_dev_flush                                                |
            |                                                               |
            |                                                               |
            |                                                               |
        ipoib_mcast_dev_flush                                               |
        Move mcast list and broadcast to remove_list                        |
            |                                                               |
            |                                                               |
        Context Switch-->                                                   |
            |                                                       ipoib_ib_dev_down
            |                                                               |
            |                                                               |
            |                                                       ipoib_ib_dev_up
            |                                                               |
            |                                                               |
            |                                                       ipoib_mcast_join_task
            |                                                       allocate new broadcast
            |                                                               |
            |                                                               |
            |                                                       Attach QP to multicast group
            |                                                               |
            |                                                               |
            |                                                       <--Context Switch
        ipoib_mcast_leave
        Detach QP from multicast group
    Signed-off-by: default avatarFeras Daoud <ferasda@mellanox.com>
    Signed-off-by: default avatarLeon Romanovsky <leon@kernel.org>
    edf3f301
ipoib_multicast.c 29.9 KB