svn commit: r318973 - head/contrib/ofed/libcxgb4/src
Navdeep Parhar
np at FreeBSD.org
Sat May 27 02:05:23 UTC 2017
Author: np
Date: Sat May 27 02:05:21 2017
New Revision: 318973
URL: https://svnweb.freebsd.org/changeset/base/318973
Log:
libcxgb4: Use memcpy instead of copying WRs 8B at a time in the userspace
RDMA library for cxgbe(4).
MFC after: 3 days
Sponsored by: Chelsio Communications
Modified:
head/contrib/ofed/libcxgb4/src/qp.c
Modified: head/contrib/ofed/libcxgb4/src/qp.c
==============================================================================
--- head/contrib/ofed/libcxgb4/src/qp.c Sat May 27 01:35:59 2017 (r318972)
+++ head/contrib/ofed/libcxgb4/src/qp.c Sat May 27 02:05:21 2017 (r318973)
@@ -47,39 +47,49 @@ struct c4iw_stats c4iw_stats;
static void copy_wr_to_sq(struct t4_wq *wq, union t4_wr *wqe, u8 len16)
{
- u64 *src, *dst;
-
- src = (u64 *)wqe;
- dst = (u64 *)((u8 *)wq->sq.queue + wq->sq.wq_pidx * T4_EQ_ENTRY_SIZE);
+ void *src, *dst;
+ uintptr_t end;
+ int total, len;
+
+ src = &wqe->flits[0];
+ dst = &wq->sq.queue->flits[wq->sq.wq_pidx *
+ (T4_EQ_ENTRY_SIZE / sizeof(__be64))];
if (t4_sq_onchip(wq)) {
len16 = align(len16, 4);
wc_wmb();
}
- while (len16) {
- *dst++ = *src++;
- if (dst == (u64 *)&wq->sq.queue[wq->sq.size])
- dst = (u64 *)wq->sq.queue;
- *dst++ = *src++;
- if (dst == (u64 *)&wq->sq.queue[wq->sq.size])
- dst = (u64 *)wq->sq.queue;
- len16--;
+
+ total = len16 * 16;
+ end = (uintptr_t)&wq->sq.queue[wq->sq.size];
+ if (__predict_true((uintptr_t)dst + total <= end)) {
+ /* Won't wrap around. */
+ memcpy(dst, src, total);
+ } else {
+ len = end - (uintptr_t)dst;
+ memcpy(dst, src, len);
+ memcpy(wq->sq.queue, src + len, total - len);
}
}
static void copy_wr_to_rq(struct t4_wq *wq, union t4_recv_wr *wqe, u8 len16)
{
- u64 *src, *dst;
-
- src = (u64 *)wqe;
- dst = (u64 *)((u8 *)wq->rq.queue + wq->rq.wq_pidx * T4_EQ_ENTRY_SIZE);
- while (len16) {
- *dst++ = *src++;
- if (dst >= (u64 *)&wq->rq.queue[wq->rq.size])
- dst = (u64 *)wq->rq.queue;
- *dst++ = *src++;
- if (dst >= (u64 *)&wq->rq.queue[wq->rq.size])
- dst = (u64 *)wq->rq.queue;
- len16--;
+ void *src, *dst;
+ uintptr_t end;
+ int total, len;
+
+ src = &wqe->flits[0];
+ dst = &wq->rq.queue->flits[wq->rq.wq_pidx *
+ (T4_EQ_ENTRY_SIZE / sizeof(__be64))];
+
+ total = len16 * 16;
+ end = (uintptr_t)&wq->rq.queue[wq->rq.size];
+ if (__predict_true((uintptr_t)dst + total <= end)) {
+ /* Won't wrap around. */
+ memcpy(dst, src, total);
+ } else {
+ len = end - (uintptr_t)dst;
+ memcpy(dst, src, len);
+ memcpy(wq->rq.queue, src + len, total - len);
}
}
More information about the svn-src-head
mailing list