On Thu, 2012-08-16 at 22:51 +0000, Hefty, Sean wrote: > Adapted from patch by Sridhar Samudrala <[email protected]> > > Signed-off-by: Sean Hefty <[email protected]>
Acked-by: Sridhar Samudrala <[email protected]> > --- > The diff makes the changes look bigger than they are. I used a loop, > kept my state check, and fixed how rbuf_bytes_avail gets updated. > > src/rsocket.c | 71 > +++++++++++++++++++++++++++++++-------------------------- > 1 files changed, 38 insertions(+), 33 deletions(-) > > diff --git a/src/rsocket.c b/src/rsocket.c > index 996cb2f..4c4821b 100644 > --- a/src/rsocket.c > +++ b/src/rsocket.c > @@ -1131,43 +1131,48 @@ ssize_t rrecv(int socket, void *buf, size_t len, int > flags) > } > } > fastlock_acquire(&rs->rlock); > - if (!rs_have_rdata(rs)) { > - ret = rs_get_comp(rs, rs_nonblocking(rs, flags), > rs_conn_have_rdata); > - if (ret) > - goto out; > - } > - > - ret = 0; > - if (flags & MSG_PEEK) { > - left = len - rs_peek(rs, buf, len); > - goto out; > - } > + do { > + if (!rs_have_rdata(rs)) { > + ret = rs_get_comp(rs, rs_nonblocking(rs, flags), > + rs_conn_have_rdata); > + if (ret) > + break; > + } > > - for (; left && rs_have_rdata(rs); left -= rsize) { > - if (left < rs->rmsg[rs->rmsg_head].data) { > - rsize = left; > - rs->rmsg[rs->rmsg_head].data -= left; > - } else { > - rs->rseq_no++; > - rsize = rs->rmsg[rs->rmsg_head].data; > - if (++rs->rmsg_head == rs->rq_size + 1) > - rs->rmsg_head = 0; > + ret = 0; > + if (flags & MSG_PEEK) { > + left = len - rs_peek(rs, buf, left); > + break; > } > > - end_size = rs->rbuf_size - rs->rbuf_offset; > - if (rsize > end_size) { > - memcpy(buf, &rs->rbuf[rs->rbuf_offset], end_size); > - rs->rbuf_offset = 0; > - buf += end_size; > - rsize -= end_size; > - left -= end_size; > + for (; left && rs_have_rdata(rs); left -= rsize) { > + if (left < rs->rmsg[rs->rmsg_head].data) { > + rsize = left; > + rs->rmsg[rs->rmsg_head].data -= left; > + } else { > + rs->rseq_no++; > + rsize = rs->rmsg[rs->rmsg_head].data; > + if (++rs->rmsg_head == rs->rq_size + 1) > + rs->rmsg_head = 0; > + } > + > + end_size = rs->rbuf_size - rs->rbuf_offset; > + if (rsize > end_size) { > + memcpy(buf, &rs->rbuf[rs->rbuf_offset], > end_size); > + rs->rbuf_offset = 0; > + buf += end_size; > + rsize -= end_size; > + left -= end_size; > + rs->rbuf_bytes_avail += end_size; > + } > + memcpy(buf, &rs->rbuf[rs->rbuf_offset], rsize); > + rs->rbuf_offset += rsize; > + buf += rsize; > + rs->rbuf_bytes_avail += rsize; > } > - memcpy(buf, &rs->rbuf[rs->rbuf_offset], rsize); > - rs->rbuf_offset += rsize; > - buf += rsize; > - } > - rs->rbuf_bytes_avail += len - left; > -out: > + > + } while (left && (flags & MSG_WAITALL) && (rs->state & rs_connect_rd)); > + > fastlock_release(&rs->rlock); > return ret ? ret : len - left; > } > > -- To unsubscribe from this list: send the line "unsubscribe linux-rdma" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html
