Skip to content

Commit 2d87344

Browse files
committed
Merge branch 'k.o/wip/dl-for-rc' into k.o/wip/dl-for-next
Due to bug fixes found by the syzkaller bot and taken into the for-rc branch after development for the 4.17 merge window had already started being taken into the for-next branch, there were fairly non-trivial merge issues that would need to be resolved between the for-rc branch and the for-next branch. This merge resolves those conflicts and provides a unified base upon which ongoing development for 4.17 can be based. Conflicts: drivers/infiniband/hw/mlx5/main.c - Commit 42cea83 (IB/mlx5: Fix cleanup order on unload) added to for-rc and commit b5ca15a (IB/mlx5: Add proper representors support) add as part of the devel cycle both needed to modify the init/de-init functions used by mlx5. To support the new representors, the new functions added by the cleanup patch needed to be made non-static, and the init/de-init list added by the representors patch needed to be modified to match the init/de-init list changes made by the cleanup patch. Updates: drivers/infiniband/hw/mlx5/mlx5_ib.h - Update function prototypes added by representors patch to reflect new function names as changed by cleanup patch drivers/infiniband/hw/mlx5/ib_rep.c - Update init/de-init stage list to match new order from cleanup patch Signed-off-by: Doug Ledford <[email protected]>
2 parents 06892cc + bd8602c commit 2d87344

File tree

28 files changed

+272
-199
lines changed

28 files changed

+272
-199
lines changed

drivers/infiniband/core/addr.c

Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -550,18 +550,13 @@ static int addr_resolve(struct sockaddr *src_in,
550550
dst_release(dst);
551551
}
552552

553-
if (ndev->flags & IFF_LOOPBACK) {
554-
ret = rdma_translate_ip(dst_in, addr);
555-
/*
556-
* Put the loopback device and get the translated
557-
* device instead.
558-
*/
553+
if (ndev) {
554+
if (ndev->flags & IFF_LOOPBACK)
555+
ret = rdma_translate_ip(dst_in, addr);
556+
else
557+
addr->bound_dev_if = ndev->ifindex;
559558
dev_put(ndev);
560-
ndev = dev_get_by_index(addr->net, addr->bound_dev_if);
561-
} else {
562-
addr->bound_dev_if = ndev->ifindex;
563559
}
564-
dev_put(ndev);
565560

566561
return ret;
567562
}

