summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBenoît Ganne <bganne@cisco.com>2020-01-07 16:08:43 +0100
committerAndrew Yourtchenko <ayourtch@gmail.com>2020-01-08 19:51:04 +0000
commitd8c1ef925af5db085a7649076047eda48ac68404 (patch)
treedfe9a8a055370b362620ecc1e178334722953bab
parentaffc5f6d3d3c17eb8ae1cf7b04a1a1e638516ca4 (diff)
rdma: api: prepare support for direct verb
Prepare rdma interface creation API for direct verb support: - add new optional 'mode' parameters to select between ibverb or direct verb backend (optional, default to 'auto') - set default value for rxq_num (1), rxq_size (1024) and txq_size (1024) so they are now optional - bump default create value for rxq_size and txq_size to 1024 if unset (0) so they are coherent with default values above Type: feature Change-Id: Id9eae2b8eb0baaf34a0fcd55da6ad09515f57a93 Signed-off-by: Benoît Ganne <bganne@cisco.com>
-rw-r--r--src/plugins/rdma/api.c16
-rw-r--r--src/plugins/rdma/cli.c2
-rw-r--r--src/plugins/rdma/device.c17
-rw-r--r--src/plugins/rdma/rdma.api24
-rw-r--r--src/plugins/rdma/rdma.h8
-rw-r--r--src/plugins/rdma/test_api.c16
-rw-r--r--src/plugins/rdma/unformat.c6
7 files changed, 79 insertions, 10 deletions
diff --git a/src/plugins/rdma/api.c b/src/plugins/rdma/api.c
index cd3c36065f2..fe1103f99fe 100644
--- a/src/plugins/rdma/api.c
+++ b/src/plugins/rdma/api.c
@@ -29,6 +29,21 @@
#include <vlibapi/api_helper_macros.h>
+static rdma_mode_t
+rdma_api_mode (vl_api_rdma_mode_t mode)
+{
+ switch (mode)
+ {
+ case RDMA_API_MODE_AUTO:
+ return RDMA_MODE_AUTO;
+ case RDMA_API_MODE_IBV:
+ return RDMA_MODE_IBV;
+ case RDMA_API_MODE_DV:
+ return RDMA_MODE_DV;
+ }
+ return RDMA_MODE_AUTO;
+}
+
static void
vl_api_rdma_create_t_handler (vl_api_rdma_create_t * mp)
{
@@ -45,6 +60,7 @@ vl_api_rdma_create_t_handler (vl_api_rdma_create_t * mp)
args.rxq_num = ntohs (mp->rxq_num);
args.rxq_size = ntohs (mp->rxq_size);
args.txq_size = ntohs (mp->txq_size);
+ args.mode = rdma_api_mode (mp->mode);
rdma_create_if (vm, &args);
rv = args.rv;
diff --git a/src/plugins/rdma/cli.c b/src/plugins/rdma/cli.c
index 3f39cfeb66b..73e91c298b1 100644
--- a/src/plugins/rdma/cli.c
+++ b/src/plugins/rdma/cli.c
@@ -49,7 +49,7 @@ VLIB_CLI_COMMAND (rdma_create_command, static) = {
.path = "create interface rdma",
.short_help = "create interface rdma <host-if ifname> [name <name>]"
" [rx-queue-size <size>] [tx-queue-size <size>]"
- " [num-rx-queues <size>]",
+ " [num-rx-queues <size>] [mode <auto|ibv|dv]",
.function = rdma_create_command_fn,
};
/* *INDENT-ON* */
diff --git a/src/plugins/rdma/device.c b/src/plugins/rdma/device.c
index 70720e4df74..7316edbaa25 100644
--- a/src/plugins/rdma/device.c
+++ b/src/plugins/rdma/device.c
@@ -589,8 +589,8 @@ rdma_create_if (vlib_main_t * vm, rdma_create_if_args_t * args)
u16 qid;
int i;
- args->rxq_size = args->rxq_size ? args->rxq_size : 2 * VLIB_FRAME_SIZE;
- args->txq_size = args->txq_size ? args->txq_size : 2 * VLIB_FRAME_SIZE;
+ args->rxq_size = args->rxq_size ? args->rxq_size : 1024;
+ args->txq_size = args->txq_size ? args->txq_size : 1024;
args->rxq_num = args->rxq_num ? args->rxq_num : 1;
if (!is_pow2 (args->rxq_num))
@@ -611,6 +611,19 @@ rdma_create_if (vlib_main_t * vm, rdma_create_if_args_t * args)
goto err0;
}
+ switch (args->mode)
+ {
+ case RDMA_MODE_AUTO:
+ break;
+ case RDMA_MODE_IBV:
+ break;
+ case RDMA_MODE_DV:
+ args->rv = VNET_API_ERROR_INVALID_VALUE;
+ args->error = clib_error_return (0, "unsupported mode");
+ goto err0;
+ break;
+ }
+
dev_list = ibv_get_device_list (&n_devs);
if (n_devs == 0)
{
diff --git a/src/plugins/rdma/rdma.api b/src/plugins/rdma/rdma.api
index a24c4fc7e21..668f2380e6f 100644
--- a/src/plugins/rdma/rdma.api
+++ b/src/plugins/rdma/rdma.api
@@ -18,14 +18,23 @@
option version = "1.0.0";
import "vnet/interface_types.api";
+enum rdma_mode
+{
+ RDMA_API_MODE_AUTO = 0,
+ RDMA_API_MODE_IBV = 1,
+ RDMA_API_MODE_DV = 2,
+};
+
+
/** \brief
@param client_index - opaque cookie to identify the sender
@param context - sender context, to match reply w/ request
@param host_if - Linux netdev interface name
@param name - new rdma interface name
- @param rxq_num - number of receive queues
- @param rxq_size - receive queue size
- @param txq_size - transmit queue size
+ @param rxq_num - number of receive queues (optional)
+ @param rxq_size - receive queue size (optional)
+ @param txq_size - transmit queue size (optional)
+ @param mode - operation mode (optional)
*/
define rdma_create
@@ -35,10 +44,11 @@ define rdma_create
string host_if[64];
string name[64];
- u16 rxq_num;
- u16 rxq_size;
- u16 txq_size;
- option vat_help = "<host-if ifname> [name <name>] [rx-queue-size <size>] [tx-queue-size <size>] [num-rx-queues <size>]";
+ u16 rxq_num [default=1];
+ u16 rxq_size [default=1024];
+ u16 txq_size [default=1024];
+ vl_api_rdma_mode_t mode [default=0];
+ option vat_help = "<host-if ifname> [name <name>] [rx-queue-size <size>] [tx-queue-size <size>] [num-rx-queues <size>] [mode <auto|ibv|dv>]";
};
/** \brief
diff --git a/src/plugins/rdma/rdma.h b/src/plugins/rdma/rdma.h
index 6e602cb31df..470309afba7 100644
--- a/src/plugins/rdma/rdma.h
+++ b/src/plugins/rdma/rdma.h
@@ -102,6 +102,13 @@ typedef struct
extern rdma_main_t rdma_main;
+typedef enum
+{
+ RDMA_MODE_AUTO = 0,
+ RDMA_MODE_IBV,
+ RDMA_MODE_DV,
+} rdma_mode_t;
+
typedef struct
{
u8 *ifname;
@@ -109,6 +116,7 @@ typedef struct
u32 rxq_size;
u32 txq_size;
u32 rxq_num;
+ rdma_mode_t mode;
/* return */
int rv;
diff --git a/src/plugins/rdma/test_api.c b/src/plugins/rdma/test_api.c
index cfd65c029c2..19c35920b7b 100644
--- a/src/plugins/rdma/test_api.c
+++ b/src/plugins/rdma/test_api.c
@@ -43,6 +43,21 @@ typedef struct
rdma_test_main_t rdma_test_main;
+static vl_api_rdma_mode_t
+api_rdma_mode (rdma_mode_t mode)
+{
+ switch (mode)
+ {
+ case RDMA_MODE_AUTO:
+ return RDMA_API_MODE_AUTO;
+ case RDMA_MODE_IBV:
+ return RDMA_API_MODE_IBV;
+ case RDMA_MODE_DV:
+ return RDMA_API_MODE_DV;
+ }
+ return ~0;
+}
+
/* rdma create API */
static int
api_rdma_create (vat_main_t * vam)
@@ -64,6 +79,7 @@ api_rdma_create (vat_main_t * vam)
mp->rxq_num = clib_host_to_net_u16 (args.rxq_num);
mp->rxq_size = clib_host_to_net_u16 (args.rxq_size);
mp->txq_size = clib_host_to_net_u16 (args.txq_size);
+ mp->mode = api_rdma_mode (args.mode);
S (mp);
W (ret);
diff --git a/src/plugins/rdma/unformat.c b/src/plugins/rdma/unformat.c
index 0b4a1212500..2bbb266f1bf 100644
--- a/src/plugins/rdma/unformat.c
+++ b/src/plugins/rdma/unformat.c
@@ -42,6 +42,12 @@ unformat_rdma_create_if_args (unformat_input_t * input, va_list * vargs)
;
else if (unformat (line_input, "num-rx-queues %u", &args->rxq_num))
;
+ else if (unformat (line_input, "mode auto"))
+ args->mode = RDMA_MODE_AUTO;
+ else if (unformat (line_input, "mode ibv"))
+ args->mode = RDMA_MODE_IBV;
+ else if (unformat (line_input, "mode dv"))
+ args->mode = RDMA_MODE_DV;
else
{
/* return failure on unknown input */