[libvirt PATCH 2/2] util: avoid glib event loop workaround where possible
Daniel P. Berrangé
berrange at redhat.com
Thu Nov 26 10:18:48 UTC 2020
On Wed, Nov 25, 2020 at 08:37:02PM +0100, Michal Prívozník wrote:
> On 11/25/20 7:04 PM, Daniel P. Berrangé wrote:
> > I previously did a workaround for a glib event loop race
> > that causes crashes:
> >
> > commit 0db4743645b7a0611a3c0687f834205c9956f7fc
> > Author: Daniel P. Berrangé <berrange at redhat.com>
> > Date: Tue Jul 28 16:52:47 2020 +0100
> >
> > util: avoid crash due to race in glib event loop code
> >
> > it turns out that the workaround has a significant performance
> > penalty on I/O intensive workloads. We thus need to avoid the
> > workaround if we know we have a new enough glib to avoid the
> > race condition.
> >
> > Signed-off-by: Daniel P. Berrangé <berrange at redhat.com>
> > ---
> > src/util/vireventglib.c | 29 +++++++++++++++++++++--------
> > 1 file changed, 21 insertions(+), 8 deletions(-)
> >
> > diff --git a/src/util/vireventglib.c b/src/util/vireventglib.c
> > index 6842c6e806..8c5495bfab 100644
> > --- a/src/util/vireventglib.c
> > +++ b/src/util/vireventglib.c
> > @@ -189,9 +189,21 @@ virEventGLibHandleFind(int watch)
> > * If the last reference to a GSource is released in a non-main
> > * thread we're exposed to a race condition that causes a
> > * crash:
> > - * https://gitlab.gnome.org/GNOME/glib/-/merge_requests/1358
> > - * Thus we're using an idle func to release our ref
> > + *
> > + * https://gitlab.gnome.org/GNOME/glib/-/merge_requests/1358
> > + *
> > + * Thus we're using an idle func to release our ref...
> > + *
> > + * ...but this imposes a significant performance penalty on
> > + * I/O intensive workloads which are sensitive to the iterations
> > + * of the event loop, so avoid the workaround if we know we have
> > + * new enough glib.
> > */
> > +#if GLIB_CHECK_VERSION(2, 64, 0)
> > +# define g_vir_source_unref_safe(source) g_source_unref(source)
> > +#else
> > +# define g_vir_source_unref_safe(source) g_idle_add(virEventGLibSourceUnrefIdle, source);
>
> s/;//
>
> > +
>
> Would something like the following be totally disgusting or only a bit?
>
> #if !GLIB_CHECK_VERSION(2, 64, 0)
> # define g_source_unref(source) g_idle_add(virEventGLibSourceUnrefIdle,
> source)
> #endif
>
> - g_idle_add(...);
> + g_source_unref(...);
>
>
> This way we could just drop the redefine once we upgrade min glib version.
it is possible, but the hack with g_idle_add is semantically different
enough from g_source_unref that I want people to know that something
unusal is going on when reading the code.
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