[libvirt] [PATCH v4] bhyve: add e1000 nic support

Roman Bogorodskiy bogorodskiy at gmail.com
Sat Feb 11 03:35:13 UTC 2017


  Laine Stump wrote:

> On 02/01/2017 11:28 AM, Roman Bogorodskiy wrote:
> > Recently e1000 NIC support was added to bhyve; implement that in
> > the bhyve driver:
> >
> >   - Add capability check by analyzing output of the 'bhyve -s 0,e1000'
> >     command
> >   - Modify bhyveBuildNetArgStr() to support e1000 and also pass
> >     virConnectPtr so it could call bhyveDriverGetCaps() to check if this
> >     NIC is supported
> >   - Modify command parsing code to add support for e1000 and adjust tests
> >   - Add net-e1000 test
> > ---
> >   src/bhyve/bhyve_capabilities.c                     | 26 ++++++++++++++++++
> >   src/bhyve/bhyve_capabilities.h                     |  1 +
> >   src/bhyve/bhyve_command.c                          | 31 +++++++++++++++++++---
> >   src/bhyve/bhyve_parse_command.c                    | 10 ++++++-
> >   tests/bhyveargv2xmldata/bhyveargv2xml-e1000.args   |  8 ++++++
> >   tests/bhyveargv2xmldata/bhyveargv2xml-e1000.xml    | 30 +++++++++++++++++++++
> >   .../bhyveargv2xmldata/bhyveargv2xml-virtio-net.xml |  2 ++
> >   .../bhyveargv2xml-virtio-net4.xml                  |  1 +
> >   tests/bhyveargv2xmltest.c                          |  1 +
> >   .../bhyvexml2argvdata/bhyvexml2argv-net-e1000.args |  9 +++++++
> >   .../bhyvexml2argv-net-e1000.ldargs                 |  3 +++
> >   .../bhyvexml2argvdata/bhyvexml2argv-net-e1000.xml  | 22 +++++++++++++++
> >   tests/bhyvexml2argvtest.c                          |  7 ++++-
> >   13 files changed, 145 insertions(+), 6 deletions(-)
> >   create mode 100644 tests/bhyveargv2xmldata/bhyveargv2xml-e1000.args
> >   create mode 100644 tests/bhyveargv2xmldata/bhyveargv2xml-e1000.xml
> >   create mode 100644 tests/bhyvexml2argvdata/bhyvexml2argv-net-e1000.args
> >   create mode 100644 tests/bhyvexml2argvdata/bhyvexml2argv-net-e1000.ldargs
> >   create mode 100644 tests/bhyvexml2argvdata/bhyvexml2argv-net-e1000.xml
> >
> > diff --git a/src/bhyve/bhyve_capabilities.c b/src/bhyve/bhyve_capabilities.c
> > index 83e3ae1b4..a647cd19b 100644
> > --- a/src/bhyve/bhyve_capabilities.c
> > +++ b/src/bhyve/bhyve_capabilities.c
> > @@ -216,6 +216,29 @@ bhyveProbeCapsAHCI32Slot(unsigned int *caps, char *binary)
> >       return ret;
> >   }
> >   
> > +static int
> > +bhyveProbeCapsNetE1000(unsigned int *caps, char *binary)
> > +{
> > +    char *error;
> > +    virCommandPtr cmd = NULL;
> > +    int ret = 0, exit;
> > +
> > +    cmd = virCommandNew(binary);
> > +    virCommandAddArgList(cmd, "-s", "0,e1000", NULL);
> > +    virCommandSetErrorBuffer(cmd, &error);
> > +    if (virCommandRun(cmd, &exit) < 0) {
> > +        ret = -1;
> > +        goto out;
> > +    }
> > +
> > +    if (strstr(error, "pci slot 0:0: unknown device \"e1000\"") == NULL)
> > +        *caps |= BHYVE_CAP_NET_E1000;
> > +
> > + out:
> 
> Even if you don't switch to using a ret initialized to -1 (see the 
> layout in bhyveBuildNetArgStr()), please name the label "cleanup" 
> instead of "out".

Flipped ret value and renamed out to cleanup. Generally, I just need to
add a helper function for these probes as they're very similar and I'm
planning to add some more cap checks.

> 
> > +    VIR_FREE(error);
> > +    virCommandFree(cmd);
> > +    return ret;
> > +}
> >   
> >   int
> >   virBhyveProbeCaps(unsigned int *caps)
> > @@ -235,6 +258,9 @@ virBhyveProbeCaps(unsigned int *caps)
> >       if ((ret = bhyveProbeCapsAHCI32Slot(caps, binary)))
> >           goto out;
> >   
> > +    if ((ret = bhyveProbeCapsNetE1000(caps, binary)))
> > +        goto out;
> > +
> >    out:
> >       VIR_FREE(binary);
> >       return ret;
> > diff --git a/src/bhyve/bhyve_capabilities.h b/src/bhyve/bhyve_capabilities.h
> > index 55581bd68..690feadb8 100644
> > --- a/src/bhyve/bhyve_capabilities.h
> > +++ b/src/bhyve/bhyve_capabilities.h
> > @@ -39,6 +39,7 @@ typedef enum {
> >   typedef enum {
> >       BHYVE_CAP_RTC_UTC = 1 << 0,
> >       BHYVE_CAP_AHCI32SLOT = 1 << 1,
> > +    BHYVE_CAP_NET_E1000 = 1 << 2,
> >   } virBhyveCapsFlags;
> >   
> >   int virBhyveProbeGrubCaps(virBhyveGrubCapsFlags *caps);
> > diff --git a/src/bhyve/bhyve_command.c b/src/bhyve/bhyve_command.c
> > index a50bd1066..5c86c9f1b 100644
> > --- a/src/bhyve/bhyve_command.c
> > +++ b/src/bhyve/bhyve_command.c
> > @@ -44,7 +44,8 @@
> >   VIR_LOG_INIT("bhyve.bhyve_command");
> >   
> >   static int
> > -bhyveBuildNetArgStr(const virDomainDef *def,
> > +bhyveBuildNetArgStr(virConnectPtr conn,
> 
> I think it's strange that you need to pass a virConnectPtr around to 
> your command-line builder functions for caps. In the qemu driver, use of 
> virConnectPtr has been eliminated wherever possible (it's completely 
> absent from qemu_command.c). We just get the qemuCaps directly from the 
> driver object.

Noted, added to my TODO list.

> ACK (although I'd greatly prefer "out:" changed to "cleanup:")

Pushed, thanks!

Roman Bogorodskiy
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 455 bytes
Desc: not available
URL: <http://listman.redhat.com/archives/libvir-list/attachments/20170211/7d6625d7/attachment-0001.sig>


More information about the libvir-list mailing list