Re: [PATCH v2 2/2] qemu: conf: Network stats support for hostdev VF Representor

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 




On 02/12/2018 03:07 AM, Jai Singh Rana wrote:
> In case of <interface type='hostdev'>, return stats if its a Switchdev
> VF Representor interface of pci SR-IOV device.
> ---
> v2 fixes bracket spacing in domain_conf.c
> 
>  src/conf/domain_conf.c |  7 +++++++
>  src/qemu/qemu_driver.c | 34 ++++++++++++++++++++++++++++++----
>  2 files changed, 37 insertions(+), 4 deletions(-)
> 
> diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
> index fb732a0c2..b553c5a2f 100644
> --- a/src/conf/domain_conf.c
> +++ b/src/conf/domain_conf.c
> @@ -58,6 +58,7 @@
>  #include "virnetdev.h"
>  #include "virnetdevmacvlan.h"
>  #include "virhostdev.h"
> +#include "virnetdevhostdev.h"
>  #include "virmdev.h"
>  
>  #define VIR_FROM_THIS VIR_FROM_DOMAIN
> @@ -28112,6 +28113,12 @@ virDomainNetFind(virDomainDefPtr def, const char *device)
>              return net;
>      }
>  
> +    /* Give a try to hostdev */
> +    for (i = 0; i < def->nnets; i++) {

If there's 10 nnets and 1 nhostdev, things are not going to end well.

> +        if (!virNetdevHostdevCheckVFRepIFName(def->hostdevs[i], device))
> +            return def->nets[i];

Wait, what?

> +    }
> +

Even w/ the correct usage - there's more than just one caller that could
get an answer it wasn't expecting... Limit your usage to where you need
this type of check...

>      virReportError(VIR_ERR_INVALID_ARG,
>                     _("'%s' is not a known interface"), device);
>      return NULL;
> diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
> index bbce5bd81..24484ab92 100644
> --- a/src/qemu/qemu_driver.c
> +++ b/src/qemu/qemu_driver.c
> @@ -67,6 +67,7 @@
>  #include "virhostcpu.h"
>  #include "virhostmem.h"
>  #include "virnetdevtap.h"
> +#include "virnetdevhostdev.h"
>  #include "virnetdevopenvswitch.h"
>  #include "capabilities.h"
>  #include "viralloc.h"
> @@ -11153,6 +11154,11 @@ qemuDomainInterfaceStats(virDomainPtr dom,
>      if (virDomainNetGetActualType(net) == VIR_DOMAIN_NET_TYPE_VHOSTUSER) {
>          if (virNetDevOpenvswitchInterfaceStats(net->ifname, stats) < 0)
>              goto cleanup;
> +    } else if (virDomainNetGetActualType(net) == VIR_DOMAIN_NET_TYPE_HOSTDEV) {
> +        if (virNetdevHostdevVFRepInterfaceStats(device, stats,
> +                                                !virDomainNetTypeSharesHostView
> +                                                (net)) < 0)
> +            goto cleanup;

So you've hidden virNetdevHostdevVFRepInterfaceStats as a call to
virNetDevTapInterfaceStats via the #define in virnetdevhostdev.h

You need to figure out a different, better, more standard, non-hack
mechanism for this.  Rather than the virDomainNetFind adjustment above,
this is where you should be more explicit.

>      } else {
>          if (virNetDevTapInterfaceStats(net->ifname, stats,
>                                         !virDomainNetTypeSharesHostView(net)) < 0)
> @@ -19794,6 +19800,7 @@ qemuDomainGetStatsInterface(virQEMUDriverPtr driver ATTRIBUTE_UNUSED,
>  {
>      size_t i;
>      struct _virDomainInterfaceStats tmp;
> +    char *vf_representor_ifname = NULL;

Can we go with just vf_ifname?

>      int ret = -1;
>  
>      if (!virDomainObjIsActive(dom))
> @@ -19806,21 +19813,40 @@ qemuDomainGetStatsInterface(virQEMUDriverPtr driver ATTRIBUTE_UNUSED,
>          virDomainNetDefPtr net = dom->def->nets[i];
>          virDomainNetType actualType;
>  
> -        if (!net->ifname)
> +        actualType = virDomainNetGetActualType(net);
> +> +        if (actualType == VIR_DOMAIN_NET_TYPE_HOSTDEV) {
> +            if (virNetdevHostdevGetVFRepIFName(dom->def->hostdevs[i],
> +                                               &vf_representor_ifname))

Either this checks "< 0)" or if changed such that the called function
returns some string...

> +                continue;
> +        }
> +        else if (!net->ifname)
>              continue;
>  
>          memset(&tmp, 0, sizeof(tmp));
>  
> -        actualType = virDomainNetGetActualType(net);
>  
> -        QEMU_ADD_NAME_PARAM(record, maxparams,
> -                            "net", "name", i, net->ifname);
> +        if (actualType != VIR_DOMAIN_NET_TYPE_HOSTDEV)
> +            QEMU_ADD_NAME_PARAM(record, maxparams,
> +                                "net", "name", i, net->ifname);
> +        else
> +            QEMU_ADD_NAME_PARAM(record, maxparams,
> +                                "net", "name", i, vf_representor_ifname);

Note that QEMU_ADD_NAME_PARAM can goto cleanup, thus leaking your
vf*_ifname.  Just add the VIR_FREE at the cleanup label

>  
>          if (actualType == VIR_DOMAIN_NET_TYPE_VHOSTUSER) {
>              if (virNetDevOpenvswitchInterfaceStats(net->ifname, &tmp) < 0) {
>                  virResetLastError();
>                  continue;
>              }
> +        } else if (actualType == VIR_DOMAIN_NET_TYPE_HOSTDEV) {
> +            if (virNetdevHostdevVFRepInterfaceStats
> +                (vf_representor_ifname, &tmp,
> +                 !virDomainNetTypeSharesHostView(net)) < 0) {
> +                VIR_FREE(vf_representor_ifname);
> +                virResetLastError();
> +                continue;
> +            }
> +            VIR_FREE(vf_representor_ifname);


    int rc;

    rc = virNetdevHostdevVFRepInterfaceStats(vf_iname, &tmp,
                        !virDomainNetTypeSharesHostView(net))
    VIR_FREE(vf_iname);
    if (rc < 0) {
        virResetLastError();
        continue;
    }

is a bit cleaner to me


John
>          } else {
>              if (virNetDevTapInterfaceStats(net->ifname, &tmp,
>                                             !virDomainNetTypeSharesHostView(net)) < 0) {
> 

--
libvir-list mailing list
libvir-list@xxxxxxxxxx
https://www.redhat.com/mailman/listinfo/libvir-list



[Index of Archives]     [Virt Tools]     [Libvirt Users]     [Lib OS Info]     [Fedora Users]     [Fedora Desktop]     [Fedora SELinux]     [Big List of Linux Books]     [Yosemite News]     [KDE Users]     [Fedora Tools]

  Powered by Linux