i40iw: Receive notification events correctly
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>
This commit is contained in:
parent
866e0f4d73
commit
b71121b4b7
@ -100,7 +100,7 @@ static struct notifier_block i40iw_net_notifier = {
|
||||
.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 i40iw_device *iwdev, bool reset, bool del
|
||||
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);
|
||||
|
Loading…
x
Reference in New Issue
Block a user