On 22 Aug 2023, at 11:28, David Marchand wrote:

> Following support of L3 and L4 checksum offloading, some bugs have been
> raised in different DPDK drivers.

So to clarify this a bit more we see issues with OVS 3.2 and the i40e vf driver 
and net/tap driver.

Mike can you take a look at this patch? Also, Ilya what do you feel would be 
the right approach to move this forward for OVS3.2?

Cheers,

Eelco

> When faced with such bugs, a OVS user can't do anything but wait for a
> DPDK fix (which can take some time to make it to the LTS releases).
>
> Make it possible for the user to disable some Tx offloads.
>
> Link: 
> https://patchwork.dpdk.org/project/dpdk/patch/[email protected]/
> Link: 
> https://patchwork.dpdk.org/project/dpdk/patch/[email protected]/
> Signed-off-by: David Marchand <[email protected]>
> ---
>  lib/netdev-provider.h |  5 ++-
>  lib/netdev.c          | 72 +++++++++++++++++++++++++++++++++++++------
>  tests/dpif-netdev.at  | 10 ++++++
>  3 files changed, 76 insertions(+), 11 deletions(-)
>
> diff --git a/lib/netdev-provider.h b/lib/netdev-provider.h
> index a7393c7cec..32a760d826 100644
> --- a/lib/netdev-provider.h
> +++ b/lib/netdev-provider.h
> @@ -59,9 +59,12 @@ struct netdev {
>       * opening this device, and therefore got assigned to the "system" class 
> */
>      bool auto_classified;
>
> -    /* This bitmask of the offloading features enabled by the netdev. */
> +    /* Bitmask of the offloading features supported by the netdev. */
>      uint64_t ol_flags;
>
> +    /* Bitmask of the offloading features disabled by the user. */
> +    uint64_t disabled_ol_flags;
> +
>      /* If this is 'true', the user explicitly specified an MTU for this
>       * netdev.  Otherwise, Open vSwitch is allowed to override it. */
>      bool mtu_user_config;
> diff --git a/lib/netdev.c b/lib/netdev.c
> index e5ac7713d2..e86dc82301 100644
> --- a/lib/netdev.c
> +++ b/lib/netdev.c
> @@ -490,6 +490,59 @@ netdev_ref(const struct netdev *netdev_)
>      return netdev;
>  }
>
> +#define NETDEV_OL_FLAGS \
> +    NETDEV_OL_FLAG("ip_csum", NETDEV_TX_OFFLOAD_IPV4_CKSUM); \
> +    NETDEV_OL_FLAG("tcp_csum", NETDEV_TX_OFFLOAD_TCP_CKSUM); \
> +    NETDEV_OL_FLAG("udp_csum", NETDEV_TX_OFFLOAD_UDP_CKSUM); \
> +    NETDEV_OL_FLAG("sctp_csum", NETDEV_TX_OFFLOAD_SCTP_CKSUM); \
> +    NETDEV_OL_FLAG("tcp_seg", NETDEV_TX_OFFLOAD_TCP_TSO);
> +
> +static int
> +netdev_parse_disabled_ol_flags(struct netdev *netdev, const struct smap 
> *args)
> +{
> +    const char *ol_flags = NULL;
> +    int err = 0;
> +
> +    netdev->disabled_ol_flags = 0;
> +
> +    if (args) {
> +        ol_flags = smap_get(args, "disabled_ol_flags");
> +    }
> +    if (ol_flags && ol_flags[0] != '\0') {
> +        char *list = xstrdup(ol_flags);
> +        char *ptr = list;
> +
> +        while (ptr) {
> +            char *end = strchr(ptr, ',');
> +            bool known_ol_flag = false;
> +
> +            if (end) {
> +                end[0] = '\0';
> +            }
> +#define NETDEV_OL_FLAG(name, bit) \
> +            if (!strcmp(ptr, name)) { \
> +                netdev->disabled_ol_flags |= bit; \
> +                VLOG_DBG("Disabling %s on %s", name, \
> +                         netdev_get_name(netdev)); \
> +                known_ol_flag = true; \
> +            }
> +            NETDEV_OL_FLAGS
> +#undef NETDEV_OL_FLAG
> +            if (!known_ol_flag) {
> +                VLOG_WARN("unknown offload type '%s'", ptr);
> +            }
> +            if (end) {
> +                ptr = end + 1;
> +            } else {
> +                ptr = NULL;
> +            }
> +        }
> +        free(list);
> +    }
> +
> +    return err;
> +}
> +
>  /* Reconfigures the device 'netdev' with 'args'.  'args' may be empty
>   * or NULL if none are needed. */
>  int
> @@ -501,6 +554,7 @@ netdev_set_config(struct netdev *netdev, const struct 
> smap *args, char **errp)
>          char *verbose_error = NULL;
>          int error;
>
> +        netdev_parse_disabled_ol_flags(netdev, args);
>          error = netdev->netdev_class->set_config(netdev,
>                                                   args ? args : &no_args,
>                                                   &verbose_error);
> @@ -834,9 +888,10 @@ netdev_send_prepare_batch(const struct netdev *netdev,
>      size_t i, size = dp_packet_batch_size(batch);
>
>      DP_PACKET_BATCH_REFILL_FOR_EACH (i, size, packet, batch) {
> +        uint64_t ol_flags = netdev->ol_flags & ~netdev->disabled_ol_flags;
>          char *errormsg = NULL;
>
> -        if (netdev_send_prepare_packet(netdev->ol_flags, packet, &errormsg)) 
> {
> +        if (netdev_send_prepare_packet(ol_flags, packet, &errormsg)) {
>              dp_packet_batch_refill(batch, packet, i);
>          } else {
>              dp_packet_delete(packet);
> @@ -1400,16 +1455,13 @@ netdev_get_status(const struct netdev *netdev, struct 
> smap *smap)
>      if (netdev_get_dpif_type(netdev) &&
>          strcmp(netdev_get_dpif_type(netdev), "system")) {
>
> -#define OL_ADD_STAT(name, bit) \
> +#define NETDEV_OL_FLAG(name, bit) \
>          smap_add(smap, "tx_" name "_offload", \
> -                 netdev->ol_flags & bit ? "true" : "false");
> -
> -        OL_ADD_STAT("ip_csum", NETDEV_TX_OFFLOAD_IPV4_CKSUM);
> -        OL_ADD_STAT("tcp_csum", NETDEV_TX_OFFLOAD_TCP_CKSUM);
> -        OL_ADD_STAT("udp_csum", NETDEV_TX_OFFLOAD_UDP_CKSUM);
> -        OL_ADD_STAT("sctp_csum", NETDEV_TX_OFFLOAD_SCTP_CKSUM);
> -        OL_ADD_STAT("tcp_seg", NETDEV_TX_OFFLOAD_TCP_TSO);
> -#undef OL_ADD_STAT
> +                 netdev->ol_flags & bit \
> +                 ?  (netdev->disabled_ol_flags & bit ? "disabled" : "true") \
> +                 : "false");
> +        NETDEV_OL_FLAGS
> +#undef NETDEV_OL_FLAG
>
>          err = 0;
>      }
> diff --git a/tests/dpif-netdev.at b/tests/dpif-netdev.at
> index 85119fb819..922badd90c 100644
> --- a/tests/dpif-netdev.at
> +++ b/tests/dpif-netdev.at
> @@ -665,6 +665,16 @@ AT_CHECK([ovs-vsctl get interface br0 status | sed -n 
> 's/^{\(.*\).*}$/\1/p'], [0
>  tx_ip_csum_offload="false", tx_sctp_csum_offload="false", 
> tx_tcp_csum_offload="false", tx_tcp_seg_offload="false", 
> tx_udp_csum_offload="false"
>  ], [])
>
> +AT_CHECK([ovs-vsctl set Interface p1 options:ol_ip_csum=true])
> +AT_CHECK([ovs-vsctl get interface p1 status | sed -n 's/^{\(.*\).*}$/\1/p'], 
> [0], [dnl
> +tx_ip_csum_offload="true", tx_sctp_csum_offload="false", 
> tx_tcp_csum_offload="false", tx_tcp_seg_offload="false", 
> tx_udp_csum_offload="false"
> +], [])
> +
> +AT_CHECK([ovs-vsctl set Interface p1 options:disabled_ol_flags="ip_csum"])
> +AT_CHECK([ovs-vsctl get interface p1 status | sed -n 's/^{\(.*\).*}$/\1/p'], 
> [0], [dnl
> +tx_ip_csum_offload=disabled, tx_sctp_csum_offload="false", 
> tx_tcp_csum_offload="false", tx_tcp_seg_offload="false", 
> tx_udp_csum_offload="false"
> +], [])
> +
>  OVS_VSWITCHD_STOP
>  AT_CLEANUP
>
> -- 
> 2.41.0

_______________________________________________
dev mailing list
[email protected]
https://mail.openvswitch.org/mailman/listinfo/ovs-dev

Reply via email to