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

login
register
mail settings
Submitter Gerd Hoffmann
Date Nov. 24, 2009, 11:06 a.m.
Message ID <1259060788-17411-2-git-send-email-kraxel@redhat.com>
Download mbox | patch
Permalink /patch/39201/
State New
Headers show

Comments

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(-)
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

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);