Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit e4f3b1e7 authored by Linus Torvalds's avatar Linus Torvalds
Browse files
* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband:
  IB/mlx4: Incorrect semicolon after if statement
  mlx4_core: Wait 1 second after reset before accessing device
  IPoIB: Fix leak in ipoib_transport_dev_init() error path
  IB/mlx4: Fix opcode returned in RDMA read completion
  IB/srp: Add OUI for new Cisco targets
  IB/srp: Wrap OUI checking for workarounds in helper functions
  RDMA/cxgb3: Always call low level send function via cxgb3_ofld_send()
  IB: Move the macro IB_UMEM_MAX_PAGE_CHUNK() to umem.c
  IB: Include <linux/list.h> and <linux/rwsem.h> from <rdma/ib_verbs.h>
  IB: Include <linux/list.h> from <rdma/ib_mad.h>
  IB/mad: Fix address handle leak in mad_rmpp
  IB/mad: agent_send_response() should be void
  IB/mad: Fix memory leak in switch handling in ib_mad_recv_done_handler()
  IB/mad: Fix error path if response alloc fails in ib_mad_recv_done_handler()
  IB/sa: Don't need to check for default P_Key twice
  IB/core: Ignore membership bit in ib_find_pkey()
parents 5bc705e9 fe11cb6b
Loading
Loading
Loading
Loading
+10 −14
Original line number Diff line number Diff line
@@ -78,7 +78,7 @@ ib_get_agent_port(struct ib_device *device, int port_num)
	return entry;
}

