[libvirt] [patch 2/3] Syncronize the teardown of rules with the thread
Daniel Veillard
veillard at redhat.com
Fri Apr 30 12:00:46 UTC 2010
On Thu, Apr 29, 2010 at 09:34:47PM -0400, Stefan Berger wrote:
> Introduce a function to notify the IP address learning
> thread to terminate and thus release the lock on the interface.
> Notify the thread before grabbing the lock on the interface
> and tearing down the rules. This prevents a 'virsh destroy' to
> tear down the rules that the IP address learning thread has
> applied.
>
> Signed-off-by; Stefan Berger <stefanb at us.ibm.com>
>
> ---
> src/nwfilter/nwfilter_gentech_driver.c | 8 ++++++++
> src/nwfilter/nwfilter_learnipaddr.c | 27 ++++++++++++++++++++++++++-
> src/nwfilter/nwfilter_learnipaddr.h | 1 +
> 3 files changed, 35 insertions(+), 1 deletion(-)
>
> Index: libvirt-acl/src/nwfilter/nwfilter_learnipaddr.c
> ===================================================================
> --- libvirt-acl.orig/src/nwfilter/nwfilter_learnipaddr.c
> +++ libvirt-acl/src/nwfilter/nwfilter_learnipaddr.c
> @@ -243,8 +243,33 @@ virNWFilterRegisterLearnReq(virNWFilterI
> return res;
> }
>
> +
> #endif
>
> +int
> +virNWFilterTerminateLearnReq(const char *ifname) {
> + int rc = 1;
> + int ifindex;
> + virNWFilterIPAddrLearnReqPtr req;
> +
> + if (ifaceGetIndex(false, ifname, &ifindex) == 0) {
> +
> + IFINDEX2STR(ifindex_str, ifindex);
> +
> + virMutexLock(&pendingLearnReqLock);
> +
> + req = virHashLookup(pendingLearnReq, ifindex_str);
> + if (req) {
> + rc = 0;
> + req->terminate = true;
> + }
> +
> + virMutexUnlock(&pendingLearnReqLock);
> + }
> +
> + return rc;
> +}
> +
>
> virNWFilterIPAddrLearnReqPtr
> virNWFilterLookupLearnReq(int ifindex) {
> @@ -472,7 +497,7 @@ learnIPAddressThread(void *arg)
>
> if (!packet) {
>
> - if (threadsTerminate) {
> + if (threadsTerminate || req->terminate) {
> req->status = ECANCELED;
> showError = false;
> break;
> Index: libvirt-acl/src/nwfilter/nwfilter_gentech_driver.c
> ===================================================================
> --- libvirt-acl.orig/src/nwfilter/nwfilter_gentech_driver.c
> +++ libvirt-acl/src/nwfilter/nwfilter_gentech_driver.c
> @@ -937,10 +937,18 @@ _virNWFilterTeardownFilter(const char *i
> drvname);
> return 1;
> }
> +
> + virNWFilterTerminateLearnReq(ifname);
> +
> + if (virNWFilterLockIface(ifname))
> + return 1;
> +
> techdriver->allTeardown(ifname);
>
> virNWFilterDelIpAddrForIfname(ifname);
>
> + virNWFilterUnlockIface(ifname);
> +
> return 0;
> }
>
> Index: libvirt-acl/src/nwfilter/nwfilter_learnipaddr.h
> ===================================================================
> --- libvirt-acl.orig/src/nwfilter/nwfilter_learnipaddr.h
> +++ libvirt-acl/src/nwfilter/nwfilter_learnipaddr.h
> @@ -46,6 +46,7 @@ struct _virNWFilterIPAddrLearnReq {
>
> int status;
> pthread_t thread;
> + volatile bool terminate;
> };
>
> int virNWFilterLearnIPAddress(virNWFilterTechDriverPtr techdriver,
>
ACK,
Daniel
--
Daniel Veillard | libxml Gnome XML XSLT toolkit http://xmlsoft.org/
daniel at veillard.com | Rpmfind RPM search engine http://rpmfind.net/
http://veillard.com/ | virtualization library http://libvirt.org/
More information about the libvir-list
mailing list