}
if (pconn->queue) {
- char *buf;
-
- DEBUG(10, ("ibw_wc_send#queue %u", (int)wc->wr_id));
+ DEBUG(10, ("ibw_wc_send#queue %u\n", (int)wc->wr_id));
p = pconn->queue;
DLIST_REMOVE(pconn->queue, p);
- buf = (p->msg_large!=NULL) ? p->msg_large : p->msg;
- ibw_send(conn, buf, p, ntohl(*(uint32_t *)buf));
+ assert(p->queued_msg!=NULL);
+ ibw_send(conn, p->queued_msg, p, ntohl(*(uint32_t *)p->queued_msg));
+ p->queued_msg = NULL;
}
return 0;
DLIST_REMOVE(pconn->wr_list_avail, p);
DLIST_ADD(pconn->wr_list_used, p);
- if (len + sizeof(uint32_t) <= pctx->opts.avg_send_size) {
- *buf = (void *)(p->msg + sizeof(uint32_t));
+ if (len <= pctx->opts.avg_send_size) {
+ *buf = (void *)p->msg;
} else {
- p->msg_large = ibw_alloc_mr(pctx, pconn, len + sizeof(uint32_t), &p->mr_large);
+ p->msg_large = ibw_alloc_mr(pctx, pconn, len, &p->mr_large);
if (!p->msg_large) {
sprintf(ibw_lasterr, "ibw_alloc_mr#1 failed\n");
goto error;
}
- *buf = (void *)(p->msg_large + sizeof(uint32_t));
+ *buf = (void *)p->msg_large;
}
} else {
DEBUG(10, ("ibw_alloc_send_buf#2: cmid=%u, len=%d\n", (uint32_t)pconn->cm_id, len));
}
DLIST_REMOVE(pconn->extra_avail, p);
- p->msg_large = ibw_alloc_mr(pctx, pconn, len + sizeof(uint32_t), &p->mr_large);
+ p->msg_large = ibw_alloc_mr(pctx, pconn, len, &p->mr_large);
if (!p->msg_large) {
sprintf(ibw_lasterr, "ibw_alloc_mr#2 failed");
goto error;
}
- *buf = (void *)(p->msg_large + sizeof(uint32_t));
+ *buf = (void *)p->msg_large;
}
*key = (void *)p;
DEBUG(10, ("ibw_wc_send#1(cmid: %u, wrid: %u, n: %d)\n",
(uint32_t)pconn->cm_id, (uint32_t)wr.wr_id, len));
+ list.addr = (uintptr_t)buf;
if (p->msg_large==NULL) {
list.lkey = pconn->mr_send->lkey;
- list.addr = (uintptr_t) p->msg;
} else {
assert(p->mr_large!=NULL);
list.lkey = p->mr_large->lkey;
- list.addr = (uintptr_t) p->msg_large;
}
rc = ibv_post_send(pconn->cm_id->qp, &wr, &bad_wr);
/* to be sent by ibw_wc_send */
DLIST_ADD_END(pconn->queue, p, struct ibw_wr *); /* TODO: optimize */
+ p->queued_msg = buf;
return 0;
}