int agent_send_response(struct ib_mad *mad, struct ib_grh *grh,
void agent_send_response(struct ib_mad *mad, struct ib_grh *grh,
			 struct ib_wc *wc, struct ib_device *device,
			 int port_num, int qpn)
{
@@ -86,7 +86,6 @@ int agent_send_response(struct ib_mad *mad, struct ib_grh *grh,
	struct ib_mad_agent *agent;
	struct ib_mad_send_buf *send_buf;
	struct ib_ah *ah;
	int ret;
	struct ib_mad_send_wr_private *mad_send_wr;

	if (device->node_type == RDMA_NODE_IB_SWITCH)
@@ -96,23 +95,21 @@ int agent_send_response(struct ib_mad *mad, struct ib_grh *grh,

	if (!port_priv) {
		printk(KERN_ERR SPFX "Unable to find port agent\n");
		return -ENODEV;
		return;
	}

	agent = port_priv->agent[qpn];
	ah = ib_create_ah_from_wc(agent->qp->pd, wc, grh, port_num);
	if (IS_ERR(ah)) {
		ret = PTR_ERR(ah);
		printk(KERN_ERR SPFX "ib_create_ah_from_wc error:%d\n", ret);
		return ret;
		printk(KERN_ERR SPFX "ib_create_ah_from_wc error\n");
		return;
	}

	send_buf = ib_create_send_mad(agent, wc->src_qp, wc->pkey_index, 0,
				      IB_MGMT_MAD_HDR, IB_MGMT_MAD_DATA,
				      GFP_KERNEL);
	if (IS_ERR(send_buf)) {
		ret = PTR_ERR(send_buf);
		printk(KERN_ERR SPFX "ib_create_send_mad error:%d\n", ret);
		printk(KERN_ERR SPFX "ib_create_send_mad error\n");
		goto err1;
	}

@@ -126,16 +123,15 @@ int agent_send_response(struct ib_mad *mad, struct ib_grh *grh,
		mad_send_wr->send_wr.wr.ud.port_num = port_num;
	}

	if ((ret = ib_post_send_mad(send_buf, NULL))) {
		printk(KERN_ERR SPFX "ib_post_send_mad error:%d\n", ret);
	if (ib_post_send_mad(send_buf, NULL)) {
		printk(KERN_ERR SPFX "ib_post_send_mad error\n");
		goto err2;
	}
	return 0;
	return;
err2:
	ib_free_send_mad(send_buf);
err1:
	ib_destroy_ah(ah);
	return ret;
}

static void agent_send_handler(struct ib_mad_agent *mad_agent,
+3 −3
Original line number Diff line number Diff line
@@ -46,7 +46,7 @@ extern int ib_agent_port_open(struct ib_device *device, int port_num);

extern int ib_agent_port_close(struct ib_device *device, int port_num);

extern int agent_send_response(struct ib_mad *mad, struct ib_grh *grh,
extern void agent_send_response(struct ib_mad *mad, struct ib_grh *grh,
				struct ib_wc *wc, struct ib_device *device,
				int port_num, int qpn);

+1 −1
Original line number Diff line number Diff line
@@ -702,7 +702,7 @@ int ib_find_pkey(struct ib_device *device,
		if (ret)
			return ret;

		if (pkey == tmp_pkey) {
		if ((pkey & 0x7fff) == (tmp_pkey & 0x7fff)) {
			*index = i;
			return 0;
		}
+13 −12
Original line number Diff line number Diff line
@@ -1842,16 +1842,11 @@ static void ib_mad_recv_done_handler(struct ib_mad_port_private *port_priv,
{
	struct ib_mad_qp_info *qp_info;
	struct ib_mad_private_header *mad_priv_hdr;
	struct ib_mad_private *recv, *response;
	struct ib_mad_private *recv, *response = NULL;
	struct ib_mad_list_head *mad_list;
	struct ib_mad_agent_private *mad_agent;
	int port_num;

	response = kmem_cache_alloc(ib_mad_cache, GFP_KERNEL);
	if (!response)
		printk(KERN_ERR PFX "ib_mad_recv_done_handler no memory "
		       "for response buffer\n");

	mad_list = (struct ib_mad_list_head *)(unsigned long)wc->wr_id;
	qp_info = mad_list->mad_queue->qp_info;
	dequeue_mad(mad_list);
@@ -1879,6 +1874,13 @@ static void ib_mad_recv_done_handler(struct ib_mad_port_private *port_priv,
	if (!validate_mad(&recv->mad.mad, qp_info->qp->qp_num))
		goto out;

	response = kmem_cache_alloc(ib_mad_cache, GFP_KERNEL);
	if (!response) {
		printk(KERN_ERR PFX "ib_mad_recv_done_handler no memory "
		       "for response buffer\n");
		goto out;
	}

	if (port_priv->device->node_type == RDMA_NODE_IB_SWITCH)
		port_num = wc->port_num;
	else
@@ -1914,12 +1916,11 @@ static void ib_mad_recv_done_handler(struct ib_mad_port_private *port_priv,
			response->header.recv_wc.recv_buf.mad = &response->mad.mad;
			response->header.recv_wc.recv_buf.grh = &response->grh;

			if (!agent_send_response(&response->mad.mad,
			agent_send_response(&response->mad.mad,
					    &response->grh, wc,
					    port_priv->device,
					    smi_get_fwd_port(&recv->mad.smp),
						 qp_info->qp->qp_num))
				response = NULL;
					    qp_info->qp->qp_num);

			goto out;
		}
+4 −4
Original line number Diff line number Diff line
@@ -163,8 +163,10 @@ static struct ib_mad_send_buf *alloc_response_msg(struct ib_mad_agent *agent,
				 hdr_len, 0, GFP_KERNEL);
	if (IS_ERR(msg))
		ib_destroy_ah(ah);
	else
	else {
		msg->ah = ah;
		msg->context[0] = ah;
	}

	return msg;
}
@@ -197,9 +199,7 @@ static void ack_ds_ack(struct ib_mad_agent_private *agent,

void ib_rmpp_send_handler(struct ib_mad_send_wc *mad_send_wc)
{
	struct ib_rmpp_mad *rmpp_mad = mad_send_wc->send_buf->mad;

	if (rmpp_mad->rmpp_hdr.rmpp_type != IB_MGMT_RMPP_TYPE_ACK)
	if (mad_send_wc->send_buf->context[0] == mad_send_wc->send_buf->ah)
		ib_destroy_ah(mad_send_wc->send_buf->ah);
	ib_free_send_mad(mad_send_wc->send_buf);
}
Loading