diff --git a/drivers/infiniband/core/device.c b/drivers/infiniband/core/device.c index e029401b5680..f3f3051713ef 100644 --- a/drivers/infiniband/core/device.c +++ b/drivers/infiniband/core/device.c @@ -2061,19 +2061,14 @@ void ib_dispatch_event_clients(struct ib_event *event) up_read(&event->device->event_handler_rwsem); } -static int iw_query_port(struct ib_device *device, - u32 port_num, - struct ib_port_attr *port_attr) +static int iw_query_port(struct ib_device *device, u32 port_num, + struct ib_port_attr *port_attr, + struct net_device *netdev) { struct in_device *inetdev; - struct net_device *netdev; memset(port_attr, 0, sizeof(*port_attr)); - netdev = ib_device_get_netdev(device, port_num); - if (!netdev) - return -ENODEV; - port_attr->max_mtu = IB_MTU_4096; port_attr->active_mtu = ib_mtu_int_to_enum(netdev->mtu); @@ -2096,7 +2091,6 @@ static int iw_query_port(struct ib_device *device, rcu_read_unlock(); } - dev_put(netdev); return device->ops.query_port(device, port_num, port_attr); } @@ -2134,13 +2128,27 @@ int ib_query_port(struct ib_device *device, u32 port_num, struct ib_port_attr *port_attr) { + struct net_device *netdev = NULL; + int ret; + if (!rdma_is_port_valid(device, port_num)) return -EINVAL; + if (rdma_protocol_iwarp(device, port_num) || + rdma_protocol_roce(device, port_num)) { + netdev = ib_device_get_netdev(device, port_num); + if (!netdev) + return -ENODEV; + } + if (rdma_protocol_iwarp(device, port_num)) - return iw_query_port(device, port_num, port_attr); + ret = iw_query_port(device, port_num, port_attr, netdev); else - return __ib_query_port(device, port_num, port_attr); + ret = __ib_query_port(device, port_num, port_attr); + if (netdev) + dev_put(netdev); + return ret; + } EXPORT_SYMBOL(ib_query_port); diff --git a/drivers/infiniband/sw/rxe/rxe_net.c b/drivers/infiniband/sw/rxe/rxe_net.c index 75d1407db52d..c5d439bebc24 100644 --- a/drivers/infiniband/sw/rxe/rxe_net.c +++ b/drivers/infiniband/sw/rxe/rxe_net.c @@ -605,6 +605,7 @@ static int rxe_notify(struct notifier_block *not_blk, switch (event) { case NETDEV_UNREGISTER: + ib_device_set_netdev(&rxe->ib_dev, NULL, 1); ib_unregister_device_queued(&rxe->ib_dev); break; case NETDEV_UP: diff --git a/drivers/infiniband/sw/siw/siw_main.c b/drivers/infiniband/sw/siw/siw_main.c index 17abef48abcd..1b7d34798783 100644 --- a/drivers/infiniband/sw/siw/siw_main.c +++ b/drivers/infiniband/sw/siw/siw_main.c @@ -400,6 +400,7 @@ static int siw_netdev_event(struct notifier_block *nb, unsigned long event, break; case NETDEV_UNREGISTER: + ib_device_set_netdev(&sdev->base_dev, NULL, 1); ib_unregister_device_queued(&sdev->base_dev); break; diff --git a/net/smc/smc_ib.c b/net/smc/smc_ib.c index 9297dc20bfe2..51225dcb0a52 100644 --- a/net/smc/smc_ib.c +++ b/net/smc/smc_ib.c @@ -899,9 +899,7 @@ static void smc_copy_netdev_ifindex(struct smc_ib_device *smcibdev, int port) struct ib_device *ibdev = smcibdev->ibdev; struct net_device *ndev; - if (!ibdev->ops.get_netdev) - return; - ndev = ibdev->ops.get_netdev(ibdev, port + 1); + ndev = ib_device_get_netdev(ibdev, port + 1); if (ndev) { smcibdev->ndev_ifidx[port] = ndev->ifindex; dev_put(ndev); @@ -921,16 +919,17 @@ void smc_ib_ndev_change(struct net_device *ndev, unsigned long event) port_cnt = smcibdev->ibdev->phys_port_cnt; for (i = 0; i < min_t(size_t, port_cnt, SMC_MAX_PORTS); i++) { libdev = smcibdev->ibdev; - if (!libdev->ops.get_netdev) - continue; - lndev = libdev->ops.get_netdev(libdev, i + 1); - dev_put(lndev); - if (lndev != ndev) + lndev = ib_device_get_netdev(libdev, i + 1); + if (lndev != ndev) { + dev_put(lndev); continue; - if (event == NETDEV_REGISTER) + } + if (event == NETDEV_REGISTER) { smcibdev->ndev_ifidx[i] = ndev->ifindex; + } if (event == NETDEV_UNREGISTER) smcibdev->ndev_ifidx[i] = 0; + ib_device_set_netdev(libdev, NULL, i + 1); } } mutex_unlock(&smc_ib_devices.mutex); diff --git a/net/smc/smc_pnet.c b/net/smc/smc_pnet.c index 1dd362326c0a..8566937c8903 100644 --- a/net/smc/smc_pnet.c +++ b/net/smc/smc_pnet.c @@ -1054,9 +1054,7 @@ static void smc_pnet_find_rdma_dev(struct net_device *netdev, for (i = 1; i <= SMC_MAX_PORTS; i++) { if (!rdma_is_port_valid(ibdev->ibdev, i)) continue; - if (!ibdev->ibdev->ops.get_netdev) - continue; - ndev = ibdev->ibdev->ops.get_netdev(ibdev->ibdev, i); + ndev = ib_device_get_netdev(ibdev->ibdev, i); if (!ndev) continue; dev_put(ndev);