[libvirt] [PATCH v4 4/4] nwfilter: Remove need for nwfilterDriverLock in some API's
Stefan Berger
stefanb at linux.vnet.ibm.com
Thu Feb 1 03:12:30 UTC 2018
On 12/08/2017 09:01 AM, John Ferlan wrote:
> Now that nwfilters object list is self locking, it's no longer
> necessary to hold the driver level lock for certain API's.
>
> However, for the DefineXML, Undefine, and Reload processing keeping
> that lock ensures for serialization required in order to process
> the filter Instantiation properly.
>
> Signed-off-by: John Ferlan <jferlan at redhat.com>
> ---
> src/nwfilter/nwfilter_driver.c | 51 +++++++++++++++++-------------------------
> 1 file changed, 20 insertions(+), 31 deletions(-)
>
> diff --git a/src/nwfilter/nwfilter_driver.c b/src/nwfilter/nwfilter_driver.c
> index b24f59379..5b7ba1fcd 100644
> --- a/src/nwfilter/nwfilter_driver.c
> +++ b/src/nwfilter/nwfilter_driver.c
> @@ -295,6 +295,10 @@ nwfilterStateReload(void)
> /* shut down all threads -- they will be restarted if necessary */
> virNWFilterLearnThreadsTerminate(true);
>
> + /* Serialization of virNWFilterObjListLoadAllConfigs is extremely
> + * important as it relates to virNWFilterObjListFindInstantiateFilter
> + * processing via virNWFilterTriggerVMFilterRebuild that occurs during
> + * virNWFilterObjListAssignDef */
> nwfilterDriverLock();
> virNWFilterWriteLockFilterUpdates();
> virNWFilterCallbackDriversLock();
> @@ -385,11 +389,7 @@ nwfilterLookupByUUID(virConnectPtr conn,
> virNWFilterDefPtr def;
> virNWFilterPtr nwfilter = NULL;
>
> - nwfilterDriverLock();
> - obj = nwfilterObjFromNWFilter(uuid);
> - nwfilterDriverUnlock();
> -
> - if (!obj)
> + if (!(obj = nwfilterObjFromNWFilter(uuid)))
> return NULL;
> def = virNWFilterObjGetDef(obj);
>
> @@ -412,11 +412,7 @@ nwfilterLookupByName(virConnectPtr conn,
> virNWFilterDefPtr def;
> virNWFilterPtr nwfilter = NULL;
>
> - nwfilterDriverLock();
> - obj = virNWFilterObjListFindByName(driver->nwfilters, name);
> - nwfilterDriverUnlock();
> -
> - if (!obj) {
> + if (!(obj = virNWFilterObjListFindByName(driver->nwfilters, name))) {
> virReportError(VIR_ERR_NO_NWFILTER,
> _("no nwfilter with matching name '%s'"), name);
> return NULL;
> @@ -450,17 +446,12 @@ nwfilterConnectListNWFilters(virConnectPtr conn,
> char **const names,
> int maxnames)
> {
> - int nnames;
> -
> if (virConnectListNWFiltersEnsureACL(conn) < 0)
> return -1;
>
> - nwfilterDriverLock();
> - nnames = virNWFilterObjListGetNames(driver->nwfilters, conn,
> - virConnectListNWFiltersCheckACL,
> - names, maxnames);
> - nwfilterDriverUnlock();
> - return nnames;
> + return virNWFilterObjListGetNames(driver->nwfilters, conn,
> + virConnectListNWFiltersCheckACL,
> + names, maxnames);
> }
>
>
> @@ -469,19 +460,13 @@ nwfilterConnectListAllNWFilters(virConnectPtr conn,
> virNWFilterPtr **nwfilters,
> unsigned int flags)
> {
> - int ret;
> -
> virCheckFlags(0, -1);
>
> if (virConnectListAllNWFiltersEnsureACL(conn) < 0)
> return -1;
>
> - nwfilterDriverLock();
> - ret = virNWFilterObjListExport(conn, driver->nwfilters, nwfilters,
> - virConnectListAllNWFiltersCheckACL);
> - nwfilterDriverUnlock();
> -
> - return ret;
> + return virNWFilterObjListExport(conn, driver->nwfilters, nwfilters,
> + virConnectListAllNWFiltersCheckACL);
> }
>
> static virNWFilterPtr
> @@ -499,6 +484,10 @@ nwfilterDefineXML(virConnectPtr conn,
> return NULL;
> }
>
> + /* Serialization of *one* DefineXML consumer is extremely important
> + * as it relates to virNWFilterObjListFindInstantiateFilter processing
> + * via virNWFilterTriggerVMFilterRebuild that occurs during
> + * virNWFilterObjListAssignDef */
> nwfilterDriverLock();
> virNWFilterWriteLockFilterUpdates();
> virNWFilterCallbackDriversLock();
> @@ -541,6 +530,10 @@ nwfilterUndefine(virNWFilterPtr nwfilter)
> virNWFilterDefPtr def;
> int ret = -1;
>
> + /* Serialization of *one* Undefine consumer is extremely important
> + * as it relates to virNWFilterObjListFindInstantiateFilter processing
> + * via virNWFilterTriggerVMFilterRebuild that occurs during
> + * virNWFilterObjTestUnassignDef */
> nwfilterDriverLock();
> virNWFilterWriteLockFilterUpdates();
> virNWFilterCallbackDriversLock();
> @@ -587,11 +580,7 @@ nwfilterGetXMLDesc(virNWFilterPtr nwfilter,
>
> virCheckFlags(0, NULL);
>
> - nwfilterDriverLock();
> - obj = nwfilterObjFromNWFilter(nwfilter->uuid);
> - nwfilterDriverUnlock();
> -
> - if (!obj)
> + if (!(obj = nwfilterObjFromNWFilter(nwfilter->uuid)))
> return NULL;
> def = virNWFilterObjGetDef(obj);
>
This looks good.
More information about the libvir-list
mailing list