diff mbox series

[22/29] vl: initialize displays before preconfig loop

Message ID 20201027182144.3315885-23-pbonzini@redhat.com (mailing list archive)
State New, archived
Headers show
Series cleanup qemu_init and make sense of command line processing | expand

Commit Message

Paolo Bonzini Oct. 27, 2020, 6:21 p.m. UTC
Displays should be available before the monitor starts, so that
it is possible to use the graphical console to interact with
the monitor itself.

This patch is quite ugly, but all this is temporary.  The double
call to qemu_init_displays will go away as soon we can unify machine
initialization between the preconfig and "normal" flows, and so will
the preconfig_exit_requested variable (that is only preconfig_requested
remains).

Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
---
 softmmu/vl.c | 58 ++++++++++++++++++++++++++++++++--------------------
 1 file changed, 36 insertions(+), 22 deletions(-)

Comments

Igor Mammedov Nov. 20, 2020, 3:11 p.m. UTC | #1
On Tue, 27 Oct 2020 14:21:37 -0400
Paolo Bonzini <pbonzini@redhat.com> wrote:

> Displays should be available before the monitor starts, so that
> it is possible to use the graphical console to interact with
> the monitor itself.
> 
> This patch is quite ugly, but all this is temporary.  The double
> call to qemu_init_displays will go away as soon we can unify machine
> initialization between the preconfig and "normal" flows, and so will
> the preconfig_exit_requested variable (that is only preconfig_requested
> remains).
> 
> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>

Doesn't apply to yer for-6.0 branch

