[libvirt] [PATCH v2 18/21] nwfilter: remove virt driver callback layer for rebuilding filters

John Ferlan jferlan at redhat.com
Fri May 18 16:57:37 UTC 2018



On 05/15/2018 01:43 PM, Daniel P. Berrangé wrote:
> Now that the nwfilter driver keeps a list of bindings that it has
> created, there is no need for the complex virt driver callbacks. It is
> possible to simply iterate of the list of recorded filter bindings.
> 
> This means that rebuilding filters no longer has to acquire any locks on
> the virDomainObj objects, as they're never touched.
> 
> Signed-off-by: Daniel P. Berrangé <berrange at redhat.com>
> ---
>  src/conf/nwfilter_conf.c               | 169 +++++++------------------
>  src/conf/nwfilter_conf.h               |  51 +-------
>  src/conf/virnwfilterobj.c              |   4 +-
>  src/libvirt_private.syms               |   7 +-
>  src/lxc/lxc_driver.c                   |  28 ----
>  src/nwfilter/nwfilter_driver.c         |  21 +--
>  src/nwfilter/nwfilter_gentech_driver.c | 164 +++++++++++++++---------
>  src/nwfilter/nwfilter_gentech_driver.h |   4 +-
>  src/qemu/qemu_driver.c                 |  25 ----
>  src/uml/uml_driver.c                   |  29 -----
>  10 files changed, 173 insertions(+), 329 deletions(-)
> 

Oh and this is where the magic happens ;-)... and there is light at the
end of this long tunnel!

[...]

> diff --git a/src/conf/nwfilter_conf.c b/src/conf/nwfilter_conf.c
> index de26a6d034..29aacba98d 100644
> --- a/src/conf/nwfilter_conf.c
> +++ b/src/conf/nwfilter_conf.c

[...]

