[PATCHv3 4/5] netdevveth: Simplify virNetDevVethCreate by using virNetDevGenerateName

Shi Lei shi_lei at massclouds.com
Tue Dec 15 03:34:06 UTC 2020


On 2020-12-15 at 11:09, Laine Stump wrote:
>On 12/13/20 8:50 PM, Shi Lei wrote:
>> Simplify virNetDevVethCreate by using common GenerateName/ReserveName
>> functions.
>>
>> Signed-off-by: Shi Lei <shi_lei at massclouds.com>
>> ---
>>   src/lxc/lxc_process.c    |   3 +
>>   src/util/virnetdevveth.c | 140 +++++++++------------------------------
>>   2 files changed, 36 insertions(+), 107 deletions(-)
>>
>> diff --git a/src/lxc/lxc_process.c b/src/lxc/lxc_process.c
>> index eb29431e..2e8ae706 100644
>> --- a/src/lxc/lxc_process.c
>> +++ b/src/lxc/lxc_process.c
>> @@ -307,6 +307,9 @@ virLXCProcessSetupInterfaceTap(virDomainDefPtr vm,
>>  
>>       VIR_DEBUG("calling vethCreate()");
>>       parentVeth = net->ifname;
>> +    if (parentVeth)
>> +        virNetDevReserveName(parentVeth);
>> +
>
>I think this is unnecessary (since a user-provided name shouldn't be
>using the auto-generate pattern, and would have been deleted by the
>parser anyway (see src/conf/domain_conf.c:12038, and comments in my
>reply to patch 5/5). So the only possible string here would be a string
>that would pass through virNetDevReserveName() with no action taken anyway. 

Okay.

>
>
>>       if (virNetDevVethCreate(&parentVeth, &containerVeth) < 0)
>>           return NULL;
>>       VIR_DEBUG("parentVeth: %s, containerVeth: %s", parentVeth, containerVeth);
>> diff --git a/src/util/virnetdevveth.c b/src/util/virnetdevveth.c
>> index b3eee1af..d6932a2e 100644
>> --- a/src/util/virnetdevveth.c
>> +++ b/src/util/virnetdevveth.c
>> @@ -32,48 +32,6 @@
>>  
>>   VIR_LOG_INIT("util.netdevveth");
>>  
>> -/* Functions */
>> -
>> -virMutex virNetDevVethCreateMutex = VIR_MUTEX_INITIALIZER;
>> -
>> -static int virNetDevVethExists(int devNum)
>> -{
>> -    int ret;
>> -    g_autofree char *path = NULL;
>> -
>> -    path = g_strdup_printf(SYSFS_NET_DIR "vnet%d/", devNum);
>> -    ret = virFileExists(path) ? 1 : 0;
>> -    VIR_DEBUG("Checked dev vnet%d usage: %d", devNum, ret);
>> -    return ret;
>> -}
>> -
>> -/**
>> - * virNetDevVethGetFreeNum:
>> - * @startDev: device number to start at (x in vethx)
>> - *
>> - * Looks in /sys/class/net/ to find the first available veth device
>> - * name.
>> - *
>> - * Returns non-negative device number on success or -1 in case of error
>> - */
>> -static int virNetDevVethGetFreeNum(int startDev)
>> -{
>> -    int devNum;
>> -
>> -#define MAX_DEV_NUM 65536
>> -
>> -    for (devNum = startDev; devNum < MAX_DEV_NUM; devNum++) {
>> -        int ret = virNetDevVethExists(devNum);
>> -        if (ret < 0)
>> -            return -1;
>> -        if (ret == 0)
>> -            return devNum;
>> -    }
>> -
>> -    virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
>> -                   _("No free veth devices available"));
>> -    return -1;
>> -}
>>  
>>   /**
>>    * virNetDevVethCreate:
>> @@ -102,77 +60,45 @@ static int virNetDevVethGetFreeNum(int startDev)
>>    */
>>   int virNetDevVethCreate(char** veth1, char** veth2)
>>   {
>> -    int ret = -1;
>> -    int vethNum = 0;
>> -    size_t i;
>> -
>> -    /*
>> -     * We might race with other containers, but this is reasonably
>> -     * unlikely, so don't do too many retries for device creation
>> -     */
>> -    virMutexLock(&virNetDevVethCreateMutex);
>> -#define MAX_VETH_RETRIES 10
>> -
>> -    for (i = 0; i < MAX_VETH_RETRIES; i++) {
>> -        g_autofree char *veth1auto = NULL;
>> -        g_autofree char *veth2auto = NULL;
>> -        g_autoptr(virCommand) cmd = NULL;
>> -
>> -        int status;
>> -        if (!*veth1) {
>> -            int veth1num;
>> -            if ((veth1num = virNetDevVethGetFreeNum(vethNum)) < 0)
>> -                goto cleanup;
>> -
>> -            veth1auto = g_strdup_printf("vnet%d", veth1num);
>> -            vethNum = veth1num + 1;
>> -        }
>> -        if (!*veth2) {
>> -            int veth2num;
>> -            if ((veth2num = virNetDevVethGetFreeNum(vethNum)) < 0)
>> -                goto cleanup;
>> +    int status;
>> +    g_autofree char *veth1auto = NULL;
>> +    g_autofree char *veth2auto = NULL;
>> +    g_autoptr(virCommand) cmd = NULL;
>>  
>> -            veth2auto = g_strdup_printf("vnet%d", veth2num);
>> -            vethNum = veth2num + 1;
>> -        } > +    if (!*veth1) {
>> +        if (virNetDevGenerateName(&veth1auto, VIR_NET_DEV_GEN_NAME_VNET) < 0)
>> +            return -1;
>> +    } > +    if (!*veth2) {
>> +        if (virNetDevGenerateName(&veth2auto, VIR_NET_DEV_GEN_NAME_VNET) < 0)
>> +            return -1;
>> +    }
>
>
>Both of these don't need the "if (!*vethN) { ... }. Remember that
>virNetDevGenerateName() is a NOP if the input ifname != NULL.
>
>Otherwise good. I can squash in these two changes if you approve.
> 

Okay.

Shi Lei

>
>>  
>> -        cmd = virCommandNew("ip");
>> -        virCommandAddArgList(cmd, "link", "add",
>> -                             *veth1 ? *veth1 : veth1auto,
>> -                             "type", "veth", "peer", "name",
>> -                             *veth2 ? *veth2 : veth2auto,
>> -                             NULL);
>> -
>> -        if (virCommandRun(cmd, &status) < 0)
>> -            goto cleanup;
>> -
>> -        if (status == 0) {
>> -            if (veth1auto) {
>> -                *veth1 = veth1auto;
>> -                veth1auto = NULL;
>> -            }
>> -            if (veth2auto) {
>> -                *veth2 = veth2auto;
>> -                veth2auto = NULL;
>> -            }
>> -            VIR_DEBUG("Create Host: %s guest: %s", *veth1, *veth2);
>> -            ret = 0;
>> -            goto cleanup;
>> -        }
>> +    cmd = virCommandNew("ip");
>> +    virCommandAddArgList(cmd, "link", "add",
>> +                         *veth1 ? *veth1 : veth1auto,
>> +                         "type", "veth", "peer", "name",
>> +                         *veth2 ? *veth2 : veth2auto,
>> +                         NULL);
>>  
>> -        VIR_DEBUG("Failed to create veth host: %s guest: %s: %d",
>> -                  *veth1 ? *veth1 : veth1auto,
>> -                  *veth2 ? *veth2 : veth2auto,
>> -                  status);
>> +    if (virCommandRun(cmd, &status) < 0 || status) {
>> +        virReportError(VIR_ERR_INTERNAL_ERROR,
>> +                       "%s", _("Failed to allocate free veth pair"));
>> +        return -1;
>>       }
>>  
>> -    virReportError(VIR_ERR_INTERNAL_ERROR,
>> -                   _("Failed to allocate free veth pair after %d attempts"),
>> -                   MAX_VETH_RETRIES);
>> +    VIR_DEBUG("create veth host: %s guest: %s: %d",
>> +              *veth1 ? *veth1 : veth1auto,
>> +              *veth2 ? *veth2 : veth2auto,
>> +              status);
>> +
>> +    if (veth1auto)
>> +        *veth1 = g_steal_pointer(&veth1auto);
>> +    if (veth2auto)
>> +        *veth2 = g_steal_pointer(&veth2auto);
>>  
>> - cleanup:
>> -    virMutexUnlock(&virNetDevVethCreateMutex);
>> -    return ret;
>> +    VIR_DEBUG("Create Host: %s guest: %s", *veth1, *veth2);
>> +    return 0;
>>   }
>>  
>>   /**
>>
>




More information about the libvir-list mailing list