[PATCH 1/3] virthreadpool: Allow setting identity for workers
Daniel P. Berrangé
berrange at redhat.com
Tue Oct 26 14:39:33 UTC 2021
On Tue, Oct 26, 2021 at 12:17:06PM +0200, Michal Privoznik wrote:
> In some cases the worker func running inside the pool may rely on
> virIdentity. While worker func could check for identity and set
> one it is not optimal - it may not have access to the identity of
> the thread creating the pool and thus would have to call
> virIdentityGetSystem(). Allow passing identity when creating the
> pool.
I wonder if we should have an identity passed via virThreadPoolSendJob,
so whatever queues the job can preserve its identity ?
>
> Signed-off-by: Michal Privoznik <mprivozn at redhat.com>
> ---
> src/nwfilter/nwfilter_dhcpsnoop.c | 1 +
> src/qemu/qemu_driver.c | 4 +++-
> src/rpc/virnetserver.c | 1 +
> src/util/virthreadpool.c | 12 ++++++++++++
> src/util/virthreadpool.h | 12 +++++++-----
> 5 files changed, 24 insertions(+), 6 deletions(-)
>
> diff --git a/src/nwfilter/nwfilter_dhcpsnoop.c b/src/nwfilter/nwfilter_dhcpsnoop.c
> index 4b62a7b661..b0297f0741 100644
> --- a/src/nwfilter/nwfilter_dhcpsnoop.c
> +++ b/src/nwfilter/nwfilter_dhcpsnoop.c
> @@ -1333,6 +1333,7 @@ virNWFilterDHCPSnoopThread(void *req0)
> worker = virThreadPoolNewFull(1, 1, 0,
> virNWFilterDHCPDecodeWorker,
> "dhcp-decode",
> + NULL,
> req);
> }
>
> diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
> index 6997dc7dea..a8bf0ecc6f 100644
> --- a/src/qemu/qemu_driver.c
> +++ b/src/qemu/qemu_driver.c
> @@ -914,7 +914,9 @@ qemuStateInitialize(bool privileged,
> * running domains since there might occur some QEMU monitor
> * events that will be dispatched to the worker pool */
> qemu_driver->workerPool = virThreadPoolNewFull(0, 1, 0, qemuProcessEventHandler,
> - "qemu-event", qemu_driver);
> + "qemu-event",
> + NULL,
> + qemu_driver);
> if (!qemu_driver->workerPool)
> goto error;
>
> diff --git a/src/rpc/virnetserver.c b/src/rpc/virnetserver.c
> index dc8f32b095..c7b4939398 100644
> --- a/src/rpc/virnetserver.c
> +++ b/src/rpc/virnetserver.c
> @@ -378,6 +378,7 @@ virNetServer *virNetServerNew(const char *name,
> priority_workers,
> virNetServerHandleJob,
> "rpc-worker",
> + NULL,
> srv)))
> goto error;
>
> diff --git a/src/util/virthreadpool.c b/src/util/virthreadpool.c
> index 92b7cac286..7bf4333885 100644
> --- a/src/util/virthreadpool.c
> +++ b/src/util/virthreadpool.c
> @@ -55,6 +55,8 @@ struct _virThreadPool {
> virThreadPoolJobList jobList;
> size_t jobQueueDepth;
>
> + virIdentity *identity;
> +
> virMutex mutex;
> virCond cond;
> virCond quit_cond;
> @@ -99,6 +101,9 @@ static void virThreadPoolWorker(void *opaque)
>
> virMutexLock(&pool->mutex);
>
> + if (pool->identity)
> + virIdentitySetCurrent(pool->identity);
> +
> while (1) {
> /* In order to support async worker termination, we need ensure that
> * both busy and free workers know if they need to terminated. Thus,
> @@ -219,6 +224,7 @@ virThreadPoolNewFull(size_t minWorkers,
> size_t prioWorkers,
> virThreadPoolJobFunc func,
> const char *name,
> + virIdentity *identity,
> void *opaque)
> {
> virThreadPool *pool;
> @@ -234,6 +240,9 @@ virThreadPoolNewFull(size_t minWorkers,
> pool->jobName = name;
> pool->jobOpaque = opaque;
>
> + if (identity)
> + pool->identity = g_object_ref(identity);
> +
> if (virMutexInit(&pool->mutex) < 0)
> goto error;
> if (virCondInit(&pool->cond) < 0)
> @@ -300,6 +309,9 @@ void virThreadPoolFree(virThreadPool *pool)
> virMutexLock(&pool->mutex);
> virThreadPoolDrainLocked(pool);
>
> + if (pool->identity)
> + g_object_unref(pool->identity);
> +
> g_free(pool->workers);
> virMutexUnlock(&pool->mutex);
> virMutexDestroy(&pool->mutex);
> diff --git a/src/util/virthreadpool.h b/src/util/virthreadpool.h
> index 619d128e9a..c6b9f31916 100644
> --- a/src/util/virthreadpool.h
> +++ b/src/util/virthreadpool.h
> @@ -22,17 +22,19 @@
> #pragma once
>
> #include "internal.h"
> +#include "viridentity.h"
>
> typedef struct _virThreadPool virThreadPool;
>
> typedef void (*virThreadPoolJobFunc)(void *jobdata, void *opaque);
>
> virThreadPool *virThreadPoolNewFull(size_t minWorkers,
> - size_t maxWorkers,
> - size_t prioWorkers,
> - virThreadPoolJobFunc func,
> - const char *name,
> - void *opaque) ATTRIBUTE_NONNULL(4);
> + size_t maxWorkers,
> + size_t prioWorkers,
> + virThreadPoolJobFunc func,
> + const char *name,
> + virIdentity *identity,
> + void *opaque) ATTRIBUTE_NONNULL(4);
>
> size_t virThreadPoolGetMinWorkers(virThreadPool *pool);
> size_t virThreadPoolGetMaxWorkers(virThreadPool *pool);
> --
> 2.32.0
>
Regards,
Daniel
--
|: https://berrange.com -o- https://www.flickr.com/photos/dberrange :|
|: https://libvirt.org -o- https://fstop138.berrange.com :|
|: https://entangle-photo.org -o- https://www.instagram.com/dberrange :|
More information about the libvir-list
mailing list