Great news. It works for me with Mellanox mlx5 as well. I will send a v2 patch with Kevin's fix.
Regards, Ophir > -----Original Message----- > From: Eelco Chaudron [mailto:echau...@redhat.com] > Sent: Wednesday, September 05, 2018 2:33 PM > To: Ophir Munk <ophi...@mellanox.com> > Cc: Thomas Monjalon <tho...@monjalon.net>; ovs-dev@openvswitch.org; > Asaf Penso <as...@mellanox.com>; Shahaf Shuler > <shah...@mellanox.com> > Subject: Re: [ovs-dev] [dpdk-hwol PATCH v1] netdev-dpdk: Upgrade to dpdk > v18.08.0 > > And one final note… I though I applied Kevin’s patch, but I applied it to the > wrong directory… > > With Kevin’s patch applied it works, root and non root OVS. > > //Eelco > > > On 5 Sep 2018, at 14:49, Eelco Chaudron wrote: > > > Forgot to cut/paste the log: > > > > 2018-09-05T12:47:48.462Z|00132|dpdk|INFO|Device with port_id=1 > already > > stopped 2018-09-05T12:47:48.462Z|00133|dpdk|ERR|Ethdev port_id=1 > > invalid > > rss_hf: 0x3afbc, valid value: 0x7ef8 > > 2018-09-05T12:47:48.462Z|00134|netdev_dpdk|WARN|Interface dpdk1 > > eth_dev setup error Invalid argument > > 2018-09-05T12:47:48.462Z|00135|netdev_dpdk|ERR|Interface > dpdk1(rxq:1 > > txq:3 lsc interrupt mode:false) configure error: Invalid argument > > 2018-09-05T12:47:48.462Z|00136|dpif_netdev|ERR|Failed to set interface > > dpdk1 new configuration > > > > Guess this will help… > > > > On 5 Sep 2018, at 14:35, Eelco Chaudron wrote: > > > >> Hi Ophir, > >> > >> I get the same error when trying this with an XL710, wanted to see if > >> the patch would work for non-root users. > >> Did not further troubleshoot it. > >> > >> Also I get the following compile warnings(errors): > >> > >> mv -f $depbase.Tpo $depbase.Po > >> lib/netdev-dpdk.c: In function 'netdev_dpdk_destruct': > >> lib/netdev-dpdk.c:1331:9: error: 'rte_eth_dev_detach' is deprecated > >> (declared at > >> /home/root/OVS_dpdk-hwol_DPDK_v18.08/dpdk/x86_64-native- > linuxapp-gcc/ > >> include/rte_ethdev.h:1451) > >> [-Werror=deprecated-declarations] > >> if (rte_eth_dev_detach(dev->port_id, devname) < 0) { > >> ^ > >> lib/netdev-dpdk.c: In function 'netdev_dpdk_process_devargs': > >> lib/netdev-dpdk.c:1624:13: error: 'rte_eth_dev_attach' is deprecated > >> (declared at > >> /home/root/OVS_dpdk-hwol_DPDK_v18.08/dpdk/x86_64-native- > linuxapp-gcc/ > >> include/rte_ethdev.h:1435) > >> [-Werror=deprecated-declarations] > >> if (!rte_eth_dev_attach(devargs, &new_port_id)) { > >> ^ > >> lib/netdev-dpdk.c: In function 'netdev_dpdk_detach': > >> lib/netdev-dpdk.c:3154:5: error: 'rte_eth_dev_detach' is deprecated > >> (declared at > >> /home/root/OVS_dpdk-hwol_DPDK_v18.08/dpdk/x86_64-native- > linuxapp-gcc/ > >> include/rte_ethdev.h:1451) > >> [-Werror=deprecated-declarations] > >> ret = rte_eth_dev_detach(port_id, devname); > >> ^ > >> lib/netdev-dpdk.c: At top level: > >> > >> > >> //Eelco > >> > >> > >> On 5 Sep 2018, at 12:44, Ophir Munk wrote: > >> > >>> Hi, > >>> I suggest the following trouble-shooting steps: > >>> 1. Try Kevin's fix for Niantic (attached here as a non-official > >>> patch on top of latest dpdk-hwol branch). > >>> Sugesh - can you please try it? > >>> 2. Sugesh - do you have the same issue with other NICs than Niantic > >>> on latest dpdk-hwol branch? (other NICs used to work a month > >>> ago) > >>> 3. I will try on my setup. > >>> > >>> Regards, > >>> Ophir > >>> > >>>> -----Original Message----- > >>>> From: Kevin Traynor [mailto:ktray...@redhat.com] > >>>> Sent: Wednesday, September 05, 2018 9:28 AM > >>>> To: Chandran, Sugesh <sugesh.chand...@intel.com>; Ophir Munk > >>>> <ophi...@mellanox.com>; ovs-dev@openvswitch.org > >>>> Cc: Asaf Penso <as...@mellanox.com>; Stokes, Ian > >>>> <ian.sto...@intel.com>; Ben Pfaff <b...@ovn.org>; Shahaf Shuler > >>>> <shah...@mellanox.com>; Thomas Monjalon > <tho...@monjalon.net>; Olga > >>>> Shern <ol...@mellanox.com> > >>>> Subject: Re: [dpdk-hwol PATCH v1] netdev-dpdk: Upgrade to dpdk > >>>> v18.08.0 > >>>> > >>>> On 09/05/2018 07:44 AM, Chandran, Sugesh wrote: > >>>>> Hi Ophir, > >>>>> > >>>>> Thank you for working on this. > >>>>> I tried to run some tests and getting some errors while adding > >>>>> physical ports as below. I use Niantic NIC for this test > >>>>> > >>>>>>>>>>>>>>>>>>>> > >>>>> 2018-09-05T06:34:58Z|00069|dpdk|INFO|Device with port_id=0 > already > >>>>> stopped 2018-09-05T06:34:58Z|00070|dpdk|ERR|Ethdev port_id=0 > >>>>> invalid > >>>>> rss_hf: 0x3afbc, valid value: 0x38d34 > >>>>> 2018-09-05T06:34:58Z|00071|netdev_dpdk|WARN|Interface dpdk0 > >>>> eth_dev > >>>>> setup error Invalid argument > >>>>> 2018-09-05T06:34:58Z|00072|netdev_dpdk|ERR|Interface > dpdk0(rxq:2 > >>>> txq:2 > >>>>> lsc interrupt mode:false) configure error: Invalid argument > >>>>> 2018-09-05T06:34:58Z|00073|dpif_netdev|ERR|Failed to set > interface > >>>>> dpdk0 new configuration 2018-09- > >>>> 05T06:34:58Z|00074|bridge|WARN|could > >>>>> not add network device dpdk0 to ofproto (No such device) > >>>>> ovs-vsctl: Error detected while setting up 'dpdk0': could not add > >>>>> network > >>>> device dpdk0 to ofproto (No such device). See ovs-vswitchd log for > >>>> details. > >>>>> ovs-vsctl: The default log directory is > >>>>> "/usr/local/var/log/openvswitch". > >>>>> > >>>> > >>>> I didn't have time to compare the below patch with the ones that I > >>>> did, but I saw that this patch was needed for niantic > >>>> > https://emea01.safelinks.protection.outlook.com/?url=https%3A%2F%2F > >>>> git > >>>> hub.com%2Fkevintraynor%2Fovs-dpdk- > >>>> > master%2Fcommit%2F88f46cc5ab338eb4f3ca5db1eacd0effefe4fa0c&d > >>>> > ata=02%7C01%7Cophirmu%40mellanox.com%7Cd203c89637bf4f27835508d > >>>> > 61309798e%7Ca652971c7d2e4d9ba6a4d149256f461b%7C0%7C0%7C63671 > >>>> > 7328752336932&sdata=L7rWODNNEStIfibwXybu6Ub7Yvn%2BfLHk6VT > >>>> we14jxyY%3D&reserved=0 > >>>> > >>>>>>>>>>>>>>>>>>>>> > >>>>> Please find below for my comments. > >>>>> > >>>>> > >>>>> Regards > >>>>> _Sugesh > >>>>> > >>>>>> -----Original Message----- > >>>>>> From: Ophir Munk [mailto:ophi...@mellanox.com] > >>>>>> Sent: Monday, September 3, 2018 3:19 PM > >>>>>> To: ovs-dev@openvswitch.org > >>>>>> Cc: Asaf Penso <as...@mellanox.com>; Chandran, Sugesh > >>>>>> <sugesh.chand...@intel.com>; Stokes, Ian <ian.sto...@intel.com>; > >>>>>> Ben Pfaff <b...@ovn.org>; Shahaf Shuler <shah...@mellanox.com>; > >>>>>> Thomas Monjalon <tho...@monjalon.net>; Olga Shern > >>>>>> <ol...@mellanox.com>; Ophir Munk <ophi...@mellanox.com>; > Kevin > >>>>>> Traynor <ktray...@redhat.com> > >>>>>> Subject: [dpdk-hwol PATCH v1] netdev-dpdk: Upgrade to dpdk > >>>>>> v18.08.0 > >>>>>> > >>>>>> 1. Enable compilation and linkage with dpdk 18.08.0 The following > >>>>>> dpdk commits which were introduced after dpdk 17.11.x require OVS > >>>>>> updates to accommodate to the dpdk changes. > >>>>>> - ce17eddefc20 ("ethdev: introduce Rx queue offloads API") > >>>>>> - ab3ce1e0c193 ("ethdev: remove old offload API") > >>>>>> - c06ddf9698e0 ("meter: add configuration profile") > >>>>>> - e58638c32411 ("ethdev: fix TPID handling in flow API") > >>>>>> - cd8c7c7ce241 ("ethdev: replace bus specific struct with generic > >>>>>> dev") > >>>>>> - ac8d22de2394 ("ethdev: flatten RSS configuration in flow API") > >>>>>> > >>>>>> 2. Update references to DPDK version in Documentation > >>>>>> > >>>>>> 3. Update DPDK version in travis' linux-build script > >>>>>> > >>>>>> Signed-off-by: Ophir Munk <ophi...@mellanox.com> > >>>>>> --- > >>>>>> .travis/linux-build.sh | 2 +- > >>>>>> Documentation/faq/releases.rst | 2 +- > >>>>>> lib/netdev-dpdk.c | 135 > >>>>>> +++++++++++++++++++++++++++++-------- > >>>> ---- > >>>>>> 3 files changed, 98 insertions(+), 41 deletions(-) > >>>>>> > >>>>>> diff --git a/.travis/linux-build.sh b/.travis/linux-build.sh > >>>>>> index > >>>>>> 4b9fc4a..c60ac71 > >>>>>> 100755 > >>>>>> --- a/.travis/linux-build.sh > >>>>>> +++ b/.travis/linux-build.sh > >>>>>> @@ -83,7 +83,7 @@ fi > >>>>>> > >>>>>> if [ "$DPDK" ]; then > >>>>>> if [ -z "$DPDK_VER" ]; then > >>>>>> - DPDK_VER="17.11.3" > >>>>>> + DPDK_VER="18.08.0" > >>>>>> fi > >>>>>> install_dpdk $DPDK_VER > >>>>>> if [ "$CC" = "clang" ]; then diff --git > >>>>>> a/Documentation/faq/releases.rst > b/Documentation/faq/releases.rst > >>>>>> index 41d41e3..646ae09 100644 > >>>>>> --- a/Documentation/faq/releases.rst > >>>>>> +++ b/Documentation/faq/releases.rst > >>>>>> @@ -168,7 +168,7 @@ Q: What DPDK version does each Open > vSwitch > >>>>>> release work with? > >>>>>> 2.7.x 16.11.7 > >>>>>> 2.8.x 17.05.2 > >>>>>> 2.9.x 17.11.3 > >>>>>> - 2.10.x 17.11.3 > >>>>>> + 2.10.x 18.08.0 > >>>>>> ============ ======= > >>>>>> > >>>>>> Q: Are all the DPDK releases that OVS versions work with > >>>>>> maintained? > >>>>>> diff --git a/lib/netdev-dpdk.c b/lib/netdev-dpdk.c index > >>>>>> f91aa27..80d2af9 > >>>>>> 100644 > >>>>>> --- a/lib/netdev-dpdk.c > >>>>>> +++ b/lib/netdev-dpdk.c > >>>>>> @@ -168,11 +168,7 @@ static const struct rte_eth_conf port_conf > = > >>>>>> { > >>>>>> .rxmode = { > >>>>>> .mq_mode = ETH_MQ_RX_RSS, > >>>>>> .split_hdr_size = 0, > >>>>>> - .header_split = 0, /* Header Split disabled */ > >>>>>> - .hw_ip_checksum = 0, /* IP checksum offload disabled */ > >>>>>> - .hw_vlan_filter = 0, /* VLAN filtering disabled */ > >>>>>> - .jumbo_frame = 0, /* Jumbo Frame Support disabled */ > >>>>>> - .hw_strip_crc = 0, > >>>>>> + .offloads = 0, > >>>>>> }, > >>>>>> .rx_adv_conf = { > >>>>>> .rss_conf = { > >>>>>> @@ -364,6 +360,7 @@ struct dpdk_ring { struct ingress_policer { > >>>>>> struct rte_meter_srtcm_params app_srtcm_params; > >>>>>> struct rte_meter_srtcm in_policer; > >>>>>> + struct rte_meter_srtcm_profile in_prof; > >>>>>> rte_spinlock_t policer_lock; }; > >>>>>> > >>>>>> @@ -903,16 +900,17 @@ dpdk_eth_dev_port_config(struct > netdev_dpdk > >>>>>> *dev, int n_rxq, int n_txq) > >>>>>> if (dev->mtu > ETHER_MTU) { > >>>>>> rte_eth_dev_info_get(dev->port_id, &info); > >>>>>> if (strncmp(info.driver_name, "net_nfp", 7)) { > >>>>>> - conf.rxmode.enable_scatter = 1; > >>>>>> + conf.rxmode.offloads |= DEV_RX_OFFLOAD_SCATTER; > >>>>>> } > >>>>>> } > >>>>>> > >>>>>> conf.intr_conf.lsc = dev->lsc_interrupt_mode; > >>>>>> - conf.rxmode.hw_ip_checksum = (dev->hw_ol_features & > >>>>>> - NETDEV_RX_CHECKSUM_OFFLOAD) != > >>>>>> 0; > >>>>>> + conf.rxmode.offloads |= ((dev->hw_ol_features & > >>>>>> + NETDEV_RX_CHECKSUM_OFFLOAD) != 0) ? > >>>>>> + DEV_RX_OFFLOAD_CHECKSUM : 0; > >>>>>> > >>>>>> if (dev->hw_ol_features & NETDEV_RX_HW_CRC_STRIP) { > >>>>>> - conf.rxmode.hw_strip_crc = 1; > >>>>>> + conf.rxmode.offloads |= DEV_RX_OFFLOAD_CRC_STRIP; > >>>>>> } > >>>>>> > >>>>>> /* A device may report more queues than it makes available > >>>>>> (this has @@ - > >>>>>> 1932,16 +1930,18 @@ netdev_dpdk_eth_tx_burst(struct > netdev_dpdk > >>>> *dev, > >>>>>> int qid, > >>>>>> > >>>>>> static inline bool > >>>>>> netdev_dpdk_policer_pkt_handle(struct rte_meter_srtcm *meter, > >>>>>> + struct rte_meter_srtcm_profile > >>>>>> + *profile, > >>>>>> struct rte_mbuf *pkt, uint64_t > >>>>>> time) { > >>>>>> uint32_t pkt_len = rte_pktmbuf_pkt_len(pkt) - sizeof(struct > >>>>>> ether_hdr); > >>>>>> > >>>>>> - return rte_meter_srtcm_color_blind_check(meter, time, > >>>>>> pkt_len) == > >>>>>> + return rte_meter_srtcm_color_blind_check(meter, profile, > >>>>>> time, > >>>>>> + pkt_len) == > >>>>>> > >>>>>> e_RTE_METER_GREEN; } > >>>>>> > >>>>>> static int > >>>>>> netdev_dpdk_policer_run(struct rte_meter_srtcm *meter, > >>>>>> + struct rte_meter_srtcm_profile *profile, > >>>>>> struct rte_mbuf **pkts, int pkt_cnt, > >>>>>> bool should_steal) { @@ -1953,7 +1953,8 > >>>>>> @@ netdev_dpdk_policer_run(struct rte_meter_srtcm *meter, > >>>>>> for (i = 0; i < pkt_cnt; i++) { > >>>>>> pkt = pkts[i]; > >>>>>> /* Handle current packet */ > >>>>>> - if (netdev_dpdk_policer_pkt_handle(meter, pkt, > >>>>>> current_time)) { > >>>>>> + if (netdev_dpdk_policer_pkt_handle(meter, profile, pkt, > >>>>>> + current_time)) > >>>>>> { > >>>>>> if (cnt != i) { > >>>>>> pkts[cnt] = pkt; > >>>>>> } > >>>>>> @@ -1975,8 +1976,8 @@ ingress_policer_run(struct ingress_policer > >>>>>> *policer, struct rte_mbuf **pkts, > >>>>>> int cnt = 0; > >>>>>> > >>>>>> rte_spinlock_lock(&policer->policer_lock); > >>>>>> - cnt = netdev_dpdk_policer_run(&policer->in_policer, pkts, > >>>>>> - pkt_cnt, should_steal); > >>>>>> + cnt = netdev_dpdk_policer_run(&policer->in_policer, > >>>>>> &policer- > >>>>> in_prof, > >>>>>> + pkts, pkt_cnt, should_steal); > >>>>>> rte_spinlock_unlock(&policer->policer_lock); > >>>>>> > >>>>>> return cnt; > >>>>>> @@ -2767,8 +2768,15 @@ netdev_dpdk_policer_construct(uint32_t > >>>>>> rate, > >>>>>> uint32_t burst) > >>>>>> policer->app_srtcm_params.cir = rate_bytes; > >>>>>> policer->app_srtcm_params.cbs = burst_bytes; > >>>>>> policer->app_srtcm_params.ebs = 0; > >>>>>> + err = rte_meter_srtcm_profile_config(&policer->in_prof, > >>>>>> + > >>>>>> &policer->app_srtcm_params); > >>>>>> + if (err) { > >>>>>> + VLOG_ERR("Could not create rte meter profile for ingress > >>>>>> policer"); > >>>>>> + free(policer); > >>>>>> + return NULL; > >>>>>> + } > >>>>>> err = rte_meter_srtcm_config(&policer->in_policer, > >>>>>> - &policer->app_srtcm_params); > >>>>>> + &policer->in_prof); > >>>>>> if (err) { > >>>>>> VLOG_ERR("Could not create rte meter for ingress > >>>>>> policer"); > >>>>>> free(policer); > >>>>>> @@ -3043,13 +3051,18 @@ netdev_dpdk_get_status(const struct > >>>>>> netdev *netdev, struct smap *args) > >>>>>> smap_add_format(args, "if_descr", "%s %s", rte_version(), > >>>>>> > >>>>>> dev_info.driver_name); > >>>>>> > >>>>>> - if (dev_info.pci_dev) { > >>>>>> - smap_add_format(args, "pci-vendor_id", "0x%x", > >>>>>> - dev_info.pci_dev->id.vendor_id); > >>>>>> - smap_add_format(args, "pci-device_id", "0x%x", > >>>>>> - dev_info.pci_dev->id.device_id); > >>>>>> + const struct rte_bus *bus; > >>>>>> + const struct rte_pci_device *pci_dev; > >>>>>> + bus = rte_bus_find_by_device(dev_info.device); > >>>>>> + if (bus && !strcmp(bus->name, "pci")) { > >>>>>> + pci_dev = RTE_DEV_TO_PCI(dev_info.device); > >>>>>> + if (pci_dev) { > >>>>>> + smap_add_format(args, "pci-vendor_id", "0x%u", > >>>>>> + pci_dev->id.vendor_id); > >>>>>> + smap_add_format(args, "pci-device_id", "0x%x", > >>>>>> + pci_dev->id.device_id); > >>>>>> + } > >>>>>> } > >>>>>> - > >>>>>> return 0; > >>>>>> } > >>>>>> > >>>>>> @@ -3727,6 +3740,7 @@ struct egress_policer { > >>>>>> struct qos_conf qos_conf; > >>>>>> struct rte_meter_srtcm_params app_srtcm_params; > >>>>>> struct rte_meter_srtcm egress_meter; > >>>>>> + struct rte_meter_srtcm_profile egress_prof; > >>>>>> }; > >>>>>> > >>>>>> static void > >>>>>> @@ -3749,8 +3763,16 @@ egress_policer_qos_construct(const > struct > >>>> smap > >>>>>> *details, > >>>>>> policer = xmalloc(sizeof *policer); > >>>>>> qos_conf_init(&policer->qos_conf, &egress_policer_ops); > >>>>>> egress_policer_details_to_param(details, > >>>>>> &policer->app_srtcm_params); > >>>>>> + err = rte_meter_srtcm_profile_config(&policer->egress_prof, > >>>>>> + > >>>>>> &policer->app_srtcm_params); > >>>>>> + if (err) { > >>>>> [Sugesh] Should we error out the message on failing the profile > >>>>> config?? > >>>>>> + free(policer); > >>>>>> + *conf = NULL; > >>>>>> + return -err; > >>>>>> + } > >>>>>> err = rte_meter_srtcm_config(&policer->egress_meter, > >>>>>> - &policer->app_srtcm_params); > >>>>>> + &policer->egress_prof); > >>>>>> + > >>>>>> if (!err) { > >>>>>> *conf = &policer->qos_conf; > >>>>>> } else { > >>>>>> @@ -3803,7 +3825,8 @@ egress_policer_run(struct qos_conf *conf, > >>>>>> struct rte_mbuf **pkts, int pkt_cnt, > >>>>>> struct egress_policer *policer = > >>>>>> CONTAINER_OF(conf, struct egress_policer, qos_conf); > >>>>>> > >>>>>> - cnt = netdev_dpdk_policer_run(&policer->egress_meter, pkts, > >>>>>> + cnt = netdev_dpdk_policer_run(&policer->egress_meter, > >>>>>> + &policer->egress_prof, pkts, > >>>>>> pkt_cnt, should_steal); > >>>>>> > >>>>>> return cnt; > >>>>>> @@ -4103,15 +4126,15 @@ dump_flow_pattern(struct > rte_flow_item > >>>> *item) > >>>>>> > >>>>>> VLOG_DBG("rte flow vlan pattern:\n"); > >>>>>> if (vlan_spec) { > >>>>>> - VLOG_DBG(" Spec: tpid=0x%"PRIx16", > >>>>>> tci=0x%"PRIx16"\n", > >>>>>> - ntohs(vlan_spec->tpid), > >>>>>> ntohs(vlan_spec->tci)); > >>>>>> + VLOG_DBG(" Spec: inner_type=0x%"PRIx16", > >>>>>> tci=0x%"PRIx16"\n", > >>>>>> + ntohs(vlan_spec->inner_type), > >>>>>> + ntohs(vlan_spec->tci)); > >>>>>> } else { > >>>>>> VLOG_DBG(" Spec = null\n"); > >>>>>> } > >>>>>> > >>>>>> if (vlan_mask) { > >>>>>> - VLOG_DBG(" Mask: tpid=0x%"PRIx16", > >>>>>> tci=0x%"PRIx16"\n", > >>>>>> - vlan_mask->tpid, vlan_mask->tci); > >>>>>> + VLOG_DBG(" Mask: inner_type=0x%"PRIx16", > >>>> tci=0x%"PRIx16"\n", > >>>>>> + vlan_mask->inner_type, vlan_mask->tci); > >>>>>> } else { > >>>>>> VLOG_DBG(" Mask = null\n"); > >>>>>> } > >>>>>> @@ -4281,27 +4304,56 @@ add_flow_action(struct flow_actions > >>>> *actions, > >>>>>> enum rte_flow_action_type type, > >>>>>> actions->cnt++; > >>>>>> } > >>>>>> > >>>>>> +/* > >>>>>> + * Storage for struct rte_flow_action_rss > >>>>>> + * including storage for key and queue array */ #define > >>>>>> +MAX_RSS_HASH_KEY_LENGTH 128 #define > >>>> MAX_ACTION_RSS_QUEUE_NUM > >>>>>> 128 > >>>>>> +struct action_rss_data { > >>>>>> + struct rte_flow_action_rss conf; > >>>>>> + uint16_t queue[MAX_ACTION_RSS_QUEUE_NUM]; > >>>>>> + uint8_t key[MAX_RSS_HASH_KEY_LENGTH]; }; > >>>>>> + > >>>>>> static struct rte_flow_action_rss * add_flow_rss_action(struct > >>>>>> flow_actions *actions, > >>>>>> struct netdev *netdev) { > >>>>>> int i; > >>>>>> - struct rte_flow_action_rss *rss; > >>>>>> + struct action_rss_data *rss_data; > >>>>>> > >>>>>> - rss = xmalloc(sizeof(*rss) + sizeof(uint16_t) * > >>>>>> netdev->n_rxq); > >>>>>> - /* > >>>>>> - * Setting it to NULL will let the driver use the default > >>>>>> RSS > >>>>>> - * configuration we have set: > >>>>>> &port_conf.rx_adv_conf.rss_conf. > >>>>>> - */ > >>>>>> - rss->rss_conf = NULL; > >>>>>> - rss->num = netdev->n_rxq; > >>>>>> + if (netdev->n_rxq > MAX_ACTION_RSS_QUEUE_NUM) { > >>>>>> + VLOG_ERR("Num of rxq (%u) must not be greater " \ > >>>>>> + "than max rss num of queues (%u)", > >>>>>> + netdev->n_rxq, MAX_ACTION_RSS_QUEUE_NUM); > >>>>>> + return NULL; > >>>>>> + } > >>>>>> > >>>>>> - for (i = 0; i < rss->num; i++) { > >>>>>> - rss->queue[i] = i; > >>>>>> + rss_data = xmalloc(sizeof(struct action_rss_data)); > >>>>>> + *rss_data = (struct action_rss_data){ > >>>>>> + .conf = (struct rte_flow_action_rss){ > >>>>>> + .func = RTE_ETH_HASH_FUNCTION_DEFAULT, > >>>>>> + .level = 0, > >>>>>> + .types = ETH_RSS_IP, > >>>>>> + .key_len = 0, > >>>>>> + .queue_num = netdev->n_rxq, > >>>>>> + .queue = rss_data->queue, > >>>>>> + .key = rss_data->key, > >>>>>> + }, > >>>>>> + .key = { 0 }, > >>>>>> + .queue = { 0 }, > >>>>>> + }; > >>>>>> + > >>>>>> + /* TODO: Override key with default */ > >>>>> [Sugesh] Do we really need this TODO?? > >>>>>> + > >>>>>> + /* Override queue array with default */ > >>>>>> + for (i = 0; i < rss_data->conf.queue_num; i++) { > >>>>>> + rss_data->queue[i] = i; > >>>>>> } > >>>>>> > >>>>>> - add_flow_action(actions, RTE_FLOW_ACTION_TYPE_RSS, rss); > >>>>>> + add_flow_action(actions, RTE_FLOW_ACTION_TYPE_RSS, > >>>>>> + &rss_data->conf); > >>>>>> > >>>>>> - return rss; > >>>>>> + return &rss_data->conf; > >>>>>> } > >>>>>> > >>>>>> static int > >>>>>> @@ -4365,7 +4417,7 @@ > netdev_dpdk_add_rte_flow_offload(struct > >>>> netdev > >>>>>> *netdev, > >>>>>> vlan_mask.tci = match->wc.masks.vlans[0].tci & > >>>>>> ~htons(VLAN_CFI); > >>>>>> > >>>>>> /* match any protocols */ > >>>>>> - vlan_mask.tpid = 0; > >>>>>> + vlan_mask.inner_type = 0; > >>>>>> > >>>>>> add_flow_pattern(&patterns, RTE_FLOW_ITEM_TYPE_VLAN, > >>>>>> &vlan_spec, &vlan_mask); @@ -4516,6 > >>>>>> +4568,11 @@ > >>>>>> end_proto_check: > >>>>>> > >>>>>> struct rte_flow_action_rss *rss; > >>>>>> rss = add_flow_rss_action(&actions, netdev); > >>>>>> + if (!rss) { > >>>>>> + VLOG_ERR("add_flow_rss_action error.\n"); > >>>>> I feel this error can be bit more verbose something like Failed to > >>>>> add > >>>> rss_flow+actions or something?? What do you think? > >>>>>> + ret = -1; > >>>>>> + goto out; > >>>>>> + } > >>>>>> add_flow_action(&actions, RTE_FLOW_ACTION_TYPE_END, > NULL); > >>>>>> > >>>>>> flow = rte_flow_create(dev->port_id, &flow_attr, > >>>>>> patterns.items, > >>>>>> -- > >>>>>> 1.8.3.1 > >>>>> > >>> > >>> _______________________________________________ > >>> dev mailing list > >>> d...@openvswitch.org > >>> > https://emea01.safelinks.protection.outlook.com/?url=https%3A%2F%2Fm > >>> ail.openvswitch.org%2Fmailman%2Flistinfo%2Fovs- > dev&data=02%7C01% > >>> > 7Cophirmu%40mellanox.com%7Ce6c08e7bb58d40807f1408d6133416c2%7C > a65297 > >>> > 1c7d2e4d9ba6a4d149256f461b%7C0%7C0%7C636717511775064323&s > data=qU > >>> > zRNGAXN%2F9EqDJplTPvs82QP8tRte6e3GW5i01IEYE%3D&reserved=0 > >> _______________________________________________ > >> dev mailing list > >> d...@openvswitch.org > >> > https://emea01.safelinks.protection.outlook.com/?url=https%3A%2F%2Fma > >> il.openvswitch.org%2Fmailman%2Flistinfo%2Fovs- > dev&data=02%7C01%7C > >> > ophirmu%40mellanox.com%7Ce6c08e7bb58d40807f1408d6133416c2%7Ca6 > 52971c7 > >> > d2e4d9ba6a4d149256f461b%7C0%7C0%7C636717511775064323&sdat > a=qUzRNG > >> AXN%2F9EqDJplTPvs82QP8tRte6e3GW5i01IEYE%3D&reserved=0 > > _______________________________________________ > > dev mailing list > > d...@openvswitch.org > > > https://emea01.safelinks.protection.outlook.com/?url=https%3A%2F%2Fmai > > l.openvswitch.org%2Fmailman%2Flistinfo%2Fovs- > dev&data=02%7C01%7Cop > > > hirmu%40mellanox.com%7Ce6c08e7bb58d40807f1408d6133416c2%7Ca652 > 971c7d2e > > > 4d9ba6a4d149256f461b%7C0%7C0%7C636717511775064323&sdata=q > UzRNGAXN% > > 2F9EqDJplTPvs82QP8tRte6e3GW5i01IEYE%3D&reserved=0 _______________________________________________ dev mailing list d...@openvswitch.org https://mail.openvswitch.org/mailman/listinfo/ovs-dev