user_mad: Add receive side RMPP support Signed-off-by: Hal Rosenstock <[EMAIL PROTECTED]>
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); _______________________________________________ openib-general mailing list openib-general@openib.org http://openib.org/mailman/listinfo/openib-general To unsubscribe, please visit http://openib.org/mailman/listinfo/openib-general