[ovs-dev] [PATCH v1 1/1] dpdk: Update to use DPDK 18.11.
Ilya Maximets
i.maximets at samsung.com
Tue Dec 11 08:46:23 UTC 2018
On 11.12.2018 3:13, Ian Stokes wrote:
> This commit adds support for DPDK v18.11, it includes the following
> changes.
>
> 1. Enable compilation and linkage with dpdk 18.11.0
> The following dpdk commits which were introduced after dpdk 17.11.x
> require OVS updates to accommodate to the dpdk changes.
> - ce17edde ("ethdev: introduce Rx queue offloads API")
> - ab3ce1e0 ("ethdev: remove old offload API")
> - c06ddf96 ("meter: add configuration profile")
> - e58638c3 ("ethdev: fix TPID handling in flow API")
> - cd8c7c7c ("ethdev: replace bus specific struct with generic dev")
> - ac8d22de ("ethdev: flatten RSS configuration in flow API")
>
> 2. Limit configured rss hash functions to only those supported
> by the eth device.
>
> 3. Set default RSS key in struct action_rss_data, required by OVS
> commit- e8a2b5bf ("netdev-dpdk: implement flow offload with rte flow")
> when configured with "other_config:hw-offload=true".
>
> 4. DEV_RX_OFFLOAD_CRC_STRIP has been removed from DPDK 18.11.
> DEV_RX_OFFLOAD_KEEP_CRC can now be used to keep the CRC.
> Use the correct flag and check it is supported.
>
> 5. rte_eth_dev_attach/detach have been removed from DPDK 18.11.
> Replace them with rte_dev_probe/remove.
>
> 6. redhat: change variable used for non-root user support from
> $HOME to $XDG_RUNTIME_DIR.
>
> 7. Update docs and travis to use DPDK18.11.
>
> This commit squashes the following commits present on the dpdk-latest
> branch:
>
> 7f021f902bb3 ("netdev-dpdk: Upgrade to dpdk v18.08")
> 270d9216f1ed ("netdev-dpdk: Set scatter based on capabilities")
> bef2cdc8f412 ("netdev-dpdk: Fix returning the field of malloced struct.")
> 73c1a65167fc ("redhat: change variable used for non-root user support")
> eb485f60ce44 ("dpdk: Update to use DPDK 18.11.")
>
> For credit all authors of the original commits above have been added as
> co-authors for this commmit.
>
> Signed-off-by: Ophir Munk <ophirmu at mellanox.com>
> Co-authored-by: Ophir Munk <ophirmu at mellanox.com>
> Signed-off-by: Kevin Traynor <ktraynor at redhat.com>
> Co-authored-by: Kevin Traynor <ktraynor at redhat.com>
> Signed-off-by: Ilya Maximets <i.maximets at samsung.com>
> Co-authored-by: Ilya Maximets <i.maximets at samsung.com>
> Signed-off-by: Timothy Redaelli <tredaelli at redhat.com>
> Co-authored-by: Timothy Redaelli <tredaelli at redhat.com>
> Signed-off-by: Ian Stokes <ian.stokes at intel.com>
> ---
> .travis/linux-build.sh | 8 +-
> Documentation/intro/install/dpdk.rst | 15 +-
> Documentation/topics/dpdk/ring.rst | 3 +-
> Documentation/topics/dpdk/vhost-user.rst | 8 +-
> NEWS | 1 +
> lib/netdev-dpdk.c | 176 +++++++++++++--------
> .../usr_lib_systemd_system_ovs-vswitchd.service.in | 2 +-
> 7 files changed, 132 insertions(+), 81 deletions(-)
>
> diff --git a/.travis/linux-build.sh b/.travis/linux-build.sh
> index 1fe5bbfa9..5f4d838a9 100755
> --- a/.travis/linux-build.sh
> +++ b/.travis/linux-build.sh
> @@ -56,9 +56,9 @@ function install_dpdk()
> cd dpdk-$1
> git checkout tags/v$1
> else
> - wget http://fast.dpdk.org/rel/dpdk-$1.tar.gz
> - tar xzvf dpdk-$1.tar.gz > /dev/null
> - DIR_NAME=$(tar -tf dpdk-$1.tar.gz | head -1 | cut -f1 -d"/")
> + wget https://fast.dpdk.org/rel/dpdk-$1.tar.xz
> + tar xvf dpdk-$1.tar.xz > /dev/null
> + DIR_NAME=$(tar -tf dpdk-$1.tar.xz | head -1 | cut -f1 -d"/")
> if [ $DIR_NAME != "dpdk-$1" ]; then mv $DIR_NAME dpdk-$1; fi
> cd dpdk-$1
> fi
> @@ -83,7 +83,7 @@ fi
>
> if [ "$DPDK" ]; then
> if [ -z "$DPDK_VER" ]; then
> - DPDK_VER="17.11.4"
> + DPDK_VER="18.11"
> fi
> install_dpdk $DPDK_VER
> if [ "$CC" = "clang" ]; then
> diff --git a/Documentation/intro/install/dpdk.rst b/Documentation/intro/install/dpdk.rst
> index 13546bb72..61307cb7c 100644
> --- a/Documentation/intro/install/dpdk.rst
> +++ b/Documentation/intro/install/dpdk.rst
> @@ -42,7 +42,7 @@ Build requirements
> In addition to the requirements described in :doc:`general`, building Open
> vSwitch with DPDK will require the following:
>
> -- DPDK 17.11.4
> +- DPDK 18.11
>
> - A `DPDK supported NIC`_
>
> @@ -71,9 +71,9 @@ Install DPDK
> #. Download the `DPDK sources`_, extract the file and set ``DPDK_DIR``::
>
> $ cd /usr/src/
> - $ wget http://fast.dpdk.org/rel/dpdk-17.11.4.tar.xz
> - $ tar xf dpdk-17.11.4.tar.xz
> - $ export DPDK_DIR=/usr/src/dpdk-stable-17.11.4
> + $ wget http://fast.dpdk.org/rel/dpdk-18.11.tar.xz
> + $ tar xf dpdk-18.11.tar.xz
> + $ export DPDK_DIR=/usr/src/dpdk-18.11
> $ cd $DPDK_DIR
>
> #. (Optional) Configure DPDK as a shared library
> @@ -283,9 +283,9 @@ with either the ovs-vswitchd logs, or by running either of the commands::
>
> $ ovs-vswitchd --version
> ovs-vswitchd (Open vSwitch) 2.9.0
> - DPDK 17.11.0
> + DPDK 18.08.0
> $ ovs-vsctl get Open_vSwitch . dpdk_version
> - "DPDK 17.11.0"
> + "DPDK 18.08.0"
>
Agree with David that this change is unnecessary. And it's actually
wrong, because it makes example inconsistent.
> At this point you can use ovs-vsctl to set up bridges and other Open vSwitch
> features. Seeing as we've configured the DPDK datapath, we will use DPDK-type
> @@ -672,7 +672,8 @@ Limitations
> The latest list of validated firmware versions can be found in the `DPDK
> release notes`_.
>
> -.. _DPDK release notes: http://dpdk.org/doc/guides/rel_notes/release_17_11.html
> +.. _DPDK release notes:
> + https://doc.dpdk.org/guides/rel_notes/release_18_11.html
>
> - Upper bound MTU: DPDK device drivers differ in how the L2 frame for a
> given MTU value is calculated e.g. i40e driver includes 2 x vlan headers in
> diff --git a/Documentation/topics/dpdk/ring.rst b/Documentation/topics/dpdk/ring.rst
> index 9ef1dc3a5..e48b44ce8 100644
> --- a/Documentation/topics/dpdk/ring.rst
> +++ b/Documentation/topics/dpdk/ring.rst
> @@ -82,4 +82,5 @@ DPDK. However, this functionality was removed because:
> - :doc:`vhost-user interfaces <vhost-user>` are the de facto DPDK-based path to
> guests
>
> -.. _DPDK documentation: https://dpdk.readthedocs.io/en/v17.11/prog_guide/ring_lib.html
> +.. _DPDK documentation:
> + https://doc.dpdk.org/guides-18.11/prog_guide/ring_lib.html
> diff --git a/Documentation/topics/dpdk/vhost-user.rst b/Documentation/topics/dpdk/vhost-user.rst
> index 6334590af..993797de5 100644
> --- a/Documentation/topics/dpdk/vhost-user.rst
> +++ b/Documentation/topics/dpdk/vhost-user.rst
> @@ -320,9 +320,9 @@ To begin, instantiate a guest as described in :ref:`dpdk-vhost-user` or
> DPDK sources to VM and build DPDK::
>
> $ cd /root/dpdk/
> - $ wget http://fast.dpdk.org/rel/dpdk-17.11.4.tar.xz
> - $ tar xf dpdk-17.11.4.tar.xz
> - $ export DPDK_DIR=/root/dpdk/dpdk-stable-17.11.4
> + $ wget http://fast.dpdk.org/rel/dpdk-18.11.tar.xz
> + $ tar xf dpdk-18.11.tar.xz
> + $ export DPDK_DIR=/root/dpdk/dpdk-18.11
> $ export DPDK_TARGET=x86_64-native-linuxapp-gcc
> $ export DPDK_BUILD=$DPDK_DIR/$DPDK_TARGET
> $ cd $DPDK_DIR
> @@ -502,4 +502,4 @@ Because of this limitation, this feature is considered 'experimental'.
>
> Further information can be found in the
> `DPDK documentation
> -<http://dpdk.readthedocs.io/en/v17.11/prog_guide/vhost_lib.html>`__
> +<https://doc.dpdk.org/guides-18.11/prog_guide/vhost_lib.html>`__
> diff --git a/NEWS b/NEWS
> index 02402d1a4..358c9b97e 100644
> --- a/NEWS
> +++ b/NEWS
> @@ -12,6 +12,7 @@ Post-v2.10.0
> - DPDK:
> * Add option for simple round-robin based Rxq to PMD assignment.
> It can be set with pmd-rxq-assign.
> + * Add support for DPDK 18.11
> - Add 'symmetric_l3' hash function.
> - OVS now honors 'updelay' and 'downdelay' for bonds with LACP configured.
> - ovs-vswitchd:
> diff --git a/lib/netdev-dpdk.c b/lib/netdev-dpdk.c
> index a871743e6..a518dd400 100644
> --- a/lib/netdev-dpdk.c
> +++ b/lib/netdev-dpdk.c
> @@ -164,11 +164,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 = {
> @@ -360,12 +356,14 @@ 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;
> };
>
> enum dpdk_hw_ol_features {
> NETDEV_RX_CHECKSUM_OFFLOAD = 1 << 0,
> NETDEV_RX_HW_CRC_STRIP = 1 << 1,
> + NETDEV_RX_HW_SCATTER = 1 << 2
> };
>
> /*
> @@ -915,27 +913,33 @@ dpdk_eth_dev_port_config(struct netdev_dpdk *dev, int n_rxq, int n_txq)
> struct rte_eth_dev_info info;
> uint16_t conf_mtu;
>
> + rte_eth_dev_info_get(dev->port_id, &info);
> +
> /* As of DPDK 17.11.1 a few PMDs require to explicitly enable
> - * scatter to support jumbo RX. Checking the offload capabilities
> - * is not an option as PMDs are not required yet to report
> - * them. The only reliable info is the driver name and knowledge
> - * (testing or code review). Listing all such PMDs feels harder
> - * than highlighting the one known not to need scatter */
> + * scatter to support jumbo RX.
> + * Setting scatter for the device is done after checking for
> + * scatter support in the device capabilites. */
> 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;
> + if (dev->hw_ol_features & NETDEV_RX_HW_SCATTER) {
> + 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;
>
> - if (dev->hw_ol_features & NETDEV_RX_HW_CRC_STRIP) {
> - conf.rxmode.hw_strip_crc = 1;
> + if (dev->hw_ol_features & NETDEV_RX_CHECKSUM_OFFLOAD) {
> + conf.rxmode.offloads |= DEV_RX_OFFLOAD_CHECKSUM;
> }
>
> + if (!(dev->hw_ol_features & NETDEV_RX_HW_CRC_STRIP)
> + && info.rx_offload_capa & DEV_RX_OFFLOAD_KEEP_CRC) {
> + conf.rxmode.offloads |= DEV_RX_OFFLOAD_KEEP_CRC;
> + }
> +
> + /* Limit configured rss hash functions to only those supported
> + * by the eth device. */
> + conf.rx_adv_conf.rss_conf.rss_hf &= info.flow_type_rss_offloads;
> +
> /* A device may report more queues than it makes available (this has
> * been observed for Intel xl710, which reserves some of them for
> * SRIOV): rte_eth_*_queue_setup will fail if a queue is not
> @@ -1052,6 +1056,13 @@ dpdk_eth_dev_init(struct netdev_dpdk *dev)
> dev->hw_ol_features |= NETDEV_RX_CHECKSUM_OFFLOAD;
> }
>
> + if (info.rx_offload_capa & DEV_RX_OFFLOAD_SCATTER) {
> + dev->hw_ol_features |= NETDEV_RX_HW_SCATTER;
> + } else {
> + /* Do not warn on lack of scatter support */
> + dev->hw_ol_features &= ~NETDEV_RX_HW_SCATTER;
> + }
> +
> n_rxq = MIN(info.max_rx_queues, dev->up.n_rxq);
> n_txq = MIN(info.max_tx_queues, dev->up.n_txq);
>
> @@ -1342,7 +1353,7 @@ static void
> netdev_dpdk_destruct(struct netdev *netdev)
> {
> struct netdev_dpdk *dev = netdev_dpdk_cast(netdev);
> - char devname[RTE_ETH_NAME_MAX_LEN];
> + struct rte_eth_dev_info dev_info;
>
> ovs_mutex_lock(&dpdk_mutex);
>
> @@ -1351,10 +1362,11 @@ netdev_dpdk_destruct(struct netdev *netdev)
>
> if (dev->attached) {
> rte_eth_dev_close(dev->port_id);
> - if (rte_eth_dev_detach(dev->port_id, devname) < 0) {
> - VLOG_ERR("Device '%s' can not be detached", dev->devargs);
> + rte_eth_dev_info_get(dev->port_id, &dev_info);
> + if (dev_info.device && !rte_dev_remove(dev_info.device)) {
> + VLOG_INFO("Device '%s' has been detached", dev->devargs);
> } else {
> - VLOG_INFO("Device '%s' has been detached", devname);
> + VLOG_ERR("Device '%s' can not be detached", dev->devargs);
> }
> }
>
> @@ -1644,7 +1656,8 @@ netdev_dpdk_process_devargs(struct netdev_dpdk *dev,
> if (rte_eth_dev_get_port_by_name(name, &new_port_id)
> || !rte_eth_dev_is_valid_port(new_port_id)) {
> /* Device not found in DPDK, attempt to attach it */
> - if (!rte_eth_dev_attach(devargs, &new_port_id)) {
> + if (!rte_dev_probe(devargs)
> + && !rte_eth_dev_get_port_by_name(name, &new_port_id)) {
> /* Attach successful */
> dev->attached = true;
> VLOG_INFO("Device '%s' attached to DPDK", devargs);
> @@ -1953,16 +1966,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) ==
> - e_RTE_METER_GREEN;
> + 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)
> {
> @@ -1974,7 +1989,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 you will re-spin the patch, I'd like the args to be vertically aligned.
Like this:
if (netdev_dpdk_policer_pkt_handle(meter, profile,
pkt, current_time)) {
> if (cnt != i) {
> pkts[cnt] = pkt;
> }
> @@ -1996,8 +2012,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;
> @@ -2802,8 +2818,12 @@ 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_config(&policer->in_policer,
> - &policer->app_srtcm_params);
> + err = rte_meter_srtcm_profile_config(&policer->in_prof,
> + &policer->app_srtcm_params);
> + if (!err) {
> + err = rte_meter_srtcm_config(&policer->in_policer,
> + &policer->in_prof);
> + }
> if (err) {
> VLOG_ERR("Could not create rte meter for ingress policer");
> free(policer);
> @@ -3097,10 +3117,24 @@ netdev_dpdk_get_status(const struct netdev *netdev, struct smap *args)
> return ENODEV;
> }
>
> + ovs_mutex_lock(&dpdk_mutex);
> ovs_mutex_lock(&dev->mutex);
> rte_eth_dev_info_get(dev->port_id, &dev_info);
> link_speed = dev->link.link_speed;
> ovs_mutex_unlock(&dev->mutex);
> + const struct rte_bus *bus;
> + const struct rte_pci_device *pci_dev;
> + uint16_t vendor_id = PCI_ANY_ID;
> + uint16_t device_id = PCI_ANY_ID;
> + 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) {
> + vendor_id = pci_dev->id.vendor_id;
> + device_id = pci_dev->id.device_id;
> + }
> + }
> + ovs_mutex_unlock(&dpdk_mutex);
>
> smap_add_format(args, "port_no", DPDK_PORT_ID_FMT, dev->port_id);
> smap_add_format(args, "numa_id", "%d",
> @@ -3123,13 +3157,8 @@ netdev_dpdk_get_status(const struct netdev *netdev, struct smap *args)
> smap_add_format(args, "if_type", "%"PRIu32, IF_TYPE_ETHERNETCSMACD);
> 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);
> - }
> + smap_add_format(args, "pci-vendor_id", "0x%x", vendor_id);
> + smap_add_format(args, "pci-device_id", "0x%x", device_id);
>
> /* Not all link speeds are defined in the OpenFlow specs e.g. 25 Gbps.
> * In that case the speed will not be reported as part of the usual
> @@ -3204,11 +3233,10 @@ static void
> netdev_dpdk_detach(struct unixctl_conn *conn, int argc OVS_UNUSED,
> const char *argv[], void *aux OVS_UNUSED)
> {
> - int ret;
> char *response;
> dpdk_port_t port_id;
> - char devname[RTE_ETH_NAME_MAX_LEN];
> struct netdev_dpdk *dev;
> + struct rte_eth_dev_info dev_info;
>
> ovs_mutex_lock(&dpdk_mutex);
>
> @@ -3227,8 +3255,8 @@ netdev_dpdk_detach(struct unixctl_conn *conn, int argc OVS_UNUSED,
>
> rte_eth_dev_close(port_id);
>
> - ret = rte_eth_dev_detach(port_id, devname);
> - if (ret < 0) {
> + rte_eth_dev_info_get(port_id, &dev_info);
> + if (!dev_info.device || rte_dev_remove(dev_info.device)) {
> response = xasprintf("Device '%s' can not be detached", argv[1]);
> goto error;
> }
> @@ -3816,6 +3844,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
> @@ -3838,11 +3867,17 @@ 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_config(&policer->egress_meter,
> - &policer->app_srtcm_params);
> + err = rte_meter_srtcm_profile_config(&policer->egress_prof,
> + &policer->app_srtcm_params);
> + if (!err) {
> + err = rte_meter_srtcm_config(&policer->egress_meter,
> + &policer->egress_prof);
> + }
> +
> if (!err) {
> *conf = &policer->qos_conf;
> } else {
> + VLOG_ERR("Could not create rte meter for egress policer");
> free(policer);
> *conf = NULL;
> err = -err;
> @@ -3892,7 +3927,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;
> @@ -3977,7 +4013,7 @@ dpdk_vhost_reconfigure_helper(struct netdev_dpdk *dev)
> if (!err) {
> /* A new mempool was created or re-used. */
> netdev_change_seq_changed(&dev->up);
> - } else if (err != EEXIST){
> + } else if (err != EEXIST) {
> return err;
> }
> if (netdev_dpdk_get_vid(dev) >= 0) {
> @@ -4203,16 +4239,16 @@ dump_flow_pattern(struct rte_flow_item *item)
> ds_put_cstr(&s, "rte flow vlan pattern:\n");
> if (vlan_spec) {
> ds_put_format(&s,
> - " Spec: tpid=0x%"PRIx16", tci=0x%"PRIx16"\n",
> - ntohs(vlan_spec->tpid), ntohs(vlan_spec->tci));
> + " Spec: inner_type=0x%"PRIx16", tci=0x%"PRIx16"\n",
> + ntohs(vlan_spec->inner_type), ntohs(vlan_spec->tci));
> } else {
> ds_put_cstr(&s, " Spec = null\n");
> }
>
> if (vlan_mask) {
> ds_put_format(&s,
> - " Mask: tpid=0x%"PRIx16", tci=0x%"PRIx16"\n",
> - vlan_mask->tpid, vlan_mask->tci);
> + " Mask: inner_type=0x%"PRIx16", tci=0x%"PRIx16"\n",
> + ntohs(vlan_mask->inner_type), ntohs(vlan_mask->tci));
> } else {
> ds_put_cstr(&s, " Mask = null\n");
> }
> @@ -4395,27 +4431,39 @@ add_flow_action(struct flow_actions *actions, enum rte_flow_action_type type,
> actions->cnt++;
> }
>
> -static struct rte_flow_action_rss *
> +struct action_rss_data {
> + struct rte_flow_action_rss conf;
> + uint16_t queue[0];
> +};
> +
> +static struct action_rss_data *
> add_flow_rss_action(struct flow_actions *actions,
> struct netdev *netdev) {
> int i;
> - struct rte_flow_action_rss *rss;
> -
> - 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;
> + struct action_rss_data *rss_data;
> +
> + rss_data = xmalloc(sizeof(struct action_rss_data) +
> + sizeof(uint16_t) * netdev->n_rxq);
> + *rss_data = (struct action_rss_data) {
> + .conf = (struct rte_flow_action_rss) {
> + .func = RTE_ETH_HASH_FUNCTION_DEFAULT,
> + .level = 0,
> + .types = 0,
> + .queue_num = netdev->n_rxq,
> + .queue = rss_data->queue,
> + .key_len = 0,
> + .key = NULL
> + },
> + };
>
> - for (i = 0; i < rss->num; i++) {
> - rss->queue[i] = i;
> + /* Override queue array with default */
> + for (i = 0; i < netdev->n_rxq; 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;
> }
>
> static int
> @@ -4479,7 +4527,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);
> @@ -4625,7 +4673,7 @@ end_proto_check:
> add_flow_pattern(&patterns, RTE_FLOW_ITEM_TYPE_END, NULL, NULL);
>
> struct rte_flow_action_mark mark;
> - struct rte_flow_action_rss *rss;
> + struct action_rss_data *rss;
>
> mark.id = info->flow_mark;
> add_flow_action(&actions, RTE_FLOW_ACTION_TYPE_MARK, &mark);
> diff --git a/rhel/usr_lib_systemd_system_ovs-vswitchd.service.in b/rhel/usr_lib_systemd_system_ovs-vswitchd.service.in
> index 11b34c686..525deae0b 100644
> --- a/rhel/usr_lib_systemd_system_ovs-vswitchd.service.in
> +++ b/rhel/usr_lib_systemd_system_ovs-vswitchd.service.in
> @@ -10,7 +10,7 @@ PartOf=openvswitch.service
> [Service]
> Type=forking
> Restart=on-failure
> -Environment=HOME=/var/run/openvswitch
> +Environment=XDG_RUNTIME_DIR=/var/run/openvswitch
> EnvironmentFile=/etc/openvswitch/default.conf
> EnvironmentFile=-/etc/sysconfig/openvswitch
> EnvironmentFile=-/run/openvswitch/useropts
>
More information about the dev
mailing list