Cdiff rdma_subr.c
*** /webrev/webrev/usr/src/uts/common/rpc/rdma_subr.c- Mon Aug 14 13:12:10 2006
--- rdma_subr.c Sun Jul 23 00:43:23 2006
*** 22,44 ****
/*
* Copyright 2004 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
#pragma ident "@(#)rdma_subr.c 1.11 05/06/08 SMI"
#include <sys/systm.h>
#include <sys/kstat.h>
#include <sys/modctl.h>
#include <rpc/rpc_rdma.h>
#include <sys/ib/ibtl/ibti.h>
- /*
- * RDMA chunk size
- */
- #define RDMA_MINCHUNK 1024
uint_t rdma_minchunk = RDMA_MINCHUNK;
/*
* Globals
*/
--- 22,52 ----
/*
* Copyright 2004 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
+ /* Copyright (c) 2006, The Ohio State University. All rights reserved.
+ *
+ * Portions of this source code is developed by the team members of
+ * The Ohio State University's Network-Based Computing Laboratory (NBCL),
+ * headed by Professor Dhabaleswar K. (DK) Panda.
+ *
+ * Acknowledgements to contributions from developors:
+ * Ranjit Noronha: noronha@cse.ohio-state.edu
+ * Lei Chai : chail@cse.ohio-state.edu
+ * Weikuan Yu : yuw@cse.ohio-state.edu
+ *
+ */
#pragma ident "@(#)rdma_subr.c 1.11 05/06/08 SMI"
#include <sys/systm.h>
#include <sys/kstat.h>
#include <sys/modctl.h>
#include <rpc/rpc_rdma.h>
#include <sys/ib/ibtl/ibti.h>
uint_t rdma_minchunk = RDMA_MINCHUNK;
/*
* Globals
*/
*** 188,205 ****
{
struct clist *c;
int status;
for (c = cl; c; c = c->c_next) {
if (src) {
! status = RDMA_REGMEMSYNC(conn,
(caddr_t)(uintptr_t)c->c_saddr, c->c_len,
&c->c_smemhandle, (void **)&c->c_ssynchandle);
} else {
! status = RDMA_REGMEMSYNC(conn,
(caddr_t)(uintptr_t)c->c_daddr, c->c_len,
&c->c_dmemhandle, (void **)&c->c_dsynchandle);
}
if (status != RDMA_SUCCESS) {
(void) clist_deregister(conn, cl, src);
return (status);
}
--- 196,222 ----
{
struct clist *c;
int status;
for (c = cl; c; c = c->c_next) {
+ if(c->c_len > 0)
if (src) {
! status = RDMA_REGMEMSYNC(conn, (caddr_t)(struct as *)cl->c_adspc,
(caddr_t)(uintptr_t)c->c_saddr, c->c_len,
+ #ifdef SERVER_REG_CACHE
+ &c->c_smemhandle, (void **)&c->c_ssynchandle, (void *)c->long_reply_buf);
+ #else
&c->c_smemhandle, (void **)&c->c_ssynchandle);
+ #endif
} else {
! status = RDMA_REGMEMSYNC(conn, (caddr_t)(struct as *)cl->c_adspc,
(caddr_t)(uintptr_t)c->c_daddr, c->c_len,
+ #ifdef SERVER_REG_CACHE
+ &c->c_dmemhandle, (void **)&c->c_dsynchandle,(void *)c->long_reply_buf);
+ #else
&c->c_dmemhandle, (void **)&c->c_dsynchandle);
+ #endif
}
if (status != RDMA_SUCCESS) {
(void) clist_deregister(conn, cl, src);
return (status);
}
*** 217,236 ****
--- 234,261 ----
if (src) {
if (c->c_smemhandle.mrc_rmr != 0) {
(void) RDMA_DEREGMEMSYNC(conn,
(caddr_t)(uintptr_t)c->c_saddr,
c->c_smemhandle,
+ #ifdef SERVER_REG_CACHE
+ (void *)(uintptr_t)c->c_ssynchandle, (void *)c->long_reply_buf);
+ #else
(void *)(uintptr_t)c->c_ssynchandle);
+ #endif
c->c_smemhandle.mrc_rmr = 0;
c->c_ssynchandle = NULL;
}
} else {
if (c->c_dmemhandle.mrc_rmr != 0) {
(void) RDMA_DEREGMEMSYNC(conn,
(caddr_t)(uintptr_t)c->c_daddr,
c->c_dmemhandle,
+ #ifdef SERVER_REG_CACHE
+ (void *)(uintptr_t)c->c_dsynchandle, (void *)c->long_reply_buf);
+ #else
(void *)(uintptr_t)c->c_dsynchandle);
+ #endif
c->c_dmemhandle.mrc_rmr = 0;
c->c_dsynchandle = NULL;
}
}
}
*** 256,266 ****
rdma_stat
rdma_clnt_postrecv(CONN *conn, uint32_t xid)
{
struct clist *cl = NULL;
rdma_stat retval;
! rdma_buf_t rbuf;
rbuf.type = RECV_BUFFER;
if (RDMA_BUF_ALLOC(conn, &rbuf)) {
retval = RDMA_NORESOURCE;
} else {
--- 281,291 ----
rdma_stat
rdma_clnt_postrecv(CONN *conn, uint32_t xid)
{
struct clist *cl = NULL;
rdma_stat retval;
! rdma_buf_t rbuf = {0};
rbuf.type = RECV_BUFFER;
if (RDMA_BUF_ALLOC(conn, &rbuf)) {
retval = RDMA_NORESOURCE;
} else {
*** 275,285 ****
rdma_stat
rdma_svc_postrecv(CONN *conn)
{
struct clist *cl = NULL;
rdma_stat retval;
! rdma_buf_t rbuf;
rbuf.type = RECV_BUFFER;
if (RDMA_BUF_ALLOC(conn, &rbuf)) {
retval = RDMA_NORESOURCE;
} else {
--- 300,310 ----
rdma_stat
rdma_svc_postrecv(CONN *conn)
{
struct clist *cl = NULL;
rdma_stat retval;
! rdma_buf_t rbuf = {0};
rbuf.type = RECV_BUFFER;
if (RDMA_BUF_ALLOC(conn, &rbuf)) {
retval = RDMA_NORESOURCE;
} else {
*** 298,321 ****
--- 323,350 ----
rdma_stat status;
c = cl;
if (src) {
while (c != NULL) {
+ if(c->c_ssynchandle){
status = RDMA_SYNCMEM(conn,
(void *)(uintptr_t)c->c_ssynchandle,
(caddr_t)(uintptr_t)c->c_saddr, c->c_len, 0);
if (status != RDMA_SUCCESS)
return (status);
+ }
c = c->c_next;
}
} else {
while (c != NULL) {
+ if(c->c_ssynchandle){
status = RDMA_SYNCMEM(conn,
(void *)(uintptr_t)c->c_dsynchandle,
(caddr_t)(uintptr_t)c->c_daddr, c->c_len, 1);
if (status != RDMA_SUCCESS)
return (status);
+ }
c = c->c_next;
}
}
return (RDMA_SUCCESS);
}
*** 328,337 ****
--- 357,371 ----
}
if (rbuf->type != CHUNK_BUFFER) {
/* pool buffer */
RDMA_BUF_FREE(conn, rbuf);
} else {
+ #ifdef SERVER_REG_CACHE
+ if(rbuf->long_reply_buf)
+ RDMA_FREE_SERVER_CACHE_BUF(conn, (rib_lrc_entry_t *)rbuf->long_reply_buf);
+ else
+ #endif
kmem_free(rbuf->addr, rbuf->len);
}
rbuf->addr = NULL;
rbuf->len = 0;
}