-----Original Message----- From: dev <dev-boun...@dpdk.org> on behalf of Shahaf Shuler <shah...@mellanox.com> Date: Tuesday, December 26, 2017 at 1:44 AM To: "jingjing...@intel.com" <jingjing...@intel.com>, "ferruh.yi...@intel.com" <ferruh.yi...@intel.com> Cc: "dev@dpdk.org" <dev@dpdk.org> Subject: [dpdk-dev] [PATCH v3 02/10] app/testpmd: convert to new Ethdev Rx offloads API
>Ethdev Rx offloads API has changed since: > >commit ce17eddefc20 ("ethdev: introduce Rx queue offloads API") > >Convert the application to use the new API. The is no functionality >changes rather simple conversion of the flags. > >Signed-off-by: Shahaf Shuler <shah...@mellanox.com> >--- > app/test-pmd/cmdline.c | 51 +++++++++++++++++++++++------------------- > app/test-pmd/config.c | 36 +++++++++++++++++++---------- > app/test-pmd/parameters.c | 32 +++++++++++++------------- > app/test-pmd/testpmd.c | 19 +++++++--------- > 4 files changed, 77 insertions(+), 61 deletions(-) > >diff --git a/app/test-pmd/cmdline.c b/app/test-pmd/cmdline.c >index f71d96301..d8c73a9b1 100644 >--- a/app/test-pmd/cmdline.c >+++ b/app/test-pmd/cmdline.c >@@ -1577,6 +1577,7 @@ cmd_config_max_pkt_len_parsed(void *parsed_result, > __attribute__((unused)) void *data) > { > struct cmd_config_max_pkt_len_result *res = parsed_result; >+ uint64_t rx_offloads = rx_mode.offloads; > > if (!all_ports_stopped()) { > printf("Please stop all ports first\n"); >@@ -1594,14 +1595,16 @@ cmd_config_max_pkt_len_parsed(void *parsed_result, > > rx_mode.max_rx_pkt_len = res->value; > if (res->value > ETHER_MAX_LEN) >- rx_mode.jumbo_frame = 1; >+ rx_offloads |= DEV_RX_OFFLOAD_JUMBO_FRAME; > else >- rx_mode.jumbo_frame = 0; >+ rx_offloads &= ~DEV_RX_OFFLOAD_JUMBO_FRAME; > } else { > printf("Unknown parameter\n"); > return; > } > >+ rx_mode.offloads = rx_offloads; >+ > init_port_config(); > > cmd_reconfig_device_queue(RTE_PORT_ALL, 1, 1); >@@ -1703,6 +1706,7 @@ cmd_config_rx_mode_flag_parsed(void *parsed_result, > __attribute__((unused)) void *data) > { > struct cmd_config_rx_mode_flag *res = parsed_result; >+ uint64_t rx_offloads = rx_mode.offloads; > > if (!all_ports_stopped()) { > printf("Please stop all ports first\n"); >@@ -1711,48 +1715,48 @@ cmd_config_rx_mode_flag_parsed(void >*parsed_result, > > if (!strcmp(res->name, "crc-strip")) { > if (!strcmp(res->value, "on")) >- rx_mode.hw_strip_crc = 1; >+ rx_offloads |= DEV_RX_OFFLOAD_CRC_STRIP; > else if (!strcmp(res->value, "off")) >- rx_mode.hw_strip_crc = 0; >+ rx_offloads &= ~DEV_RX_OFFLOAD_CRC_STRIP; > else { > printf("Unknown parameter\n"); > return; > } > } else if (!strcmp(res->name, "scatter")) { >- if (!strcmp(res->value, "on")) >- rx_mode.enable_scatter = 1; >- else if (!strcmp(res->value, "off")) >- rx_mode.enable_scatter = 0; >- else { >+ if (!strcmp(res->value, "on")) { >+ rx_offloads |= DEV_RX_OFFLOAD_SCATTER; >+ } else if (!strcmp(res->value, "off")) { >+ rx_offloads &= ~DEV_RX_OFFLOAD_SCATTER; >+ } else { > printf("Unknown parameter\n"); > return; > } > } else if (!strcmp(res->name, "rx-cksum")) { > if (!strcmp(res->value, "on")) >- rx_mode.hw_ip_checksum = 1; >+ rx_offloads |= DEV_RX_OFFLOAD_CHECKSUM; > else if (!strcmp(res->value, "off")) >- rx_mode.hw_ip_checksum = 0; >+ rx_offloads &= ~DEV_RX_OFFLOAD_CHECKSUM; > else { > printf("Unknown parameter\n"); > return; > } > } else if (!strcmp(res->name, "rx-timestamp")) { > if (!strcmp(res->value, "on")) >- rx_mode.hw_timestamp = 1; >+ rx_offloads |= DEV_RX_OFFLOAD_TIMESTAMP; > else if (!strcmp(res->value, "off")) >- rx_mode.hw_timestamp = 0; >+ rx_offloads &= ~DEV_RX_OFFLOAD_TIMESTAMP; > else { > printf("Unknown parameter\n"); > return; > } > } else if (!strcmp(res->name, "hw-vlan")) { > if (!strcmp(res->value, "on")) { >- rx_mode.hw_vlan_filter = 1; >- rx_mode.hw_vlan_strip = 1; >+ rx_offloads |= (DEV_RX_OFFLOAD_VLAN_FILTER | >+ DEV_RX_OFFLOAD_VLAN_STRIP); > } > else if (!strcmp(res->value, "off")) { >- rx_mode.hw_vlan_filter = 0; >- rx_mode.hw_vlan_strip = 0; >+ rx_offloads &= ~(DEV_RX_OFFLOAD_VLAN_FILTER | >+ DEV_RX_OFFLOAD_VLAN_STRIP); > } > else { > printf("Unknown parameter\n"); >@@ -1760,27 +1764,27 @@ cmd_config_rx_mode_flag_parsed(void >*parsed_result, > } > } else if (!strcmp(res->name, "hw-vlan-filter")) { > if (!strcmp(res->value, "on")) >- rx_mode.hw_vlan_filter = 1; >+ rx_offloads |= DEV_RX_OFFLOAD_VLAN_FILTER; > else if (!strcmp(res->value, "off")) >- rx_mode.hw_vlan_filter = 0; >+ rx_offloads &= ~DEV_RX_OFFLOAD_VLAN_FILTER; > else { > printf("Unknown parameter\n"); > return; > } > } else if (!strcmp(res->name, "hw-vlan-strip")) { > if (!strcmp(res->value, "on")) >- rx_mode.hw_vlan_strip = 1; >+ rx_offloads |= DEV_RX_OFFLOAD_VLAN_STRIP; > else if (!strcmp(res->value, "off")) >- rx_mode.hw_vlan_strip = 0; >+ rx_offloads &= ~DEV_RX_OFFLOAD_VLAN_STRIP; > else { > printf("Unknown parameter\n"); > return; > } > } else if (!strcmp(res->name, "hw-vlan-extend")) { > if (!strcmp(res->value, "on")) >- rx_mode.hw_vlan_extend = 1; >+ rx_offloads |= DEV_RX_OFFLOAD_VLAN_EXTEND; > else if (!strcmp(res->value, "off")) >- rx_mode.hw_vlan_extend = 0; >+ rx_offloads &= ~DEV_RX_OFFLOAD_VLAN_EXTEND; > else { > printf("Unknown parameter\n"); > return; >@@ -1798,6 +1802,7 @@ cmd_config_rx_mode_flag_parsed(void *parsed_result, > printf("Unknown parameter\n"); > return; > } >+ rx_mode.offloads = rx_offloads; > > init_port_config(); > >diff --git a/app/test-pmd/config.c b/app/test-pmd/config.c >index 387fefbaa..3bc99be76 100644 >--- a/app/test-pmd/config.c >+++ b/app/test-pmd/config.c >@@ -540,14 +540,12 @@ port_infos_display(portid_t port_id) > void > port_offload_cap_display(portid_t port_id) > { >- struct rte_eth_dev *dev; > struct rte_eth_dev_info dev_info; > static const char *info_border = "************"; > > if (port_id_is_invalid(port_id, ENABLED_WARN)) > return; > >- dev = &rte_eth_devices[port_id]; > rte_eth_dev_info_get(port_id, &dev_info); > > printf("\n%s Port %d supported offload features: %s\n", >@@ -555,7 +553,8 @@ port_offload_cap_display(portid_t port_id) > > if (dev_info.rx_offload_capa & DEV_RX_OFFLOAD_VLAN_STRIP) { > printf("VLAN stripped: "); >- if (dev->data->dev_conf.rxmode.hw_vlan_strip) >+ if (ports[port_id].dev_conf.rxmode.offloads & >+ DEV_RX_OFFLOAD_VLAN_STRIP) > printf("on\n"); > else > printf("off\n"); >@@ -563,7 +562,8 @@ port_offload_cap_display(portid_t port_id) > > if (dev_info.rx_offload_capa & DEV_RX_OFFLOAD_QINQ_STRIP) { > printf("Double VLANs stripped: "); >- if (dev->data->dev_conf.rxmode.hw_vlan_extend) >+ if (ports[port_id].dev_conf.rxmode.offloads & >+ DEV_RX_OFFLOAD_VLAN_EXTEND) > printf("on\n"); > else > printf("off\n"); >@@ -571,7 +571,8 @@ port_offload_cap_display(portid_t port_id) > > if (dev_info.rx_offload_capa & DEV_RX_OFFLOAD_IPV4_CKSUM) { > printf("RX IPv4 checksum: "); >- if (dev->data->dev_conf.rxmode.hw_ip_checksum) >+ if (ports[port_id].dev_conf.rxmode.offloads & >+ DEV_RX_OFFLOAD_IPV4_CKSUM) > printf("on\n"); > else > printf("off\n"); >@@ -579,7 +580,8 @@ port_offload_cap_display(portid_t port_id) > > if (dev_info.rx_offload_capa & DEV_RX_OFFLOAD_UDP_CKSUM) { > printf("RX UDP checksum: "); >- if (dev->data->dev_conf.rxmode.hw_ip_checksum) >+ if (ports[port_id].dev_conf.rxmode.offloads & >+ DEV_RX_OFFLOAD_UDP_CKSUM) > printf("on\n"); > else > printf("off\n"); >@@ -587,18 +589,26 @@ port_offload_cap_display(portid_t port_id) > > if (dev_info.rx_offload_capa & DEV_RX_OFFLOAD_TCP_CKSUM) { > printf("RX TCP checksum: "); >- if (dev->data->dev_conf.rxmode.hw_ip_checksum) >+ if (ports[port_id].dev_conf.rxmode.offloads & >+ DEV_RX_OFFLOAD_TCP_CKSUM) > printf("on\n"); > else > printf("off\n"); > } > >- if (dev_info.rx_offload_capa & DEV_RX_OFFLOAD_OUTER_IPV4_CKSUM) >- printf("RX Outer IPv4 checksum: on"); >+ if (dev_info.rx_offload_capa & DEV_RX_OFFLOAD_OUTER_IPV4_CKSUM) { >+ printf("RX Outer IPv4 checksum: "); >+ if (ports[port_id].dev_conf.rxmode.offloads & >+ DEV_RX_OFFLOAD_OUTER_IPV4_CKSUM) >+ printf("on\n"); >+ else >+ printf("off\n"); >+ } > > if (dev_info.rx_offload_capa & DEV_RX_OFFLOAD_TCP_LRO) { > printf("Large receive offload: "); >- if (dev->data->dev_conf.rxmode.enable_lro) >+ if (ports[port_id].dev_conf.rxmode.offloads & >+ DEV_RX_OFFLOAD_TCP_LRO) > printf("on\n"); > else > printf("off\n"); >@@ -615,7 +625,8 @@ port_offload_cap_display(portid_t port_id) > > if (dev_info.rx_offload_capa & DEV_RX_OFFLOAD_TIMESTAMP) { > printf("HW timestamp: "); >- if (dev->data->dev_conf.rxmode.hw_timestamp) >+ if (ports[port_id].dev_conf.rxmode.offloads & >+ DEV_RX_OFFLOAD_TIMESTAMP) > printf("on\n"); > else > printf("off\n"); >@@ -1676,7 +1687,8 @@ rxtx_config_display(void) > > printf(" port %d:\n", (unsigned int)pid); > printf(" CRC stripping %s\n", >- ports[pid].dev_conf.rxmode.hw_strip_crc ? >+ (ports[pid].dev_conf.rxmode.offloads & >+ DEV_RX_OFFLOAD_CRC_STRIP) ? > "enabled" : "disabled"); > printf(" RX queues=%d - RX desc=%d - RX free threshold=%d\n", > nb_rxq, nb_rxd, rx_conf->rx_free_thresh); >diff --git a/app/test-pmd/parameters.c b/app/test-pmd/parameters.c >index 84e7a63ef..263651cba 100644 >--- a/app/test-pmd/parameters.c >+++ b/app/test-pmd/parameters.c >@@ -566,6 +566,8 @@ launch_args_parse(int argc, char** argv) > char **argvopt; > int opt_idx; > enum { TX, RX }; >+ /* Default Rx offloads for all ports. */ >+ uint64_t rx_offloads = rx_mode.offloads; > > static struct option lgopts[] = { > { "help", 0, 0, 0 }, >@@ -804,7 +806,8 @@ launch_args_parse(int argc, char** argv) > if (n >= ETHER_MIN_LEN) { > rx_mode.max_rx_pkt_len = (uint32_t) n; > if (n > ETHER_MAX_LEN) >- rx_mode.jumbo_frame = 1; >+ rx_offloads |= >+ >DEV_RX_OFFLOAD_JUMBO_FRAME; > } else > rte_exit(EXIT_FAILURE, > "Invalid max-pkt-len=%d - > should be > %d\n", >@@ -897,34 +900,30 @@ launch_args_parse(int argc, char** argv) > } > #endif > if (!strcmp(lgopts[opt_idx].name, "disable-crc-strip")) >- rx_mode.hw_strip_crc = 0; >+ rx_offloads &= ~DEV_RX_OFFLOAD_CRC_STRIP; > if (!strcmp(lgopts[opt_idx].name, "enable-lro")) >- rx_mode.enable_lro = 1; >+ rx_offloads |= DEV_RX_OFFLOAD_TCP_LRO; > if (!strcmp(lgopts[opt_idx].name, "enable-scatter")) >- rx_mode.enable_scatter = 1; >+ rx_offloads |= DEV_RX_OFFLOAD_SCATTER; > if (!strcmp(lgopts[opt_idx].name, "enable-rx-cksum")) >- rx_mode.hw_ip_checksum = 1; >+ rx_offloads |= DEV_RX_OFFLOAD_CHECKSUM; > if (!strcmp(lgopts[opt_idx].name, > "enable-rx-timestamp")) >- rx_mode.hw_timestamp = 1; >- >- if (!strcmp(lgopts[opt_idx].name, "disable-hw-vlan")) { >- rx_mode.hw_vlan_filter = 0; >- rx_mode.hw_vlan_strip = 0; >- rx_mode.hw_vlan_extend = 0; >- } >+ rx_offloads |= DEV_RX_OFFLOAD_TIMESTAMP; >+ if (!strcmp(lgopts[opt_idx].name, "disable-hw-vlan")) >+ rx_offloads &= ~DEV_RX_OFFLOAD_VLAN; > > if (!strcmp(lgopts[opt_idx].name, > "disable-hw-vlan-filter")) >- rx_mode.hw_vlan_filter = 0; >+ rx_offloads &= ~DEV_RX_OFFLOAD_VLAN_FILTER; > > if (!strcmp(lgopts[opt_idx].name, > "disable-hw-vlan-strip")) >- rx_mode.hw_vlan_strip = 0; >+ rx_offloads &= ~DEV_RX_OFFLOAD_VLAN_STRIP; > > if (!strcmp(lgopts[opt_idx].name, > "disable-hw-vlan-extend")) >- rx_mode.hw_vlan_extend = 0; >+ rx_offloads &= ~DEV_RX_OFFLOAD_VLAN_EXTEND; > > if (!strcmp(lgopts[opt_idx].name, "enable-drop-en")) > rx_drop_en = 1; >@@ -1140,4 +1139,7 @@ launch_args_parse(int argc, char** argv) > break; > } > } >+ >+ /* Set offload configuration from command line parameters. */ >+ rx_mode.offloads = rx_offloads; > } >diff --git a/app/test-pmd/testpmd.c b/app/test-pmd/testpmd.c >index c3ab44849..6785b095f 100644 >--- a/app/test-pmd/testpmd.c >+++ b/app/test-pmd/testpmd.c >@@ -338,15 +338,10 @@ lcoreid_t latencystats_lcore_id = -1; > */ > struct rte_eth_rxmode rx_mode = { > .max_rx_pkt_len = ETHER_MAX_LEN, /**< Default maximum frame length. */ >- .split_hdr_size = 0, >- .header_split = 0, /**< Header Split disabled. */ >- .hw_ip_checksum = 0, /**< IP checksum offload disabled. */ >- .hw_vlan_filter = 1, /**< VLAN filtering enabled. */ >- .hw_vlan_strip = 1, /**< VLAN strip enabled. */ >- .hw_vlan_extend = 0, /**< Extended VLAN disabled. */ >- .jumbo_frame = 0, /**< Jumbo Frame Support disabled. */ >- .hw_strip_crc = 1, /**< CRC stripping by hardware enabled. */ >- .hw_timestamp = 0, /**< HW timestamp enabled. */ >+ .offloads = (DEV_RX_OFFLOAD_VLAN_FILTER | >+ DEV_RX_OFFLOAD_VLAN_STRIP | >+ DEV_RX_OFFLOAD_CRC_STRIP), >+ .ignore_offload_bitfield = 1, > }; > > struct rte_fdir_conf fdir_conf = { >@@ -1521,6 +1516,8 @@ start_port(portid_t pid) > port->need_reconfig_queues = 1; > return -1; > } >+ /* Apply Rx offloads configuration */ >+ port->rx_conf.offloads = port->dev_conf.rxmode.offloads; > /* setup rx queues */ > for (qi = 0; qi < nb_rxq; qi++) { > if ((numa_support) && >@@ -2252,7 +2249,7 @@ init_port_dcb_config(portid_t pid, > retval = get_eth_dcb_conf(&port_conf, dcb_mode, num_tcs, pfc_en); > if (retval < 0) > return retval; >- port_conf.rxmode.hw_vlan_filter = 1; >+ port_conf.rxmode.offloads |= DEV_RX_OFFLOAD_VLAN_FILTER; > > /** > * Write the configuration into the device. >@@ -2301,7 +2298,7 @@ init_port_dcb_config(portid_t pid, > > rxtx_port_config(rte_port); > /* VLAN filter */ >- rte_port->dev_conf.rxmode.hw_vlan_filter = 1; >+ rte_port->dev_conf.rxmode.offloads |= DEV_RX_OFFLOAD_VLAN_FILTER; > for (i = 0; i < RTE_DIM(vlan_tags); i++) > rx_vft_set(pid, vlan_tags[i], 1); > >-- >2.12.0 > Hi Shahaf, This testpmd change is causing some issues for qede PMD. In this patch, rte_eth_dev_configure() and RX/TX queue setup functions are called for the second time after applying TX offloads but without calling rte_eth_dev_close() before. Also there is no way in the driver to detect that this is a port reconfiguration condition in which case it needs to do certain resources deallocation/cleanup based on prior configuration. Ideally, we don’t want to maintain port states in driver internally. So is there any suggestions here? Thanks, Harish >