lkml.org 
[lkml]   [2016]   [Oct]   [6]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.7 047/141] i40iw: Receive notification events correctly
    Date
    4.7-stable review patch.  If anyone has any objections, please let me know.

    ------------------

    From: Shiraz Saleem <shiraz.saleem@intel.com>

    commit b71121b4b70a995c0b794026e84c880c4f26c361 upstream.

    Device notifications are not received after the first interface is
    closed; since there is an unregister for notifications on every
    interface close. Correct this by unregistering for device
    notifications only when the last interface is closed. Also, make
    all operations on the i40iw_notifiers_registered atomic as it
    can be read/modified concurrently.

    Fixes: 8e06af711bf2 ("i40iw: add main, hdr, status")

    Signed-off-by: Mustafa Ismail <mustafa.ismail@intel.com>
    Signed-off-by: Shiraz Saleem <shiraz.saleem@intel.com>
    Signed-off-by: Doug Ledford <dledford@redhat.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

    ---
    drivers/infiniband/hw/i40iw/i40iw_main.c | 8 +++-----
    1 file changed, 3 insertions(+), 5 deletions(-)

    --- a/drivers/infiniband/hw/i40iw/i40iw_main.c
    +++ b/drivers/infiniband/hw/i40iw/i40iw_main.c
    @@ -100,7 +100,7 @@ static struct notifier_block i40iw_net_n
    .notifier_call = i40iw_net_event
    };

    -static int i40iw_notifiers_registered;
    +static atomic_t i40iw_notifiers_registered;

    /**
    * i40iw_find_i40e_handler - find a handler given a client info
    @@ -1342,12 +1342,11 @@ exit:
    */
    static void i40iw_register_notifiers(void)
    {
    - if (!i40iw_notifiers_registered) {
    + if (atomic_inc_return(&i40iw_notifiers_registered) == 1) {
    register_inetaddr_notifier(&i40iw_inetaddr_notifier);
    register_inet6addr_notifier(&i40iw_inetaddr6_notifier);
    register_netevent_notifier(&i40iw_net_notifier);
    }
    - i40iw_notifiers_registered++;
    }

    /**
    @@ -1429,8 +1428,7 @@ static void i40iw_deinit_device(struct i
    i40iw_del_macip_entry(iwdev, (u8)iwdev->mac_ip_table_idx);
    /* fallthrough */
    case INET_NOTIFIER:
    - if (i40iw_notifiers_registered > 0) {
    - i40iw_notifiers_registered--;
    + if (!atomic_dec_return(&i40iw_notifiers_registered)) {
    unregister_netevent_notifier(&i40iw_net_notifier);
    unregister_inetaddr_notifier(&i40iw_inetaddr_notifier);
    unregister_inet6addr_notifier(&i40iw_inetaddr6_notifier);

    \
     
     \ /
      Last update: 2016-10-06 11:49    [W:4.211 / U:0.608 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site