[openib-general] [PATCH] user_mad: Add receive side RMPP support

Hal Rosenstock halr at voltaire.com
Thu Jun 30 09:26:20 PDT 2005


user_mad: Add receive side RMPP support

Signed-off-by: Hal Rosenstock <halr at voltaire.com>

Index: user_mad.c
===================================================================
--- user_mad.c	(revision 2757)
+++ user_mad.c	(working copy)
@@ -176,7 +176,7 @@
 	if (mad_recv_wc->wc->status != IB_WC_SUCCESS)
 		goto out;
 
-	length = 256;	/* until RMPP is supported */
+	length = mad_recv_wc->mad_len; 
 	packet = kmalloc(sizeof *packet + length, GFP_KERNEL);
 	if (!packet)
 		goto out;
@@ -184,7 +184,8 @@
 	memset(packet, 0, sizeof *packet + length);
 	packet->length = length;
 
-	memcpy(packet->mad.data, mad_recv_wc->recv_buf.mad, length);
+	ib_coalesce_recv_mad(mad_recv_wc, packet->mad.data);
+
 	packet->mad.hdr.status    = 0;
 	packet->mad.hdr.qpn 	  = cpu_to_be32(mad_recv_wc->wc->src_qp);
 	packet->mad.hdr.lid 	  = cpu_to_be16(mad_recv_wc->wc->slid);
@@ -214,7 +215,7 @@
 	struct ib_umad_packet *packet;
 	ssize_t ret;
 
-	if (count < sizeof (struct ib_user_mad) + 256) /* until RMPP supported */ 
+	if (count < sizeof (struct ib_user_mad) + 256)
 		return -EINVAL;
 
 	spin_lock_irq(&file->recv_lock);
@@ -238,13 +239,14 @@
 	spin_unlock_irq(&file->recv_lock);
 
 	if (count < packet->length + sizeof (struct ib_user_mad))
-		ret = -EINVAL;
+		/* return length needed if too small */
+		ret = packet->length + sizeof (struct ib_user_mad);
 	else if (copy_to_user(buf, &packet->mad,
 			      packet->length + sizeof (struct ib_user_mad)))
 		ret = -EFAULT;
 	else
 		ret = packet->length + sizeof (struct ib_user_mad);
-	if (ret < 0) {
+	if (ret < 0 || count < packet->length + sizeof (struct ib_user_mad)) {
 		/* Requeue packet */
 		spin_lock_irq(&file->recv_lock);
 		list_add(&packet->list, &file->recv_list);






More information about the general mailing list