[libvirt] [PATCHv2] util: keep/use a bitmap of in-use macvtap devices
Pavel Hrdina
phrdina at redhat.com
Mon Jan 25 12:16:32 UTC 2016
On Fri, Jan 22, 2016 at 12:52:27PM -0500, Laine Stump wrote:
> This patch creates two bitmaps, one for macvlan devicenames and one
s/devicenames/device names/
[...]
> diff --git a/src/util/virnetdevmacvlan.c b/src/util/virnetdevmacvlan.c
[...]
> +/**
> + * virNetDevMacVLanReserveName:
> + *
> + * @name: already-known name of device
> + * @quietFail: don't log an error if this name is already in-use
> + *
> + * Extract the device type and id from a macvtap/macvlan device name
> + * and mark the appropriate position as in-use in the appropriate
> + * bitmap.
> + *
> + * returns 0 on success, -1 on failure, -2 if the name doesn't fit the auto-pattern
Long line, would be nice to wrap it. And the return 0 isn't true, because
virNetDevMacVLanReserveID() returns ID on success.
> + */
> +int
> +virNetDevMacVLanReserveName(const char *name, bool quietFail)
> +{
> + unsigned int id;
> + unsigned int flags = 0;
> + const char *idstr = NULL;
> +
> + if (virNetDevMacVLanInitialize() < 0)
> + return -1;
> +
> + if (STRPREFIX(name, MACVTAP_NAME_PREFIX)) {
> + idstr = name + strlen(MACVTAP_NAME_PREFIX);
> + flags |= VIR_NETDEV_MACVLAN_CREATE_WITH_TAP;
> + } else if (STRPREFIX(name, MACVLAN_NAME_PREFIX)) {
> + idstr = name + strlen(MACVLAN_NAME_PREFIX);
> + } else {
> + return -2;
> + }
> +
> + if (virStrToLong_ui(idstr, NULL, 10, &id) < 0) {
> + virReportError(VIR_ERR_INTERNAL_ERROR,
> + _("couldn't get id value from macvtap device name %s"),
> + name);
> + return -1;
> + }
> + return virNetDevMacVLanReserveID(id, flags, quietFail, false);
> +}
[...]
> const char *type = (flags & VIR_NETDEV_MACVLAN_CREATE_WITH_TAP) ?
> "macvtap" : "macvlan";
> - const char *prefix = (flags & VIR_NETDEV_MACVLAN_CREATE_WITH_TAP) ?
> - MACVTAP_NAME_PREFIX : MACVLAN_NAME_PREFIX;
Maybe use the MACV(TAP|LAN)_NAME_PREFIX instead of the strings for *type.
> const char *pattern = (flags & VIR_NETDEV_MACVLAN_CREATE_WITH_TAP) ?
> MACVTAP_NAME_PATTERN : MACVLAN_NAME_PATTERN;
> - int c, rc;
> + int rc, reservedID = -1;
> char ifname[IFNAMSIZ];
> int retries, do_retry = 0;
> uint32_t macvtapMode;
> - const char *cr_ifname = NULL;
> + const char *ifnameCreated = NULL;
> int ret;
> int vf = -1;
> bool vnet_hdr = flags & VIR_NETDEV_MACVLAN_VNET_HDR;
[...]
> + retries = MACVLAN_MAX_ID + 1;
> + while (!ifnameCreated && retries) {
> virMutexLock(&virNetDevMacVLanCreateMutex);
> - for (c = 0; c < 8192; c++) {
> - snprintf(ifname, sizeof(ifname), pattern, c);
> - if ((ret = virNetDevExists(ifname)) < 0) {
> - virMutexUnlock(&virNetDevMacVLanCreateMutex);
> + reservedID = virNetDevMacVLanReserveID(reservedID, flags, false, true);
> + if (reservedID < 0) {
> + virMutexUnlock(&virNetDevMacVLanCreateMutex);
> + return -1;
> + }
> + snprintf(ifname, sizeof(ifname), pattern, reservedID);
Since you're changing this, snprintf returns -1 in case of error.
ACK with the issues fixed.
More information about the libvir-list
mailing list