Commit 7221f581 authored by Tatyana Nikolova's avatar Tatyana Nikolova Committed by Leon Romanovsky
Browse files

RDMA/irdma: Return EINVAL for invalid arp index error



When rdma_connect() fails due to an invalid arp index, user space rdma core
reports ENOMEM which is confusing. Modify irdma_make_cm_node() to return the
correct error code.

Fixes: 146b9756 ("RDMA/irdma: Add connection manager")
Signed-off-by: default avatarTatyana Nikolova <tatyana.e.nikolova@intel.com>
Signed-off-by: default avatarLeon Romanovsky <leon@kernel.org>
parent 6f523709
Loading
Loading
Loading
Loading
+10 −7
Original line number Diff line number Diff line
@@ -2241,11 +2241,12 @@ irdma_make_cm_node(struct irdma_cm_core *cm_core, struct irdma_device *iwdev,
	int oldarpindex;
	int arpindex;
	struct net_device *netdev = iwdev->netdev;
	int ret;

	/* create an hte and cm_node for this instance */
	cm_node = kzalloc_obj(*cm_node, GFP_ATOMIC);
	if (!cm_node)
		return NULL;
		return ERR_PTR(-ENOMEM);

	/* set our node specific transport info */
	cm_node->ipv4 = cm_info->ipv4;
@@ -2348,8 +2349,10 @@ irdma_make_cm_node(struct irdma_cm_core *cm_core, struct irdma_device *iwdev,
			arpindex = -EINVAL;
	}

	if (arpindex < 0)
	if (arpindex < 0) {
		ret = -EINVAL;
		goto err;
	}

	ether_addr_copy(cm_node->rem_mac,
			iwdev->rf->arp_table[arpindex].mac_addr);
@@ -2360,7 +2363,7 @@ irdma_make_cm_node(struct irdma_cm_core *cm_core, struct irdma_device *iwdev,
err:
	kfree(cm_node);

	return NULL;
	return ERR_PTR(ret);
}

static void irdma_destroy_connection(struct irdma_cm_node *cm_node)
@@ -3021,8 +3024,8 @@ static int irdma_create_cm_node(struct irdma_cm_core *cm_core,

	/* create a CM connection node */
	cm_node = irdma_make_cm_node(cm_core, iwdev, cm_info, NULL);
	if (!cm_node)
		return -ENOMEM;
	if (IS_ERR(cm_node))
		return PTR_ERR(cm_node);

	/* set our node side to client (active) side */
	cm_node->tcp_cntxt.client = 1;
@@ -3219,9 +3222,9 @@ void irdma_receive_ilq(struct irdma_sc_vsi *vsi, struct irdma_puda_buf *rbuf)
		cm_info.cm_id = listener->cm_id;
		cm_node = irdma_make_cm_node(cm_core, iwdev, &cm_info,
					     listener);
		if (!cm_node) {
		if (IS_ERR(cm_node)) {
			ibdev_dbg(&cm_core->iwdev->ibdev,
				  "CM: allocate node failed\n");
				  "CM: allocate node failed ret=%ld\n", PTR_ERR(cm_node));
			refcount_dec(&listener->refcnt);
			return;
		}