X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=src%2Fplugins%2Fdpdk%2Fdevice%2Finit.c;h=d88dad49ad57493e285b1e93b12945b16fb402be;hb=006c071b0;hp=3b5b90704df111f0fe7f9b16d296c3f79e39c3d6;hpb=57eb4b6269dd22b042deb2a7a535cf31387a0161;p=vpp.git diff --git a/src/plugins/dpdk/device/init.c b/src/plugins/dpdk/device/init.c index 3b5b90704df..d88dad49ad5 100644 --- a/src/plugins/dpdk/device/init.c +++ b/src/plugins/dpdk/device/init.c @@ -24,6 +24,7 @@ #include #include #include +#include #include #include #include @@ -56,17 +57,17 @@ const struct const char *pfx; } if_name_prefixes[] = { /* sorted, higher speed first */ - { ETH_LINK_SPEED_200G, "TwoHundredGigabitEthernet" }, - { ETH_LINK_SPEED_100G, "HundredGigabitEthernet" }, - { ETH_LINK_SPEED_56G, "FiftySixGigabitEthernet" }, - { ETH_LINK_SPEED_50G, "FiftyGigabitEthernet" }, - { ETH_LINK_SPEED_40G, "FortyGigabitEthernet" }, - { ETH_LINK_SPEED_25G, "TwentyFiveGigabitEthernet" }, - { ETH_LINK_SPEED_20G, "TwentyGigabitEthernet" }, - { ETH_LINK_SPEED_10G, "TenGigabitEthernet" }, - { ETH_LINK_SPEED_5G, "FiveGigabitEthernet" }, - { ETH_LINK_SPEED_2_5G, "TwoDotFiveGigabitEthernet" }, - { ETH_LINK_SPEED_1G, "GigabitEthernet" }, + { RTE_ETH_LINK_SPEED_200G, "TwoHundredGigabitEthernet" }, + { RTE_ETH_LINK_SPEED_100G, "HundredGigabitEthernet" }, + { RTE_ETH_LINK_SPEED_56G, "FiftySixGigabitEthernet" }, + { RTE_ETH_LINK_SPEED_50G, "FiftyGigabitEthernet" }, + { RTE_ETH_LINK_SPEED_40G, "FortyGigabitEthernet" }, + { RTE_ETH_LINK_SPEED_25G, "TwentyFiveGigabitEthernet" }, + { RTE_ETH_LINK_SPEED_20G, "TwentyGigabitEthernet" }, + { RTE_ETH_LINK_SPEED_10G, "TenGigabitEthernet" }, + { RTE_ETH_LINK_SPEED_5G, "FiveGigabitEthernet" }, + { RTE_ETH_LINK_SPEED_2_5G, "TwoDotFiveGigabitEthernet" }, + { RTE_ETH_LINK_SPEED_1G, "GigabitEthernet" }, }; static clib_error_t * @@ -204,8 +205,12 @@ dpdk_find_startup_config (struct rte_eth_dev_info *di) if ((vmbus_dev = dpdk_get_vmbus_device (di))) { unformat_input_t input_vmbus; - unformat_init_string (&input_vmbus, di->device->name, - strlen (di->device->name)); +#if RTE_VERSION >= RTE_VERSION_NUM(22, 11, 0, 0) + const char *dev_name = rte_dev_name (di->device); +#else + const char *dev_name = di->device->name; +#endif + unformat_init_string (&input_vmbus, dev_name, strlen (dev_name)); if (unformat (&input_vmbus, "%U", unformat_vlib_vmbus_addr, &vmbus_addr)) p = mhash_get (&dm->conf->device_config_index_by_vmbus_addr, &vmbus_addr); @@ -247,7 +252,8 @@ dpdk_lib_init (dpdk_main_t * dm) dm->default_port_conf.n_tx_desc = DPDK_NB_TX_DESC_DEFAULT; dm->default_port_conf.n_rx_queues = 1; dm->default_port_conf.n_tx_queues = tm->n_vlib_mains; - dm->default_port_conf.rss_hf = ETH_RSS_IP | ETH_RSS_UDP | ETH_RSS_TCP; + dm->default_port_conf.rss_hf = + RTE_ETH_RSS_IP | RTE_ETH_RSS_UDP | RTE_ETH_RSS_TCP; dm->default_port_conf.max_lro_pkt_size = DPDK_MAX_LRO_SIZE_DEFAULT; if ((clib_mem_get_default_hugepage_size () == 2 << 20) && @@ -262,6 +268,7 @@ dpdk_lib_init (dpdk_main_t * dm) dpdk_device_config_t *devconf = 0; vnet_eth_interface_registration_t eir = {}; dpdk_driver_t *dr; + i8 numa_node; if (!rte_eth_dev_is_valid_port (port_id)) continue; @@ -400,7 +407,8 @@ dpdk_lib_init (dpdk_main_t * dm) q = di.max_rx_pktlen - di.max_mtu; /* attempt to protect from bogus value provided by pmd */ - if (q < (2 * xd->driver_frame_overhead) && q > 0) + if (q < (2 * xd->driver_frame_overhead) && q > 0 && + di.max_mtu != UINT16_MAX) xd->driver_frame_overhead = q; dpdk_log_debug ("[%u] min_mtu: %u, max_mtu: %u, min_rx_bufsize: %u, " "max_rx_pktlen: %u, max_lro_pkt_size: %u", @@ -428,6 +436,8 @@ dpdk_lib_init (dpdk_main_t * dm) vec_validate_aligned (xd->rx_queues, xd->conf.n_rx_queues - 1, CLIB_CACHE_LINE_BYTES); + vec_validate_aligned (xd->tx_queues, xd->conf.n_tx_queues - 1, + CLIB_CACHE_LINE_BYTES); rte_eth_macaddr_get (port_id, (void *) addr); @@ -439,11 +449,19 @@ dpdk_lib_init (dpdk_main_t * dm) eir.cb.set_max_frame_size = dpdk_set_max_frame_size; xd->hw_if_index = vnet_eth_register_interface (vnm, &eir); hi = vnet_get_hw_interface (vnm, xd->hw_if_index); - hi->numa_node = xd->cpu_socket = (i8) rte_eth_dev_socket_id (port_id); + numa_node = (i8) rte_eth_dev_socket_id (port_id); + if (numa_node == SOCKET_ID_ANY) + /* numa_node is not set, default to 0 */ + hi->numa_node = xd->cpu_socket = 0; + else + hi->numa_node = xd->cpu_socket = numa_node; sw = vnet_get_hw_sw_interface (vnm, xd->hw_if_index); xd->sw_if_index = sw->sw_if_index; dpdk_log_debug ("[%u] interface %s created", port_id, hi->name); + if (devconf->tag) + vnet_set_sw_interface_tag (vnm, devconf->tag, sw->sw_if_index); + ethernet_set_flags (vnm, xd->hw_if_index, ETHERNET_INTERFACE_FLAG_DEFAULT_L3); @@ -468,13 +486,26 @@ dpdk_lib_init (dpdk_main_t * dm) vnm, xd->hw_if_index, q, VNET_HW_IF_RXQ_THREAD_ANY); } + for (q = 0; q < xd->conf.n_tx_queues; q++) + { + dpdk_tx_queue_t *txq = vec_elt_at_index (xd->tx_queues, q); + txq->queue_index = + vnet_hw_if_register_tx_queue (vnm, xd->hw_if_index, q); + } + + for (q = 0; q < tm->n_vlib_mains; q++) + { + u32 qi = xd->tx_queues[q % xd->conf.n_tx_queues].queue_index; + vnet_hw_if_tx_queue_assign_thread (vnm, qi, q); + } + if (devconf->tso == DPDK_DEVICE_TSO_ON) { /*tcp_udp checksum must be enabled*/ if (xd->conf.enable_tcp_udp_checksum == 0) dpdk_log_warn ("[%u] TCP/UDP checksum offload must be enabled", xd->port_id); - else if ((di.tx_offload_capa & DEV_TX_OFFLOAD_TCP_TSO) == 0) + else if ((di.tx_offload_capa & RTE_ETH_TX_OFFLOAD_TCP_TSO) == 0) dpdk_log_warn ("[%u] TSO not supported by device", xd->port_id); else xd->conf.enable_tso = 1; @@ -604,9 +635,12 @@ dpdk_bind_devices_to_uio (dpdk_config_main_t * conf) else if (d->vendor_id == 0x8086 && d->device_class == PCI_CLASS_NETWORK_ETHERNET) ; /* all Intel QAT devices VFs */ - else if (d->vendor_id == 0x8086 && d->device_class == PCI_CLASS_PROCESSOR_CO && - (d->device_id == 0x0443 || d->device_id == 0x18a1 || d->device_id == 0x19e3 || - d->device_id == 0x37c9 || d->device_id == 0x6f55)) + else if (d->vendor_id == 0x8086 && + d->device_class == PCI_CLASS_PROCESSOR_CO && + (d->device_id == 0x0443 || d->device_id == 0x18a1 || + d->device_id == 0x19e3 || d->device_id == 0x37c9 || + d->device_id == 0x6f55 || d->device_id == 0x18ef || + d->device_id == 0x4941)) ; /* Cisco VIC */ else if (d->vendor_id == 0x1137 && @@ -634,10 +668,28 @@ dpdk_bind_devices_to_uio (dpdk_config_main_t * conf) { continue; } - /* Mellanox CX6, CX6VF, CX6DX, CX6DXVF */ - else if (d->vendor_id == 0x15b3 && d->device_id >= 0x101b && d->device_id <= 0x101e) + /* Mellanox CX6, CX6VF, CX6DX, CX6DXVF, CX6LX */ + else if (d->vendor_id == 0x15b3 && + (d->device_id >= 0x101b && d->device_id <= 0x101f)) { - continue; + continue; + } + /* Mellanox CX7 */ + else if (d->vendor_id == 0x15b3 && d->device_id == 0x1021) + { + continue; + } + /* Mellanox BF, BFVF */ + else if (d->vendor_id == 0x15b3 && + (d->device_id >= 0xa2d2 && d->device_id <= 0Xa2d3)) + { + continue; + } + /* Mellanox BF2, BF3 */ + else if (d->vendor_id == 0x15b3 && + (d->device_id == 0xa2d6 || d->device_id == 0xa2dc)) + { + continue; } /* Broadcom NetXtreme S, and E series only */ else if (d->vendor_id == 0x14e4 && @@ -652,6 +704,9 @@ dpdk_bind_devices_to_uio (dpdk_config_main_t * conf) d->device_id == 0x1614 || d->device_id == 0x1606 || d->device_id == 0x1609 || d->device_id == 0x1614))) ; + /* Google vNIC */ + else if (d->vendor_id == 0x1ae0 && d->device_id == 0x0042) + ; else { dpdk_log_warn ("Unsupported PCI device 0x%04x:0x%04x found " @@ -660,7 +715,8 @@ dpdk_bind_devices_to_uio (dpdk_config_main_t * conf) continue; } - error = vlib_pci_bind_to_uio (vm, addr, (char *) conf->uio_driver_name); + error = vlib_pci_bind_to_uio (vm, addr, (char *) conf->uio_driver_name, + conf->uio_bind_force); if (error) { @@ -855,6 +911,8 @@ dpdk_device_config (dpdk_config_main_t *conf, void *addr, ; else if (unformat (input, "name %v", &devconf->name)) ; + else if (unformat (input, "tag %s", &devconf->tag)) + ; else if (unformat (input, "workers %U", unformat_bitmap_list, &devconf->workers)) ; @@ -1067,6 +1125,8 @@ dpdk_config (vlib_main_t * vm, unformat_input_t * input) } else if (unformat (input, "uio-driver %s", &conf->uio_driver_name)) ; + else if (unformat (input, "uio-bind-force")) + conf->uio_bind_force = 1; else if (unformat (input, "socket-mem %s", &socket_mem)) ; else if (unformat (input, "no-pci")) @@ -1356,35 +1416,32 @@ dpdk_update_link_state (dpdk_device_t * xd, f64 now) ed->new_link_state = (u8) xd->link.link_status; } - if ((xd->link.link_duplex != prev_link.link_duplex)) + hw_flags_chg = ((xd->link.link_duplex != prev_link.link_duplex) || + (xd->link.link_status != prev_link.link_status)); + + if (xd->link.link_speed != prev_link.link_speed) + vnet_hw_interface_set_link_speed (vnm, xd->hw_if_index, + (xd->link.link_speed == UINT32_MAX) ? + UINT32_MAX : + xd->link.link_speed * 1000); + + if (hw_flags_chg) { - hw_flags_chg = 1; + if (xd->link.link_status) + hw_flags |= VNET_HW_INTERFACE_FLAG_LINK_UP; + switch (xd->link.link_duplex) { - case ETH_LINK_HALF_DUPLEX: + case RTE_ETH_LINK_HALF_DUPLEX: hw_flags |= VNET_HW_INTERFACE_FLAG_HALF_DUPLEX; break; - case ETH_LINK_FULL_DUPLEX: + case RTE_ETH_LINK_FULL_DUPLEX: hw_flags |= VNET_HW_INTERFACE_FLAG_FULL_DUPLEX; break; default: break; } - } - if (xd->link.link_speed != prev_link.link_speed) - vnet_hw_interface_set_link_speed (vnm, xd->hw_if_index, - xd->link.link_speed * 1000); - - if (xd->link.link_status != prev_link.link_status) - { - hw_flags_chg = 1; - - if (xd->link.link_status) - hw_flags |= VNET_HW_INTERFACE_FLAG_LINK_UP; - } - if (hw_flags_chg) - { if (LINK_STATE_ELOGS) { ELOG_TYPE_DECLARE (e) = @@ -1414,6 +1471,7 @@ dpdk_process (vlib_main_t * vm, vlib_node_runtime_t * rt, vlib_frame_t * f) dpdk_device_t *xd; vlib_thread_main_t *tm = vlib_get_thread_main (); + vlib_worker_thread_barrier_sync (vm); error = dpdk_lib_init (dm); if (error) @@ -1430,6 +1488,7 @@ dpdk_process (vlib_main_t * vm, vlib_node_runtime_t * rt, vlib_frame_t * f) } } + vlib_worker_thread_barrier_release (vm); tm->worker_thread_release = 1; f64 now = vlib_time_now (vm);