> It is possible to set LSC detection mode to polling or interrupt mode for
> DPDK interfaces. The default is polling mode. To set interrupt mode,
> option dpdk-lsc-interrupt has to be set to true.
> 
> For detailed description and usage see the dpdk install documentation.
> 

Thanks Robert, LGTM,

I've made the following incremental

diff --git a/NEWS b/NEWS
index 39f42c5..269faea 100644
--- a/NEWS
+++ b/NEWS
@@ -27,6 +27,7 @@ Post-v2.9.0
    - DPDK:
      * New 'check-dpdk' Makefile target to run a new system testsuite.
        See Testing topic for the details.
+     * Add support for LSC interrupt mode for DPDK devices.

I've also moved the documentation you added from 

'Documentation/intro/install/dpdk.rst' to 'Documentation/topics/dpdk/phy.rst' 
as I think the proper location for the configuration options.

If this is ok with you I'll put this on DPDK_MERGE, I believe we said it should 
be backported also to OVS 2.9 and OVS 2.8 at least.

Thanks
Ian

> Signed-off-by: Robert Mulik <robert.mu...@ericsson.com>
> ---
> v5 -> v6:
> - DPDK install documentation updated.
> - Status of lsc_interrupt_mode of DPDK interfaces can be read by command
>   ovs-appctl dpif/show.
> - It was suggested to check if the HW supports interrupt mode, but it is
> not
>   possible to do without DPDK code change, so it is skipped from this
> patch.
> V6 -> v7
> - DPDK install documentation updated.
> - Commit message updated.
> - Error message updated with LSC failure.
> - Code refactorized based on the comments for v6.
> ---
>  Documentation/intro/install/dpdk.rst | 24 ++++++++++++++++++++++++
>  lib/netdev-dpdk.c                    | 33 ++++++++++++++++++++++++++++---
> --
>  vswitchd/vswitch.xml                 | 17 +++++++++++++++++
>  3 files changed, 69 insertions(+), 5 deletions(-)
> 
> diff --git a/Documentation/intro/install/dpdk.rst
> b/Documentation/intro/install/dpdk.rst
> index fea4890..c47ea13 100644
> --- a/Documentation/intro/install/dpdk.rst
> +++ b/Documentation/intro/install/dpdk.rst
> @@ -628,6 +628,30 @@ The average number of packets per output batch can be
> checked in PMD stats::
> 
>      $ ovs-appctl dpif-netdev/pmd-stats-show
> 
> +Link State Change (LSC) detection configuration
> +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
> +
> +There are two methods to get the information when Link State Change
> +(LSC) happens on a network interface: by polling or interrupt.
> +
> +Configuring the lsc detection mode has no direct effect on OVS itself,
> +instead it configures the NIC how it should handle link state changes.
> +Processing the link state update request triggered by OVS takes less
> +time using interrupt mode, since the NIC updates its link state in the
> +background, while in polling mode the link state has to be fetched from
> +the firmware every time to fulfil this request.
> +
> +Note that not all PMD drivers support LSC interrupts.
> +
> +The default configuration is polling mode. To set interrupt mode,
> +option ``dpdk-lsc-interrupt`` has to be set to ``true``.
> +
> +Command to set interrupt mode for a specific interface::
> +    $ ovs-vsctl set interface <iface_name>
> +options:dpdk-lsc-interrupt=true
> +
> +Command to set polling mode for a specific interface::
> +    $ ovs-vsctl set interface <iface_name>
> +options:dpdk-lsc-interrupt=false
> +
>  Limitations
>  ------------
> 
> diff --git a/lib/netdev-dpdk.c b/lib/netdev-dpdk.c index ee39cbe..c2ec463
> 100644
> --- a/lib/netdev-dpdk.c
> +++ b/lib/netdev-dpdk.c
> @@ -434,6 +434,12 @@ struct netdev_dpdk {
>          /* DPDK-ETH hardware offload features,
>           * from the enum set 'dpdk_hw_ol_features' */
>          uint32_t hw_ol_features;
> +
> +        /* Properties for link state change detection mode.
> +         * If lsc_interrupt_mode is set to false, poll mode is used,
> +         * otherwise interrupt mode is used. */
> +        bool requested_lsc_interrupt_mode;
> +        bool lsc_interrupt_mode;
>      );
> 
>      PADDED_MEMBERS(CACHE_LINE_SIZE,
> @@ -689,12 +695,14 @@ dpdk_watchdog(void *dummy OVS_UNUSED)  }
> 
>  static int
> -dpdk_eth_dev_queue_setup(struct netdev_dpdk *dev, int n_rxq, int n_txq)
> +dpdk_eth_dev_port_config(struct netdev_dpdk *dev, int n_rxq, int n_txq)
>  {
>      int diag = 0;
>      int i;
>      struct rte_eth_conf conf = port_conf;
> 
> +    conf.intr_conf.lsc = dev->lsc_interrupt_mode;
> +
>      /* For some NICs (e.g. Niantic), scatter_rx mode needs to be
> explicitly
>       * enabled. */
>      if (dev->mtu > ETHER_MTU) {
> @@ -804,10 +812,13 @@ dpdk_eth_dev_init(struct netdev_dpdk *dev)
>      n_rxq = MIN(info.max_rx_queues, dev->up.n_rxq);
>      n_txq = MIN(info.max_tx_queues, dev->up.n_txq);
> 
> -    diag = dpdk_eth_dev_queue_setup(dev, n_rxq, n_txq);
> +    diag = dpdk_eth_dev_port_config(dev, n_rxq, n_txq);
>      if (diag) {
> -        VLOG_ERR("Interface %s(rxq:%d txq:%d) configure error: %s",
> -                 dev->up.name, n_rxq, n_txq, rte_strerror(-diag));
> +        VLOG_ERR("Interface %s(rxq:%d txq:%d lsc interrupt mode:%s) "
> +                 "configure error: %s",
> +                 dev->up.name, n_rxq, n_txq,
> +                 dev->lsc_interrupt_mode ? "true" : "false",
> +                 rte_strerror(-diag));
>          return -diag;
>      }
> 
> @@ -900,6 +911,7 @@ common_construct(struct netdev *netdev, dpdk_port_t
> port_no,
>      dev->flags = 0;
>      dev->requested_mtu = ETHER_MTU;
>      dev->max_packet_len = MTU_TO_FRAME_LEN(dev->mtu);
> +    dev->requested_lsc_interrupt_mode = 0;
>      ovsrcu_index_init(&dev->vid, -1);
>      dev->vhost_reconfigured = false;
>      dev->attached = false;
> @@ -1324,6 +1336,8 @@ netdev_dpdk_get_config(const struct netdev *netdev,
> struct smap *args)
>          } else {
>              smap_add(args, "rx_csum_offload", "false");
>          }
> +        smap_add(args, "lsc_interrupt_mode",
> +                 dev->lsc_interrupt_mode ? "true" : "false");
>      }
>      ovs_mutex_unlock(&dev->mutex);
> 
> @@ -1447,7 +1461,7 @@ netdev_dpdk_set_config(struct netdev *netdev, const
> struct smap *args,
>                         char **errp)
>  {
>      struct netdev_dpdk *dev = netdev_dpdk_cast(netdev);
> -    bool rx_fc_en, tx_fc_en, autoneg;
> +    bool rx_fc_en, tx_fc_en, autoneg, lsc_interrupt_mode;
>      enum rte_eth_fc_mode fc_mode;
>      static const enum rte_eth_fc_mode fc_mode_set[2][2] = {
>          {RTE_FC_NONE,     RTE_FC_TX_PAUSE},
> @@ -1524,6 +1538,12 @@ netdev_dpdk_set_config(struct netdev *netdev, const
> struct smap *args,
>          goto out;
>      }
> 
> +    lsc_interrupt_mode = smap_get_bool(args, "dpdk-lsc-interrupt",
> false);
> +    if (dev->requested_lsc_interrupt_mode != lsc_interrupt_mode) {
> +        dev->requested_lsc_interrupt_mode = lsc_interrupt_mode;
> +        netdev_request_reconfigure(netdev);
> +    }
> +
>      rx_fc_en = smap_get_bool(args, "rx-flow-ctrl", false);
>      tx_fc_en = smap_get_bool(args, "tx-flow-ctrl", false);
>      autoneg = smap_get_bool(args, "flow-ctrl-autoneg", false); @@ -3554,6
> +3574,7 @@ netdev_dpdk_reconfigure(struct netdev *netdev)
>      if (netdev->n_txq == dev->requested_n_txq
>          && netdev->n_rxq == dev->requested_n_rxq
>          && dev->mtu == dev->requested_mtu
> +        && dev->lsc_interrupt_mode == dev->requested_lsc_interrupt_mode
>          && dev->rxq_size == dev->requested_rxq_size
>          && dev->txq_size == dev->requested_txq_size
>          && dev->socket_id == dev->requested_socket_id) { @@ -3569,6
> +3590,8 @@ netdev_dpdk_reconfigure(struct netdev *netdev)
>          goto out;
>      }
> 
> +    dev->lsc_interrupt_mode = dev->requested_lsc_interrupt_mode;
> +
>      netdev->n_txq = dev->requested_n_txq;
>      netdev->n_rxq = dev->requested_n_rxq;
> 
> diff --git a/vswitchd/vswitch.xml b/vswitchd/vswitch.xml index
> 9c2a826..aeb1a47 100644
> --- a/vswitchd/vswitch.xml
> +++ b/vswitchd/vswitch.xml
> @@ -3627,6 +3627,23 @@ ovs-vsctl add-port br0 p0 -- set Interface p0
> type=patch options:peer=p1 \
>        </column>
>      </group>
> 
> +    <group title="Link State Change detection mode">
> +      <column name="options" key="dpdk-lsc-interrupt"
> +              type='{"type": "boolean"}'>
> +        <p>
> +          Set this value to <code>true</code> to configure interrupt mode
> for
> +          Link State Change (LSC) detection instead of poll mode for the
> DPDK
> +          interface.
> +        </p>
> +        <p>
> +          If this value is not set, poll mode is configured.
> +        </p>
> +        <p>
> +          This parameter has an effect only on netdev dpdk interfaces.
> +        </p>
> +      </column>
> +    </group>
> +
>      <group title="Common Columns">
>        The overall purpose of these columns is described under
> <code>Common
>        Columns</code> at the beginning of this document.
> --
> 1.9.1
> 
> _______________________________________________
> dev mailing list
> d...@openvswitch.org
> https://mail.openvswitch.org/mailman/listinfo/ovs-dev
_______________________________________________
dev mailing list
d...@openvswitch.org
https://mail.openvswitch.org/mailman/listinfo/ovs-dev

Reply via email to