* Daniel P. Berrangé (berra...@redhat.com) wrote: > Some monitor functions, most notably, monitor_cur() rely on global > data being initialized by 'monitor_init_globals()'. The latter is > called relatively late in startup. If code triggers error_report() > before monitor_init_globals() is called, QEMU will abort when > accessing the uninitialized monitor mutex. > > The critical monitor global data must be initialized from a > constructor function, to improve the guarantee that it is done > before any possible calls to monitor_cur(). Not only that, but > the constructor must be marked to run before the default > constructor in case any of them trigger error reporting. > > Note in particular that the RCU constructor will spawn a background > thread so we might even have non-constructor QEMU code running > concurrently with other constructors. > > Signed-off-by: Daniel P. Berrangé <berra...@redhat.com>
Checked that qemu_mutex_init doesn't look like it can call error code; so Reviewed-by: Dr. David Alan Gilbert <d...@treblig.org> > --- > monitor/monitor.c | 14 +++++++++----- > 1 file changed, 9 insertions(+), 5 deletions(-) > > diff --git a/monitor/monitor.c b/monitor/monitor.c > index c5a5d30877..da54e1b1ce 100644 > --- a/monitor/monitor.c > +++ b/monitor/monitor.c > @@ -704,18 +704,22 @@ void monitor_cleanup(void) > } > } > > -static void monitor_qapi_event_init(void) > +/* > + * Initialize static vars that have no deps on external > + * module initialization, and are required for external > + * functions to call things like monitor_cur() > + */ > +static void __attribute__((__constructor__(QEMU_CONSTRUCTOR_EARLY))) > +monitor_init_static(void) > { > + qemu_mutex_init(&monitor_lock); > + coroutine_mon = g_hash_table_new(NULL, NULL); > monitor_qapi_event_state = g_hash_table_new(qapi_event_throttle_hash, > qapi_event_throttle_equal); > } > > void monitor_init_globals(void) > { > - monitor_qapi_event_init(); > - qemu_mutex_init(&monitor_lock); > - coroutine_mon = g_hash_table_new(NULL, NULL); > - > /* > * The dispatcher BH must run in the main loop thread, since we > * have commands assuming that context. It would be nice to get > -- > 2.50.1 > -- -----Open up your eyes, open up your mind, open up your code ------- / Dr. David Alan Gilbert | Running GNU/Linux | Happy \ \ dave @ treblig.org | | In Hex / \ _________________________|_____ http://www.treblig.org |_______/