All of lore.kernel.org
 help / color / mirror / Atom feed
From: Paolo Bonzini <pbonzini@redhat.com>
To: qemu-devel@nongnu.org
Subject: [PULL 061/113] qemu-option: restrict qemu_opts_set to merge-lists QemuOpts
Date: Wed,  2 Dec 2020 03:07:57 -0500	[thread overview]
Message-ID: <20201202080849.4125477-62-pbonzini@redhat.com> (raw)
In-Reply-To: <20201202080849.4125477-1-pbonzini@redhat.com>

qemu_opts_set is used to create default network backends and to
parse sugar options -kernel, -initrd, -append, -bios and -dtb.
These are very different uses:

I would *expect* a function named qemu_opts_set to set an option in a
merge-lists QemuOptsList, such as -kernel, and possibly to set an option
in a non-merge-lists QemuOptsList with non-NULL id, similar to -set.

However, it wouldn't *work* to use qemu_opts_set for the latter
because qemu_opts_set uses fail_if_exists==1. So, for non-merge-lists
QemuOptsList and non-NULL id, the semantics of qemu_opts_set (fail if the
(QemuOptsList, id) pair already exists) are debatable.

On the other hand, I would not expect qemu_opts_set to create a
non-merge-lists QemuOpts with a single option; which it does, though.
For this case of non-merge-lists QemuOptsList and NULL id, qemu_opts_set
hardly adds value over qemu_opts_parse.  It does skip some parsing and
unescaping, but that's not needed when creating default network
backends.

So qemu_opts_set has warty behavior for non-merge-lists QemuOptsList
if id is non-NULL, and it's mostly pointless if id is NULL.  My
solution to keeping the API as simple as possible is to limit
qemu_opts_set to merge-lists QemuOptsList.  For them, it's useful (we
don't want comma-unescaping for -kernel) *and* has sane semantics.
Network backend creation is switched to qemu_opts_parse.

qemu_opts_set is now only used on merge-lists QemuOptsList... except
in the testcase, which is changed to use a merge-list QemuOptsList.

With this change we can also remove the id parameter.  With the
parameter always NULL, we know that qemu_opts_create cannot fail
and can pass &error_abort to it.

Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
---
 include/qemu/option.h  |  3 +--
 softmmu/vl.c           | 19 +++++++------------
 tests/test-qemu-opts.c | 20 +++++++++++++++++---
 util/qemu-option.c     |  9 +++------
 4 files changed, 28 insertions(+), 23 deletions(-)

diff --git a/include/qemu/option.h b/include/qemu/option.h
index ac69352e0e..f73e0dc7d9 100644
--- a/include/qemu/option.h
+++ b/include/qemu/option.h
@@ -119,8 +119,7 @@ QemuOpts *qemu_opts_create(QemuOptsList *list, const char *id,
                            int fail_if_exists, Error **errp);
 void qemu_opts_reset(QemuOptsList *list);
 void qemu_opts_loc_restore(QemuOpts *opts);
-bool qemu_opts_set(QemuOptsList *list, const char *id,
-                   const char *name, const char *value, Error **errp);
+bool qemu_opts_set(QemuOptsList *list, const char *name, const char *value, Error **errp);
 const char *qemu_opts_id(QemuOpts *opts);
 void qemu_opts_set_id(QemuOpts *opts, char *id);
 void qemu_opts_del(QemuOpts *opts);
diff --git a/softmmu/vl.c b/softmmu/vl.c
index 85b23d51be..5571f9ff75 100644
--- a/softmmu/vl.c
+++ b/softmmu/vl.c
@@ -3388,20 +3388,16 @@ void qemu_init(int argc, char **argv, char **envp)
                 }
                 break;
             case QEMU_OPTION_kernel:
-                qemu_opts_set(qemu_find_opts("machine"), NULL, "kernel", optarg,
-                              &error_abort);
+                qemu_opts_set(qemu_find_opts("machine"), "kernel", optarg, &error_abort);
                 break;
             case QEMU_OPTION_initrd:
-                qemu_opts_set(qemu_find_opts("machine"), NULL, "initrd", optarg,
-                              &error_abort);
+                qemu_opts_set(qemu_find_opts("machine"), "initrd", optarg, &error_abort);
                 break;
             case QEMU_OPTION_append:
-                qemu_opts_set(qemu_find_opts("machine"), NULL, "append", optarg,
-                              &error_abort);
+                qemu_opts_set(qemu_find_opts("machine"), "append", optarg, &error_abort);
                 break;
             case QEMU_OPTION_dtb:
-                qemu_opts_set(qemu_find_opts("machine"), NULL, "dtb", optarg,
-                              &error_abort);
+                qemu_opts_set(qemu_find_opts("machine"), "dtb", optarg, &error_abort);
                 break;
             case QEMU_OPTION_cdrom:
                 drive_add(IF_DEFAULT, 2, optarg, CDROM_OPTS);
@@ -3511,8 +3507,7 @@ void qemu_init(int argc, char **argv, char **envp)
                 }
                 break;
             case QEMU_OPTION_bios:
-                qemu_opts_set(qemu_find_opts("machine"), NULL, "firmware", optarg,
-                              &error_abort);
+                qemu_opts_set(qemu_find_opts("machine"), "firmware", optarg, &error_abort);
                 break;
             case QEMU_OPTION_singlestep:
                 singlestep = 1;
@@ -4395,9 +4390,9 @@ void qemu_init(int argc, char **argv, char **envp)
 
     if (default_net) {
         QemuOptsList *net = qemu_find_opts("net");
-        qemu_opts_set(net, NULL, "type", "nic", &error_abort);
+        qemu_opts_parse(net, "nic", true, &error_abort);
 #ifdef CONFIG_SLIRP
-        qemu_opts_set(net, NULL, "type", "user", &error_abort);
+        qemu_opts_parse(net, "user", true, &error_abort);
 #endif
     }
 
diff --git a/tests/test-qemu-opts.c b/tests/test-qemu-opts.c
index 297ffe79dd..2aab831d10 100644
--- a/tests/test-qemu-opts.c
+++ b/tests/test-qemu-opts.c
@@ -84,11 +84,25 @@ static QemuOptsList opts_list_03 = {
     },
 };
 
+static QemuOptsList opts_list_04 = {
+    .name = "opts_list_04",
+    .head = QTAILQ_HEAD_INITIALIZER(opts_list_04.head),
+    .merge_lists = true,
+    .desc = {
+        {
+            .name = "str3",
+            .type = QEMU_OPT_STRING,
+        },
+        { /* end of list */ }
+    },
+};
+
 static void register_opts(void)
 {
     qemu_add_opts(&opts_list_01);
     qemu_add_opts(&opts_list_02);
     qemu_add_opts(&opts_list_03);
+    qemu_add_opts(&opts_list_04);
 }
 
 static void test_find_unknown_opts(void)
@@ -402,17 +416,17 @@ static void test_qemu_opts_set(void)
     QemuOpts *opts;
     const char *opt;
 
-    list = qemu_find_opts("opts_list_01");
+    list = qemu_find_opts("opts_list_04");
     g_assert(list != NULL);
     g_assert(QTAILQ_EMPTY(&list->head));
-    g_assert_cmpstr(list->name, ==, "opts_list_01");
+    g_assert_cmpstr(list->name, ==, "opts_list_04");
 
     /* should not find anything at this point */
     opts = qemu_opts_find(list, NULL);
     g_assert(opts == NULL);
 
     /* implicitly create opts and set str3 value */
-    qemu_opts_set(list, NULL, "str3", "value", &error_abort);
+    qemu_opts_set(list, "str3", "value", &error_abort);
     g_assert(!QTAILQ_EMPTY(&list->head));
 
     /* get the just created opts */
diff --git a/util/qemu-option.c b/util/qemu-option.c
index acefbc23fa..25792159ba 100644
--- a/util/qemu-option.c
+++ b/util/qemu-option.c
@@ -670,15 +670,12 @@ void qemu_opts_loc_restore(QemuOpts *opts)
     loc_restore(&opts->loc);
 }
 
-bool qemu_opts_set(QemuOptsList *list, const char *id,
-                   const char *name, const char *value, Error **errp)
+bool qemu_opts_set(QemuOptsList *list, const char *name, const char *value, Error **errp)
 {
     QemuOpts *opts;
 
-    opts = qemu_opts_create(list, id, 1, errp);
-    if (!opts) {
-        return false;
-    }
+    assert(list->merge_lists);
+    opts = qemu_opts_create(list, NULL, 0, &error_abort);
     return qemu_opt_set(opts, name, value, errp);
 }
 
-- 
2.26.2




  parent reply	other threads:[~2020-12-02  8:57 UTC|newest]