>  
> +static virNWFilterTriggerRebuildCallback rebuildCallback;
> +static void *rebuildOpaque;
>  
>  int
> -virNWFilterConfLayerInit(virDomainObjListIterator domUpdateCB,
> +virNWFilterConfLayerInit(virNWFilterTriggerRebuildCallback cb,
>                           void *opaque)
>  {
>      if (initialized)
>          return -1;
>  
> -    virNWFilterDomainFWUpdateCB = domUpdateCB;
> -    virNWFilterDomainFWUpdateOpaque = opaque;
> +    rebuildCallback = cb;
> +    rebuildOpaque = opaque;
>  
>      initialized = true;
>  
> @@ -3233,8 +3120,50 @@ virNWFilterConfLayerShutdown(void)
>      virRWLockDestroy(&updateLock);
>  
>      initialized = false;
> -    virNWFilterDomainFWUpdateOpaque = NULL;
> -    virNWFilterDomainFWUpdateCB = NULL;
> +    rebuildCallback = NULL;
> +    rebuildOpaque = NULL;
> +}
> +

Two blank lines

> +int
> +virNWFilterTriggerRebuild(void)
> +{
> +#if 0

Did you mean to keep the #if 0 - just in case?

> +    size_t i;
> +    int ret = 0;
> +    struct domUpdateCBStruct cb = {
> +        .opaque = virNWFilterDomainFWUpdateOpaque,
> +        .step = STEP_APPLY_NEW,
> +        .skipInterfaces = virHashCreate(0, NULL),
> +    };
> +
> +    if (!cb.skipInterfaces)
> +        return -1;
> +
> +    for (i = 0; i < nCallbackDriver; i++) {
> +        if (callbackDrvArray[i]->vmFilterRebuild(virNWFilterDomainFWUpdateCB,
> +                                                 &cb) < 0)
> +            ret = -1;
> +    }
> +
> +    if (ret < 0) {
> +        cb.step = STEP_TEAR_NEW; /* rollback */
> +
> +        for (i = 0; i < nCallbackDriver; i++)
> +            callbackDrvArray[i]->vmFilterRebuild(virNWFilterDomainFWUpdateCB,
> +                                                 &cb);
> +    } else {
> +        cb.step = STEP_TEAR_OLD; /* switch over */
> +
> +        for (i = 0; i < nCallbackDriver; i++)
> +            callbackDrvArray[i]->vmFilterRebuild(virNWFilterDomainFWUpdateCB,
> +                                                 &cb);
> +    }
> +
> +    virHashFree(cb.skipInterfaces);
> +
> +    return ret;
> +#endif
> +    return rebuildCallback(rebuildOpaque);
>  }
>  
>  

[...]

> diff --git a/src/nwfilter/nwfilter_gentech_driver.c b/src/nwfilter/nwfilter_gentech_driver.c
> index 30ae3970fb..de7361f3dd 100644
> --- a/src/nwfilter/nwfilter_gentech_driver.c
> +++ b/src/nwfilter/nwfilter_gentech_driver.c
> @@ -153,9 +153,9 @@ virNWFilterVarHashmapAddStdValues(virHashTablePtr table,
>          if (!val)
>              return -1;
>  
> -        if (virHashAddEntry(table,
> -                            NWFILTER_STD_VAR_MAC,
> -                            val) < 0) {
> +        if (virHashUpdateEntry(table,
> +                               NWFILTER_STD_VAR_MAC,
> +                               val) < 0) {
>              virNWFilterVarValueFree(val);
>              virReportError(VIR_ERR_INTERNAL_ERROR,
>                             "%s", _("Could not add variable 'MAC' to hashmap"));
> @@ -168,9 +168,9 @@ virNWFilterVarHashmapAddStdValues(virHashTablePtr table,
>          if (!val)
>              return -1;
>  
> -        if (virHashAddEntry(table,
> -                            NWFILTER_STD_VAR_IP,
> -                            val) < 0) {
> +        if (virHashUpdateEntry(table,
> +                               NWFILTER_STD_VAR_IP,
> +                               val) < 0) {
>              virNWFilterVarValueFree(val);
>              virReportError(VIR_ERR_INTERNAL_ERROR,
>                             "%s", _("Could not add variable 'IP' to hashmap"));
> @@ -1000,68 +1000,110 @@ virNWFilterTeardownFilter(virNWFilterBindingDefPtr binding)
>      return ret;
>  }
>  
> +enum {
> +    STEP_APPLY_NEW,
> +    STEP_TEAR_NEW,
> +    STEP_TEAR_OLD,

We could take the opportunity to rename from TEAR_NEW to ROLL_BACK and
TEAR_OLD to SWITCH_OVER...  IDC, just a thought since the comments from
virNWFilterTriggerVMFilterRebuild (that are currently copied inside the
#if 0 in virNWFilterTriggerRebuild) perhaps more accurately describe
what's going on...

> +    STEP_APPLY_CURRENT,
> +};
>  

[...]

> +int
> +virNWFilterBuildAll(virNWFilterDriverStatePtr driver,
> +                    bool newFilters)
> +{
> +    struct virNWFilterBuildData data = {
> +        .driver = driver,
> +    };
> +    int ret = 0;
> +
> +    VIR_DEBUG("Build all filters newFilters=%d", newFilters);
> +
> +    if (newFilters) {
> +        if (!(data.skipInterfaces = virHashCreate(0, NULL)))
> +            return -1;
> +
> +        data.step = STEP_APPLY_NEW;
> +        if (virNWFilterBindingObjListForEach(driver->bindings,
> +                                             virNWFilterBuildIter,
> +                                             &data) < 0)
> +            ret = -1;
> +
> +        if (ret == -1) {
> +            data.step = STEP_TEAR_NEW;
> +            virNWFilterBindingObjListForEach(driver->bindings,
> +                                             virNWFilterBuildIter,
> +                                             &data);
> +        } else  {
> +            data.step = STEP_TEAR_OLD;
> +            virNWFilterBindingObjListForEach(driver->bindings,
> +                                             virNWFilterBuildIter,
> +                                             &data);
> +        }
> +    } else {
> +        data.step = STEP_APPLY_CURRENT;
> +        if (virNWFilterBindingObjListForEach(driver->bindings,
> +                                             virNWFilterBuildIter,
> +                                             &data) < 0)
> +            ret = -1;
> +    }

Does this need to virHashFree(data.skipInterfaces); similar to what
virNWFilterTriggerVMFilterRebuild did previously, since it's local here?

>      return ret;
>  }
>  

[...]

With a couple of minor adjustments and since it doesn't appear any of
the changes would be too controversial...

Reviewed-by: John Ferlan <jferlan at redhat.com>

John

Testing the heck out of this is the real challenge!  I'll look to shake
the cobwebs off my virt_test/avocado environment...




More information about the libvir-list mailing list