[libvirt] Re: [PATCH 1/3] Allow multiple monitor devices

Jan Kiszka jan.kiszka at siemens.com
Wed Apr 8 14:27:04 UTC 2009


Anthony Liguori wrote:
> Right now only one monitor device can be enabled at a time.  In order to support

I guess you are talking about -monitor provided instances here. There
can already be multiple instances (multiplexed ones or the one provided
via gdb).

> asynchronous notification of events, I would like to introduce a 'wait' command
> that waits for an event to occur.  This implies that we need an additional
> monitor session to allow commands to still be executed while waiting for an
> asynchronous notification.

Need to have a closer look at the actual patch later, but the
description confuses me. 'wait' itself makes sense, though.

Jan

> 
> Signed-off-by: Anthony Liguori <aliguori at us.ibm.com>
> 
> diff --git a/vl.c b/vl.c
> index 4bd173f..f78cabb 100644
> --- a/vl.c
> +++ b/vl.c
> @@ -184,6 +184,9 @@ int main(int argc, char **argv)
>  /* Max number of bluetooth switches on the commandline.  */
>  #define MAX_BT_CMDLINE 10
>  
> +/* Maximum number of monitor devices */
> +#define MAX_MONITOR_DEVICES 10
> +
>  /* XXX: use a two level table to limit memory usage */
>  #define MAX_IOPORTS 65536
>  
> @@ -4252,8 +4255,9 @@ int main(int argc, char **argv, char **envp)
>      int hda_index;
>      int optind;
>      const char *r, *optarg;
> -    CharDriverState *monitor_hd = NULL;
> -    const char *monitor_device;
> +    CharDriverState *monitor_hds[MAX_MONITOR_DEVICES];
> +    const char *monitor_devices[MAX_MONITOR_DEVICES];
> +    int monitor_device_index;
>      const char *serial_devices[MAX_SERIAL_PORTS];
>      int serial_device_index;
>      const char *parallel_devices[MAX_PARALLEL_PORTS];
> @@ -4324,7 +4328,6 @@ int main(int argc, char **argv, char **envp)
>      kernel_cmdline = "";
>      cyls = heads = secs = 0;
>      translation = BIOS_ATA_TRANSLATION_AUTO;
> -    monitor_device = "vc:80Cx24C";
>  
>      serial_devices[0] = "vc:80Cx24C";
>      for(i = 1; i < MAX_SERIAL_PORTS; i++)
> @@ -4340,6 +4343,11 @@ int main(int argc, char **argv, char **envp)
>          virtio_consoles[i] = NULL;
>      virtio_console_index = 0;
>  
> +    monitor_devices[0] = "vc:80Cx24C";
> +    for (i = 1; i < MAX_MONITOR_DEVICES; i++)
> +        monitor_devices[i] = NULL;
> +    monitor_device_index = 0;
> +
>      usb_devices_index = 0;
>  
>      nb_net_clients = 0;
> @@ -4723,7 +4731,12 @@ int main(int argc, char **argv, char **envp)
>                      break;
>                  }
>              case QEMU_OPTION_monitor:
> -                monitor_device = optarg;
> +                if (monitor_device_index >= MAX_MONITOR_DEVICES) {
> +                    fprintf(stderr, "qemu: too many monitor devices\n");
> +                    exit(1);
> +                }
> +                monitor_devices[monitor_device_index] = optarg;
> +                monitor_device_index++;
>                  break;
>              case QEMU_OPTION_serial:
>                  if (serial_device_index >= MAX_SERIAL_PORTS) {
> @@ -4974,8 +4987,8 @@ int main(int argc, char **argv, char **envp)
>             serial_devices[0] = "stdio";
>         if (parallel_device_index == 0)
>             parallel_devices[0] = "null";
> -       if (strncmp(monitor_device, "vc", 2) == 0)
> -           monitor_device = "stdio";
> +       if (strncmp(monitor_devices[0], "vc", 2) == 0)
> +           monitor_devices[0] = "stdio";
>      }
>  
>  #ifndef _WIN32
> @@ -5184,14 +5197,14 @@ int main(int argc, char **argv, char **envp)
>  #endif
>  
>      /* Maintain compatibility with multiple stdio monitors */
> -    if (!strcmp(monitor_device,"stdio")) {
> +    if (!strcmp(monitor_devices[0],"stdio")) {
>          for (i = 0; i < MAX_SERIAL_PORTS; i++) {
>              const char *devname = serial_devices[i];
>              if (devname && !strcmp(devname,"mon:stdio")) {
> -                monitor_device = NULL;
> +                monitor_devices[0] = NULL;
>                  break;
>              } else if (devname && !strcmp(devname,"stdio")) {
> -                monitor_device = NULL;
> +                monitor_devices[0] = NULL;
>                  serial_devices[i] = "mon:stdio";
>                  break;
>              }
> @@ -5208,11 +5221,20 @@ int main(int argc, char **argv, char **envp)
>          }
>      }
>  
> -    if (monitor_device) {
> -        monitor_hd = qemu_chr_open("monitor", monitor_device, NULL);
> -        if (!monitor_hd) {
> -            fprintf(stderr, "qemu: could not open monitor device '%s'\n", monitor_device);
> -            exit(1);
> +    for (i = 0; i < MAX_MONITOR_DEVICES; i++) {
> +        const char *devname = monitor_devices[i];
> +        if (devname && strcmp(devname, "none")) {
> +            char label[32];
> +            if (i == 0)
> +                snprintf(label, sizeof(label), "monitor");
> +            else
> +                snprintf(label, sizeof(label), "monitor%d", i);
> +            monitor_hds[i] = qemu_chr_open(label, devname, NULL);
> +            if (!monitor_hds[i]) {
> +                fprintf(stderr, "qemu: could not open monitor device '%s'\n",
> +                        devname);
> +                exit(1);
> +            }
>          }
>      }
>  
> @@ -5335,8 +5357,13 @@ int main(int argc, char **argv, char **envp)
>      text_consoles_set_display(display_state);
>      qemu_chr_initial_reset();
>  
> -    if (monitor_device && monitor_hd)
> -        monitor_init(monitor_hd, MONITOR_USE_READLINE | MONITOR_IS_DEFAULT);
> +    for (i = 0; i < MAX_MONITOR_DEVICES; i++) {
> +        if (monitor_devices[i] && monitor_hds[i]) {
> +            monitor_init(monitor_hds[i],
> +                         MONITOR_USE_READLINE |
> +                         ((i == 0) ? MONITOR_IS_DEFAULT : 0));
> +        }
> +    }
>  
>      for(i = 0; i < MAX_SERIAL_PORTS; i++) {
>          const char *devname = serial_devices[i];

-- 
Siemens AG, Corporate Technology, CT SE 2
Corporate Competence Center Embedded Linux




More information about the libvir-list mailing list