On Mon, Sep 05, 2022 at 01:25:29PM +0200, Laszlo Ersek wrote:
> Introduce a checkbox that lets the user choose between options (a) and
> (b), as outlined in one of the previous patches in this series. When the
> checkbox is ticked -- that is, the fully populated physical topology is
> copied --, make the VCPU count text entry insensitive, and overwrite its
> contents with the value calculated from the physical topology. Upon
> unticking the checkbox, restore the last manual entry.
> 
> The VCPU limit warning applies automatically when the checkbox is toggled,
> because when the VCPU count text entry is programmatically modified, the
> entry emits the "changed" signal, and that chains to
> vcpus_or_memory_check_callback().
> 
> However, in show_conversion_dialog(), we need to handle the case of option
> (a) potentially becoming the default. In that case we have to render the
> VCPU count text entry insensitive immediately, and overwrite its contents
> (set originally from the *online* logical processor count, or on the
> kernel command line) with the full population count derived from the
> topology. For this, call vcpu_topo_toggled() manually. This in turn may
> (as it should) trigger the VCPU limit warning at once, handled by the
> vcpus_or_memory_check_callback() call right after.
> 
> Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1590721
> Signed-off-by: Laszlo Ersek <ler...@redhat.com>
> ---
>  gui.c | 47 +++++++++++++++++++-
>  1 file changed, 45 insertions(+), 2 deletions(-)
> 
> diff --git a/gui.c b/gui.c
> index eeb15a096351..b734f1bda8be 100644
> --- a/gui.c
> +++ b/gui.c
> @@ -121,12 +121,13 @@ static GtkWidget *conn_dlg,
>  
>  /* The conversion dialog. */
>  static GtkWidget *conv_dlg,
> -  *guestname_entry, *vcpus_entry, *memory_entry,
> +  *guestname_entry, *vcpu_topo, *vcpus_entry, *memory_entry,
>    *vcpus_warning, *memory_warning, *target_warning_label,
>    *o_combo, *oc_entry, *os_entry, *of_entry, *oa_combo,
>    *info_label,
>    *disks_list, *removable_list, *interfaces_list,
>    *start_button;
> +static int vcpus_entry_when_last_sensitive;
>  
>  /* The running dialog which is displayed when virt-v2v is running. */
>  static GtkWidget *run_dlg,
> @@ -690,8 +691,10 @@ static void set_removable_from_ui (struct config *);
>  static void set_interfaces_from_ui (struct config *);
>  static void conversion_back_clicked (GtkWidget *w, gpointer data);
>  static void start_conversion_clicked (GtkWidget *w, gpointer data);
> +static void vcpu_topo_toggled (GtkWidget *w, gpointer data);
>  static void vcpus_or_memory_check_callback (GtkWidget *w, gpointer data);
>  static void notify_ui_callback (int type, const char *data);
> +static bool get_dense_topo_from_conv_dlg (void);
>  static int get_vcpus_from_conv_dlg (void);
>  static uint64_t get_memory_from_conv_dlg (void);
>  
> @@ -756,7 +759,7 @@ create_conversion_dialog (struct config *config)
>  
>    vbox_new (target_vbox, FALSE, 1);
>  
> -  table_new (target_tbl, 3, 3);
> +  table_new (target_tbl, 4, 3);
>    row = 0;
>    guestname_label = gtk_label_new_with_mnemonic (_("_Name:"));
>    table_attach (target_tbl, guestname_label,
> @@ -769,6 +772,13 @@ create_conversion_dialog (struct config *config)
>    table_attach (target_tbl, guestname_entry,
>                  1, 2, row, GTK_FILL, GTK_FILL, 1, 1);
>  
> +  row++;
> +  vcpu_topo = gtk_check_button_new_with_mnemonic (
> +                _("Copy fully populated _pCPU topology"));
> +  gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (vcpu_topo),
> +                                config->vcpu.dense_topo);
> +  table_attach (target_tbl, vcpu_topo, 0, 2, row, GTK_FILL, GTK_FILL, 1, 1);
> +
>    row++;
>    vcpus_label = gtk_label_new_with_mnemonic (_("# _vCPUs:"));
>    table_attach (target_tbl, vcpus_label,
> @@ -778,6 +788,7 @@ create_conversion_dialog (struct config *config)
>    gtk_label_set_mnemonic_widget (GTK_LABEL (vcpus_label), vcpus_entry);
>    snprintf (vcpus_str, sizeof vcpus_str, "%d", config->vcpu.cores);
>    gtk_entry_set_text (GTK_ENTRY (vcpus_entry), vcpus_str);
> +  vcpus_entry_when_last_sensitive = config->vcpu.cores;
>    table_attach (target_tbl, vcpus_entry,
>                  1, 2, row, GTK_FILL, GTK_FILL, 1, 1);
>    vcpus_warning = gtk_image_new_from_stock (GTK_STOCK_DIALOG_WARNING,
> @@ -970,6 +981,8 @@ create_conversion_dialog (struct config *config)
>                      G_CALLBACK (conversion_back_clicked), NULL);
>    g_signal_connect (G_OBJECT (start_button), "clicked",
>                      G_CALLBACK (start_conversion_clicked), config);
> +  g_signal_connect (G_OBJECT (vcpu_topo), "toggled",
> +                    G_CALLBACK (vcpu_topo_toggled), NULL);
>    g_signal_connect (G_OBJECT (vcpus_entry), "changed",
>                      G_CALLBACK (vcpus_or_memory_check_callback), NULL);
>    g_signal_connect (G_OBJECT (memory_entry), "changed",
> @@ -988,6 +1001,7 @@ show_conversion_dialog (void)
>  
>    /* Show the conversion dialog. */
>    gtk_widget_show_all (conv_dlg);
> +  vcpu_topo_toggled (NULL, NULL);
>    vcpus_or_memory_check_callback (NULL, NULL);
>  
>    /* output_drivers may have been updated, so repopulate o_combo. */
> @@ -1534,6 +1548,28 @@ concat_warning (char *warning, const char *fs, ...)
>    return warning;
>  }
>  
> +static void
> +vcpu_topo_toggled (GtkWidget *w, gpointer data)
> +{
> +  bool dense_topo;
> +  unsigned vcpus;
> +  char vcpus_str[64];
> +
> +  dense_topo = get_dense_topo_from_conv_dlg ();
> +  if (dense_topo) {
> +    struct cpu_topo topo;
> +
> +    get_cpu_topology (&topo);
> +    vcpus = topo.sockets * topo.cores * topo.threads;
> +    vcpus_entry_when_last_sensitive = get_vcpus_from_conv_dlg ();
> +  } else
> +    vcpus = vcpus_entry_when_last_sensitive;
> +
> +  snprintf (vcpus_str, sizeof vcpus_str, "%u", vcpus);
> +  gtk_entry_set_text (GTK_ENTRY (vcpus_entry), vcpus_str);
> +  gtk_widget_set_sensitive (vcpus_entry, !dense_topo);
> +}
> +
>  /**
>   * Display a warning if the vCPUs or memory is outside the supported
>   * range (L<https://bugzilla.redhat.com/823758>).
> @@ -1577,6 +1613,12 @@ vcpus_or_memory_check_callback (GtkWidget *w, gpointer 
> data)
>      gtk_label_set_text (GTK_LABEL (target_warning_label), "");
>  }
>  
> +static bool
> +get_dense_topo_from_conv_dlg (void)
> +{
> +  return gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (vcpu_topo));
> +}
> +
>  static int
>  get_vcpus_from_conv_dlg (void)
>  {
> @@ -2025,6 +2067,7 @@ start_conversion_clicked (GtkWidget *w, gpointer data)
>      return;
>    }
>  
> +  config->vcpu.dense_topo = get_dense_topo_from_conv_dlg ();
>    config->vcpu.cores = get_vcpus_from_conv_dlg ();
>    config->memory = get_memory_from_conv_dlg ();
>  

Reviewed-by: Richard W.M. Jones <rjo...@redhat.com>

Rich.

-- 
Richard Jones, Virtualization Group, Red Hat http://people.redhat.com/~rjones
Read my programming and virtualization blog: http://rwmj.wordpress.com
virt-top is 'top' for virtual machines.  Tiny program with many
powerful monitoring features, net stats, disk stats, logging, etc.
http://people.redhat.com/~rjones/virt-top
_______________________________________________
Libguestfs mailing list
Libguestfs@redhat.com
https://listman.redhat.com/mailman/listinfo/libguestfs

Reply via email to