[libvirt] [PATCH 2/5] Split out virNetDevGetEthtoolFeatures

Peter Krempa pkrempa at redhat.com
Tue Jun 7 07:25:33 UTC 2016


On Mon, Jun 06, 2016 at 09:39:25 +0200, Ján Tomko wrote:
> Split out the features that we probe via various ethtool commands
> and ETHTOOL_GFLAGS.
> ---
>  src/util/virnetdev.c | 105 ++++++++++++++++++++++++++++-----------------------
>  1 file changed, 57 insertions(+), 48 deletions(-)
> 
> diff --git a/src/util/virnetdev.c b/src/util/virnetdev.c
> index 354e6f7..210fcda 100644
> --- a/src/util/virnetdev.c
> +++ b/src/util/virnetdev.c
> @@ -3266,6 +3266,62 @@ virNetDevFeatureAvailable(const char *ifname, struct ethtool_value *cmd)
>  }
>  
>  
> +static void
> +virNetDevGetEthtoolFeatures(virBitmapPtr bitmap,
> +                            const char *ifname)
> +{
> +    size_t i;
> +    struct ethtool_value cmd = { 0 };
> +
> +    /* legacy ethtool getters */
> +    struct ethtool_to_virnetdev_feature ethtool_cmds[] = {
> +        {ETHTOOL_GRXCSUM, VIR_NET_DEV_FEAT_GRXCSUM},
> +        {ETHTOOL_GTXCSUM, VIR_NET_DEV_FEAT_GTXCSUM},
> +        {ETHTOOL_GSG, VIR_NET_DEV_FEAT_GSG},
> +        {ETHTOOL_GTSO, VIR_NET_DEV_FEAT_GTSO},
> +# if HAVE_DECL_ETHTOOL_GGSO
> +        {ETHTOOL_GGSO, VIR_NET_DEV_FEAT_GGSO},
> +# endif
> +# if HAVE_DECL_ETHTOOL_GGRO
> +        {ETHTOOL_GGRO, VIR_NET_DEV_FEAT_GGRO},
> +# endif
> +    };
> +
> +# if HAVE_DECL_ETHTOOL_GFLAGS
> +    /* ethtool masks */
> +    struct ethtool_to_virnetdev_feature flags[] = {
> +#  if HAVE_DECL_ETH_FLAG_LRO
> +        {ETH_FLAG_LRO, VIR_NET_DEV_FEAT_LRO},
> +#  endif
> +#  if HAVE_DECL_ETH_FLAG_TXVLAN
> +        {ETH_FLAG_RXVLAN, VIR_NET_DEV_FEAT_RXVLAN},
> +        {ETH_FLAG_TXVLAN, VIR_NET_DEV_FEAT_TXVLAN},
> +#  endif
> +#  if HAVE_DECL_ETH_FLAG_NTUBLE
> +        {ETH_FLAG_NTUPLE, VIR_NET_DEV_FEAT_NTUPLE},
> +#  endif
> +#  if HAVE_DECL_ETH_FLAG_RXHASH
> +        {ETH_FLAG_RXHASH, VIR_NET_DEV_FEAT_RXHASH},
> +#  endif
> +    };
> +
> +    for (i = 0; i < ARRAY_CARDINALITY(ethtool_cmds); i++) {

This is guarded by HAVE_DECL_ETHTOOL_GFLAGS so it is not equivalent to
the code below.

> +        cmd.cmd = ethtool_cmds[i].cmd;
> +        if (virNetDevFeatureAvailable(ifname, &cmd) == 1)
> +            ignore_value(virBitmapSetBit(bitmap, ethtool_cmds[i].feat));
> +    }
> +
> +    cmd.cmd = ETHTOOL_GFLAGS;
> +    if (virNetDevFeatureAvailable(ifname, &cmd) == 1) {
> +        for (i = 0; i < ARRAY_CARDINALITY(flags); i++) {
> +            if (cmd.data & flags[i].cmd)
> +                ignore_value(virBitmapSetBit(bitmap, flags[i].feat));
> +        }
> +    }
> +# endif
> +}

ACK if you move the first loop out of HAVE_DECL_ETHTOOL_GFLAGS but you
need to keep the second one in place.




More information about the libvir-list mailing list