[2/2] qdev: add command line option to set global defaults for properties.

Submitted by Gerd Hoffmann on Nov. 24, 2009, 11:06 a.m.

Details

Message ID 1259060788-17411-2-git-send-email-kraxel@redhat.com
State New
Headers show

Commit Message

Gerd Hoffmann Nov. 24, 2009, 11:06 a.m.
This patch adds infrastructure and command line option for setting
global defaults for device properties, i.e. you can for example use

  -global virtio-blk-pci.vectors=0

to turn off msi by default for all virtio block devices.  The config
file syntax is:

[global]
  driver = "virtio-blk-pci"
  property = "vectors"
  value = "0"

This can also be used to set properties for devices which are not
created via -device but implicitly via machine init, i.e.

  -global isa-fdc,driveA=<name>

This patch uses the mechanism which configures properties for the
compatibility machine types (pc-0.10 & friends).  The command line
takes precedence over the machine type values.

Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
---
 qemu-config.c   |   56 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
 qemu-config.h   |    2 +
 qemu-options.hx |    3 ++
 vl.c            |    6 +++++
 4 files changed, 67 insertions(+), 0 deletions(-)

Comments

Michael S. Tsirkin Nov. 24, 2009, 2:11 p.m.
On Tue, Nov 24, 2009 at 12:06:28PM +0100, Gerd Hoffmann wrote:
> This patch adds infrastructure and command line option for setting
> global defaults for device properties, i.e. you can for example use
> 
>   -global virtio-blk-pci.vectors=0
> 
> to turn off msi by default for all virtio block devices.  The config
> file syntax is:
> 
> [global]
>   driver = "virtio-blk-pci"
>   property = "vectors"
>   value = "0"

Where's this documented?

> This can also be used to set properties for devices which are not
> created via -device but implicitly via machine init, i.e.
> 
>   -global isa-fdc,driveA=<name>
> 

...

> diff --git a/qemu-options.hx b/qemu-options.hx
> index b65fd74..420b7d8 100644
> --- a/qemu-options.hx
> +++ b/qemu-options.hx
> @@ -109,6 +109,9 @@ DEF("set", HAS_ARG, QEMU_OPTION_set,
>      "-set group.id.arg=value\n"
>      "                set <arg> parameter for item <id> of type <group>\n"
>      "                i.e. -set drive.$id.file=/path/to/image\n")
> +DEF("global", HAS_ARG, QEMU_OPTION_global,
> +    "-global driver.property=value\n"
> +    "                set a global default for a driver property\n")
>  STEXI
>  @item -drive @var{option}[,@var{option}[,@var{option}[,...]]]

Let's add a hint on how to get the list of drivers and properties?
How would one figure out the command lines you give in
the examples above?
Gerd Hoffmann Nov. 25, 2009, 12:55 p.m.
On 11/24/09 15:11, Michael S. Tsirkin wrote:
> On Tue, Nov 24, 2009 at 12:06:28PM +0100, Gerd Hoffmann wrote:
>> This patch adds infrastructure and command line option for setting
>> global defaults for device properties, i.e. you can for example use
>>
>>    -global virtio-blk-pci.vectors=0
>>
>> to turn off msi by default for all virtio block devices.  The config
>> file syntax is:
>>
>> [global]
>>    driver = "virtio-blk-pci"
>>    property = "vectors"
>>    value = "0"
>
> Where's this documented?

config file syntax is git-style, the details are not (yet) documented.

Easiest way to get one if you want to play with it is
   "qemu <all-your-vm-options-here> -writeconfig <filename>".

Note that not all command line options are covered.

I've attached a sample to this mail.  Needs a few patches sent to the 
list yesterday and today to actually work though.

> How would one figure out the command lines you give in
> the examples above?

"info qtree" in monitor prints the device names and properties for all 
devices used by the virtual machine.

"info qdm" and '-device ?' list all devices known to qemu.  The device 
properties are not listed there though (one of the items on my todo list).

cheers,
   Gerd
# qemu config file

# The config file doesn't yet cover all possible options.
#
# minimum command line:
#   qemu -nodefaults -vga cirrus -readconfig $thisfile
#
# you might want to add these switches:
#   -enable-kvm -m <mem> -smp <cpus> -vnc <display> -monitor <chardev>
#
# create a new config file for your guest, for the bits already covered:
#   qemu <tons-of-switches-here> -writeconfig <name>.cfg

#####################################################
# host side configuration

[drive "hda"]
  if = "none"
  file = "/vmdisk/arch-x86.img"

