[libvirt] [PATCH v3] qemu: set default vhost-user ifname

Michal Privoznik mprivozn at redhat.com
Fri Jan 20 14:43:53 UTC 2017


On 01/18/2017 02:21 PM, John Ferlan wrote:
> 
> I think I half assumed this would have been pushed already, but seeing
> as it wasn't...
> 
> On 12/22/2016 04:45 AM, Michal Privoznik wrote:
>> Based on work of Mehdi Abaakouk <sileht at sileht.net>.
>>
>> When parsing vhost-user interface XML and no ifname is found we
>> can try to fill it in in post parse callback. The way this works
>> is we try to make up interface name from given socket path and
>> then ask openvswitch wether it knows the interface.
> 
> s/wether/whether
> 
>>
>> Signed-off-by: Michal Privoznik <mprivozn at redhat.com>
>> ---
>>
>> diff to v2:
>> - All the review points from v2 worked in
>>
>>  src/libvirt_private.syms                           |  1 +
>>  src/qemu/qemu_domain.c                             | 21 +++++---
>>  src/util/virnetdevopenvswitch.c                    | 58 ++++++++++++++++++++++
>>  src/util/virnetdevopenvswitch.h                    |  4 ++
>>  tests/Makefile.am                                  |  7 +++
>>  tests/qemuxml2argvmock.c                           |  8 +++
>>  tests/qemuxml2xmlmock.c                            | 33 ++++++++++++
>>  .../qemuxml2xmlout-net-vhostuser.xml               |  2 +
>>  tests/qemuxml2xmltest.c                            |  2 +-
>>  9 files changed, 129 insertions(+), 7 deletions(-)
>>  create mode 100644 tests/qemuxml2xmlmock.c
>>
> 
> 
>> diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
>> index 2d23e462d..9e4e8f83f 100644
>> --- a/src/libvirt_private.syms
>> +++ b/src/libvirt_private.syms
>> @@ -2057,6 +2057,7 @@ virNetDevMidonetUnbindPort;
>>  # util/virnetdevopenvswitch.h
>>  virNetDevOpenvswitchAddPort;
>>  virNetDevOpenvswitchGetMigrateData;
>> +virNetDevOpenvswitchGetVhostuserIfname;
>>  virNetDevOpenvswitchInterfaceStats;
>>  virNetDevOpenvswitchRemovePort;
>>  virNetDevOpenvswitchSetMigrateData;
>> diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c
>> index acfa69589..eed5745b6 100644
>> --- a/src/qemu/qemu_domain.c
>> +++ b/src/qemu/qemu_domain.c
>> @@ -41,6 +41,7 @@
>>  #include "domain_addr.h"
>>  #include "domain_event.h"
>>  #include "virtime.h"
>> +#include "virnetdevopenvswitch.h"
>>  #include "virstoragefile.h"
>>  #include "virstring.h"
>>  #include "virthreadjob.h"
>> @@ -3028,12 +3029,20 @@ qemuDomainDeviceDefPostParse(virDomainDeviceDefPtr dev,
>>                                            def->emulator);
>>      }
>>  
>> -    if (dev->type == VIR_DOMAIN_DEVICE_NET &&
>> -        dev->data.net->type != VIR_DOMAIN_NET_TYPE_HOSTDEV &&
>> -        !dev->data.net->model) {
>> -        if (VIR_STRDUP(dev->data.net->model,
>> -                       qemuDomainDefaultNetModel(def, qemuCaps)) < 0)
>> -            goto cleanup;
>> +    if (dev->type == VIR_DOMAIN_DEVICE_NET) {
>> +        if (dev->data.net->type != VIR_DOMAIN_NET_TYPE_HOSTDEV &&
>> +            !dev->data.net->model) {
>> +            if (VIR_STRDUP(dev->data.net->model,
>> +                           qemuDomainDefaultNetModel(def, qemuCaps)) < 0)
>> +                goto cleanup;
>> +        }
>> +        if (dev->data.net->type == VIR_DOMAIN_NET_TYPE_VHOSTUSER &&
>> +            !dev->data.net->ifname) {
>> +            if (virNetDevOpenvswitchGetVhostuserIfname(
>> +                   dev->data.net->data.vhostuser->data.nix.path,
>> +                   &dev->data.net->ifname) < 0)
>> +                goto cleanup;
>> +        }
>>      }
>>  
>>      /* set default disk types and drivers */
>> diff --git a/src/util/virnetdevopenvswitch.c b/src/util/virnetdevopenvswitch.c
>> index f003b3b13..d93653317 100644
>> --- a/src/util/virnetdevopenvswitch.c
>> +++ b/src/util/virnetdevopenvswitch.c
>> @@ -377,3 +377,61 @@ virNetDevOpenvswitchInterfaceStats(const char *ifname,
>>      virCommandFree(cmd);
>>      return ret;
>>  }
>> +
>> +/**
>> + * virNetDevOpenvswitchVhostuserGetIfname:
>> + * @path: the path of the unix socket
>> + * @ifname: the retrieved name of the interface
>> + *
>> + * Retreives the ovs ifname from vhostuser unix socket path.
>> + *
>> + * Returns: 1 if interface is an openvswitch interface,
>> + *          0 if it is not, but no other error occurred,
>> + *         -1 otherwise.
>> + */
>> +int
>> +virNetDevOpenvswitchGetVhostuserIfname(const char *path,
>> +                                       char **ifname)
>> +{
>> +    virCommandPtr cmd = NULL;
>> +    char *tmpIfname = NULL;
>> +    char **tokens = NULL;
>> +    size_t ntokens = 0;
>> +    int status;
>> +    int ret = -1;
>> +
>> +    /* Openvswitch vhostuser path are hardcoded to
>> +     * /<runstatedir>/openvswitch/<ifname>
>> +     * for example: /var/run/openvswitch/dpdkvhostuser0
>> +     *
>> +     * so we pick the filename and check it's a openvswitch interface
>> +     */
>> +    if ((tokens = virStringSplitCount(path, "/", 0, &ntokens))) {
> 
> Seems like a lot of extra work just to pull off the last element of the
> path. Why not something using strrchr?
> 
> ACK in principal - I think you can decide whether strrchr would be more
> useful since it seems you can guarantee that @path has at least a '/' in
> it...   Probably wouldn't need to strdup below either...

Ah, yeah. Fixed and pushed. Thanks.

Michal




More information about the libvir-list mailing list