> ---
>  softmmu/vl.c | 58 ++++++++++++++++++++++++++++++++--------------------
>  1 file changed, 36 insertions(+), 22 deletions(-)
> 
> diff --git a/softmmu/vl.c b/softmmu/vl.c
> index 1485aba8be..a46f1b9164 100644
> --- a/softmmu/vl.c
> +++ b/softmmu/vl.c
> @@ -137,6 +137,7 @@ static ram_addr_t maxram_size;
>  static uint64_t ram_slots;
>  static int display_remote;
>  static int snapshot;
> +static bool preconfig_requested;
>  static QemuPluginList plugin_list = QTAILQ_HEAD_INITIALIZER(plugin_list);
>  static BlockdevOptionsQueue bdo_queue = QSIMPLEQ_HEAD_INITIALIZER(bdo_queue);
>  static bool nographic = false;
> @@ -3210,12 +3211,12 @@ static void qemu_validate_options(void)
>            }
>      }
>  
> -    if (loadvm && !preconfig_exit_requested) {
> +    if (loadvm && preconfig_requested) {
>          error_report("'preconfig' and 'loadvm' options are "
>                       "mutually exclusive");
>          exit(EXIT_FAILURE);
>      }
> -    if (incoming && !preconfig_exit_requested) {
> +    if (incoming && preconfig_requested) {
>          error_report("'preconfig' and 'incoming' options are "
>                       "mutually exclusive");
>          exit(EXIT_FAILURE);
> @@ -3381,6 +3382,28 @@ static void qemu_init_subsystems(void)
>      socket_init();
>  }
>  
> +static void qemu_init_displays(void)
> +{
> +    DisplayState *ds;
> +
> +    /* init local displays */
> +    ds = init_displaystate();
> +    qemu_display_init(ds, &dpy);
> +
> +    /* must be after terminal init, SDL library changes signal handlers */
> +    os_setup_signal_handling();
> +
> +    /* init remote displays */
> +#ifdef CONFIG_VNC
> +    qemu_opts_foreach(qemu_find_opts("vnc"),
> +                      vnc_init_func, NULL, &error_fatal);
> +#endif
> +
> +    if (using_spice) {
> +        qemu_spice.display_init();
> +    }
> +}
> +
>  /*
>   * Called after leaving preconfig state.  From here on runstate is
>   * RUN_STATE_PRELAUNCH or RUN_STATE_INMIGRATE.
> @@ -3449,8 +3472,6 @@ static void qemu_create_cli_devices(void)
>  
>  static void qemu_machine_creation_done(void)
>  {
> -    DisplayState *ds;
> -
>      cpu_synchronize_all_post_init();
>  
>      /* Did we create any drives that we failed to create a device for? */
> @@ -3473,23 +3494,6 @@ static void qemu_machine_creation_done(void)
>          qemu_register_reset(restore_boot_order, g_strdup(boot_order));
>      }
>  
> -    /* init local displays */
> -    ds = init_displaystate();
> -    qemu_display_init(ds, &dpy);
> -
> -    /* must be after terminal init, SDL library changes signal handlers */
> -    os_setup_signal_handling();
> -
> -    /* init remote displays */
> -#ifdef CONFIG_VNC
> -    qemu_opts_foreach(qemu_find_opts("vnc"),
> -                      vnc_init_func, NULL, &error_fatal);
> -#endif
> -
> -    if (using_spice) {
> -        qemu_spice.display_init();
> -    }
> -
>      if (foreach_device_config(DEV_GDB, gdbserver_start) < 0) {
>          exit(1);
>      }
> @@ -4094,6 +4098,7 @@ void qemu_init(int argc, char **argv, char **envp)
>                  break;
>              case QEMU_OPTION_preconfig:
>                  preconfig_exit_requested = false;
> +                preconfig_requested = true;
>                  break;
>              case QEMU_OPTION_enable_kvm:
>                  olist = qemu_find_opts("machine");
> @@ -4515,11 +4520,20 @@ void qemu_init(int argc, char **argv, char **envp)
>      qemu_resolve_machine_memdev();
>      parse_numa_opts(current_machine);
>  
> +    if (preconfig_requested) {
> +        qemu_init_displays();
> +    }
> +
>      /* do monitor/qmp handling at preconfig state if requested */
>      qemu_main_loop();
> -
>      qemu_finish_machine_init();
> +
>      qemu_create_cli_devices();
> +
> +    /* initialize displays after all errors have been reported */
> +    if (!preconfig_requested) {
> +        qemu_init_displays();
> +    }
>      qemu_machine_creation_done();
>  
>      if (loadvm) {
Paolo Bonzini Nov. 20, 2020, 3:53 p.m. UTC | #2
On 20/11/20 16:11, Igor Mammedov wrote:
> On Tue, 27 Oct 2020 14:21:37 -0400
> Paolo Bonzini <pbonzini@redhat.com> wrote:
> 
>> Displays should be available before the monitor starts, so that
>> it is possible to use the graphical console to interact with
>> the monitor itself.
>>
>> This patch is quite ugly, but all this is temporary.  The double
>> call to qemu_init_displays will go away as soon we can unify machine
>> initialization between the preconfig and "normal" flows, and so will
>> the preconfig_exit_requested variable (that is only preconfig_requested
>> remains).
>>
>> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
> 
> Doesn't apply to yer for-6.0 branch

I updated the branch.

Thanks,

Paolo

>> ---
>>   softmmu/vl.c | 58 ++++++++++++++++++++++++++++++++--------------------
>>   1 file changed, 36 insertions(+), 22 deletions(-)
>>
>> diff --git a/softmmu/vl.c b/softmmu/vl.c
>> index 1485aba8be..a46f1b9164 100644
>> --- a/softmmu/vl.c
>> +++ b/softmmu/vl.c
>> @@ -137,6 +137,7 @@ static ram_addr_t maxram_size;
>>   static uint64_t ram_slots;
>>   static int display_remote;
>>   static int snapshot;
>> +static bool preconfig_requested;
>>   static QemuPluginList plugin_list = QTAILQ_HEAD_INITIALIZER(plugin_list);
>>   static BlockdevOptionsQueue bdo_queue = QSIMPLEQ_HEAD_INITIALIZER(bdo_queue);
>>   static bool nographic = false;
>> @@ -3210,12 +3211,12 @@ static void qemu_validate_options(void)
>>             }
>>       }
>>   
>> -    if (loadvm && !preconfig_exit_requested) {
>> +    if (loadvm && preconfig_requested) {
>>           error_report("'preconfig' and 'loadvm' options are "
>>                        "mutually exclusive");
>>           exit(EXIT_FAILURE);
>>       }
>> -    if (incoming && !preconfig_exit_requested) {
>> +    if (incoming && preconfig_requested) {
>>           error_report("'preconfig' and 'incoming' options are "
>>                        "mutually exclusive");
>>           exit(EXIT_FAILURE);
>> @@ -3381,6 +3382,28 @@ static void qemu_init_subsystems(void)
>>       socket_init();
>>   }
>>   
>> +static void qemu_init_displays(void)
>> +{
>> +    DisplayState *ds;
>> +
>> +    /* init local displays */
>> +    ds = init_displaystate();
>> +    qemu_display_init(ds, &dpy);
>> +
>> +    /* must be after terminal init, SDL library changes signal handlers */
>> +    os_setup_signal_handling();
>> +
>> +    /* init remote displays */
>> +#ifdef CONFIG_VNC
>> +    qemu_opts_foreach(qemu_find_opts("vnc"),
>> +                      vnc_init_func, NULL, &error_fatal);
>> +#endif
>> +
>> +    if (using_spice) {
>> +        qemu_spice.display_init();
>> +    }
>> +}
>> +
>>   /*
>>    * Called after leaving preconfig state.  From here on runstate is
>>    * RUN_STATE_PRELAUNCH or RUN_STATE_INMIGRATE.
>> @@ -3449,8 +3472,6 @@ static void qemu_create_cli_devices(void)
>>   
>>   static void qemu_machine_creation_done(void)
>>   {
>> -    DisplayState *ds;
>> -
>>       cpu_synchronize_all_post_init();
>>   
>>       /* Did we create any drives that we failed to create a device for? */
>> @@ -3473,23 +3494,6 @@ static void qemu_machine_creation_done(void)
>>           qemu_register_reset(restore_boot_order, g_strdup(boot_order));
>>       }
>>   
>> -    /* init local displays */
>> -    ds = init_displaystate();
>> -    qemu_display_init(ds, &dpy);
>> -
>> -    /* must be after terminal init, SDL library changes signal handlers */
>> -    os_setup_signal_handling();
>> -
>> -    /* init remote displays */
>> -#ifdef CONFIG_VNC
>> -    qemu_opts_foreach(qemu_find_opts("vnc"),
>> -                      vnc_init_func, NULL, &error_fatal);
>> -#endif
>> -
>> -    if (using_spice) {
>> -        qemu_spice.display_init();
>> -    }
>> -
>>       if (foreach_device_config(DEV_GDB, gdbserver_start) < 0) {
>>           exit(1);
>>       }
>> @@ -4094,6 +4098,7 @@ void qemu_init(int argc, char **argv, char **envp)
>>                   break;
>>               case QEMU_OPTION_preconfig:
>>                   preconfig_exit_requested = false;
>> +                preconfig_requested = true;
>>                   break;
>>               case QEMU_OPTION_enable_kvm:
>>                   olist = qemu_find_opts("machine");
>> @@ -4515,11 +4520,20 @@ void qemu_init(int argc, char **argv, char **envp)
>>       qemu_resolve_machine_memdev();
>>       parse_numa_opts(current_machine);
>>   
>> +    if (preconfig_requested) {
>> +        qemu_init_displays();
>> +    }
>> +
>>       /* do monitor/qmp handling at preconfig state if requested */
>>       qemu_main_loop();
>> -
>>       qemu_finish_machine_init();
>> +
>>       qemu_create_cli_devices();
>> +
>> +    /* initialize displays after all errors have been reported */
>> +    if (!preconfig_requested) {
>> +        qemu_init_displays();
>> +    }
>>       qemu_machine_creation_done();
>>   
>>       if (loadvm) {
>
Igor Mammedov Nov. 20, 2020, 4:32 p.m. UTC | #3
On Fri, 20 Nov 2020 16:53:41 +0100
Paolo Bonzini <pbonzini@redhat.com> wrote:

> On 20/11/20 16:11, Igor Mammedov wrote:
> > On Tue, 27 Oct 2020 14:21:37 -0400
> > Paolo Bonzini <pbonzini@redhat.com> wrote:
> >   
> >> Displays should be available before the monitor starts, so that
> >> it is possible to use the graphical console to interact with
> >> the monitor itself.
> >>
> >> This patch is quite ugly, but all this is temporary.  The double
> >> call to qemu_init_displays will go away as soon we can unify machine
> >> initialization between the preconfig and "normal" flows, and so will
> >> the preconfig_exit_requested variable (that is only preconfig_requested
> >> remains).
> >>
> >> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>  
> > 
> > Doesn't apply to yer for-6.0 branch  
> 
> I updated the branch.

it probably won't help,
what I do review/test is drop these patches on branch
and reapply them from this thread.
Having v2 on list that applies to master would be better.

> Thanks,
> 
> Paolo
> 
[...]
Paolo Bonzini Nov. 20, 2020, 4:46 p.m. UTC | #4
On 20/11/20 17:32, Igor Mammedov wrote:
> On Fri, 20 Nov 2020 16:53:41 +0100
> Paolo Bonzini <pbonzini@redhat.com> wrote:
> 
>> On 20/11/20 16:11, Igor Mammedov wrote:
>>> On Tue, 27 Oct 2020 14:21:37 -0400
>>> Paolo Bonzini <pbonzini@redhat.com> wrote:
>>>    
>>>> Displays should be available before the monitor starts, so that
>>>> it is possible to use the graphical console to interact with
>>>> the monitor itself.
>>>>
>>>> This patch is quite ugly, but all this is temporary.  The double
>>>> call to qemu_init_displays will go away as soon we can unify machine
>>>> initialization between the preconfig and "normal" flows, and so will
>>>> the preconfig_exit_requested variable (that is only preconfig_requested
>>>> remains).
>>>>
>>>> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
>>>
>>> Doesn't apply to yer for-6.0 branch
>>
>> I updated the branch.
> 
> it probably won't help,
> what I do review/test is drop these patches on branch
> and reapply them from this thread.
> Having v2 on list that applies to master would be better.

Yes, of course.  I meant that the for-6.0 branch already _is_ the v2, 
I'll send it out as soon as I integrate all your feedback.

Thanks,

Paolo
Igor Mammedov Nov. 20, 2020, 5:11 p.m. UTC | #5
On Fri, 20 Nov 2020 17:46:14 +0100
Paolo Bonzini <pbonzini@redhat.com> wrote:

> On 20/11/20 17:32, Igor Mammedov wrote:
> > On Fri, 20 Nov 2020 16:53:41 +0100
> > Paolo Bonzini <pbonzini@redhat.com> wrote:
> >   
> >> On 20/11/20 16:11, Igor Mammedov wrote:  
> >>> On Tue, 27 Oct 2020 14:21:37 -0400
> >>> Paolo Bonzini <pbonzini@redhat.com> wrote:
> >>>      
> >>>> Displays should be available before the monitor starts, so that
> >>>> it is possible to use the graphical console to interact with
> >>>> the monitor itself.
> >>>>
> >>>> This patch is quite ugly, but all this is temporary.  The double
> >>>> call to qemu_init_displays will go away as soon we can unify machine
> >>>> initialization between the preconfig and "normal" flows, and so will
> >>>> the preconfig_exit_requested variable (that is only preconfig_requested
> >>>> remains).
> >>>>
> >>>> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>  
> >>>
> >>> Doesn't apply to yer for-6.0 branch  
> >>
> >> I updated the branch.  
> > 
> > it probably won't help,
> > what I do review/test is drop these patches on branch
> > and reapply them from this thread.
> > Having v2 on list that applies to master would be better.  
> 
> Yes, of course.  I meant that the for-6.0 branch already _is_ the v2, 
> I'll send it out as soon as I integrate all your feedback.

Thanks for trying to make hornets nest (vl.c) in something manageable and
less scary to touch.
I'll try to review v2 faster (there is not much of it left by now)

> 
> Thanks,
> 
> Paolo
> 
>
diff mbox series

Patch

diff --git a/softmmu/vl.c b/softmmu/vl.c
index 1485aba8be..a46f1b9164 100644
--- a/softmmu/vl.c
+++ b/softmmu/vl.c
@@ -137,6 +137,7 @@  static ram_addr_t maxram_size;
 static uint64_t ram_slots;
 static int display_remote;
 static int snapshot;
+static bool preconfig_requested;
 static QemuPluginList plugin_list = QTAILQ_HEAD_INITIALIZER(plugin_list);
 static BlockdevOptionsQueue bdo_queue = QSIMPLEQ_HEAD_INITIALIZER(bdo_queue);
 static bool nographic = false;
@@ -3210,12 +3211,12 @@  static void qemu_validate_options(void)
           }
     }
 
-    if (loadvm && !preconfig_exit_requested) {
+    if (loadvm && preconfig_requested) {
         error_report("'preconfig' and 'loadvm' options are "
                      "mutually exclusive");
         exit(EXIT_FAILURE);
     }
-    if (incoming && !preconfig_exit_requested) {
+    if (incoming && preconfig_requested) {
         error_report("'preconfig' and 'incoming' options are "
                      "mutually exclusive");
         exit(EXIT_FAILURE);
@@ -3381,6 +3382,28 @@  static void qemu_init_subsystems(void)
     socket_init();
 }
 
+static void qemu_init_displays(void)
+{
+    DisplayState *ds;
+
+    /* init local displays */
+    ds = init_displaystate();
+    qemu_display_init(ds, &dpy);
+
+    /* must be after terminal init, SDL library changes signal handlers */
+    os_setup_signal_handling();
+
+    /* init remote displays */
+#ifdef CONFIG_VNC
+    qemu_opts_foreach(qemu_find_opts("vnc"),
+                      vnc_init_func, NULL, &error_fatal);
+#endif
+
+    if (using_spice) {
+        qemu_spice.display_init();
+    }
+}
+
 /*
  * Called after leaving preconfig state.  From here on runstate is
  * RUN_STATE_PRELAUNCH or RUN_STATE_INMIGRATE.
@@ -3449,8 +3472,6 @@  static void qemu_create_cli_devices(void)
 
 static void qemu_machine_creation_done(void)
 {
-    DisplayState *ds;
-
     cpu_synchronize_all_post_init();
 
     /* Did we create any drives that we failed to create a device for? */
@@ -3473,23 +3494,6 @@  static void qemu_machine_creation_done(void)
         qemu_register_reset(restore_boot_order, g_strdup(boot_order));
     }
 
-    /* init local displays */
-    ds = init_displaystate();
-    qemu_display_init(ds, &dpy);
-
-    /* must be after terminal init, SDL library changes signal handlers */
-    os_setup_signal_handling();
-
-    /* init remote displays */
-#ifdef CONFIG_VNC
-    qemu_opts_foreach(qemu_find_opts("vnc"),
-                      vnc_init_func, NULL, &error_fatal);
-#endif
-
-    if (using_spice) {
-        qemu_spice.display_init();
-    }
-
     if (foreach_device_config(DEV_GDB, gdbserver_start) < 0) {
         exit(1);
     }
@@ -4094,6 +4098,7 @@  void qemu_init(int argc, char **argv, char **envp)
                 break;
             case QEMU_OPTION_preconfig:
                 preconfig_exit_requested = false;
+                preconfig_requested = true;
                 break;
             case QEMU_OPTION_enable_kvm:
                 olist = qemu_find_opts("machine");
@@ -4515,11 +4520,20 @@  void qemu_init(int argc, char **argv, char **envp)
     qemu_resolve_machine_memdev();
     parse_numa_opts(current_machine);
 
+    if (preconfig_requested) {
+        qemu_init_displays();
+    }
+
     /* do monitor/qmp handling at preconfig state if requested */
     qemu_main_loop();
-
     qemu_finish_machine_init();
+
     qemu_create_cli_devices();
+
+    /* initialize displays after all errors have been reported */
+    if (!preconfig_requested) {
+        qemu_init_displays();
+    }
     qemu_machine_creation_done();
 
     if (loadvm) {