[libvirt] [PATCH 2/2] netcf driver: use a single netcf handle for all connections

Eric Blake eblake at redhat.com
Wed Aug 28 21:59:49 UTC 2013


On 08/28/2013 11:39 AM, Laine Stump wrote:
> This resolves: https://bugzilla.redhat.com/show_bug.cgi?id=983026
> 
> The netcf interface driver previously had no state driver associated
> with it - as a connection was opened, it would create a new netcf
> instance just for that connection, and close it when it was
> finished. the problem with this is that each connection to libvirt
> used up a netlink socket, and there is a per process maximum of ~1000
> netlink sockets.
> 
> The solution is to create a state driver to go along with the netcf
> driver. The state driver will open a netcf instance, then all
> connections will share that same netcf instance, thus only a single
> netlink socket will be used no matter how many connections are mde to
> libvirtd.
> 
> This was rather simple to do - most of the functionality from
> netcfInterfaceOpen() was moved to netcfStateInitialize (which
> initializes a single global driverState), and netcfInterfaceOpen now
> just puts a pointer to driverState into the privateData. A similar
> change was mad eto netcfStateCleanup() vs netcfInterfaceClose(). Since
> all the functions already have locking around them, no other change
> was necessary (they now use the single global lock rather than a lock
> specific to their connection).

I'm torn on whether this patch qualifies as being safe enough to apply
after freeze.

> ---
>  src/interface/interface_backend_netcf.c | 157 ++++++++++++++++++++++++--------
>  1 file changed, 117 insertions(+), 40 deletions(-)
> 
> diff --git a/src/interface/interface_backend_netcf.c b/src/interface/interface_backend_netcf.c
> index f47669e..1b5c850 100644
> --- a/src/interface/interface_backend_netcf.c
> +++ b/src/interface/interface_backend_netcf.c
> @@ -43,8 +43,10 @@ typedef struct
>  {
>      virMutex lock;
>      struct netcf *netcf;
> +    size_t nConnections;
>  } virNetcfDriverState, *virNetcfDriverStatePtr;
>  
> +virNetcfDriverStatePtr driverState = NULL;

Any reason this is not static?

>  
>  static void interfaceDriverLock(virNetcfDriverStatePtr driver)
>  {
> @@ -56,6 +58,98 @@ static void interfaceDriverUnlock(virNetcfDriverStatePtr driver)
>      virMutexUnlock(&driver->lock);
>  }
>  
> +static int
> +netcfStateInitialize(bool privileged ATTRIBUTE_UNUSED,
> +                     virStateInhibitCallback callback ATTRIBUTE_UNUSED,
> +                     void *opaque ATTRIBUTE_UNUSED)
> +{
> +    if (VIR_ALLOC(driverState) < 0)
> +        goto alloc_error;
> +
> +    /* initialize non-0 stuff in driverState */
> +    if (virMutexInit(&driverState->lock) < 0)
> +    {
> +        /* what error to report? */
> +        goto mutex_error;

VIR_ERR_INTERNAL_ERROR is probably as good as any, since this is unlikely.

> +    }
> +
> +    /* open netcf */
> +    if (ncf_init(&driverState->netcf, NULL) != 0)
> +    {
> +        /* what error to report? */
> +        goto netcf_error;

Probably here as well.

> -static virDrvOpenStatus netcfInterfaceOpen(virConnectPtr conn,
> -                                           virConnectAuthPtr auth ATTRIBUTE_UNUSED,
> -                                           unsigned int flags)
> +static virDrvOpenStatus
> +netcfInterfaceOpen(virConnectPtr conn,
> +                   virConnectAuthPtr auth ATTRIBUTE_UNUSED,
> +                   unsigned int flags)
>  {

>  
>      conn->interfacePrivateData = driverState;
> +    interfaceDriverLock(driverState);
> +    driverState->nConnections++;
> +    interfaceDriverUnlock(driverState);

Is it worth switching things to use virObject with atomic refcounting
that doesn't require a lock?  But that can probably be a separate patch.


-- 
Eric Blake   eblake redhat com    +1-919-301-3266
Libvirt virtualization library http://libvirt.org

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


More information about the libvir-list mailing list