On 30.11.2012 19:43, Laine Stump wrote:
On 11/19/2012 11:51 AM, Michal Privoznik wrote:
> Network should be notified if we plug in or unplug an
> interface, so it can perform some action, e.g. set/unset
> network part of QoS.
> ---
> src/Makefile.am | 7 ++-
> src/conf/domain_conf.h | 1 +
> src/conf/network_conf.c | 1 +
> src/conf/network_conf.h | 3 +
> src/libvirt_network.syms | 8 ++
> src/network/bridge_driver.c | 165 +++++++++++++++++++++++++++++++++++++++++++
> src/network/bridge_driver.h | 10 ++-
> src/qemu/qemu_command.c | 32 ++++++---
> src/qemu/qemu_process.c | 12 +++
> 9 files changed, 225 insertions(+), 14 deletions(-)
> create mode 100644 src/libvirt_network.syms
>
> diff --git a/src/conf/network_conf.h b/src/conf/network_conf.h
> index 3e46304..8a8d1e4 100644
> --- a/src/conf/network_conf.h
> +++ b/src/conf/network_conf.h
> @@ -221,6 +221,9 @@ struct _virNetworkObj {
>
> virNetworkDefPtr def; /* The current definition */
> virNetworkDefPtr newDef; /* New definition to activate at shutdown */
> +
> + unsigned int class_id; /* next class ID for QoS */
Okay, so this is just a monotonically increasing counter so that each
interface gets a new and different class_id. Maybe you should call it
"nextFreeClassID" or something like that, so that everyone understands
it's not a class id used by the network. Or you might want to do this
with a bitmap so you can re-use id's of interfaces that are
disconnected. (can virBitmaps being dynamically expanded?)
> + unsigned long long floor_sum; /* sum of all 'floor'-s of attached NICs
*/
And you keep track of the sum of all floors here.
So, what happens if libvirtd is restarted? It looks like they both go
back to their initial values.
We think alike :) In the next patches I am fixing this. class_id becomes
a virBitmap and among with floor_sum gets stored into network status
XML. I've split it into several patches because changes are big (in
number of lines at least) and I think this way it's easier to review.
And what about hotplug?
This is a similar problem to the pool of interfaces used by
macvtap/hostdev modes - a network with an interface pool needs to have
the "inuse" counters of each interface refreshed whenever libvirtd
restarts. So the necessary hooks are already in place:
networkAllocateActualDevice - called any time an interface with
type='network' is initially
allocated and connected.
networkNotifyActualDevice - called for each type='network' interface
of each active domain
any time libvirtd restarts
networkReleaseActualDevice - called for every type='network'
interface as it is being
disconnected and destroyed.
These are called for *all* type='network' interfaces, not just those
that need to allocate a physical netdev from a pool.
Rather than adding your own new hooks (and figuring out all the places
they need to be called), I think it would be better to use the existing
hooks (perhaps calling a reduced/renamed version of your functions,
which can possibly be moved over to ). That will have two advantages:
1) It will assure that the bandwidth functions are called at all the
right times, including hotplug/unplug, and libvirtd restart
2) It will continue the process of consolidating all network-related
functionality need for these three events into 3 functions which may
some day be moved into their own daemom with a public (within libvirt
anyway) API accessible via RPC (thus allowing non-privileged libvirts to
have full networking functionality).
Okay, renamed to networkPlugBandwidth and networkUnplugBandwidth and
inserted into networkAllocateActualDevice and networkReleaseActualDevice
respectively.
Note that you will probably want to save the interface class_id in
the
iface->actual (as a matter of fact, in
iface->data.network.actual->bandwidth, which can be retrieved with
virDomainNetGetActualBandwidth()) so that it's saved properly in the
interface's state without polluting the interface's config. Then it will
be read back from the state file during the restart and available during
networkNotifyActualDevice() of each interface. I guess you can then
re-set the network->class_id by checking interface->class_id and setting
network->class_id = MAX(network->class_id, iface->class_id + 1);
for each encountered interface (or add it to a bitmap, if a) bitmaps can
be enlarged dynamically or b) we can determine a reasonable maximum
limit on number of active domains). At the same time, you'll recompute
the network->floor_sum iteratively as the network is called with a
notify for each interface.
> ...
To summarize: I think this needs to be refactored to be integrated into
the network*ActualDevice() functions so that the bookkeeping is properly
handled in all cases, including hotplug and libvirtd restart.
--
libvir-list mailing list
libvir-list(a)redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list