]> git.openfabrics.org - ~shefty/librdmacm.git/commitdiff
rsockets: Allow user to specify the QP sizes
authorSean Hefty <sean.hefty@intel.com>
Fri, 18 May 2012 23:56:15 +0000 (16:56 -0700)
committerSean Hefty <sean.hefty@intel.com>
Thu, 24 May 2012 21:25:00 +0000 (14:25 -0700)
Add setsockopt options that allow the user to specify the desired
size of the underlying QP.  The provided sizes are used as the
maximum size when creating the QP.  The actual sizes of the QP
are the smaller of the user provided maximum and the maximum
sizes supported by the underlying hardware.

A user may retrieve the actual sizes of the QP through the
getsockopt call.

The send and receive queue sizes are specified separately.

Signed-off-by: Sean Hefty <sean.hefty@intel.com>
include/rdma/rsocket.h
src/cma.h
src/rsocket.c

index 87ee943ea5e1fd54d5a6d0db521f74a62fe0dd88..9fd99290682811a32cd33a520ed8095eb1e2ddd4 100644 (file)
@@ -73,6 +73,10 @@ int rgetpeername(int socket, struct sockaddr *addr, socklen_t *addrlen);
 int rgetsockname(int socket, struct sockaddr *addr, socklen_t *addrlen);
 
 #define SOL_RDMA 0x10000
+enum {
+       RDMA_SQSIZE,
+       RDMA_RQSIZE
+};
 
 int rsetsockopt(int socket, int level, int optname,
                const void *optval, socklen_t optlen);
index 669b6819e18e17f020fd59becb0de05ab2854fec..fc97ad56ed6edf0553919cc95519353390997146 100644 (file)
--- a/src/cma.h
+++ b/src/cma.h
@@ -67,6 +67,7 @@ static inline uint64_t htonll(uint64_t x) { return x; }
 static inline uint64_t ntohll(uint64_t x) { return x; }
 #endif
 
+#define max(a, b) ((a) > (b) ? a : b)
 #define min(a, b) ((a) < (b) ? a : b)
 
 /*
index 9efdbfa35cdda7b822914f1e9224bdc115901bb8..527c0dc69417b22935130d94f77ef0db6231d140 100644 (file)
@@ -268,8 +268,15 @@ static void rs_set_qp_size(struct rsocket *rs)
 
        if (rs->sq_size > max_size)
                rs->sq_size = max_size;
+       else if (rs->sq_size < 2)
+               rs->sq_size = 2;
+       if (rs->sq_size <= (RS_QP_CTRL_SIZE << 2))
+               rs->ctrl_avail = 1;
+
        if (rs->rq_size > max_size)
                rs->rq_size = max_size;
+       else if (rs->rq_size < 2)
+               rs->rq_size = 2;
 }
 
 static int rs_init_bufs(struct rsocket *rs)
@@ -1694,12 +1701,27 @@ int rsetsockopt(int socket, int level, int optname,
                }
                break;
        case SOL_RDMA:
+               if (rs->state != rs_init && rs->state != rs_bound) {
+                       ret = ERR(EINVAL);
+                       break;
+               }
+
+               switch (optname) {
+               case RDMA_SQSIZE:
+                       rs->sq_size = min((*(uint32_t *) optval), RS_QP_MAX_SIZE);
+                       break;
+               case RDMA_RQSIZE:
+                       rs->rq_size = min((*(uint32_t *) optval), RS_QP_MAX_SIZE);
+                       break;
+               default:
+                       break;
+               }
                break;
        default:
                break;
        }
 
-       if (!ret) {
+       if (!ret && opts) {
                if (opt_on)
                        *opts |= (1 << optname);
                else
@@ -1761,7 +1783,19 @@ int rgetsockopt(int socket, int level, int optname,
                }
                break;
        case SOL_RDMA:
-               ret = ENOTSUP;
+               switch (optname) {
+               case RDMA_SQSIZE:
+                       *((int *) optval) = rs->sq_size;
+                       *optlen = sizeof(int);
+                       break;
+               case RDMA_RQSIZE:
+                       *((int *) optval) = rs->rq_size;
+                       *optlen = sizeof(int);
+                       break;
+               default:
+                       ret = ENOTSUP;
+                       break;
+               }
                break;
        default:
                ret = ENOTSUP;