drivers/infiniband/core/cma.c

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3043,7 +3043,8 @@ static int cma_port_is_unique(struct rdma_bind_list *bind_list,
30433043
continue;
30443044

30453045
/* different dest port -> unique */
3046-
if (!cma_any_port(cur_daddr) &&
3046+
if (!cma_any_port(daddr) &&
3047+
!cma_any_port(cur_daddr) &&
30473048
(dport != cur_dport))
30483049
continue;
30493050

@@ -3054,7 +3055,8 @@ static int cma_port_is_unique(struct rdma_bind_list *bind_list,
30543055
continue;
30553056

30563057
/* different dst address -> unique */
3057-
if (!cma_any_addr(cur_daddr) &&
3058+
if (!cma_any_addr(daddr) &&
3059+
!cma_any_addr(cur_daddr) &&
30583060
cma_addr_cmp(daddr, cur_daddr))
30593061
continue;
30603062

@@ -3352,13 +3354,13 @@ int rdma_bind_addr(struct rdma_cm_id *id, struct sockaddr *addr)
33523354
}
33533355
#endif
33543356
}
3357+
daddr = cma_dst_addr(id_priv);
3358+
daddr->sa_family = addr->sa_family;
3359+
33553360
ret = cma_get_port(id_priv);
33563361
if (ret)
33573362
goto err2;
33583363

3359-
daddr = cma_dst_addr(id_priv);
3360-
daddr->sa_family = addr->sa_family;
3361-
33623364
return 0;
33633365
err2:
33643366
if (id_priv->cma_dev) {
@@ -4153,6 +4155,9 @@ int rdma_join_multicast(struct rdma_cm_id *id, struct sockaddr *addr,
41534155
struct cma_multicast *mc;
41544156
int ret;
41554157

4158+
if (!id->device)
4159+
return -EINVAL;
4160+
41564161
id_priv = container_of(id, struct rdma_id_private, id);
41574162
if (!cma_comp(id_priv, RDMA_CM_ADDR_BOUND) &&
41584163
!cma_comp(id_priv, RDMA_CM_ADDR_RESOLVED))

drivers/infiniband/core/cq.c

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717

1818
/* # of WCs to poll for with a single call to ib_poll_cq */
1919
#define IB_POLL_BATCH 16
20+
#define IB_POLL_BATCH_DIRECT 8
2021

2122
/* # of WCs to iterate over before yielding */
2223
#define IB_POLL_BUDGET_IRQ 256
@@ -25,18 +26,18 @@
2526
#define IB_POLL_FLAGS \
2627
(IB_CQ_NEXT_COMP | IB_CQ_REPORT_MISSED_EVENTS)
2728

28-
static int __ib_process_cq(struct ib_cq *cq, int budget, struct ib_wc *poll_wc)
29+
static int __ib_process_cq(struct ib_cq *cq, int budget, struct ib_wc *wcs,
30+
int batch)
2931
{
3032
int i, n, completed = 0;
31-
struct ib_wc *wcs = poll_wc ? : cq->wc;
3233

3334
/*
3435
* budget might be (-1) if the caller does not
3536
* want to bound this call, thus we need unsigned
3637
* minimum here.
3738
*/
38-
while ((n = ib_poll_cq(cq, min_t(u32, IB_POLL_BATCH,
39-
budget - completed), wcs)) > 0) {
39+
while ((n = ib_poll_cq(cq, min_t(u32, batch,
40+
budget - completed), wcs)) > 0) {
4041
for (i = 0; i < n; i++) {
4142
struct ib_wc *wc = &wcs[i];
4243

@@ -48,8 +49,7 @@ static int __ib_process_cq(struct ib_cq *cq, int budget, struct ib_wc *poll_wc)
4849

4950
completed += n;
5051

51-
if (n != IB_POLL_BATCH ||
52-
(budget != -1 && completed >= budget))
52+
if (n != batch || (budget != -1 && completed >= budget))
5353
break;
5454
}
5555

@@ -72,9 +72,9 @@ static int __ib_process_cq(struct ib_cq *cq, int budget, struct ib_wc *poll_wc)
7272
*/
7373
int ib_process_cq_direct(struct ib_cq *cq, int budget)
7474
{
75-
struct ib_wc wcs[IB_POLL_BATCH];
75+
struct ib_wc wcs[IB_POLL_BATCH_DIRECT];
7676

77-
return __ib_process_cq(cq, budget, wcs);
77+
return __ib_process_cq(cq, budget, wcs, IB_POLL_BATCH_DIRECT);
7878
}
7979
EXPORT_SYMBOL(ib_process_cq_direct);
8080

@@ -88,7 +88,7 @@ static int ib_poll_handler(struct irq_poll *iop, int budget)
8888
struct ib_cq *cq = container_of(iop, struct ib_cq, iop);
8989
int completed;
9090

91-
completed = __ib_process_cq(cq, budget, NULL);
91+
completed = __ib_process_cq(cq, budget, cq->wc, IB_POLL_BATCH);
9292
if (completed < budget) {
9393
irq_poll_complete(&cq->iop);
9494
if (ib_req_notify_cq(cq, IB_POLL_FLAGS) > 0)
@@ -108,7 +108,8 @@ static void ib_cq_poll_work(struct work_struct *work)
108108
struct ib_cq *cq = container_of(work, struct ib_cq, work);
109109
int completed;
110110

111-
completed = __ib_process_cq(cq, IB_POLL_BUDGET_WORKQUEUE, NULL);
111+
completed = __ib_process_cq(cq, IB_POLL_BUDGET_WORKQUEUE, cq->wc,
112+
IB_POLL_BATCH);
112113
if (completed >= IB_POLL_BUDGET_WORKQUEUE ||
113114
ib_req_notify_cq(cq, IB_POLL_FLAGS) > 0)
114115
queue_work(ib_comp_wq, &cq->work);

drivers/infiniband/core/device.c

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -536,14 +536,14 @@ int ib_register_device(struct ib_device *device,
536536
ret = device->query_device(device, &device->attrs, &uhw);
537537
if (ret) {
538538
pr_warn("Couldn't query the device attributes\n");
539-
goto cache_cleanup;
539+
goto cg_cleanup;
540540
}
541541

542542
ret = ib_device_register_sysfs(device, port_callback);
543543
if (ret) {
544544
pr_warn("Couldn't register device %s with driver model\n",
545545
device->name);
546-
goto cache_cleanup;
546+
goto cg_cleanup;
547547
}
548548

549549
device->reg_state = IB_DEV_REGISTERED;
@@ -559,6 +559,8 @@ int ib_register_device(struct ib_device *device,
559559
mutex_unlock(&device_mutex);
560560
return 0;
561561

562+
cg_cleanup:
563+
ib_device_unregister_rdmacg(device);
562564
cache_cleanup:
563565
ib_cache_cleanup_one(device);
564566
ib_cache_release_one(device);

drivers/infiniband/core/sa_query.c

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1291,10 +1291,9 @@ int ib_init_ah_attr_from_path(struct ib_device *device, u8 port_num,
12911291

12921292
resolved_dev = dev_get_by_index(dev_addr.net,
12931293
dev_addr.bound_dev_if);
1294-
if (resolved_dev->flags & IFF_LOOPBACK) {
1295-
dev_put(resolved_dev);
1296-
resolved_dev = idev;
1297-
dev_hold(resolved_dev);
1294+
if (!resolved_dev) {
1295+
dev_put(idev);
1296+
return -ENODEV;
12981297
}
12991298
ndev = ib_get_ndev_from_path(rec);
13001299
rcu_read_lock();

drivers/infiniband/core/ucma.c

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1149,6 +1149,9 @@ static ssize_t ucma_init_qp_attr(struct ucma_file *file,
11491149
if (copy_from_user(&cmd, inbuf, sizeof(cmd)))
11501150
return -EFAULT;
11511151

1152+
if (cmd.qp_state > IB_QPS_ERR)
1153+
return -EINVAL;
1154+
11521155
ctx = ucma_get_ctx(file, cmd.id);
11531156
if (IS_ERR(ctx))
11541157
return PTR_ERR(ctx);
@@ -1294,6 +1297,9 @@ static ssize_t ucma_set_option(struct ucma_file *file, const char __user *inbuf,
12941297
if (IS_ERR(ctx))
12951298
return PTR_ERR(ctx);
12961299

1300+
if (unlikely(cmd.optval > KMALLOC_MAX_SIZE))
1301+
return -EINVAL;
1302+
12971303
optval = memdup_user((void __user *) (unsigned long) cmd.optval,
12981304
cmd.optlen);
12991305
if (IS_ERR(optval)) {
@@ -1343,7 +1349,7 @@ static ssize_t ucma_process_join(struct ucma_file *file,
13431349
return -ENOSPC;
13441350

13451351
addr = (struct sockaddr *) &cmd->addr;
1346-
if (!cmd->addr_size || (cmd->addr_size != rdma_addr_size(addr)))
1352+
if (cmd->addr_size != rdma_addr_size(addr))
13471353
return -EINVAL;
13481354

13491355
if (cmd->join_flags == RDMA_MC_JOIN_FLAG_FULLMEMBER)
@@ -1411,6 +1417,9 @@ static ssize_t ucma_join_ip_multicast(struct ucma_file *file,
14111417
join_cmd.uid = cmd.uid;
14121418
join_cmd.id = cmd.id;
14131419
join_cmd.addr_size = rdma_addr_size((struct sockaddr *) &cmd.addr);
1420+
if (!join_cmd.addr_size)
1421+
return -EINVAL;
1422+
14141423
join_cmd.join_flags = RDMA_MC_JOIN_FLAG_FULLMEMBER;
14151424
memcpy(&join_cmd.addr, &cmd.addr, join_cmd.addr_size);
14161425

@@ -1426,6 +1435,9 @@ static ssize_t ucma_join_multicast(struct ucma_file *file,
14261435
if (copy_from_user(&cmd, inbuf, sizeof(cmd)))
14271436
return -EFAULT;
14281437

1438+
if (!rdma_addr_size((struct sockaddr *)&cmd.addr))
1439+
return -EINVAL;
1440+
14291441
return ucma_process_join(file, &cmd, out_len);
14301442
}
14311443

drivers/infiniband/hw/bnxt_re/ib_verbs.c

Lines changed: 19 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -785,7 +785,7 @@ int bnxt_re_query_ah(struct ib_ah *ib_ah, struct rdma_ah_attr *ah_attr)
785785
return 0;
786786
}
787787

788-
static unsigned long bnxt_re_lock_cqs(struct bnxt_re_qp *qp)
788+
unsigned long bnxt_re_lock_cqs(struct bnxt_re_qp *qp)
789789
__acquires(&qp->scq->cq_lock) __acquires(&qp->rcq->cq_lock)
790790
{
791791
unsigned long flags;
@@ -799,8 +799,8 @@ static unsigned long bnxt_re_lock_cqs(struct bnxt_re_qp *qp)
799799
return flags;
800800
}
801801

802-
static void bnxt_re_unlock_cqs(struct bnxt_re_qp *qp,
803-
unsigned long flags)
802+
void bnxt_re_unlock_cqs(struct bnxt_re_qp *qp,
803+
unsigned long flags)
804804
__releases(&qp->scq->cq_lock) __releases(&qp->rcq->cq_lock)
805805
{
806806
if (qp->rcq != qp->scq)
@@ -1605,6 +1605,7 @@ int bnxt_re_modify_qp(struct ib_qp *ib_qp, struct ib_qp_attr *qp_attr,
16051605
int status;
16061606
union ib_gid sgid;
16071607
struct ib_gid_attr sgid_attr;
1608+
unsigned int flags;
16081609
u8 nw_type;
16091610

16101611
qp->qplib_qp.modify_flags = 0;
@@ -1633,14 +1634,18 @@ int bnxt_re_modify_qp(struct ib_qp *ib_qp, struct ib_qp_attr *qp_attr,
16331634
dev_dbg(rdev_to_dev(rdev),
16341635
"Move QP = %p to flush list\n",
16351636
qp);
1637+
flags = bnxt_re_lock_cqs(qp);
16361638
bnxt_qplib_add_flush_qp(&qp->qplib_qp);
1639+
bnxt_re_unlock_cqs(qp, flags);
16371640
}
16381641
if (!qp->sumem &&
16391642
qp->qplib_qp.state == CMDQ_MODIFY_QP_NEW_STATE_RESET) {
16401643
dev_dbg(rdev_to_dev(rdev),
16411644
"Move QP = %p out of flush list\n",
16421645
qp);
1646+
flags = bnxt_re_lock_cqs(qp);
16431647
bnxt_qplib_clean_qp(&qp->qplib_qp);
1648+
bnxt_re_unlock_cqs(qp, flags);
16441649
}
16451650
}
16461651
if (qp_attr_mask & IB_QP_EN_SQD_ASYNC_NOTIFY) {
@@ -2226,10 +2231,13 @@ static int bnxt_re_build_inv_wqe(struct ib_send_wr *wr,
22262231
wqe->type = BNXT_QPLIB_SWQE_TYPE_LOCAL_INV;
22272232
wqe->local_inv.inv_l_key = wr->ex.invalidate_rkey;
22282233

2234+
/* Need unconditional fence for local invalidate
2235+
* opcode to work as expected.
2236+
*/
2237+
wqe->flags |= BNXT_QPLIB_SWQE_FLAGS_UC_FENCE;
2238+
22292239
if (wr->send_flags & IB_SEND_SIGNALED)
22302240
wqe->flags |= BNXT_QPLIB_SWQE_FLAGS_SIGNAL_COMP;
2231-
if (wr->send_flags & IB_SEND_FENCE)
2232-
wqe->flags |= BNXT_QPLIB_SWQE_FLAGS_UC_FENCE;
22332241
if (wr->send_flags & IB_SEND_SOLICITED)
22342242
wqe->flags |= BNXT_QPLIB_SWQE_FLAGS_SOLICIT_EVENT;
22352243

@@ -2250,8 +2258,12 @@ static int bnxt_re_build_reg_wqe(struct ib_reg_wr *wr,
22502258
wqe->frmr.levels = qplib_frpl->hwq.level + 1;
22512259
wqe->type = BNXT_QPLIB_SWQE_TYPE_REG_MR;
22522260

2253-
if (wr->wr.send_flags & IB_SEND_FENCE)
2254-
wqe->flags |= BNXT_QPLIB_SWQE_FLAGS_UC_FENCE;
2261+
/* Need unconditional fence for reg_mr
2262+
* opcode to function as expected.
2263+
*/
2264+
2265+
wqe->flags |= BNXT_QPLIB_SWQE_FLAGS_UC_FENCE;
2266+
22552267
if (wr->wr.send_flags & IB_SEND_SIGNALED)
22562268
wqe->flags |= BNXT_QPLIB_SWQE_FLAGS_SIGNAL_COMP;
22572269

drivers/infiniband/hw/bnxt_re/ib_verbs.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -222,4 +222,7 @@ struct ib_ucontext *bnxt_re_alloc_ucontext(struct ib_device *ibdev,
222222
struct ib_udata *udata);
223223
int bnxt_re_dealloc_ucontext(struct ib_ucontext *context);
224224
int bnxt_re_mmap(struct ib_ucontext *context, struct vm_area_struct *vma);
225+
226+
unsigned long bnxt_re_lock_cqs(struct bnxt_re_qp *qp);
227+
void bnxt_re_unlock_cqs(struct bnxt_re_qp *qp, unsigned long flags);
225228
#endif /* __BNXT_RE_IB_VERBS_H__ */

drivers/infiniband/hw/bnxt_re/main.c

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -730,6 +730,13 @@ static int bnxt_re_handle_qp_async_event(struct creq_qp_event *qp_event,
730730
struct bnxt_re_qp *qp)
731731
{
732732
struct ib_event event;
733+
unsigned int flags;
734+
735+
if (qp->qplib_qp.state == CMDQ_MODIFY_QP_NEW_STATE_ERR) {
736+
flags = bnxt_re_lock_cqs(qp);
737+
bnxt_qplib_add_flush_qp(&qp->qplib_qp);
738+
bnxt_re_unlock_cqs(qp, flags);
739+
}
733740

734741
memset(&event, 0, sizeof(event));
735742
if (qp->qplib_qp.srq) {
@@ -1416,9 +1423,12 @@ static void bnxt_re_task(struct work_struct *work)
14161423
switch (re_work->event) {
14171424
case NETDEV_REGISTER:
14181425
rc = bnxt_re_ib_reg(rdev);
1419-
if (rc)
1426+
if (rc) {
14201427
dev_err(rdev_to_dev(rdev),
14211428
"Failed to register with IB: %#x", rc);
1429+
bnxt_re_remove_one(rdev);
1430+
bnxt_re_dev_unreg(rdev);
1431+
}
14221432
break;
14231433
case NETDEV_UP:
14241434
bnxt_re_dispatch_event(&rdev->ibdev, NULL, 1,

0 commit comments

Comments
 (0)