[ovs-dev] [dpdk-hwol PATCH v1] netdev-dpdk: Upgrade to dpdk v18.08.0
Ophir Munk
ophirmu at mellanox.com
Wed Sep 5 14:45:38 UTC 2018
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:echaudro at redhat.com]
> Sent: Wednesday, September 05, 2018 2:33 PM
> To: Ophir Munk <ophirmu at mellanox.com>
> Cc: Thomas Monjalon <thomas at monjalon.net>; ovs-dev at openvswitch.org;
> Asaf Penso <asafp at mellanox.com>; Shahaf Shuler
> <shahafs at 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:ktraynor at redhat.com]
> >>>> Sent: Wednesday, September 05, 2018 9:28 AM
> >>>> To: Chandran, Sugesh <sugesh.chandran at intel.com>; Ophir Munk
> >>>> <ophirmu at mellanox.com>; ovs-dev at openvswitch.org
> >>>> Cc: Asaf Penso <asafp at mellanox.com>; Stokes, Ian
> >>>> <ian.stokes at intel.com>; Ben Pfaff <blp at ovn.org>; Shahaf Shuler
> >>>> <shahafs at mellanox.com>; Thomas Monjalon
> <thomas at monjalon.net>; Olga
> >>>> Shern <olgas at 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:ophirmu at mellanox.com]
> >>>>>> Sent: Monday, September 3, 2018 3:19 PM
> >>>>>> To: ovs-dev at openvswitch.org
> >>>>>> Cc: Asaf Penso <asafp at mellanox.com>; Chandran, Sugesh
> >>>>>> <sugesh.chandran at intel.com>; Stokes, Ian <ian.stokes at intel.com>;
> >>>>>> Ben Pfaff <blp at ovn.org>; Shahaf Shuler <shahafs at mellanox.com>;
> >>>>>> Thomas Monjalon <thomas at monjalon.net>; Olga Shern
> >>>>>> <olgas at mellanox.com>; Ophir Munk <ophirmu at mellanox.com>;
> Kevin
> >>>>>> Traynor <ktraynor at 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 <ophirmu at 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
> >>> dev at 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
> >> dev at 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
> > dev at 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
More information about the dev
mailing list