Commit 834a4a68 authored by Linus Torvalds's avatar Linus Torvalds
Browse files
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
parents 3618002d ffc59e32
Loading
Loading
Loading
Loading
+3 −1
Original line number Diff line number Diff line
@@ -72,6 +72,8 @@ static const char * const cma_events[] = {
static void cma_iboe_set_mgid(struct sockaddr *addr, union ib_gid *mgid,
			      enum ib_gid_type gid_type);

static void cma_netevent_work_handler(struct work_struct *_work);

const char *__attribute_const__ rdma_event_msg(enum rdma_cm_event_type event)
{
	size_t index = event;
@@ -1047,6 +1049,7 @@ __rdma_create_id(struct net *net, rdma_cm_event_handler event_handler,
	get_random_bytes(&id_priv->seq_num, sizeof id_priv->seq_num);
	id_priv->id.route.addr.dev_addr.net = get_net(net);
	id_priv->seq_num &= 0x00ffffff;
	INIT_WORK(&id_priv->id.net_work, cma_netevent_work_handler);

	rdma_restrack_new(&id_priv->res, RDMA_RESTRACK_CM_ID);
	if (parent)
@@ -5241,7 +5244,6 @@ static int cma_netevent_callback(struct notifier_block *self,
		if (!memcmp(current_id->id.route.addr.dev_addr.dst_dev_addr,
			   neigh->ha, ETH_ALEN))
			continue;
		INIT_WORK(&current_id->id.net_work, cma_netevent_work_handler);
		cma_id_get(current_id);
		queue_work(cma_wq, &current_id->id.net_work);
	}
+1 −1
Original line number Diff line number Diff line
@@ -170,7 +170,7 @@ int ib_create_ucap(enum rdma_user_cap type)
	ucap->dev.class = &ucaps_class;
	ucap->dev.devt = MKDEV(MAJOR(ucaps_base_dev), type);
	ucap->dev.release = ucap_dev_release;
	ret = dev_set_name(&ucap->dev, ucap_names[type]);
	ret = dev_set_name(&ucap->dev, "%s", ucap_names[type]);
	if (ret)
		goto err_device;

+4 −2
Original line number Diff line number Diff line
@@ -76,12 +76,14 @@ static inline int ib_init_umem_odp(struct ib_umem_odp *umem_odp,

		npfns = (end - start) >> PAGE_SHIFT;
		umem_odp->pfn_list = kvcalloc(
			npfns, sizeof(*umem_odp->pfn_list), GFP_KERNEL);
			npfns, sizeof(*umem_odp->pfn_list),
			GFP_KERNEL | __GFP_NOWARN);
		if (!umem_odp->pfn_list)
			return -ENOMEM;

		umem_odp->dma_list = kvcalloc(
			ndmas, sizeof(*umem_odp->dma_list), GFP_KERNEL);
			ndmas, sizeof(*umem_odp->dma_list),
			GFP_KERNEL | __GFP_NOWARN);
		if (!umem_odp->dma_list) {
			ret = -ENOMEM;
			goto out_pfn_list;
+0 −10
Original line number Diff line number Diff line
@@ -1774,10 +1774,7 @@ int bnxt_re_destroy_srq(struct ib_srq *ib_srq, struct ib_udata *udata)
					       ib_srq);
	struct bnxt_re_dev *rdev = srq->rdev;
	struct bnxt_qplib_srq *qplib_srq = &srq->qplib_srq;
	struct bnxt_qplib_nq *nq = NULL;

	if (qplib_srq->cq)
		nq = qplib_srq->cq->nq;
	if (rdev->chip_ctx->modes.toggle_bits & BNXT_QPLIB_SRQ_TOGGLE_BIT) {
		free_page((unsigned long)srq->uctx_srq_page);
		hash_del(&srq->hash_entry);
@@ -1785,8 +1782,6 @@ int bnxt_re_destroy_srq(struct ib_srq *ib_srq, struct ib_udata *udata)
	bnxt_qplib_destroy_srq(&rdev->qplib_res, qplib_srq);
	ib_umem_release(srq->umem);
	atomic_dec(&rdev->stats.res.srq_count);
	if (nq)
		nq->budget--;
	return 0;
}

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

	if (udata) {
		rc = bnxt_re_init_user_srq(rdev, pd, srq, udata);
@@ -1908,8 +1901,6 @@ int bnxt_re_create_srq(struct ib_srq *ib_srq,
			goto fail;
		}
	}
	if (nq)
		nq->budget++;
	active_srqs = atomic_inc_return(&rdev->stats.res.srq_count);
	if (active_srqs > rdev->stats.res.srq_watermark)
		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)
	ib_umem_release(cq->umem);

	atomic_dec(&rdev->stats.res.cq_count);
	nq->budget--;
	kfree(cq->cql);
	return 0;
}
+1 −1
Original line number Diff line number Diff line
@@ -763,7 +763,7 @@ static int hns_roce_register_device(struct hns_roce_dev *hr_dev)
		if (ret)
			return ret;
	}
	dma_set_max_seg_size(dev, UINT_MAX);
	dma_set_max_seg_size(dev, SZ_2G);
	ret = ib_register_device(ib_dev, "hns_%d", dev);
	if (ret) {
		dev_err(dev, "ib_register_device failed!\n");
Loading