[libvirt] [RFC PATCH 3/3] libvirt: Implement two-tier driver loading

Peter Krempa pkrempa at redhat.com
Mon Jan 20 15:02:20 UTC 2014


On 12/21/13 05:14, Adam Walters wrote:
> This implements a two-tier driver loading system into libvirt. The two classes of drivers are "Libvirt" drivers and "Hypervisor" drivers. Hypervisor drivers are fairly self-explanatory, they provide domain services. Libvirt drivers are sort of the backend drivers for those, like the secret and storage drivers. In the two-tier loading system here, the "Libvirt" drivers are all loaded and auto-started. Once those have finished, the "Hypervisor" drivers are loaded and auto-started. By doing things in this manner, we do not have to hard-code a driver loading order or roll our own dynamic dependency-based loading algorithm, while still gaining the benefits of a more orderly driver loading approach, which should help minimize the possibility of a race condition during startup. If another race condition is found, the code can be extended to provide any number of extra tiers without much trouble.

Again, as in 2/3, please break the long line into some paragraphs.

> 
> Signed-off-by: Adam Walters <adam at pandorasboxen.com>
> ---
>  src/libvirt.c | 57 +++++++++++++++++++++++++++++++++++++++++++++++++--------
>  1 file changed, 49 insertions(+), 8 deletions(-)
> 
> diff --git a/src/libvirt.c b/src/libvirt.c
> index 77f481e..9c00491 100644
> --- a/src/libvirt.c
> +++ b/src/libvirt.c
> @@ -837,31 +837,72 @@ int virStateInitialize(bool privileged,
>                         void *opaque)
>  {
>      size_t i;
> +    virStateDriverPtr virLibvirtStateDriverTab[MAX_DRIVERS];
> +    int virLibvirtStateDriverTabCount = 0;
> +    virStateDriverPtr virHypervisorStateDriverTab[MAX_DRIVERS];
> +    int virHypervisorStateDriverTabCount = 0;
>  
>      if (virInitialize() < 0)
>          return -1;
>  
>      for (i = 0; i < virStateDriverTabCount; i++) {
> -        if (virStateDriverTab[i]->stateInitialize) {
> +        switch (virStateDriverTab[i]->stateType) {
> +        case VIR_DRV_STATE_DRV_LIBVIRT:
> +            virLibvirtStateDriverTab[virLibvirtStateDriverTabCount++] =
> +                virStateDriverTab[i];
> +            break;
> +        case VIR_DRV_STATE_DRV_HYPERVISOR:
> +            virHypervisorStateDriverTab[virHypervisorStateDriverTabCount++] =
> +                virStateDriverTab[i];
> +            break;
> +        }
> +    }

Hmmm, this duplicates the loading code for each driver tier. As we don't
really need to copy the driver structure pointers into separate arrays
to load each driver tier I'd suggest the following multi-pass algorithm:

for (driverTier = 0; driverTier < driverTierLast; driverTier++) {
	for (i = 0; i < virStateDriverTabCount i++) {
		if (virStateDriverTab[i]->stateType != driverTier)
			continue;

	... ALL THE EXISTING LOADER CODE ...
	}
}

This'd save a lot of the code duplication and still would keep the
ordering you are trying to introduce. I like the overal idea of this series.

Peter




-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 901 bytes
Desc: OpenPGP digital signature
URL: <http://listman.redhat.com/archives/libvir-list/attachments/20140120/5f507012/attachment-0001.sig>


More information about the libvir-list mailing list