• Petr Pavlu's avatar
    mlx4: Replace the mlx4_interface.event callback with a notifier · 73d68002
    Petr Pavlu authored
    Use a notifier to implement mlx4_dispatch_event() in preparation to
    switch mlx4_en and mlx4_ib to be an auxiliary device.
    
    A problem is that if the mlx4_interface.event callback was replaced with
    something as mlx4_adrv.event then the implementation of
    mlx4_dispatch_event() would need to acquire a lock on a given device
    before executing this callback. That is necessary because otherwise
    there is no guarantee that the associated driver cannot get unbound when
    the callback is running. However, taking this lock is not possible
    because mlx4_dispatch_event() can be invoked from the hardirq context.
    Using an atomic notifier allows the driver to accurately record when it
    wants to receive these events and solves this problem.
    
    A handler registration is done by both mlx4_en and mlx4_ib at the end of
    their mlx4_interface.add callback. This matches the current situation
    when mlx4_add_device() would enable events for a given device
    immediately after this callback, by adding the device on the
    mlx4_priv.list.
    Signed-off-by: default avatarPetr Pavlu <petr.pavlu@suse.com>
    Tested-by: default avatarLeon Romanovsky <leonro@nvidia.com>
    Acked-by: default avatarTariq Toukan <tariqt@nvidia.com>
    Reviewed-by: default avatarLeon Romanovsky <leonro@nvidia.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    73d68002
en_main.c 11.6 KB