[drive "hdc"]
  if = "none"
  media = "cdrom"

[drive "sda"]
  if = "none"
  file = "/vmdisk/test-lsi-1.img"

[drive "sdb"]
  if = "none"
  file = "/vmdisk/test-lsi-2.img"

[drive "vda"]
  if = "none"
  file = "/vmdisk/test-vio-1.img"

[chardev "ttyS0"]
  backend = "vc"
  cols = "100"
  rows = "50"

[netdev "eth0"]
  type = "user"

#####################################################
# guest devices

[device]
  driver = "ide-drive"
  bus = "ide.0"
  drive = "hda"

[device]
  driver = "ide-drive"
  bus = "ide.1"
  drive = "hdc"

[device]
  driver = "isa-serial"
  chardev = "ttyS0"

[device]
  driver = "e1000"
  netdev = "eth0"
  mac = "52:54:00:78:23:6f"
  addr = "06.0"

[device]
  driver = "AC97"
  addr = "05.0"

[device]
  driver = "virtio-balloon-pci"
  addr = "08.0"

[device]
  driver = "virtio-blk-pci"
  addr = "0c.0"
  drive = "vda"

[device "lsi"]
  driver = "lsi53c895a"
  addr = "0a.0"

[device]
  driver = "scsi-disk"
  bus = "lsi.0"
  scsi-id = "0"
  drive = "sda"

[device]
  driver = "scsi-disk"
  bus = "lsi.0"
  scsi-id = "2"
  drive = "sdb"
Michael S. Tsirkin Nov. 25, 2009, 1:18 p.m.
On Wed, Nov 25, 2009 at 01:55:18PM +0100, Gerd Hoffmann wrote:
> On 11/24/09 15:11, Michael S. Tsirkin wrote:
>> On Tue, Nov 24, 2009 at 12:06:28PM +0100, Gerd Hoffmann wrote:
>>> This patch adds infrastructure and command line option for setting
>>> global defaults for device properties, i.e. you can for example use
>>>
>>>    -global virtio-blk-pci.vectors=0
>>>
>>> to turn off msi by default for all virtio block devices.  The config
>>> file syntax is:
>>>
>>> [global]
>>>    driver = "virtio-blk-pci"
>>>    property = "vectors"
>>>    value = "0"
>>
>> Where's this documented?
>
> config file syntax is git-style, the details are not (yet) documented.
>
> Easiest way to get one if you want to play with it is
>   "qemu <all-your-vm-options-here> -writeconfig <filename>".
>
> Note that not all command line options are covered.
>
> I've attached a sample to this mail.  Needs a few patches sent to the  
> list yesterday and today to actually work though.
>
>> How would one figure out the command lines you give in
>> the examples above?
>
> "info qtree" in monitor prints the device names and properties for all  
> devices used by the virtual machine.
>
> "info qdm" and '-device ?' list all devices known to qemu.

So maybe add "use -device ? to get list of all devices"
to help text?

[mst@tuck qemu]$ ~/qemu-git/bin/qemu-system-x86_64 -device ?
/home/mst/qemu-git/bin/qemu-system-x86_64: invalid option -- '-device'
[mst@tuck qemu]$ ~/qemu-git/bin/qemu-system-x86_64 --device ?
/home/mst/qemu-git/bin/qemu-system-x86_64: invalid option -- '-device'

>  The device  
> properties are not listed there though (one of the items on my todo 
> list).

Yes, and in fact each option should supply a help text
explaining what it is. This was not done this way upfront
and each day makes it harder to document as new options
are added without documentation.


> cheers,
>   Gerd
Paul Brook Nov. 25, 2009, 2:03 p.m.
> So maybe add "use -device ? to get list of all devices"
> to help text?
> 
> [mst@tuck qemu]$ ~/qemu-git/bin/qemu-system-x86_64 -device ?
> /home/mst/qemu-git/bin/qemu-system-x86_64: invalid option -- '-device'

You need to stop your shell eating the ?

Paul

Patch hide | download patch | download mbox

diff --git a/qemu-config.c b/qemu-config.c
index 590fc05..e12b66c 100644
--- a/qemu-config.c
+++ b/qemu-config.c
@@ -2,6 +2,7 @@ 
 #include "qemu-option.h"
 #include "qemu-config.h"
 #include "sysemu.h"
+#include "hw/qdev.h"
 
 QemuOptsList qemu_drive_opts = {
     .name = "drive",
@@ -202,6 +203,24 @@  QemuOptsList qemu_rtc_opts = {
     },
 };
 
