]> 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 22:25:26 +0000 (15: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 f28eaf3a1dc9dc136b535091e069819f043faa26..2f5215c10298646a3a55514492d42ca7f3cdee5f 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 15e28de43d204b4ef5fce029503cef7adaac48d6..78d7338ab1d445600b8f5991d6d3ef4c8afa131f 100644 (file)
@@ -265,8 +265,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)
@@ -1691,12 +1698,27 @@ int rsetsockopt(int socket, int level, int optname,
                }
                break;
        case SOL_RDMA:
+               if (rs->state > rs_listening) {
+                       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
@@ -1758,7 +1780,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;