On Wed, Feb 12, 2025 at 09:46:10AM +0300, Alexander Shursha wrote:
> Sponsored by: Future Crew, LLC
> Signed-off-by: Alexander Shursha <kek...@ya.ru>
> ---
>  src/bhyve/bhyve_parse_command.c | 59 +++++++++++++++++++++++++++++++++
>  1 file changed, 59 insertions(+)

Should come with additions to  bhyveargv2xmltest.c data files

> 
> diff --git a/src/bhyve/bhyve_parse_command.c b/src/bhyve/bhyve_parse_command.c
> index 29d3a678bf..14916c401d 100644
> --- a/src/bhyve/bhyve_parse_command.c
> +++ b/src/bhyve/bhyve_parse_command.c
> @@ -639,6 +639,63 @@ bhyveParsePCIFbuf(virDomainDef *def,
>      return -1;
>  }
>  
> +static int
> +bhyveParsePassthru(virDomainDef *def G_GNUC_UNUSED,
> +                  unsigned pcibus,
> +                  unsigned pcislot,
> +                  unsigned pcifunction,
> +                  char *addr)
> +{
> +    /* -s slot,bus/slot/function */
> +    /* -s slot,pcibus:slot:function */
> +    virDomainHostdevDef *hostdev = NULL;
> +    g_auto(GStrv) params = NULL;
> +    GStrv param;
> +    char *p = NULL;
> +
> +    if (!(hostdev = virDomainHostdevDefNew()))
> +        return 0;

This method can't fail so don't check for NULL.

> +
> +    hostdev->mode = VIR_DOMAIN_HOSTDEV_MODE_SUBSYS;
> +    hostdev->source.subsys.type = VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PCI;
> +
> +    hostdev->info->type = VIR_DOMAIN_DEVICE_ADDRESS_TYPE_PCI;
> +    hostdev->info->addr.pci.bus = pcibus;
> +    hostdev->info->addr.pci.slot = pcislot;
> +    hostdev->info->addr.pci.function = pcifunction;
> +
> +    if (!addr)
> +        goto error;
> +
> +    if (!(params = g_strsplit(addr, ":", -1))) {
> +        virReportError(VIR_ERR_OPERATION_FAILED, _("Failed to parse PCI 
> address %1$s"), addr);
> +        goto error;
> +    }
> +    if (g_str_equal(addr, *params))
> +        if (!(params = g_strsplit(addr, "/", -1))) {

This overwrites the pointer currently stored in 'params'
without free'ing it. The 'g_auto' will only free data
when it goes out of scope, not when the pointer is
overwritten directly.

> +            virReportError(VIR_ERR_OPERATION_FAILED, _("Failed to parse PCI 
> address %1$s"), addr);
> +            goto error;
> +        }

Add {} on the outer if too for clarity.

> +    if (g_strv_length(params) != 3) {
> +        virReportError(VIR_ERR_OPERATION_FAILED, _("Failed to parse PCI 
> address %1$s"), addr);
> +        goto error;
> +    }


> +    param = params;
> +    hostdev->source.subsys.u.pci.addr.bus = g_ascii_strtoull(*param++, &p, 
> 10);
> +    hostdev->source.subsys.u.pci.addr.slot = g_ascii_strtoull(*param++, &p, 
> 10);
> +    hostdev->source.subsys.u.pci.addr.function = g_ascii_strtoull(*param, 
> &p, 10);
> +
> +    hostdev->source.subsys.u.pci.addr.domain = 0;
> +    hostdev->managed = false;
> +
> +    VIR_APPEND_ELEMENT(def->hostdevs, def->nhostdevs, hostdev);
> +    return 0;
> +
> +    error:
> +        virDomainHostdevDefFree(hostdev);
> +        return -1;
> +}
> +
>  static int
>  bhyveParseBhyvePCIArg(virDomainDef *def,
>                        virDomainXMLOption *xmlopt,
> @@ -703,6 +760,8 @@ bhyveParseBhyvePCIArg(virDomainDef *def,
>                           VIR_DOMAIN_NET_MODEL_E1000, conf);
>      else if (STREQ(emulation, "fbuf"))
>          bhyveParsePCIFbuf(def, xmlopt, caps, bus, slot, function, conf);
> +    else if (STREQ(emulation, "passthru"))
> +        bhyveParsePassthru(def, bus, slot, function, conf);
>  
>      VIR_FREE(emulation);
>      VIR_FREE(slotdef);
> -- 
> 2.47.1
> 

With regards,
Daniel
-- 
|: https://berrange.com      -o-    https://www.flickr.com/photos/dberrange :|
|: https://libvirt.org         -o-            https://fstop138.berrange.com :|
|: https://entangle-photo.org    -o-    https://www.instagram.com/dberrange :|

Reply via email to