On 6/19/20 1:16 PM, Daniel P. Berrangé wrote:
On Fri, Jun 19, 2020 at 01:06:33PM -0400, Laine Stump wrote:
On 6/19/20 12:26 PM, Daniel P. Berrangé wrote:
Maintain a global "int nextTapID" counter, and just iterate on this.
NIC names can be upto 16 bytes, so we'll create billions of devices
before we have any chance of wrapping around and risking a collision
with a concurrently shutting down guest.
I remember I tried doing a monotonically increasing "next" counter for
macvtap (never actually pushed, but shown to [some users, I forget who,
maybe ovirt devs?], and they didn't like it because the devices ended up
with long difficult-for-a-human-to-remember/pick-out/recite names like
macvtap42301 and macvtap43021. So instead we keep track of the names that
are in use, and always look for the lowest available number when creating a
new one. (of course doing that would greatly increase the likelyhood of
exposing any race conditions, so...) Definitely if we change the behavior in
this way we're going to hear about it, though :-)
People might complain, but I'm not convinced it really matters. Pid
numbers used to be nice & short until someone raised pid max and now
my processes have 7-digit long pids. It is surprising at first, but
it didn't really cause me any functional problems.
This is a good point. But even more convincing than that is the
revelation that this isn't an issue just with OVS switch ports - the
same race is also causing problems with libvirt nwfilter driver
bindings, as reported here:
https://bugzilla.redhat.com/show_bug.cgi?id=1837395
After seeing that report and realizing that this same race is the cause,
I've decided to change libvirt's tap device creation to provide names
based on a monotonically increasing counter as you suggest, rather than
relying on the kernel. I'm hoping to have something to send to the list
in a day or two.
And there's still the option of just providing a fixed name if you
really need something predictable for a guest.
Another issue I remember from macvtap is the possibility of a different
process (not libvirt) having already created a macvtap device with the name
that we are wanting to use. That is easily solved in the case of macvtap by
just iterating through until we find one that we can create without failure.
So basically you have the list/bitmap/whatever of devicenames currently in
use, use that as a starting point to pick a name for the new device, but
then also allow for that name to already be used, and retry.
I wasn't thinking we need a bitmap, literally just a single counter.
We start where we left off, trying until we succeeed, which is what
the kernel does anyway IIRC. Most other competing processes will
rely on the kernel auto-allocation so won't clash with us very
frequently if at all.
Also, in the name of backward compatibility, we will need to support tap
device names from the config that have %d in the name, e.g. the default name
we send is "vnet%d", but we allow for someone to specify "mytap%d".
We could keep a counter per prefix, or just have a single global
counter.
Regards,
Daniel