Udiff 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,23 +22,31 @@
 /*
  * 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>
 
-/*
- * RDMA chunk size
- */
-#define        RDMA_MINCHUNK   1024
 uint_t rdma_minchunk = RDMA_MINCHUNK;
 
 /*
  * Globals
  */
@@ -188,18 +196,27 @@
 {
        struct clist *c;
        int status;
 
        for (c = cl; c; c = c->c_next) {
+       if(c->c_len > 0)
                if (src) {
-                       status = RDMA_REGMEMSYNC(conn,
+                       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,
+                       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,20 +234,28 @@
                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,11 +281,11 @@
 rdma_stat
 rdma_clnt_postrecv(CONN *conn, uint32_t xid)
 {
        struct clist *cl = NULL;
        rdma_stat retval;
-       rdma_buf_t rbuf;
+       rdma_buf_t rbuf = {0};
 
        rbuf.type = RECV_BUFFER;
        if (RDMA_BUF_ALLOC(conn, &rbuf)) {
                retval = RDMA_NORESOURCE;
        } else {
@@ -275,11 +300,11 @@
 rdma_stat
 rdma_svc_postrecv(CONN *conn)
 {
        struct clist *cl = NULL;
        rdma_stat retval;
-       rdma_buf_t rbuf;
+       rdma_buf_t rbuf = {0};
 
        rbuf.type = RECV_BUFFER;
        if (RDMA_BUF_ALLOC(conn, &rbuf)) {
                retval = RDMA_NORESOURCE;
        } else {
@@ -298,24 +323,28 @@
        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,10 +357,15 @@
        }
        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;
 }