Skip to content

Commit 29a877d

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: "A mixture of small bug fixes and a small security issue: - WARN_ON when IPoIB is automatically moved between namespaces - Long standing bug where mlx5 would use the wrong page for the doorbell recovery memory if fork is used - Security fix for mlx4 that disables the timestamp feature - Several crashers for mlx5 - Plug a recent mlx5 memory leak for the sig_mr" * tag 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/rdma/rdma: IB/mlx5: Fix initializing CQ fragments buffer RDMA/mlx5: Delete right entry from MR signature database RDMA: Verify port when creating flow rule RDMA/mlx5: Block FDB rules when not in switchdev mode RDMA/mlx4: Do not map the core_clock page to user space unless enabled RDMA/mlx5: Use different doorbell memory for different processes RDMA/ipoib: Fix warning caused by destroying non-initial netns
2 parents cd1245d + 2ba0aa2 commit 29a877d

File tree

11 files changed

+38
-18
lines changed

11 files changed

+38
-18
lines changed

drivers/infiniband/core/uverbs_cmd.c

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3248,6 +3248,11 @@ static int ib_uverbs_ex_create_flow(struct uverbs_attr_bundle *attrs)
32483248
goto err_free_attr;
32493249
}
32503250

3251+
if (!rdma_is_port_valid(uobj->context->device, cmd.flow_attr.port)) {
3252+
err = -EINVAL;
3253+
goto err_uobj;
3254+
}
3255+
32513256
qp = uobj_get_obj_read(qp, UVERBS_OBJECT_QP, cmd.qp_handle, attrs);
32523257
if (!qp) {
32533258
err = -EINVAL;

drivers/infiniband/hw/mlx4/main.c

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -581,12 +581,9 @@ static int mlx4_ib_query_device(struct ib_device *ibdev,
581581
props->cq_caps.max_cq_moderation_count = MLX4_MAX_CQ_COUNT;
582582
props->cq_caps.max_cq_moderation_period = MLX4_MAX_CQ_PERIOD;
583583

584-
if (!mlx4_is_slave(dev->dev))
585-
err = mlx4_get_internal_clock_params(dev->dev, &clock_params);
586-
587584
if (uhw->outlen >= resp.response_length + sizeof(resp.hca_core_clock_offset)) {
588585
resp.response_length += sizeof(resp.hca_core_clock_offset);
589-
if (!err && !mlx4_is_slave(dev->dev)) {
586+
if (!mlx4_get_internal_clock_params(dev->dev, &clock_params)) {
590587
resp.comp_mask |= MLX4_IB_QUERY_DEV_RESP_MASK_CORE_CLOCK_OFFSET;
591588
resp.hca_core_clock_offset = clock_params.offset % PAGE_SIZE;
592589
}
@@ -1702,9 +1699,6 @@ static struct ib_flow *mlx4_ib_create_flow(struct ib_qp *qp,
17021699
struct mlx4_dev *dev = (to_mdev(qp->device))->dev;
17031700
int is_bonded = mlx4_is_bonded(dev);
17041701

1705-
if (!rdma_is_port_valid(qp->device, flow_attr->port))
1706-
return ERR_PTR(-EINVAL);
1707-
17081702
if (flow_attr->flags & ~IB_FLOW_ATTR_FLAGS_DONT_TRAP)
17091703
return ERR_PTR(-EOPNOTSUPP);
17101704

drivers/infiniband/hw/mlx5/cq.c

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -849,15 +849,14 @@ static void destroy_cq_user(struct mlx5_ib_cq *cq, struct ib_udata *udata)
849849
ib_umem_release(cq->buf.umem);
850850
}
851851

852-
static void init_cq_frag_buf(struct mlx5_ib_cq *cq,
853-
struct mlx5_ib_cq_buf *buf)
852+
static void init_cq_frag_buf(struct mlx5_ib_cq_buf *buf)
854853
{
855854
int i;
856855
void *cqe;
857856
struct mlx5_cqe64 *cqe64;
858857

859858
for (i = 0; i < buf->nent; i++) {
860-
cqe = get_cqe(cq, i);
859+
cqe = mlx5_frag_buf_get_wqe(&buf->fbc, i);
861860
cqe64 = buf->cqe_size == 64 ? cqe : cqe + 64;
862861
cqe64->op_own = MLX5_CQE_INVALID << 4;
863862
}
@@ -883,7 +882,7 @@ static int create_cq_kernel(struct mlx5_ib_dev *dev, struct mlx5_ib_cq *cq,
883882
if (err)
884883
goto err_db;
885884

886-
init_cq_frag_buf(cq, &cq->buf);
885+
init_cq_frag_buf(&cq->buf);
887886

888887
*inlen = MLX5_ST_SZ_BYTES(create_cq_in) +
889888
MLX5_FLD_SZ_BYTES(create_cq_in, pas[0]) *
@@ -1184,7 +1183,7 @@ static int resize_kernel(struct mlx5_ib_dev *dev, struct mlx5_ib_cq *cq,
11841183
if (err)
11851184
goto ex;
11861185

1187-
init_cq_frag_buf(cq, cq->resize_buf);
1186+
init_cq_frag_buf(cq->resize_buf);
11881187

11891188
return 0;
11901189

drivers/infiniband/hw/mlx5/doorbell.c

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ struct mlx5_ib_user_db_page {
4141
struct ib_umem *umem;
4242
unsigned long user_virt;
4343
int refcnt;
44+
struct mm_struct *mm;
4445
};
4546

4647
int mlx5_ib_db_map_user(struct mlx5_ib_ucontext *context,
@@ -53,7 +54,8 @@ int mlx5_ib_db_map_user(struct mlx5_ib_ucontext *context,
5354
mutex_lock(&context->db_page_mutex);
5455

5556
list_for_each_entry(page, &context->db_page_list, list)
56-
if (page->user_virt == (virt & PAGE_MASK))
57+
if ((current->mm == page->mm) &&
58+
(page->user_virt == (virt & PAGE_MASK)))
5759
goto found;
5860

5961
page = kmalloc(sizeof(*page), GFP_KERNEL);
@@ -71,6 +73,8 @@ int mlx5_ib_db_map_user(struct mlx5_ib_ucontext *context,
7173
kfree(page);
7274
goto out;
7375
}
76+
mmgrab(current->mm);
77+
page->mm = current->mm;
7478

7579
list_add(&page->list, &context->db_page_list);
7680

@@ -91,6 +95,7 @@ void mlx5_ib_db_unmap_user(struct mlx5_ib_ucontext *context, struct mlx5_db *db)
9195

9296
if (!--db->u.user_page->refcnt) {
9397
list_del(&db->u.user_page->list);
98+
mmdrop(db->u.user_page->mm);
9499
ib_umem_release(db->u.user_page->umem);
95100
kfree(db->u.user_page);
96101
}

drivers/infiniband/hw/mlx5/fs.c

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1194,9 +1194,8 @@ static struct ib_flow *mlx5_ib_create_flow(struct ib_qp *qp,
11941194
goto free_ucmd;
11951195
}
11961196

1197-
if (flow_attr->port > dev->num_ports ||
1198-
(flow_attr->flags &
1199-
~(IB_FLOW_ATTR_FLAGS_DONT_TRAP | IB_FLOW_ATTR_FLAGS_EGRESS))) {
1197+
if (flow_attr->flags &
1198+
~(IB_FLOW_ATTR_FLAGS_DONT_TRAP | IB_FLOW_ATTR_FLAGS_EGRESS)) {
12001199
err = -EINVAL;
12011200
goto free_ucmd;
12021201
}
@@ -2134,6 +2133,12 @@ static int UVERBS_HANDLER(MLX5_IB_METHOD_FLOW_MATCHER_CREATE)(
21342133
if (err)
21352134
goto end;
21362135

2136+
if (obj->ns_type == MLX5_FLOW_NAMESPACE_FDB &&
2137+
mlx5_eswitch_mode(dev->mdev) != MLX5_ESWITCH_OFFLOADS) {
2138+
err = -EINVAL;
2139+
goto end;
2140+
}
2141+
21372142
uobj->object = obj;
21382143
obj->mdev = dev->mdev;
21392144
atomic_set(&obj->usecnt, 0);

drivers/infiniband/hw/mlx5/mr.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1940,8 +1940,8 @@ int mlx5_ib_dereg_mr(struct ib_mr *ibmr, struct ib_udata *udata)
19401940
mlx5r_deref_wait_odp_mkey(&mr->mmkey);
19411941

19421942
if (ibmr->type == IB_MR_TYPE_INTEGRITY) {
1943-
xa_cmpxchg(&dev->sig_mrs, mlx5_base_mkey(mr->mmkey.key), ibmr,
1944-
NULL, GFP_KERNEL);
1943+
xa_cmpxchg(&dev->sig_mrs, mlx5_base_mkey(mr->mmkey.key),
1944+
mr->sig, NULL, GFP_KERNEL);
19451945

19461946
if (mr->mtt_mr) {
19471947
rc = mlx5_ib_dereg_mr(&mr->mtt_mr->ibmr, NULL);

drivers/infiniband/ulp/ipoib/ipoib_netlink.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -163,6 +163,7 @@ static size_t ipoib_get_size(const struct net_device *dev)
163163

164164
static struct rtnl_link_ops ipoib_link_ops __read_mostly = {
165165
.kind = "ipoib",
166+
.netns_refund = true,
166167
.maxtype = IFLA_IPOIB_MAX,
167168
.policy = ipoib_policy,
168169
.priv_size = sizeof(struct ipoib_dev_priv),

drivers/net/ethernet/mellanox/mlx4/fw.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -823,6 +823,7 @@ int mlx4_QUERY_DEV_CAP(struct mlx4_dev *dev, struct mlx4_dev_cap *dev_cap)
823823
#define QUERY_DEV_CAP_MAD_DEMUX_OFFSET 0xb0
824824
#define QUERY_DEV_CAP_DMFS_HIGH_RATE_QPN_BASE_OFFSET 0xa8
825825
#define QUERY_DEV_CAP_DMFS_HIGH_RATE_QPN_RANGE_OFFSET 0xac
826+
#define QUERY_DEV_CAP_MAP_CLOCK_TO_USER 0xc1
826827
#define QUERY_DEV_CAP_QP_RATE_LIMIT_NUM_OFFSET 0xcc
827828
#define QUERY_DEV_CAP_QP_RATE_LIMIT_MAX_OFFSET 0xd0
828829
#define QUERY_DEV_CAP_QP_RATE_LIMIT_MIN_OFFSET 0xd2
@@ -841,6 +842,8 @@ int mlx4_QUERY_DEV_CAP(struct mlx4_dev *dev, struct mlx4_dev_cap *dev_cap)
841842

842843
if (mlx4_is_mfunc(dev))
843844
disable_unsupported_roce_caps(outbox);
845+
MLX4_GET(field, outbox, QUERY_DEV_CAP_MAP_CLOCK_TO_USER);
846+
dev_cap->map_clock_to_user = field & 0x80;
844847
MLX4_GET(field, outbox, QUERY_DEV_CAP_RSVD_QP_OFFSET);
845848
dev_cap->reserved_qps = 1 << (field & 0xf);
846849
MLX4_GET(field, outbox, QUERY_DEV_CAP_MAX_QP_OFFSET);

drivers/net/ethernet/mellanox/mlx4/fw.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -131,6 +131,7 @@ struct mlx4_dev_cap {
131131
u32 health_buffer_addrs;
132132
struct mlx4_port_cap port_cap[MLX4_MAX_PORTS + 1];
133133
bool wol_port[MLX4_MAX_PORTS + 1];
134+
bool map_clock_to_user;
134135
};
135136

136137
struct mlx4_func_cap {

drivers/net/ethernet/mellanox/mlx4/main.c

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -498,6 +498,7 @@ static int mlx4_dev_cap(struct mlx4_dev *dev, struct mlx4_dev_cap *dev_cap)
498498
}
499499
}
500500

501+
dev->caps.map_clock_to_user = dev_cap->map_clock_to_user;
501502
dev->caps.uar_page_size = PAGE_SIZE;
502503
dev->caps.num_uars = dev_cap->uar_size / PAGE_SIZE;
503504
dev->caps.local_ca_ack_delay = dev_cap->local_ca_ack_delay;
@@ -1948,6 +1949,11 @@ int mlx4_get_internal_clock_params(struct mlx4_dev *dev,
19481949
if (mlx4_is_slave(dev))
19491950
return -EOPNOTSUPP;
19501951

1952+
if (!dev->caps.map_clock_to_user) {
1953+
mlx4_dbg(dev, "Map clock to user is not supported.\n");
1954+
return -EOPNOTSUPP;
1955+
}
1956+
19511957
if (!params)
19521958
return -EINVAL;
19531959

0 commit comments

Comments
 (0)