Re: [PATCH v5 02/24] include: define constant for early constructor priority

Daniel P. Berrangé <[email protected]>
Newsgroups org.nongnu.qemu-rust,org.nongnu.qemu-devel
Message-ID <[email protected]>
On Fri, Jan 09, 2026 at 12:39:59PM +0100, Paolo Bonzini wrote:
> On 1/8/26 18:03, Daniel P. Berrangé wrote:
> > Functions marked with __attribute__((__constructor__)) will be
> > invoked in linker order. In theory this is well defined, but
> > in practice, it is hard to determine what this order will be
> > with the layers of indirection through meson, ninja and the
> > static libraries QEMU builds.
> > 
> > Notably, the order currently appears different between Linux
> > and Windows (as tested with Wine on Linux). This can cause
> > problems when certain QEMU constructors have a dependancy on
> > other QEMU constructors.
> 
> What dependency are you seeing, or introducing?
> 
> In theory QEMU constructors should not have any dependency, as we only use
> them to initialize static data structures (such as the various *_init
> macros).
> 
> Not an objection, but I'd like to understand this better.

See the commit message in patch 2.   Essentially the RCU thread
gets spawned from a constructor, and if anything it does results
in an error_report() call, it will trigger use of monitor APIs
before the monitor constructor has had a chance to run.

IMHO the root problem is that it is pretty dubious for us to be
spawning the RCU thread from a constructor. Constructors should
be limited to minimal initialization of state. Spawning threads
is outside the boundary of what I'd consider reasonable for
a constructor todo. I didn't want try to tackle refactoring the
RCU thread creation though, hence this gross workaround.

> 
> Paolo
> 
> > To address this define a QEMU_CONSTRUCTOR_EARLY constant which
> > provides a priority value that will run before other default
> > constructors. This is to be used for QEMU constructors that
> > are themselves self-contained, but may be relied upon by other
> > constructors.
> > 
> > Reviewed-by: Richard Henderson <[email protected]>
> > Reviewed-by: Dr. David Alan Gilbert <[email protected]>
> > Signed-off-by: Daniel P. Berrangé <[email protected]>
> > ---
> >   include/qemu/compiler.h | 8 ++++++++
> >   1 file changed, 8 insertions(+)
> > 
> > diff --git a/include/qemu/compiler.h b/include/qemu/compiler.h
> > index 1c2b673c05..4c49f52eb0 100644
> > --- a/include/qemu/compiler.h
> > +++ b/include/qemu/compiler.h
> > @@ -194,6 +194,14 @@
> >   # define QEMU_USED
> >   #endif
> > +/*
> > + * A priority for __attribute__((constructor(...))) that
> > + * will run earlier than the default constructors. Must
> > + * only be used for functions that have no dependency
> > + * on global initialization of other QEMU subsystems.
> > + */
> > +#define QEMU_CONSTRUCTOR_EARLY 101
> > +
> >   /*
> >    * Disable -ftrivial-auto-var-init on a local variable.
> >    *
> 

With 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 :|
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.