rdma: api: prepare support for direct verb 25/24225/4
authorBenoît Ganne <bganne@cisco.com>
Tue, 7 Jan 2020 15:08:43 +0000 (16:08 +0100)
committerAndrew Yourtchenko <ayourtch@gmail.com>
Wed, 8 Jan 2020 19:51:04 +0000 (19:51 +0000)
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>
src/plugins/rdma/api.c
src/plugins/rdma/cli.c
src/plugins/rdma/device.c
src/plugins/rdma/rdma.api
src/plugins/rdma/rdma.h
src/plugins/rdma/test_api.c
src/plugins/rdma/unformat.c

index cd3c360..fe1103f 100644 (file)
 
 #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;
index 3f39cfe..73e91c2 100644 (file)
@@ -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* */
index 70720e4..7316edb 100644 (file)
@@ -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)
     {
index a24c4fc..668f238 100644 (file)
 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
index 6e602cb..470309a 100644 (file)
@@ -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;
index cfd65c0..19c3592 100644 (file)
@@ -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);
index 0b4a121..2bbb266 100644 (file)
@@ -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 */