Thread overview: 116+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-12-02  8:06 [PULL 000/113] First batch of misc (i386, kernel-doc, memory, vl.c) changes for QEMU 6.0 Paolo Bonzini
2020-12-02  8:06 ` [PULL 001/113] target/i386: fix operand order for PDEP and PEXT Paolo Bonzini
2020-12-02  8:06 ` [PULL 002/113] target/i386: Support up to 32768 CPUs without IRQ remapping Paolo Bonzini
2020-12-02  8:06 ` [PULL 003/113] target/i386: seg_helper: Correct segement selector nullification in the RET/IRET helper Paolo Bonzini
2020-12-02  8:07 ` [PULL 004/113] WHPX: support for the kernel-irqchip on/off Paolo Bonzini
2020-12-02  8:07 ` [PULL 005/113] docs/devel/loads-stores: Add regexp for DMA functions Paolo Bonzini
2020-12-02  8:07 ` [PULL 006/113] qom: eliminate identical functions Paolo Bonzini
2020-12-02  8:07 ` [PULL 007/113] dma: Document address_space_map/address_space_unmap() prototypes Paolo Bonzini
2020-12-02  8:07 ` [PULL 008/113] dma: Let dma_memory_set() propagate MemTxResult Paolo Bonzini
2020-12-02  8:07 ` [PULL 009/113] dma: Let dma_memory_rw() " Paolo Bonzini
2020-12-02  8:07 ` [PULL 010/113] dma: Let dma_memory_read() " Paolo Bonzini
2020-12-02  8:07 ` [PULL 011/113] dma: Let dma_memory_write() " Paolo Bonzini
2020-12-02  8:07 ` [PULL 012/113] pci: Let pci_dma_rw() " Paolo Bonzini
2020-12-02  8:07 ` [PULL 013/113] pci: Let pci_dma_read() " Paolo Bonzini
2020-12-02  8:07 ` [PULL 014/113] pci: Let pci_dma_write() " Paolo Bonzini
2020-12-02  8:07 ` [PULL 015/113] hw/ssi/aspeed_smc: Rename 'max_slaves' variable as 'max_peripherals' Paolo Bonzini
2020-12-02  8:07 ` [PULL 016/113] hw/ssi: Update coding style to make checkpatch.pl happy Paolo Bonzini
2020-12-02  8:07 ` [PULL 017/113] hw/ssi: Rename SSI 'slave' as 'peripheral' Paolo Bonzini
2020-12-02  8:07 ` [PULL 018/113] hw/core/stream: Rename StreamSlave as StreamSink Paolo Bonzini
2020-12-02  8:07 ` [PULL 019/113] hw/dma/xilinx_axidma: " Paolo Bonzini
2020-12-02  8:07 ` [PULL 020/113] hw/net/xilinx_axienet: " Paolo Bonzini
2020-12-02  8:07 ` [PULL 021/113] alpha: remove bios_name Paolo Bonzini
2020-12-02  8:07 ` [PULL 022/113] arm: " Paolo Bonzini
2020-12-02  8:07 ` [PULL 023/113] hppa: " Paolo Bonzini
2020-12-02  8:07 ` [PULL 024/113] i386: " Paolo Bonzini
2020-12-02  8:07 ` [PULL 025/113] lm32: " Paolo Bonzini
2020-12-02  8:07 ` [PULL 026/113] m68k: " Paolo Bonzini
2020-12-02  8:07 ` [PULL 027/113] mips: " Paolo Bonzini
2020-12-02  8:07 ` [PULL 028/113] moxie: " Paolo Bonzini
2020-12-02  8:07 ` [PULL 029/113] ppc: " Paolo Bonzini
2020-12-02  8:07 ` [PULL 030/113] rx: move BIOS load from MCU to board Paolo Bonzini
2020-12-02  8:07 ` [PULL 031/113] s390: remove bios_name Paolo Bonzini
2020-12-02  8:07 ` [PULL 032/113] sh4: " Paolo Bonzini
2020-12-02  8:07 ` [PULL 033/113] sparc: " Paolo Bonzini
2020-12-02  8:07 ` [PULL 034/113] digic: " Paolo Bonzini
2020-12-02  8:07 ` [PULL 035/113] vl: " Paolo Bonzini
2020-12-02  8:07 ` [PULL 036/113] arm: do not use ram_size global Paolo Bonzini
2020-12-02  8:07 ` [PULL 037/113] cris: " Paolo Bonzini
2020-12-02  8:07 ` [PULL 038/113] hppa: " Paolo Bonzini
2020-12-02  8:07 ` [PULL 039/113] i386: " Paolo Bonzini
2020-12-02  8:07 ` [PULL 040/113] m68k: " Paolo Bonzini
2020-12-02  8:07 ` [PULL 041/113] microblaze: " Paolo Bonzini
2020-12-02  8:07 ` [PULL 042/113] mips: " Paolo Bonzini
2020-12-02  8:07 ` [PULL 043/113] moxie: " Paolo Bonzini
2020-12-02  8:07 ` [PULL 044/113] nios2: " Paolo Bonzini
2020-12-02  8:07 ` [PULL 045/113] ppc: " Paolo Bonzini
2020-12-02  8:07 ` [PULL 046/113] riscv: " Paolo Bonzini
2020-12-02  8:07 ` [PULL 047/113] s390x: " Paolo Bonzini
2020-12-02  8:07 ` [PULL 048/113] sparc64: " Paolo Bonzini
2020-12-02  8:07 ` [PULL 049/113] make ram_size local to vl.c Paolo Bonzini
2020-12-02  8:07 ` [PULL 050/113] hw/char/serial: Clean up unnecessary code Paolo Bonzini
2020-12-02  8:07 ` [PULL 051/113] treewide: do not use short-form boolean options Paolo Bonzini
2020-12-02  8:07 ` [PULL 052/113] vl: extract validation of -smp to machine.c Paolo Bonzini
2020-12-02  8:07 ` [PULL 053/113] vl: remove bogus check Paolo Bonzini
2020-12-02  8:07 ` [PULL 054/113] vl: split various early command line options to a separate function Paolo Bonzini
2020-12-02  8:07 ` [PULL 055/113] vl: move various initialization routines out of qemu_init Paolo Bonzini
2020-12-02  8:07 ` [PULL 056/113] vl: extract qemu_init_subsystems Paolo Bonzini
2020-12-02  8:07 ` [PULL 057/113] vl: move prelaunch part of qemu_init to new functions Paolo Bonzini
2020-12-02  8:07 ` [PULL 058/113] vl: extract various command line validation snippets to a new function Paolo Bonzini
2020-12-02  8:07 ` [PULL 059/113] vl: preconfig and loadvm are mutually exclusive Paolo Bonzini
2020-12-02  8:07 ` [PULL 060/113] vl: extract various command line desugaring snippets to a new function Paolo Bonzini
2020-12-02  8:07 ` Paolo Bonzini [this message]
2020-12-02  8:07 ` [PULL 062/113] vl: create "-net nic -net user" default earlier Paolo Bonzini
2020-12-02  8:07 ` [PULL 063/113] vl: load plugins as late as possible Paolo Bonzini
2020-12-02  8:08 ` [PULL 064/113] vl: extract default devices to separate functions Paolo Bonzini
2020-12-02  8:08 ` [PULL 065/113] vl: move CHECKPOINT_INIT after preconfig Paolo Bonzini
2020-12-02  8:08 ` [PULL 066/113] vl: separate qemu_create_early_backends Paolo Bonzini
2020-12-02  8:08 ` [PULL 067/113] vl: separate qemu_create_late_backends Paolo Bonzini
2020-12-02  8:08 ` [PULL 068/113] vl: separate qemu_create_machine Paolo Bonzini
2020-12-02  8:08 ` [PULL 069/113] vl: separate qemu_apply_machine_options Paolo Bonzini
2020-12-02  8:08 ` [PULL 070/113] vl: separate qemu_resolve_machine_memdev Paolo Bonzini
2020-12-02  8:08 ` [PULL 071/113] vl: initialize displays before preconfig loop Paolo Bonzini
2020-12-02  8:08 ` [PULL 072/113] vl: move -global check earlier Paolo Bonzini
2020-12-02  8:08 ` [PULL 073/113] migration, vl: start migration via qmp_migrate_incoming Paolo Bonzini
2020-12-02  8:08 ` [PULL 074/113] vl: start VM via qmp_cont Paolo Bonzini
2020-12-02  8:08 ` [PULL 075/113] hmp: introduce cmd_available Paolo Bonzini
2020-12-02  8:08 ` [PULL 076/113] vl: extract softmmu/datadir.c Paolo Bonzini
2020-12-02  8:08 ` [PULL 077/113] vl: extract machine done notifiers Paolo Bonzini
2020-12-02  8:08 ` [PULL 078/113] vl: extract softmmu/rtc.c Paolo Bonzini
2020-12-02  8:08 ` [PULL 079/113] vl: remove serial_max_hds Paolo Bonzini
2020-12-02  8:08 ` [PULL 080/113] vl: clean up -boot variables Paolo Bonzini
2020-12-02  8:08 ` [PULL 081/113] config-file: move -set implementation to vl.c Paolo Bonzini
2020-12-02  8:08 ` [PULL 082/113] docs: temporarily disable the kernel-doc extension Paolo Bonzini
2020-12-02  8:08 ` [PULL 083/113] kernel-doc: fix processing nested structs with attributes Paolo Bonzini
2020-12-02  8:08 ` [PULL 084/113] kernel-doc: add support for ____cacheline_aligned_in_smp attribute Paolo Bonzini
2020-12-02  8:08 ` [PULL 085/113] scripts/kernel-doc: Add support for named variable macro arguments Paolo Bonzini
2020-12-02  8:08 ` [PULL 086/113] scripts: kernel-doc: proper handle @foo->bar() Paolo Bonzini
2020-12-02  8:08 ` [PULL 087/113] scripts: kernel-doc: accept negation like !@var Paolo Bonzini
2020-12-02  8:08 ` [PULL 088/113] scripts: kernel-doc: accept blank lines on parameter description Paolo Bonzini
2020-12-02  8:08 ` [PULL 089/113] Replace HTTP links with HTTPS ones: documentation Paolo Bonzini
2020-12-02  8:08 ` [PULL 090/113] scripts/kernel-doc: parse __ETHTOOL_DECLARE_LINK_MODE_MASK Paolo Bonzini
2020-12-02  8:08 ` [PULL 091/113] scripts/kernel-doc: handle function pointer prototypes Paolo Bonzini
2020-12-02  8:08 ` [PULL 092/113] scripts/kernel-doc: optionally treat warnings as errors Paolo Bonzini
2020-12-02  8:08 ` [PULL 093/113] kernel-doc: include line numbers for function prototypes Paolo Bonzini
2020-12-02  8:08 ` [PULL 094/113] kernel-doc: add support for ____cacheline_aligned attribute Paolo Bonzini
2020-12-02  8:08 ` [PULL 095/113] scripts: kernel-doc: add support for typedef enum Paolo Bonzini
2020-12-02  8:08 ` [PULL 096/113] Revert "scripts/kerneldoc: For Sphinx 3 use c:macro for macros with arguments" Paolo Bonzini
2020-12-02  8:08 ` [PULL 097/113] Revert "kernel-doc: Use c:struct for Sphinx 3.0 and later" Paolo Bonzini
2020-12-02  8:08 ` [PULL 098/113] scripts: kernel-doc: make it more compatible with Sphinx 3.x Paolo Bonzini
2020-12-02  8:08 ` [PULL 099/113] scripts: kernel-doc: use a less pedantic markup for funcs on " Paolo Bonzini
2020-12-02  8:08 ` [PULL 100/113] scripts: kernel-doc: fix troubles with line counts Paolo Bonzini
2020-12-02  8:08 ` [PULL 101/113] scripts: kernel-doc: reimplement -nofunction argument Paolo Bonzini
2020-12-02  8:08 ` [PULL 102/113] scripts: kernel-doc: fix typedef identification Paolo Bonzini
2020-12-02  8:08 ` [PULL 103/113] scripts: kernel-doc: don't mangle with parameter list Paolo Bonzini
2020-12-02  8:08 ` [PULL 104/113] scripts: kernel-doc: allow passing desired Sphinx C domain dialect Paolo Bonzini
2020-12-02  8:08 ` [PULL 105/113] scripts: kernel-doc: fix line number handling Paolo Bonzini
2020-12-02  8:08 ` [PULL 106/113] scripts: kernel-doc: try to use c:function if possible Paolo Bonzini
2020-12-02  8:08 ` [PULL 107/113] Revert "kernel-doc: Handle function typedefs without asterisks" Paolo Bonzini
2020-12-02  8:08 ` [PULL 108/113] Revert "kernel-doc: Handle function typedefs that return pointers" Paolo Bonzini
2020-12-02  8:08 ` [PULL 109/113] scripts: kernel-doc: fix typedef parsing Paolo Bonzini
2020-12-02  8:08 ` [PULL 110/113] scripts: kernel-doc: split typedef complex regex Paolo Bonzini
2020-12-02  8:08 ` [PULL 111/113] scripts: kernel-doc: use :c:union when needed Paolo Bonzini
2020-12-02  8:08 ` [PULL 112/113] Revert "docs: temporarily disable the kernel-doc extension" Paolo Bonzini
2020-12-02  8:08 ` [PULL 113/113] scripts: kernel-doc: remove unnecesssary change wrt Linux Paolo Bonzini
2020-12-02 11:52 ` [PULL 000/113] First batch of misc (i386, kernel-doc, memory, vl.c) changes for QEMU 6.0 no-reply
2020-12-09 14:16 ` Peter Maydell

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20201202080849.4125477-62-pbonzini@redhat.com \
    --to=pbonzini@redhat.com \
    --cc=qemu-devel@nongnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.