From: Mustafa Ismail <mustafa.ismail@xxxxxxxxx> Currently, events on vlan netdevs are being ignored. Fix this by finding the real netdev and processing the notifications for vlan netdevs. Fixes: 915cc7ac0f8e ("RDMA/irdma: Add miscellaneous utility definitions") Signed-off-by: Mustafa Ismail <mustafa.ismail@xxxxxxxxx> Signed-off-by: Shiraz Saleem <shiraz.saleem@xxxxxxxxx> --- drivers/infiniband/hw/irdma/utils.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/drivers/infiniband/hw/irdma/utils.c b/drivers/infiniband/hw/irdma/utils.c index 398736d..26407d8 100644 --- a/drivers/infiniband/hw/irdma/utils.c +++ b/drivers/infiniband/hw/irdma/utils.c @@ -155,6 +155,8 @@ int irdma_inetaddr_event(struct notifier_block *notifier, unsigned long event, struct ib_device *ibdev; u32 local_ipaddr; + if (is_vlan_dev(netdev)) + netdev = vlan_dev_real_dev(netdev); ibdev = ib_device_get_by_netdev(netdev, RDMA_DRIVER_IRDMA); if (!ibdev) return NOTIFY_DONE; @@ -201,6 +203,8 @@ int irdma_inet6addr_event(struct notifier_block *notifier, unsigned long event, struct ib_device *ibdev; u32 local_ipaddr6[4]; + if (is_vlan_dev(netdev)) + netdev = vlan_dev_real_dev(netdev); ibdev = ib_device_get_by_netdev(netdev, RDMA_DRIVER_IRDMA); if (!ibdev) return NOTIFY_DONE; @@ -243,14 +247,16 @@ int irdma_net_event(struct notifier_block *notifier, unsigned long event, void *ptr) { struct neighbour *neigh = ptr; + struct net_device *netdev = (struct net_device *)neigh->dev; struct irdma_device *iwdev; struct ib_device *ibdev; __be32 *p; u32 local_ipaddr[4] = {}; bool ipv4 = true; - ibdev = ib_device_get_by_netdev((struct net_device *)neigh->dev, - RDMA_DRIVER_IRDMA); + if (is_vlan_dev(netdev)) + netdev = vlan_dev_real_dev(netdev); + ibdev = ib_device_get_by_netdev(netdev, RDMA_DRIVER_IRDMA); if (!ibdev) return NOTIFY_DONE; -- 1.8.3.1