void *buffer = NULL;
gmnal_srxd_t *srxd = (gmnal_srxd_t*)private;
int status = PTL_OK;
+ size_t msglen = mlen;
+ size_t nob;
CDEBUG(D_TRACE, "gmnal_cb_recv libnal [%p], private[%p], cookie[%p], "
"niov[%d], iov [%p], offset["LPSZ"], mlen["LPSZ"], rlen["LPSZ"]\n",
* side occurrence of filling pkmap_count[].
*/
buffer = srxd->buffer;
- buffer += sizeof(gmnal_msghdr_t);
+ buffer += GMNAL_MSGHDR_SIZE;
buffer += sizeof(ptl_hdr_t);
while(niov--) {
if (offset >= iov->iov_len) {
offset -= iov->iov_len;
- } else if (offset > 0) {
- CDEBUG(D_INFO, "processing [%p] base [%p] "
- "len %d, offset %d, len ["LPSZ"]\n", iov,
- iov->iov_base + offset, iov->iov_len,
- offset, iov->iov_len - offset);
- gm_bcopy(buffer, iov->iov_base + offset,
- iov->iov_len - offset);
- buffer += iov->iov_len - offset;
- offset = 0;
} else {
- CDEBUG(D_INFO, "processing [%p] len ["LPSZ"]\n",
- iov, iov->iov_len);
- gm_bcopy(buffer, iov->iov_base, iov->iov_len);
- buffer += iov->iov_len;
+ nob = MIN (iov->iov_len - offset, msglen);
+ CDEBUG(D_INFO, "processing iov [%p] base [%p] "
+ "offset [%d] len ["LPSZ"] to [%p] left "
+ "["LPSZ"]\n", iov, iov->iov_base,
+ offset, nob, buffer, msglen);
+ gm_bcopy(buffer, iov->iov_base + offset, nob);
+ buffer += nob;
+ msglen -= nob;
+ offset = 0;
}
iov++;
}
libnal, private, cookie, kniov, kiov, offset, mlen, rlen);
if (srxd->type == GMNAL_SMALL_MESSAGE) {
+ size_t msglen = mlen;
+ size_t nob;
+
buffer = srxd->buffer;
- buffer += sizeof(gmnal_msghdr_t);
+ buffer += GMNAL_MSGHDR_SIZE;
buffer += sizeof(ptl_hdr_t);
/*
if (offset >= kiov->kiov_len) {
offset -= kiov->kiov_len;
} else {
+ nob = MIN (kiov->kiov_len - offset, msglen);
CDEBUG(D_INFO, "kniov page [%p] len [%d] "
"offset[%d]\n", kiov->kiov_page,
kiov->kiov_len, kiov->kiov_offset);
- CDEBUG(D_INFO, "Calling kmap[%p]", kiov->kiov_page);
ptr = ((char *)kmap(kiov->kiov_page)) +
kiov->kiov_offset;
- if (offset > 0) {
- CDEBUG(D_INFO, "processing [%p] base "
- "[%p] len %d, offset %d, len ["
- LPSZ"]\n", ptr, ptr + offset,
- kiov->kiov_len, offset,
- kiov->kiov_len - offset);
- gm_bcopy(buffer, ptr + offset,
- kiov->kiov_len - offset);
- buffer += kiov->kiov_len - offset;
- offset = 0;
- } else {
- CDEBUG(D_INFO, "processing [%p] len ["
- LPSZ"]\n", ptr, kiov->kiov_len);
- gm_bcopy(buffer, ptr, kiov->kiov_len);
- buffer += kiov->kiov_len;
- }
+ CDEBUG(D_INFO, "processing ptr [%p] offset [%d] "
+ "len ["LPSZ"] from [%p] left ["LPSZ"]\n",
+ ptr, offset, nob, buffer, msglen);
+ gm_bcopy(buffer, ptr + offset, nob);
kunmap(kiov->kiov_page);
- CDEBUG(D_INFO, "Stored in [%p]\n", ptr);
+ buffer += nob;
+ msglen -= nob;
+ offset = 0;
}
kiov++;
}
}
if (GMNAL_IS_SMALL_MESSAGE(nal_data, niov, iov, len)) {
+ size_t msglen = len;
+ size_t nob;
+
CDEBUG(D_INFO, "This is a small message send\n");
/*
* HP SFS 1380: With the change to gmnal_small_tx, need to get
stxd = gmnal_get_stxd(nal_data, 1);
CDEBUG(D_INFO, "stxd [%p]\n", stxd);
/* Set the offset of the data to copy into the buffer */
- buffer = stxd->buffer +sizeof(gmnal_msghdr_t)+sizeof(ptl_hdr_t);
+ buffer = stxd->buffer + GMNAL_MSGHDR_SIZE + sizeof(ptl_hdr_t);
while(niov--) {
if (offset >= iov->iov_len) {
offset -= iov->iov_len;
- } else if (offset > 0) {
- CDEBUG(D_INFO, "processing iov [%p] base [%p] "
- "len ["LPSZ"] to [%p]\n",
- iov, iov->iov_base + offset,
- iov->iov_len - offset, buffer);
- gm_bcopy(iov->iov_base + offset, buffer,
- iov->iov_len - offset);
- buffer+= iov->iov_len - offset;
- offset = 0;
} else {
- CDEBUG(D_INFO, "processing iov [%p] len ["LPSZ
- "] to [%p]\n", iov, iov->iov_len,buffer);
- gm_bcopy(iov->iov_base, buffer, iov->iov_len);
- buffer+= iov->iov_len;
+ nob = MIN (iov->iov_len - offset, msglen);
+ CDEBUG(D_INFO, "processing iov [%p] base [%p]"
+ " offset [%d] len ["LPSZ"] to [%p] left"
+ " ["LPSZ"]\n", iov, iov->iov_base,
+ offset, nob, buffer, msglen);
+ gm_bcopy(iov->iov_base + offset, buffer, nob);
+ buffer += nob;
+ msglen -= nob;
+ offset = 0;
}
iov++;
}
stxd = gmnal_get_stxd(nal_data, 1);
CDEBUG(D_INFO, "stxd [%p]\n", stxd);
/* Set the offset of the data to copy into the buffer */
- buffer = stxd->buffer + sizeof(gmnal_msghdr_t) + sizeof(ptl_hdr_t);
+ buffer = stxd->buffer + GMNAL_MSGHDR_SIZE + sizeof(ptl_hdr_t);
if (GMNAL_IS_SMALL_MESSAGE(nal_data, 0, NULL, len)) {
+ size_t msglen = len;
+ size_t nob;
+
CDEBUG(D_INFO, "This is a small message send\n");
while(kniov--) {
if (offset >= kiov->kiov_len) {
offset -= kiov->kiov_len;
} else {
+ nob = MIN (kiov->kiov_len - offset, msglen);
CDEBUG(D_INFO, "kniov page [%p] len [%d] offset[%d]\n",
kiov->kiov_page, kiov->kiov_len,
kiov->kiov_offset);
ptr = ((char *)kmap(kiov->kiov_page)) +
kiov->kiov_offset;
- if (offset > 0) {
- CDEBUG(D_INFO, "processing [%p] base "
- "[%p] len ["LPSZ"] to [%p]\n",
- ptr, ptr + offset,
- kiov->kiov_len - offset, buffer);
- gm_bcopy(ptr + offset, buffer,
- kiov->kiov_len - offset);
- buffer+= kiov->kiov_len - offset;
- offset = 0;
- } else {
- CDEBUG(D_INFO, "processing kmapped [%p]"
- " len ["LPSZ"] to [%p]\n",
- ptr, kiov->kiov_len, buffer);
- gm_bcopy(ptr, buffer, kiov->kiov_len);
-
- buffer += kiov->kiov_len;
- }
+ CDEBUG(D_INFO, "processing ptr [%p] offset [%d]"
+ " len ["LPSZ"] to [%p] left ["LPSZ"]\n",
+ ptr, offset, nob, buffer, msglen);
+ gm_bcopy(ptr + offset, buffer, nob);
kunmap(kiov->kiov_page);
+ buffer += nob;
+ msglen -= nob;
+ offset = 0;
}
kiov++;
}
sprintf(current->comm, "gmnal_ct");
- daemonize();
+ kportal_daemonize("gmnalctd");
nal_data->ctthread_flag = GMNAL_CTTHREAD_STARTED;
*/
int gmnal_rx_thread(void *arg)
{
+ char name[16];
gmnal_data_t *nal_data;
void *buffer;
gmnal_rxtwe_t *we = NULL;
if (nal_data->rxthread_pid[rank] == current->pid)
break;
- sprintf(current->comm, "gmnal_rx_%d", rank);
+ snprintf(name, sizeof(name), "gmnal_rx_%d", rank);
- daemonize();
+ kportal_daemonize(name);
/*
* set 1 bit for each thread started
* doesn't matter which bit
rc = lib_parse(nal_data->libnal, portals_hdr, srxd);
if (rc != PTL_OK) {
- /* I just received garbage; take appropriate action... */
- LBUG();
+ /* I just received garbage; return the srxd for use */
+ CWARN("Returning srxd and discarding message, "
+ "lib_parse didn't like it.\n");
+ return(gmnal_rx_bad(nal_data, we, srxd));
}
return(GMNAL_STATUS_OK);
msghdr->sender_node_id = nal_data->gm_global_nid;
CDEBUG(D_INFO, "processing msghdr at [%p]\n", buffer);
- buffer += sizeof(gmnal_msghdr_t);
+ buffer += GMNAL_MSGHDR_SIZE;
CDEBUG(D_INFO, "processing portals hdr at [%p]\n", buffer);
gm_bcopy(hdr, buffer, sizeof(ptl_hdr_t));
buffer += sizeof(ptl_hdr_t);
CDEBUG(D_INFO, "sending\n");
- tot_size = size+sizeof(ptl_hdr_t)+sizeof(gmnal_msghdr_t);
+ tot_size = size+sizeof(ptl_hdr_t)+GMNAL_MSGHDR_SIZE;
stxd->msg_size = tot_size;
void gmnal_resume_sending_callback(struct gm_port *gm_port, void *context,
gm_status_t status)
{
- gmnal_data_t *nal_data;
gmnal_stxd_t *stxd = (gmnal_stxd_t*)context;
+ gmnal_data_t *nal_data = (gmnal_data_t*)stxd->nal_data;
CDEBUG(D_TRACE, "status is [%d] context is [%p]\n", status, context);
gmnal_return_stxd(stxd->nal_data, stxd);
+ lib_finalize(nal_data->libnal, stxd, stxd->cookie, PTL_FAIL);
return;
}
} else {
CERROR("send_to_peer status for stxd [%p] is "
"[%d][%s]\n", stxd, status, gmnal_gm_error(status));
+ /* Recycle the stxd */
+ gmnal_return_stxd(nal_data, stxd);
+ lib_finalize(nal_data->libnal, stxd, stxd->cookie, PTL_FAIL);
}
-
return;
}
msghdr->sender_node_id = nal_data->gm_global_nid;
msghdr->stxd_remote_ptr = (gm_remote_ptr_t)stxd;
msghdr->niov = niov ;
- buffer += sizeof(gmnal_msghdr_t);
- mlen = sizeof(gmnal_msghdr_t);
+ buffer += GMNAL_MSGHDR_SIZE;
+ mlen = GMNAL_MSGHDR_SIZE;
CDEBUG(D_INFO, "mlen is [%d]\n", mlen);
buffer = srxd->buffer;
msghdr = (gmnal_msghdr_t*)buffer;
- buffer += sizeof(gmnal_msghdr_t);
+ buffer += GMNAL_MSGHDR_SIZE;
buffer += sizeof(ptl_hdr_t);
/*
CDEBUG(D_INFO, "processing msghdr at [%p]\n", buffer);
CDEBUG(D_INFO, "sending\n");
- stxd->msg_size= sizeof(gmnal_msghdr_t);
+ stxd->msg_size= GMNAL_MSGHDR_SIZE;
CDEBUG(D_NET, "Calling gm_send_to_peer port [%p] buffer [%p] "