Skip to content

Commit 834a4a6

Browse files
committed
Merge tag 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/rdma/rdma
Pull rdma fixes from Jason Gunthorpe: - Fix hang in bnxt_re due to miscomputing the budget - Avoid a -Wformat-security message in dev_set_name() - Avoid an unused definition warning in fs.c with some kconfigs - Fix error handling in usnic and remove IS_ERR_OR_NULL() usage - Regression in RXE support foudn by blktests due to missing ODP exclusions - Set the dma_segment_size on HNS so it doesn't corrupt DMA when using very large IOs - Move a INIT_WORK to near when the work is allocated in cm.c to fix a racey crash where work in progress was being init'd - Use __GFP_NOWARN to not dump in kvcalloc() if userspace requests a very big MR * tag 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/rdma/rdma: RDMA/bnxt_re: Remove unusable nq variable RDMA/core: Silence oversized kvmalloc() warning RDMA/cma: Fix workqueue crash in cma_netevent_work_handler RDMA/hns: Fix wrong maximum DMA segment size RDMA/rxe: Fix null pointer dereference in ODP MR check RDMA/mlx5: Fix compilation warning when USER_ACCESS isn't set RDMA/usnic: Fix passing zero to PTR_ERR in usnic_ib_pci_probe() RDMA/ucaps: Avoid format-security warning RDMA/bnxt_re: Fix budget handling of notification queue
2 parents 3618002 + ffc59e3 commit 834a4a6

File tree

11 files changed

+33
-28
lines changed

11 files changed

+33
-28
lines changed

drivers/infiniband/core/cma.c

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,8 @@ static const char * const cma_events[] = {
7272
static void cma_iboe_set_mgid(struct sockaddr *addr, union ib_gid *mgid,
7373
enum ib_gid_type gid_type);
7474

75+
static void cma_netevent_work_handler(struct work_struct *_work);
76+
7577
const char *__attribute_const__ rdma_event_msg(enum rdma_cm_event_type event)
7678
{
7779
size_t index = event;
@@ -1047,6 +1049,7 @@ __rdma_create_id(struct net *net, rdma_cm_event_handler event_handler,
10471049
get_random_bytes(&id_priv->seq_num, sizeof id_priv->seq_num);
10481050
id_priv->id.route.addr.dev_addr.net = get_net(net);
10491051
id_priv->seq_num &= 0x00ffffff;
1052+
INIT_WORK(&id_priv->id.net_work, cma_netevent_work_handler);
10501053

10511054
rdma_restrack_new(&id_priv->res, RDMA_RESTRACK_CM_ID);
10521055
if (parent)
@@ -5241,7 +5244,6 @@ static int cma_netevent_callback(struct notifier_block *self,
52415244
if (!memcmp(current_id->id.route.addr.dev_addr.dst_dev_addr,
52425245
neigh->ha, ETH_ALEN))
52435246
continue;
5244-
INIT_WORK(&current_id->id.net_work, cma_netevent_work_handler);
52455247
cma_id_get(current_id);
52465248
queue_work(cma_wq, &current_id->id.net_work);
52475249
}

drivers/infiniband/core/ucaps.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -170,7 +170,7 @@ int ib_create_ucap(enum rdma_user_cap type)
170170
ucap->dev.class = &ucaps_class;
171171
ucap->dev.devt = MKDEV(MAJOR(ucaps_base_dev), type);
172172
ucap->dev.release = ucap_dev_release;
173-
ret = dev_set_name(&ucap->dev, ucap_names[type]);
173+
ret = dev_set_name(&ucap->dev, "%s", ucap_names[type]);
174174
if (ret)
175175
goto err_device;
176176

drivers/infiniband/core/umem_odp.c

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -76,12 +76,14 @@ static inline int ib_init_umem_odp(struct ib_umem_odp *umem_odp,
7676

7777
npfns = (end - start) >> PAGE_SHIFT;
7878
umem_odp->pfn_list = kvcalloc(
79-
npfns, sizeof(*umem_odp->pfn_list), GFP_KERNEL);
79+
npfns, sizeof(*umem_odp->pfn_list),
80+
GFP_KERNEL | __GFP_NOWARN);
8081
if (!umem_odp->pfn_list)
8182
return -ENOMEM;
8283

8384
umem_odp->dma_list = kvcalloc(
84-
ndmas, sizeof(*umem_odp->dma_list), GFP_KERNEL);
85+
ndmas, sizeof(*umem_odp->dma_list),
86+
GFP_KERNEL | __GFP_NOWARN);
8587
if (!umem_odp->dma_list) {
8688
ret = -ENOMEM;
8789
goto out_pfn_list;

drivers/infiniband/hw/bnxt_re/ib_verbs.c

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1774,19 +1774,14 @@ int bnxt_re_destroy_srq(struct ib_srq *ib_srq, struct ib_udata *udata)
17741774
ib_srq);
17751775
struct bnxt_re_dev *rdev = srq->rdev;
17761776
struct bnxt_qplib_srq *qplib_srq = &srq->qplib_srq;
1777-
struct bnxt_qplib_nq *nq = NULL;
17781777

1779-
if (qplib_srq->cq)
1780-
nq = qplib_srq->cq->nq;
17811778
if (rdev->chip_ctx->modes.toggle_bits & BNXT_QPLIB_SRQ_TOGGLE_BIT) {
17821779
free_page((unsigned long)srq->uctx_srq_page);
17831780
hash_del(&srq->hash_entry);
17841781
}
17851782
bnxt_qplib_destroy_srq(&rdev->qplib_res, qplib_srq);
17861783
ib_umem_release(srq->umem);
17871784
atomic_dec(&rdev->stats.res.srq_count);
1788-
if (nq)
1789-
nq->budget--;
17901785
return 0;
17911786
}
17921787

@@ -1827,7 +1822,6 @@ int bnxt_re_create_srq(struct ib_srq *ib_srq,
18271822
struct ib_udata *udata)
18281823
{
18291824
struct bnxt_qplib_dev_attr *dev_attr;
1830-
struct bnxt_qplib_nq *nq = NULL;
18311825
struct bnxt_re_ucontext *uctx;
18321826
struct bnxt_re_dev *rdev;
18331827
struct bnxt_re_srq *srq;
@@ -1873,7 +1867,6 @@ int bnxt_re_create_srq(struct ib_srq *ib_srq,
18731867
srq->qplib_srq.eventq_hw_ring_id = rdev->nqr->nq[0].ring_id;
18741868
srq->qplib_srq.sg_info.pgsize = PAGE_SIZE;
18751869
srq->qplib_srq.sg_info.pgshft = PAGE_SHIFT;
1876-
nq = &rdev->nqr->nq[0];
18771870

18781871
if (udata) {
18791872
rc = bnxt_re_init_user_srq(rdev, pd, srq, udata);
@@ -1908,8 +1901,6 @@ int bnxt_re_create_srq(struct ib_srq *ib_srq,
19081901
goto fail;
19091902
}
19101903
}
1911-
if (nq)
1912-
nq->budget++;
19131904
active_srqs = atomic_inc_return(&rdev->stats.res.srq_count);
19141905
if (active_srqs > rdev->stats.res.srq_watermark)
19151906
rdev->stats.res.srq_watermark = active_srqs;
@@ -3079,7 +3070,6 @@ int bnxt_re_destroy_cq(struct ib_cq *ib_cq, struct ib_udata *udata)
30793070
ib_umem_release(cq->umem);
30803071

30813072
atomic_dec(&rdev->stats.res.cq_count);
3082-
nq->budget--;
30833073
kfree(cq->cql);
30843074
return 0;
30853075
}

drivers/infiniband/hw/hns/hns_roce_main.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -763,7 +763,7 @@ static int hns_roce_register_device(struct hns_roce_dev *hr_dev)
763763
if (ret)
764764
return ret;
765765
}
766-
dma_set_max_seg_size(dev, UINT_MAX);
766+
dma_set_max_seg_size(dev, SZ_2G);
767767
ret = ib_register_device(ib_dev, "hns_%d", dev);
768768
if (ret) {
769769
dev_err(dev, "ib_register_device failed!\n");

drivers/infiniband/hw/mlx5/fs.c

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3461,7 +3461,6 @@ DECLARE_UVERBS_NAMED_OBJECT(
34613461
&UVERBS_METHOD(MLX5_IB_METHOD_STEERING_ANCHOR_DESTROY));
34623462

34633463
const struct uapi_definition mlx5_ib_flow_defs[] = {
3464-
#if IS_ENABLED(CONFIG_INFINIBAND_USER_ACCESS)
34653464
UAPI_DEF_CHAIN_OBJ_TREE_NAMED(
34663465
MLX5_IB_OBJECT_FLOW_MATCHER),
34673466
UAPI_DEF_CHAIN_OBJ_TREE(
@@ -3472,7 +3471,6 @@ const struct uapi_definition mlx5_ib_flow_defs[] = {
34723471
UAPI_DEF_CHAIN_OBJ_TREE_NAMED(
34733472
MLX5_IB_OBJECT_STEERING_ANCHOR,
34743473
UAPI_DEF_IS_OBJ_SUPPORTED(mlx5_ib_shared_ft_allowed)),
3475-
#endif
34763474
{},
34773475
};
34783476

drivers/infiniband/hw/usnic/usnic_ib_main.c

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -397,7 +397,7 @@ static void *usnic_ib_device_add(struct pci_dev *dev)
397397
if (!us_ibdev) {
398398
usnic_err("Device %s context alloc failed\n",
399399
netdev_name(pci_get_drvdata(dev)));
400-
return ERR_PTR(-EFAULT);
400+
return NULL;
401401
}
402402

403403
us_ibdev->ufdev = usnic_fwd_dev_alloc(dev);
@@ -517,8 +517,8 @@ static struct usnic_ib_dev *usnic_ib_discover_pf(struct usnic_vnic *vnic)
517517
}
518518

519519
us_ibdev = usnic_ib_device_add(parent_pci);
520-
if (IS_ERR_OR_NULL(us_ibdev)) {
521-
us_ibdev = us_ibdev ? us_ibdev : ERR_PTR(-EFAULT);
520+
if (!us_ibdev) {
521+
us_ibdev = ERR_PTR(-EFAULT);
522522
goto out;
523523
}
524524

@@ -586,10 +586,10 @@ static int usnic_ib_pci_probe(struct pci_dev *pdev,
586586
}
587587

588588
pf = usnic_ib_discover_pf(vf->vnic);
589-
if (IS_ERR_OR_NULL(pf)) {
590-
usnic_err("Failed to discover pf of vnic %s with err%ld\n",
591-
pci_name(pdev), PTR_ERR(pf));
592-
err = pf ? PTR_ERR(pf) : -EFAULT;
589+
if (IS_ERR(pf)) {
590+
err = PTR_ERR(pf);
591+
usnic_err("Failed to discover pf of vnic %s with err%d\n",
592+
pci_name(pdev), err);
593593
goto out_clean_vnic;
594594
}
595595

drivers/infiniband/sw/rxe/rxe_loc.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -140,6 +140,12 @@ static inline int qp_mtu(struct rxe_qp *qp)
140140
return IB_MTU_4096;
141141
}
142142

143+
static inline bool is_odp_mr(struct rxe_mr *mr)
144+
{
145+
return IS_ENABLED(CONFIG_INFINIBAND_ON_DEMAND_PAGING) && mr->umem &&
146+
mr->umem->is_odp;
147+
}
148+
143149
void free_rd_atomic_resource(struct resp_res *res);
144150

145151
static inline void rxe_advance_resp_resource(struct rxe_qp *qp)

drivers/infiniband/sw/rxe/rxe_mr.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -323,7 +323,7 @@ int rxe_mr_copy(struct rxe_mr *mr, u64 iova, void *addr,
323323
return err;
324324
}
325325

326-
if (mr->umem->is_odp)
326+
if (is_odp_mr(mr))
327327
return rxe_odp_mr_copy(mr, iova, addr, length, dir);
328328
else
329329
return rxe_mr_copy_xarray(mr, iova, addr, length, dir);
@@ -536,7 +536,7 @@ int rxe_mr_do_atomic_write(struct rxe_mr *mr, u64 iova, u64 value)
536536
u64 *va;
537537

538538
/* ODP is not supported right now. WIP. */
539-
if (mr->umem->is_odp)
539+
if (is_odp_mr(mr))
540540
return RESPST_ERR_UNSUPPORTED_OPCODE;
541541

542542
/* See IBA oA19-28 */

drivers/infiniband/sw/rxe/rxe_resp.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -650,7 +650,7 @@ static enum resp_states process_flush(struct rxe_qp *qp,
650650
struct resp_res *res = qp->resp.res;
651651

652652
/* ODP is not supported right now. WIP. */
653-
if (mr->umem->is_odp)
653+
if (is_odp_mr(mr))
654654
return RESPST_ERR_UNSUPPORTED_OPCODE;
655655

656656
/* oA19-14, oA19-15 */
@@ -706,7 +706,7 @@ static enum resp_states atomic_reply(struct rxe_qp *qp,
706706
if (!res->replay) {
707707
u64 iova = qp->resp.va + qp->resp.offset;
708708

709-
if (mr->umem->is_odp)
709+
if (is_odp_mr(mr))
710710
err = rxe_odp_atomic_op(mr, iova, pkt->opcode,
711711
atmeth_comp(pkt),
712712
atmeth_swap_add(pkt),

include/rdma/ib_verbs.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4790,7 +4790,14 @@ void roce_del_all_netdev_gids(struct ib_device *ib_dev,
47904790

47914791
struct ib_ucontext *ib_uverbs_get_ucontext_file(struct ib_uverbs_file *ufile);
47924792

4793+
#if IS_ENABLED(CONFIG_INFINIBAND_USER_ACCESS)
47934794
int uverbs_destroy_def_handler(struct uverbs_attr_bundle *attrs);
4795+
#else
4796+
static inline int uverbs_destroy_def_handler(struct uverbs_attr_bundle *attrs)
4797+
{
4798+
return 0;
4799+
}
4800+
#endif
47944801

47954802
struct net_device *rdma_alloc_netdev(struct ib_device *device, u32 port_num,
47964803
enum rdma_netdev_t type, const char *name,

0 commit comments

Comments
 (0)