On 6/14/24 17:08, David Marchand wrote:
> Querying link status may get delayed for an undeterministic (long) time
> with mlx5 ports. This is a consequence of the mlx5 driver calling ethtool
> kernel API and getting stuck on the kernel RTNL lock while some other
> operation is in progress under this lock.
> 
> One impact for long link status query is that it is called under the bond
> lock taken in write mode periodically in bond_run().
> In parallel, datapath threads may block requesting to read bonding related
> info (like for example in bond_check_admissibility()).
> 
> The LSC interrupt mode is available with many DPDK drivers and is used by
> default with testpmd.
> 
> It seems safe enough to switch on this feature by default in OVS.
> We keep the per interface option to disable this feature in case of an
> unforeseen bug.
> 
> Signed-off-by: David Marchand <david.march...@redhat.com>
> Reviewed-by: Robin Jarry <rja...@redhat.com>
> Acked-by: Mike Pattrick <m...@redhat.com>
> ---
> Changes since v2:
> - fixed typo in NEWS,
> 
> Changes since v1:
> - (early) fail when interrupt lsc is requested by user but not supported
>   by the driver,
> - otherwise, log a debug message if user did not request interrupt mode,
> 
> ---
>  Documentation/topics/dpdk/phy.rst |  4 ++--
>  NEWS                              |  3 +++
>  lib/netdev-dpdk.c                 | 13 ++++++++++++-
>  vswitchd/vswitch.xml              |  8 ++++----
>  4 files changed, 21 insertions(+), 7 deletions(-)
> 
> diff --git a/Documentation/topics/dpdk/phy.rst 
> b/Documentation/topics/dpdk/phy.rst
> index efd168cba8..eefc25613d 100644
> --- a/Documentation/topics/dpdk/phy.rst
> +++ b/Documentation/topics/dpdk/phy.rst
> @@ -546,8 +546,8 @@ 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``.
> +The default configuration is interrupt mode. To set polling mode, option
> +``dpdk-lsc-interrupt`` has to be set to ``false``.
>  
>  Command to set interrupt mode for a specific interface::
>      $ ovs-vsctl set interface <iface_name> options:dpdk-lsc-interrupt=true
> diff --git a/NEWS b/NEWS
> index 5ae0108d55..d05f2d0f89 100644
> --- a/NEWS
> +++ b/NEWS
> @@ -9,6 +9,9 @@ Post-v3.3.0
>       https://github.com/openvswitch/ovs.git
>     - DPDK:
>       * OVS validated with DPDK 23.11.1.
> +     * Link status changes are now handled via interrupt mode if the DPDK
> +       driver supports it.  It is possible to revert to polling mode by 
> setting
> +       per interface 'options:dpdk-lsc-interrupt' to 'false'.
>  
>  
>  v3.3.0 - 16 Feb 2024
> diff --git a/lib/netdev-dpdk.c b/lib/netdev-dpdk.c
> index 0fa37d5145..a260bc8485 100644
> --- a/lib/netdev-dpdk.c
> +++ b/lib/netdev-dpdk.c
> @@ -2397,7 +2397,18 @@ netdev_dpdk_set_config(struct netdev *netdev, const 
> struct smap *args,
>          }
>      }
>  
> -    lsc_interrupt_mode = smap_get_bool(args, "dpdk-lsc-interrupt", false);
> +    lsc_interrupt_mode = smap_get_bool(args, "dpdk-lsc-interrupt", true);
> +    if (lsc_interrupt_mode && !(*info.dev_flags & RTE_ETH_DEV_INTR_LSC)) {
> +        if (smap_get(args, "dpdk-lsc-interrupt")) {
> +            VLOG_ERR("interface '%s': link status interrupt is not 
> supported.",
> +                     netdev_get_name(netdev));

Since we're exiting with an error set, the message should be buffered
into errp instead, so it can be visible in the database record and
returned as a result of the ovs-vsctl.

Also, we're using WARN level for all other configuration issues, so we
should do that here as well.  ERR is usually some sort of internal error.
And we're usually just using "%s: ..." and not "interface '%s': ...".

> +            err = EINVAL;
> +            goto out;
> +        }
> +        VLOG_DBG("interface '%s': not enabling link status interrupt.",
> +                 netdev_get_name(netdev));
> +        lsc_interrupt_mode = false;
> +    }
>      if (dev->requested_lsc_interrupt_mode != lsc_interrupt_mode) {
>          dev->requested_lsc_interrupt_mode = lsc_interrupt_mode;
>          netdev_request_reconfigure(netdev);
> diff --git a/vswitchd/vswitch.xml b/vswitchd/vswitch.xml
> index 8a1b607d71..e3afb78a4e 100644
> --- a/vswitchd/vswitch.xml
> +++ b/vswitchd/vswitch.xml
> @@ -4647,12 +4647,12 @@ ovs-vsctl add-port br0 p0 -- set Interface p0 
> type=patch options:peer=p1 \
>        <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.
> +          Set this value to <code>false</code> to configure poll mode for
> +          Link State Change (LSC) detection instead of interrupt mode for the
> +          DPDK interface.
>          </p>
>          <p>
> -          If this value is not set, poll mode is configured.
> +          If this value is not set, interrupt mode is configured.
>          </p>
>          <p>
>            This parameter has an effect only on netdev dpdk interfaces.

_______________________________________________
dev mailing list
d...@openvswitch.org
https://mail.openvswitch.org/mailman/listinfo/ovs-dev

Reply via email to