Commit 192db8b4 authored by Antoine Kaufmann's avatar Antoine Kaufmann
Browse files

dist/net_rdma: batch transfer of entries if possible

parent e00c5148
......@@ -42,6 +42,7 @@
static const uint64_t kPollReportThreshold = 128;
static const uint64_t kCleanReportThreshold = 128;
static const uint64_t kPollMax = 8;
const char *shm_path = NULL;
size_t shm_size = 256 * 1024 * 1024ULL; // 256MB
......@@ -343,7 +344,9 @@ static int PeerEvent(struct Peer *peer, uint32_t events) {
static inline void PollPeerTransfer(struct Peer *peer, bool *report) {
// XXX: consider batching this to forward multiple entries at once if possible
void *entry = (peer->local_base + peer->local_pos * peer->local_elen);
size_t n;
for (n = 0; n < kPollMax && peer->local_pos + n < peer->local_enum; n++) {
void *entry = (peer->local_base + (peer->local_pos + n) * peer->local_elen);
bool ready;
if (peer->is_dev) {
struct SimbricksProtoNetD2NDummy *d2n = entry;
......@@ -354,10 +357,13 @@ static inline void PollPeerTransfer(struct Peer *peer, bool *report) {
ready = (n2d->own_type & SIMBRICKS_PROTO_NET_N2D_OWN_MASK) ==
SIMBRICKS_PROTO_NET_N2D_OWN_DEV;
}
if (!ready)
break;
}
if (ready) {
RdmaPassEntry(peer);
peer->local_pos += 1;
if (n > 0) {
RdmaPassEntry(peer, n);
peer->local_pos += n;
if (peer->local_pos >= peer->local_enum)
peer->local_pos -= peer->local_enum;
......
......@@ -106,7 +106,7 @@ int PeerReport(struct Peer *peer, uint32_t written_pos, uint32_t clean_pos);
int RdmaListen(struct sockaddr_in *addr);
int RdmaConnect(struct sockaddr_in *addr);
int RdmaPassIntro(struct Peer *peer);
int RdmaPassEntry(struct Peer *peer);
int RdmaPassEntry(struct Peer *peer, uint32_t n);
int RdmaPassReport();
int RdmaEvent();
......
......@@ -550,7 +550,7 @@ int RdmaPassIntro(struct Peer *peer) {
return 0;
}
int RdmaPassEntry(struct Peer *peer) {
int RdmaPassEntry(struct Peer *peer, uint32_t n) {
#ifdef RDMA_DEBUG
fprintf(stderr, "RdmaPassEntry(%s,%u)\n", peer->sock_path, peer->local_pos);
fprintf(stderr, " remote_base=%lx local_base=%p\n", peer->remote_base,
......@@ -560,7 +560,7 @@ int RdmaPassEntry(struct Peer *peer) {
uint64_t pos = peer->local_pos * peer->local_elen;
struct ibv_sge sge;
sge.addr = (uintptr_t) (peer->local_base + pos);
sge.length = peer->local_elen;
sge.length = peer->local_elen * n;
sge.lkey = peer->shm_mr->lkey;
struct ibv_send_wr send_wr = { };
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment