diff options
Diffstat (limited to 'src/plugins/vmxnet3')
-rw-r--r-- | src/plugins/vmxnet3/README.md | 64 | ||||
-rw-r--r-- | src/plugins/vmxnet3/README.rst | 86 | ||||
-rw-r--r-- | src/plugins/vmxnet3/cli.c | 41 | ||||
-rw-r--r-- | src/plugins/vmxnet3/format.c | 2 | ||||
-rw-r--r-- | src/plugins/vmxnet3/input.c | 15 | ||||
-rw-r--r-- | src/plugins/vmxnet3/plugin.c | 2 | ||||
-rw-r--r-- | src/plugins/vmxnet3/vmxnet3.c | 96 | ||||
-rw-r--r-- | src/plugins/vmxnet3/vmxnet3.h | 19 | ||||
-rw-r--r-- | src/plugins/vmxnet3/vmxnet3_api.c | 19 | ||||
-rw-r--r-- | src/plugins/vmxnet3/vmxnet3_test.c | 2 |
10 files changed, 200 insertions, 146 deletions
diff --git a/src/plugins/vmxnet3/README.md b/src/plugins/vmxnet3/README.md deleted file mode 100644 index 6e9fb194c94..00000000000 --- a/src/plugins/vmxnet3/README.md +++ /dev/null @@ -1,64 +0,0 @@ -# VMWARE vmxnet3 device driver plugin {#vmxnet3_doc} - -##Overview -This plugin provides native PCI driver support for VMWare vmxnet3. - -##Prerequisites - * This code is tested with vfio-pci driver installed with Ubuntu 18.04 which -has kernel version 4.15.0-33-generic. - - * This driver is tested with ESXi vSwitch version 6.5/6.7 for LRO/TSO support, VMware Workstation 15 Pro (no LRO/TSO), and VMware Fusion 11 Pro (no LRO/TSO) - - * Driver requires MSI-X interrupt support, which is not supported by -uio_pci_generic driver. So vfio-pci must be used. On systems without IOMMU, -vfio driver can still be used with 4.15.0-33-generic kernel (Ubuntu 18.04) which supports no-iommu mode. - -##Known issues - -* VLAN filter - -## Usage -### System setup - -1. load VFIO driver -``` -sudo modprobe vfio-pci -``` - -2. Make sure the interface is down -``` -sudo ifconfig <if-name> down -``` - -Steps 3 and 4 are optional. They can be accomplished by specifying the optional keyword "bind" when creating the vmxnet3 interface. - -3. (systems without IOMMU only) enable unsafe NOIOMMU mode -``` -echo Y | sudo tee /sys/module/vfio/parameters/enable_unsafe_noiommu_mode -``` - -4. Bind interface to vfio-pci -``` -sudo dpdk-devbind.py --bind vfio-pci 0b:00.0 -``` - -### Interface Creation -Interface can be dynamically created with following CLI, with or without the bind option. If step 3 and 4 were executed, bind can be omitted. -``` -create interface vmxnet3 0000:0b:00.0 bind -set int state vmxnet3-0/b/0/0 up -``` - -### Interface Deletion -Interface can be deleted with following CLI: -``` -delete interface vmxnet3 <if-name> -``` - -### Interface Statistics -Interface statistics can be displayed with `show hardware-interface <if-name>` -command. - -### Show Interface CLI -Interface and ring information can be obtained with -`show vmxnet3 [if-name] [desc]` diff --git a/src/plugins/vmxnet3/README.rst b/src/plugins/vmxnet3/README.rst new file mode 100644 index 00000000000..14430433c17 --- /dev/null +++ b/src/plugins/vmxnet3/README.rst @@ -0,0 +1,86 @@ +VMWARE vmxnet3 device driver +============================ + +##Overview This plugin provides native PCI driver support for VMWare +vmxnet3. + +##Prerequisites \* This code is tested with vfio-pci driver installed +with Ubuntu 18.04 which has kernel version 4.15.0-33-generic. + +- This driver is tested with ESXi vSwitch version 6.5/6.7 for LRO/TSO + support, VMware Workstation 15 Pro (no LRO/TSO), and VMware Fusion 11 + Pro (no LRO/TSO) + +- Driver requires MSI-X interrupt support, which is not supported by + uio_pci_generic driver. So vfio-pci must be used. On systems without + IOMMU, vfio driver can still be used with 4.15.0-33-generic kernel + (Ubuntu 18.04) which supports no-iommu mode. + +##Known issues + +- VLAN filter + +Usage +----- + +System setup +~~~~~~~~~~~~ + +1. load VFIO driver + +:: + + sudo modprobe vfio-pci + +2. Make sure the interface is down + +:: + + sudo ifconfig <if-name> down + +Steps 3 and 4 are optional. They can be accomplished by specifying the +optional keyword “bind” when creating the vmxnet3 interface. + +3. (systems without IOMMU only) enable unsafe NOIOMMU mode + +:: + + echo Y | sudo tee /sys/module/vfio/parameters/enable_unsafe_noiommu_mode + +4. Bind interface to vfio-pci + +:: + + sudo dpdk-devbind.py --bind vfio-pci 0b:00.0 + +Interface Creation +~~~~~~~~~~~~~~~~~~ + +Interface can be dynamically created with following CLI, with or without +the bind option. If step 3 and 4 were executed, bind can be omitted. + +:: + + create interface vmxnet3 0000:0b:00.0 bind + set int state vmxnet3-0/b/0/0 up + +Interface Deletion +~~~~~~~~~~~~~~~~~~ + +Interface can be deleted with following CLI: + +:: + + delete interface vmxnet3 <if-name> + +Interface Statistics +~~~~~~~~~~~~~~~~~~~~ + +Interface statistics can be displayed with +``show hardware-interface <if-name>`` command. + +Show Interface CLI +~~~~~~~~~~~~~~~~~~ + +Interface and ring information can be obtained with +``show vmxnet3 [if-name] [desc]`` diff --git a/src/plugins/vmxnet3/cli.c b/src/plugins/vmxnet3/cli.c index 71342bd535c..d682e3ec2c9 100644 --- a/src/plugins/vmxnet3/cli.c +++ b/src/plugins/vmxnet3/cli.c @@ -47,8 +47,10 @@ vmxnet3_create_command_fn (vlib_main_t * vm, unformat_input_t * input, args.enable_gso = 1; else if (unformat (line_input, "elog")) args.enable_elog = 1; + else if (unformat (line_input, "bind force")) + args.bind = VMXNET3_BIND_FORCE; else if (unformat (line_input, "bind")) - args.bind = 1; + args.bind = VMXNET3_BIND_DEFAULT; else if (unformat (line_input, "rx-queue-size %u", &size)) args.rxq_size = size; else if (unformat (line_input, "tx-queue-size %u", &size)) @@ -58,12 +60,14 @@ vmxnet3_create_command_fn (vlib_main_t * vm, unformat_input_t * input, else if (unformat (line_input, "num-rx-queues %u", &size)) args.rxq_num = size; else - return clib_error_return (0, "unknown input `%U'", - format_unformat_error, input); + { + unformat_free (line_input); + return clib_error_return (0, "unknown input `%U'", + format_unformat_error, input); + } } unformat_free (line_input); - vmxnet3_create_if (vm, &args); if (args.error == 0) vlib_cli_output (vm, "%U\n", format_vnet_sw_if_index_name, @@ -72,16 +76,15 @@ vmxnet3_create_command_fn (vlib_main_t * vm, unformat_input_t * input, return args.error; } -/* *INDENT-OFF* */ VLIB_CLI_COMMAND (vmxnet3_create_command, static) = { .path = "create interface vmxnet3", - .short_help = "create interface vmxnet3 <pci-address>" - " [rx-queue-size <size>] [tx-queue-size <size>]" - " [num-tx-queues <number>] [num-rx-queues <number>] [bind]" - " [gso]", + .short_help = + "create interface vmxnet3 <pci-address>" + " [rx-queue-size <size>] [tx-queue-size <size>]" + " [num-tx-queues <number>] [num-rx-queues <number>] [bind [force]]" + " [gso]", .function = vmxnet3_create_command_fn, }; -/* *INDENT-ON* */ static clib_error_t * vmxnet3_delete_command_fn (vlib_main_t * vm, unformat_input_t * input, @@ -126,14 +129,12 @@ vmxnet3_delete_command_fn (vlib_main_t * vm, unformat_input_t * input, return 0; } -/* *INDENT-OFF* */ VLIB_CLI_COMMAND (vmxnet3_delete_command, static) = { .path = "delete interface vmxnet3", .short_help = "delete interface vmxnet3 " "{<interface> | sw_if_index <sw_idx>}", .function = vmxnet3_delete_command_fn, }; -/* *INDENT-ON* */ static clib_error_t * vmxnet3_test_command_fn (vlib_main_t * vm, unformat_input_t * input, @@ -187,14 +188,12 @@ vmxnet3_test_command_fn (vlib_main_t * vm, unformat_input_t * input, return 0; } -/* *INDENT-OFF* */ VLIB_CLI_COMMAND (vmxnet3_test_command, static) = { .path = "test vmxnet3", .short_help = "test vmxnet3 <interface> | sw_if_index <sw_idx> [irq] " "[elog-on] [elog-off]", .function = vmxnet3_test_command_fn, }; -/* *INDENT-ON* */ static void show_vmxnet3 (vlib_main_t * vm, u32 * hw_if_indices, u8 show_descr, @@ -213,6 +212,15 @@ show_vmxnet3 (vlib_main_t * vm, u32 * hw_if_indices, u8 show_descr, vmxnet3_tx_comp *tx_comp; u16 qid; + vlib_cli_output (vm, "Global:"); + for (u32 tid = 0; tid <= vlib_num_workers (); tid++) + { + vmxnet3_per_thread_data_t *ptd = + vec_elt_at_index (vmxm->per_thread_data, tid); + vlib_cli_output (vm, " Thread %u: polling queue count %u", tid, + ptd->polling_q_count); + } + if (!hw_if_indices) return; @@ -568,24 +576,25 @@ done: return error; } -/* *INDENT-OFF* */ VLIB_CLI_COMMAND (show_vmxnet3_command, static) = { .path = "show vmxnet3", .short_help = "show vmxnet3 [[<interface>] ([desc] | ([rx-comp] | " "[rx-desc-0] | [rx-desc-1] | [tx-comp] | [tx-desc]) [<slot>])]", .function = show_vmxnet3_fn, }; -/* *INDENT-ON* */ clib_error_t * vmxnet3_cli_init (vlib_main_t * vm) { vmxnet3_main_t *vmxm = &vmxnet3_main; + vlib_thread_main_t *tm = vlib_get_thread_main (); /* initialize binary API */ vmxnet3_plugin_api_hookup (vm); vmxm->log_default = vlib_log_register_class ("vmxnet3", 0); + + vec_validate (vmxm->per_thread_data, tm->n_vlib_mains - 1); return 0; } diff --git a/src/plugins/vmxnet3/format.c b/src/plugins/vmxnet3/format.c index d463feb3bec..43d790d31eb 100644 --- a/src/plugins/vmxnet3/format.c +++ b/src/plugins/vmxnet3/format.c @@ -164,7 +164,7 @@ format_vmxnet3_input_trace (u8 * s, va_list * args) s = format (s, "vmxnet3: %v (%d) next-node %U", hi->name, t->hw_if_index, format_vlib_next_node_name, vm, node->index, t->next_index); - s = format (s, "\n buffer %U", format_vnet_buffer, &t->buffer); + s = format (s, "\n buffer %U", format_vnet_buffer_no_chain, &t->buffer); return s; } diff --git a/src/plugins/vmxnet3/input.c b/src/plugins/vmxnet3/input.c index 3015fb116ca..25632546b6d 100644 --- a/src/plugins/vmxnet3/input.c +++ b/src/plugins/vmxnet3/input.c @@ -23,6 +23,7 @@ #include <vnet/ip/ip6_packet.h> #include <vnet/ip/ip4_packet.h> #include <vnet/udp/udp_packet.h> +#include <vnet/tcp/tcp_packet.h> #include <vnet/interface/rx_queue_funcs.h> #include <vmxnet3/vmxnet3.h> @@ -106,19 +107,11 @@ vmxnet3_handle_offload (vmxnet3_rx_comp * rx_comp, vlib_buffer_t * hb, { if (rx_comp->flags & VMXNET3_RXCF_TCP) { - tcp_header_t *tcp = - (tcp_header_t *) (hb->data + - vnet_buffer (hb)->l4_hdr_offset); oflags |= VNET_BUFFER_OFFLOAD_F_TCP_CKSUM; - tcp->checksum = 0; } else if (rx_comp->flags & VMXNET3_RXCF_UDP) { - udp_header_t *udp = - (udp_header_t *) (hb->data + - vnet_buffer (hb)->l4_hdr_offset); oflags |= VNET_BUFFER_OFFLOAD_F_UDP_CKSUM; - udp->checksum = 0; } } } @@ -384,8 +377,8 @@ vmxnet3_device_input_inline (vlib_main_t * vm, vlib_node_runtime_t * node, if (PREDICT_FALSE (vnet_device_input_have_features (vd->sw_if_index))) { - vnet_feature_start_device_input_x1 (vd->sw_if_index, - &next_index, hb); + vnet_feature_start_device_input (vd->sw_if_index, &next_index, + hb); known_next = 1; } @@ -487,7 +480,6 @@ VLIB_NODE_FN (vmxnet3_input_node) (vlib_main_t * vm, } #ifndef CLIB_MARCH_VARIANT -/* *INDENT-OFF* */ VLIB_REGISTER_NODE (vmxnet3_input_node) = { .name = "vmxnet3-input", .sibling_of = "device-input", @@ -500,7 +492,6 @@ VLIB_REGISTER_NODE (vmxnet3_input_node) = { }; #endif -/* *INDENT-ON* */ /* * fd.io coding-style-patch-verification: ON diff --git a/src/plugins/vmxnet3/plugin.c b/src/plugins/vmxnet3/plugin.c index 76f1cfc5e3e..20caf97f612 100644 --- a/src/plugins/vmxnet3/plugin.c +++ b/src/plugins/vmxnet3/plugin.c @@ -19,12 +19,10 @@ #include <vnet/plugin/plugin.h> #include <vpp/app/version.h> -/* *INDENT-OFF* */ VLIB_PLUGIN_REGISTER () = { .version = VPP_BUILD_VER, .description = "VMWare Vmxnet3 Device Driver", }; -/* *INDENT-ON* */ /* * fd.io coding-style-patch-verification: ON diff --git a/src/plugins/vmxnet3/vmxnet3.c b/src/plugins/vmxnet3/vmxnet3.c index ff0a7dc706b..e64e0d135d6 100644 --- a/src/plugins/vmxnet3/vmxnet3.c +++ b/src/plugins/vmxnet3/vmxnet3.c @@ -69,11 +69,23 @@ vmxnet3_interface_rx_mode_change (vnet_main_t * vnm, u32 hw_if_index, u32 qid, vnet_hw_interface_t *hw = vnet_get_hw_interface (vnm, hw_if_index); vmxnet3_device_t *vd = pool_elt_at_index (vmxm->devices, hw->dev_instance); vmxnet3_rxq_t *rxq = vec_elt_at_index (vd->rxqs, qid); + vmxnet3_per_thread_data_t *ptd; - if (mode == VNET_HW_IF_RX_MODE_POLLING) - rxq->int_mode = 0; + if (mode == rxq->mode) + return 0; + if ((mode != VNET_HW_IF_RX_MODE_POLLING) && + (mode != VNET_HW_IF_RX_MODE_INTERRUPT)) + return clib_error_return (0, "Rx mode %U not supported", + format_vnet_hw_if_rx_mode, mode); + rxq->mode = mode; + ptd = vec_elt_at_index (vmxm->per_thread_data, rxq->thread_index); + if (rxq->mode == VNET_HW_IF_RX_MODE_POLLING) + ptd->polling_q_count++; else - rxq->int_mode = 1; + { + ASSERT (ptd->polling_q_count != 0); + ptd->polling_q_count--; + } return 0; } @@ -133,7 +145,6 @@ static char *vmxnet3_tx_func_error_strings[] = { #undef _ }; -/* *INDENT-OFF* */ VNET_DEVICE_CLASS (vmxnet3_device_class,) = { .name = "VMXNET3 interface", @@ -146,7 +157,6 @@ VNET_DEVICE_CLASS (vmxnet3_device_class,) = .tx_function_n_errors = VMXNET3_TX_N_ERROR, .tx_function_error_strings = vmxnet3_tx_func_error_strings, }; -/* *INDENT-ON* */ static u32 vmxnet3_flag_change (vnet_main_t * vnm, vnet_hw_interface_t * hw, u32 flags) @@ -288,6 +298,7 @@ vmxnet3_rxq_init (vlib_main_t * vm, vmxnet3_device_t * vd, u16 qid, u16 qsz) rxq = vec_elt_at_index (vd->rxqs, qid); clib_memset (rxq, 0, sizeof (*rxq)); rxq->size = qsz; + rxq->mode = VNET_HW_IF_RX_MODE_POLLING; for (rid = 0; rid < VMXNET3_RX_RING_SIZE; rid++) { rxq->rx_desc[rid] = vlib_physmem_alloc_aligned_on_numa @@ -534,8 +545,13 @@ vmxnet3_rxq_irq_handler (vlib_main_t * vm, vlib_pci_dev_handle_t h, u16 line) u16 qid = line; vmxnet3_rxq_t *rxq = vec_elt_at_index (vd->rxqs, qid); - if (vec_len (vd->rxqs) > qid && vd->rxqs[qid].int_mode != 0) - vnet_hw_if_rx_queue_set_int_pending (vnm, rxq->queue_index); + if (vec_len (vd->rxqs) > qid && (rxq->mode != VNET_HW_IF_RX_MODE_POLLING)) + { + vmxnet3_per_thread_data_t *ptd = + vec_elt_at_index (vmxm->per_thread_data, rxq->thread_index); + if (ptd->polling_q_count == 0) + vnet_hw_if_rx_queue_set_int_pending (vnm, rxq->queue_index); + } } static void @@ -554,8 +570,9 @@ vmxnet3_event_irq_handler (vlib_main_t * vm, vlib_pci_dev_handle_t h, { vd->flags |= VMXNET3_DEVICE_F_LINK_UP; vd->link_speed = ret >> 16; - vnet_hw_interface_set_link_speed (vnm, vd->hw_if_index, - vd->link_speed * 1000); + vnet_hw_interface_set_link_speed ( + vnm, vd->hw_if_index, + (vd->link_speed == UINT32_MAX) ? UINT32_MAX : vd->link_speed * 1000); vnet_hw_interface_set_flags (vnm, vd->hw_if_index, VNET_HW_INTERFACE_FLAG_LINK_UP); } @@ -599,8 +616,11 @@ vmxnet3_create_if (vlib_main_t * vm, vmxnet3_create_if_args_t * args) { vnet_main_t *vnm = vnet_get_main (); vmxnet3_main_t *vmxm = &vmxnet3_main; + vnet_eth_interface_registration_t eir = {}; + vmxnet3_device_t *vd; vlib_pci_dev_handle_t h; + vnet_hw_if_caps_change_t cc = {}; clib_error_t *error = 0; u16 qid; u32 num_intr; @@ -653,7 +673,6 @@ vmxnet3_create_if (vlib_main_t * vm, vmxnet3_create_if_args_t * args) return; } - /* *INDENT-OFF* */ pool_foreach (vd, vmxm->devices) { if (vd->pci_addr.as_u32 == args->addr.as_u32) { @@ -666,11 +685,11 @@ vmxnet3_create_if (vlib_main_t * vm, vmxnet3_create_if_args_t * args) return; } } - /* *INDENT-ON* */ if (args->bind) { - error = vlib_pci_bind_to_uio (vm, &args->addr, (char *) "auto"); + error = vlib_pci_bind_to_uio (vm, &args->addr, (char *) "auto", + VMXNET3_BIND_FORCE == args->bind); if (error) { args->rv = VNET_API_ERROR_INVALID_INTERFACE; @@ -784,29 +803,24 @@ vmxnet3_create_if (vlib_main_t * vm, vmxnet3_create_if_args_t * args) } /* create interface */ - error = ethernet_register_interface (vnm, vmxnet3_device_class.index, - vd->dev_instance, vd->mac_addr, - &vd->hw_if_index, vmxnet3_flag_change); - - if (error) - { - vmxnet3_log_error (vd, - "error encountered on ethernet register interface"); - goto error; - } + eir.dev_class_index = vmxnet3_device_class.index; + eir.dev_instance = vd->dev_instance; + eir.address = vd->mac_addr; + eir.cb.flag_change = vmxnet3_flag_change; + vd->hw_if_index = vnet_eth_register_interface (vnm, &eir); vnet_sw_interface_t *sw = vnet_get_hw_sw_interface (vnm, vd->hw_if_index); vd->sw_if_index = sw->sw_if_index; args->sw_if_index = sw->sw_if_index; - vnet_hw_interface_t *hw = vnet_get_hw_interface (vnm, vd->hw_if_index); - hw->caps |= VNET_HW_INTERFACE_CAP_SUPPORTS_INT_MODE; + cc.mask = VNET_HW_IF_CAP_INT_MODE | VNET_HW_IF_CAP_TCP_GSO | + VNET_HW_IF_CAP_TX_TCP_CKSUM | VNET_HW_IF_CAP_TX_UDP_CKSUM; if (vd->gso_enable) - { - hw->caps |= (VNET_HW_INTERFACE_CAP_SUPPORTS_TCP_GSO | - VNET_HW_INTERFACE_CAP_SUPPORTS_TX_TCP_CKSUM | - VNET_HW_INTERFACE_CAP_SUPPORTS_TX_UDP_CKSUM); - } + cc.val = cc.mask; + else + cc.val = VNET_HW_IF_CAP_INT_MODE; + + vnet_hw_if_change_caps (vnm, vd->hw_if_index, &cc); vnet_hw_if_set_input_node (vnm, vd->hw_if_index, vmxnet3_input_node.index); /* Disable interrupts */ @@ -815,12 +829,20 @@ vmxnet3_create_if (vlib_main_t * vm, vmxnet3_create_if_args_t * args) { vmxnet3_rxq_t *rxq = vec_elt_at_index (vd->rxqs, qid); u32 qi, fi; + vmxnet3_per_thread_data_t *ptd; qi = vnet_hw_if_register_rx_queue (vnm, vd->hw_if_index, qid, VNET_HW_IF_RXQ_THREAD_ANY); fi = vlib_pci_get_msix_file_index (vm, vd->pci_dev_handle, qid); vnet_hw_if_set_rx_queue_file_index (vnm, qi, fi); rxq->queue_index = qi; + rxq->thread_index = + vnet_hw_if_get_rx_queue_thread_index (vnm, rxq->queue_index); + if (rxq->mode == VNET_HW_IF_RX_MODE_POLLING) + { + ptd = vec_elt_at_index (vmxm->per_thread_data, rxq->thread_index); + ptd->polling_q_count++; + } rxq->buffer_pool_index = vnet_hw_if_get_rx_queue_numa_node (vnm, rxq->queue_index); vmxnet3_rxq_refill_ring0 (vm, vd, rxq); @@ -843,8 +865,9 @@ vmxnet3_create_if (vlib_main_t * vm, vmxnet3_create_if_args_t * args) vd->flags |= VMXNET3_DEVICE_F_INITIALIZED; vmxnet3_enable_interrupt (vd); - vnet_hw_interface_set_link_speed (vnm, vd->hw_if_index, - vd->link_speed * 1000); + vnet_hw_interface_set_link_speed ( + vnm, vd->hw_if_index, + (vd->link_speed == UINT32_MAX) ? UINT32_MAX : vd->link_speed * 1000); if (vd->flags & VMXNET3_DEVICE_F_LINK_UP) vnet_hw_interface_set_flags (vnm, vd->hw_if_index, VNET_HW_INTERFACE_FLAG_LINK_UP); @@ -880,13 +903,19 @@ vmxnet3_delete_if (vlib_main_t * vm, vmxnet3_device_t * vd) vlib_pci_device_close (vm, vd->pci_dev_handle); - /* *INDENT-OFF* */ vec_foreach_index (i, vd->rxqs) { vmxnet3_rxq_t *rxq = vec_elt_at_index (vd->rxqs, i); u16 mask = rxq->size - 1; u16 rid; + vmxnet3_per_thread_data_t *ptd = + vec_elt_at_index (vmxm->per_thread_data, rxq->thread_index); + if (rxq->mode == VNET_HW_IF_RX_MODE_POLLING) + { + ASSERT (ptd->polling_q_count != 0); + ptd->polling_q_count--; + } for (rid = 0; rid < VMXNET3_RX_RING_SIZE; rid++) { vmxnet3_rx_ring *ring; @@ -900,11 +929,9 @@ vmxnet3_delete_if (vlib_main_t * vm, vmxnet3_device_t * vd) } vlib_physmem_free (vm, rxq->rx_comp); } - /* *INDENT-ON* */ vec_free (vd->rxqs); vec_free (vd->rx_stats); - /* *INDENT-OFF* */ vec_foreach_index (i, vd->txqs) { vmxnet3_txq_t *txq = vec_elt_at_index (vd->txqs, i); @@ -925,7 +952,6 @@ vmxnet3_delete_if (vlib_main_t * vm, vmxnet3_device_t * vd) vlib_physmem_free (vm, txq->tx_desc); vlib_physmem_free (vm, txq->tx_comp); } - /* *INDENT-ON* */ vec_free (vd->txqs); vec_free (vd->tx_stats); diff --git a/src/plugins/vmxnet3/vmxnet3.h b/src/plugins/vmxnet3/vmxnet3.h index 75107689443..89602f8ee9e 100644 --- a/src/plugins/vmxnet3/vmxnet3.h +++ b/src/plugins/vmxnet3/vmxnet3.h @@ -513,10 +513,17 @@ typedef struct typedef struct { CLIB_CACHE_LINE_ALIGN_MARK (cacheline0); + u32 polling_q_count; +} vmxnet3_per_thread_data_t; + +typedef struct +{ + CLIB_CACHE_LINE_ALIGN_MARK (cacheline0); u16 size; - u8 int_mode; + u32 mode; u8 buffer_pool_index; u32 queue_index; + u32 thread_index; vmxnet3_rx_ring rx_ring[VMXNET3_RX_RING_SIZE]; vmxnet3_rx_desc *rx_desc[VMXNET3_RX_RING_SIZE]; vmxnet3_rx_comp *rx_comp; @@ -594,10 +601,18 @@ typedef struct vmxnet3_device_t *devices; u16 msg_id_base; vlib_log_class_t log_default; + vmxnet3_per_thread_data_t *per_thread_data; } vmxnet3_main_t; extern vmxnet3_main_t vmxnet3_main; +typedef enum +{ + VMXNET3_BIND_NONE = 0, + VMXNET3_BIND_DEFAULT = 1, + VMXNET3_BIND_FORCE = 2, +} __clib_packed vmxnet3_bind_t; + typedef struct { vlib_pci_addr_t addr; @@ -606,7 +621,7 @@ typedef struct u16 rxq_num; u16 txq_size; u16 txq_num; - u8 bind; + vmxnet3_bind_t bind; u8 enable_gso; /* return */ i32 rv; diff --git a/src/plugins/vmxnet3/vmxnet3_api.c b/src/plugins/vmxnet3/vmxnet3_api.c index cef0770a63b..c51c07b705d 100644 --- a/src/plugins/vmxnet3/vmxnet3_api.c +++ b/src/plugins/vmxnet3/vmxnet3_api.c @@ -29,6 +29,7 @@ #include <vmxnet3/vmxnet3.api_enum.h> #include <vmxnet3/vmxnet3.api_types.h> +#define REPLY_MSG_ID_BASE (vmxm->msg_id_base) #include <vlibapi/api_helper_macros.h> static void @@ -54,12 +55,8 @@ vl_api_vmxnet3_create_t_handler (vl_api_vmxnet3_create_t * mp) vmxnet3_create_if (vm, &args); rv = args.rv; - /* *INDENT-OFF* */ - REPLY_MACRO2 (VL_API_VMXNET3_CREATE_REPLY + vmxm->msg_id_base, - ({ - rmp->sw_if_index = ntohl (args.sw_if_index); - })); - /* *INDENT-ON* */ + REPLY_MACRO2 (VL_API_VMXNET3_CREATE_REPLY, + ({ rmp->sw_if_index = ntohl (args.sw_if_index); })); } static void @@ -87,7 +84,7 @@ vl_api_vmxnet3_delete_t_handler (vl_api_vmxnet3_delete_t * mp) vmxnet3_delete_if (vm, vd); reply: - REPLY_MACRO (VL_API_VMXNET3_DELETE_REPLY + vmxm->msg_id_base); + REPLY_MACRO (VL_API_VMXNET3_DELETE_REPLY); } static void @@ -173,16 +170,14 @@ vl_api_vmxnet3_dump_t_handler (vl_api_vmxnet3_dump_t * mp) if (!reg) return; - /* *INDENT-OFF* */ pool_foreach (vd, vmxm->devices) { swif = vnet_get_sw_interface (vnm, vd->sw_if_index); if_name = format (if_name, "%U%c", format_vnet_sw_interface_name, vnm, swif, 0); send_vmxnet3_details (reg, vd, swif, if_name, mp->context); - _vec_len (if_name) = 0; + vec_set_len (if_name, 0); } - /* *INDENT-ON* */ vec_free (if_name); } @@ -211,7 +206,6 @@ static void vl_api_sw_vmxnet3_interface_dump_t_handler (vnet_sw_interface_is_api_valid (vnm, filter_sw_if_index) == 0)) goto bad_sw_if_index; - /* *INDENT-OFF* */ pool_foreach (vd, vmxm->devices) { if ((filter_sw_if_index == ~0) || @@ -221,10 +215,9 @@ static void vl_api_sw_vmxnet3_interface_dump_t_handler if_name = format (if_name, "%U%c", format_vnet_sw_interface_name, vnm, swif, 0); send_vmxnet3_details (reg, vd, swif, if_name, mp->context); - _vec_len (if_name) = 0; + vec_set_len (if_name, 0); } } - /* *INDENT-ON* */ BAD_SW_IF_INDEX_LABEL; vec_free (if_name); diff --git a/src/plugins/vmxnet3/vmxnet3_test.c b/src/plugins/vmxnet3/vmxnet3_test.c index 6fa9373486c..9b73c09d03c 100644 --- a/src/plugins/vmxnet3/vmxnet3_test.c +++ b/src/plugins/vmxnet3/vmxnet3_test.c @@ -34,7 +34,7 @@ /* declare message IDs */ #include <vmxnet3/vmxnet3.api_enum.h> #include <vmxnet3/vmxnet3.api_types.h> -#include <vpp/api/vpe.api_types.h> +#include <vlibmemory/vlib.api_types.h> typedef struct { |