+QemuOptsList qemu_global_opts = {
+    .name = "global",
+    .head = QTAILQ_HEAD_INITIALIZER(qemu_global_opts.head),
+    .desc = {
+        {
+            .name = "driver",
+            .type = QEMU_OPT_STRING,
+        },{
+            .name = "property",
+            .type = QEMU_OPT_STRING,
+        },{
+            .name = "value",
+            .type = QEMU_OPT_STRING,
+        },
+        { /* end if list */ }
+    },
+};
+
 static QemuOptsList *lists[] = {
     &qemu_drive_opts,
     &qemu_chardev_opts,
@@ -209,6 +228,7 @@  static QemuOptsList *lists[] = {
     &qemu_netdev_opts,
     &qemu_net_opts,
     &qemu_rtc_opts,
+    &qemu_global_opts,
     NULL,
 };
 
@@ -257,6 +277,42 @@  int qemu_set_option(const char *str)
     return 0;
 }
 
+int qemu_global_option(const char *str)
+{
+    char driver[64], property[64];
+    QemuOpts *opts;
+    int rc, offset;
+
+    rc = sscanf(str, "%63[^.].%63[^=]%n", driver, property, &offset);
+    if (rc < 2 || str[offset] != '=') {
+        qemu_error("can't parse: \"%s\"\n", str);
+        return -1;
+    }
+
+    opts = qemu_opts_create(&qemu_global_opts, NULL, 0);
+    qemu_opt_set(opts, "driver", driver);
+    qemu_opt_set(opts, "property", property);
+    qemu_opt_set(opts, "value", str+offset+1);
+    return 0;
+}
+
+static int qemu_add_one_global(QemuOpts *opts, void *opaque)
+{
+    GlobalProperty *g;
+
+    g = qemu_mallocz(sizeof(*g));
+    g->driver   = qemu_opt_get(opts, "driver");
+    g->property = qemu_opt_get(opts, "property");
+    g->value    = qemu_opt_get(opts, "value");
+    qdev_prop_register_global(g);
+    return 0;
+}
+
+void qemu_add_globals(void)
+{
+    qemu_opts_foreach(&qemu_global_opts, qemu_add_one_global, NULL, 0);
+}
+
 struct ConfigWriteData {
     QemuOptsList *list;
     FILE *fp;
diff --git a/qemu-config.h b/qemu-config.h
index b564851..6246e76 100644
--- a/qemu-config.h
+++ b/qemu-config.h
@@ -9,6 +9,8 @@  extern QemuOptsList qemu_net_opts;
 extern QemuOptsList qemu_rtc_opts;
 
 int qemu_set_option(const char *str);
+int qemu_global_option(const char *str);
+void qemu_add_globals(void);
 
 void qemu_config_write(FILE *fp);
 int qemu_config_parse(FILE *fp);
diff --git a/qemu-options.hx b/qemu-options.hx
index b65fd74..420b7d8 100644
--- a/qemu-options.hx
+++ b/qemu-options.hx
@@ -109,6 +109,9 @@  DEF("set", HAS_ARG, QEMU_OPTION_set,
     "-set group.id.arg=value\n"
     "                set <arg> parameter for item <id> of type <group>\n"
     "                i.e. -set drive.$id.file=/path/to/image\n")
+DEF("global", HAS_ARG, QEMU_OPTION_global,
+    "-global driver.property=value\n"
+    "                set a global default for a driver property\n")
 STEXI
 @item -drive @var{option}[,@var{option}[,@var{option}[,...]]]
 
diff --git a/vl.c b/vl.c
index d52b1cc..4911fe5 100644
--- a/vl.c
+++ b/vl.c
@@ -4786,6 +4786,10 @@  int main(int argc, char **argv, char **envp)
                 if (qemu_set_option(optarg) != 0)
                     exit(1);
 	        break;
+            case QEMU_OPTION_global:
+                if (qemu_global_option(optarg) != 0)
+                    exit(1);
+	        break;
             case QEMU_OPTION_mtdblock:
                 drive_add(optarg, MTD_ALIAS);
                 break;
@@ -5700,6 +5704,8 @@  int main(int argc, char **argv, char **envp)
     if (machine->compat_props) {
         qdev_prop_register_global_list(machine->compat_props);
     }
+    qemu_add_globals();
+
     machine->init(ram_size, boot_devices,
                   kernel_filename, kernel_cmdline, initrd_filename, cpu_model);