RDMA/addr: Mark addr_resolve as might_sleep()
authorJason Gunthorpe <jgg@mellanox.com>
Wed, 6 May 2020 07:46:52 +0000 (10:46 +0300)
committerJason Gunthorpe <jgg@mellanox.com>
Wed, 13 May 2020 00:32:52 +0000 (21:32 -0300)
Under one path through ib_nl_fetch_ha() this calls nlmsg_new(GFP_KERNEL)
which is a sleeping call. This is a very rare path, so mark fetch_ha() and
the module external entry point that conditionally calls through to
fetch_ha() as might_sleep().

Link: https://lore.kernel.org/r/20200506074701.9775-2-leon@kernel.org
Signed-off-by: Leon Romanovsky <leonro@mellanox.com>
Signed-off-by: Jason Gunthorpe <jgg@mellanox.com>
drivers/infiniband/core/addr.c

index 1753a98..3a98439 100644 (file)
@@ -371,6 +371,8 @@ static int fetch_ha(const struct dst_entry *dst, struct rdma_dev_addr *dev_addr,
                (const void *)&dst_in6->sin6_addr;
        sa_family_t family = dst_in->sa_family;
 
+       might_sleep();
+
        /* If we have a gateway in IB mode then it must be an IB network */
        if (has_gateway(dst, family) && dev_addr->network == RDMA_NETWORK_IB)
                return ib_nl_fetch_ha(dev_addr, daddr, seq, family);
@@ -727,6 +729,8 @@ int roce_resolve_route_from_path(struct sa_path_rec *rec,
        struct rdma_dev_addr dev_addr = {};
        int ret;
 
+       might_sleep();
+
        if (rec->roce.route_resolved)
                return 0;