static struct index_map idm;
static pthread_mutex_t mut = PTHREAD_MUTEX_INITIALIZER;
+static int sq_size;
+static int rq_size;
+static int sq_inline;
+
enum fd_type {
fd_normal,
fd_rsocket
return type;
}
+void getenv_options(void)
+{
+ char *var;
+
+ var = getenv("RS_SQ_SIZE");
+ if (var)
+ sq_size = atoi(var);
+
+ var = getenv("RS_RQ_SIZE");
+ if (var)
+ rq_size = atoi(var);
+
+ var = getenv("RS_INLINE");
+ if (var)
+ sq_inline = atoi(var);
+}
+
static void init_preload(void)
{
static int init;
real_setsockopt = dlsym(RTLD_NEXT, "setsockopt");
real_getsockopt = dlsym(RTLD_NEXT, "getsockopt");
real_fcntl = dlsym(RTLD_NEXT, "fcntl");
+
+ getenv_options();
init = 1;
out:
pthread_mutex_unlock(&mut);
return ret;
}
+/*
+ * Use defaults on failure.
+ */
+void set_rsocket_options(int rsocket)
+{
+ if (sq_size)
+ rsetsockopt(rsocket, SOL_RDMA, RDMA_SQSIZE, &sq_size, sizeof sq_size);
+
+ if (rq_size)
+ rsetsockopt(rsocket, SOL_RDMA, RDMA_RQSIZE, &rq_size, sizeof rq_size);
+
+ if (sq_inline)
+ rsetsockopt(rsocket, SOL_RDMA, RDMA_INLINE, &sq_inline, sizeof sq_inline);
+}
+
int socket(int domain, int type, int protocol)
{
static __thread int recursive;
recursive = 0;
if (ret >= 0) {
fd_store(index, ret, fd_rsocket);
+ set_rsocket_options(ret);
return index;
}
fd_close(index, &ret);