[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [PATCH v2 3/6] qemu-option: restrict qemu_opts_set to merge-lists Qe
From: |
Markus Armbruster |
Subject: |
Re: [PATCH v2 3/6] qemu-option: restrict qemu_opts_set to merge-lists QemuOpts |
Date: |
Mon, 09 Nov 2020 16:55:22 +0100 |
User-agent: |
Gnus/5.13 (Gnus v5.13) Emacs/27.1 (gnu/linux) |
Paolo Bonzini <pbonzini@redhat.com> writes:
> qemu_opts_set is used to create default network backends and to
> parse sugar options -kernel, -initrd, -append, -bios and -dtb.
> Switch the former to qemu_opts_parse, so that qemu_opts_set
> is now only used on merge-lists QemuOptsList (for which it makes
> the most sense indeed)... except in the testcase, which is
> changed to use a merge-list QemuOptsList.
>
> With this change we can 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 | 24 +++++++++++++++++++++---
> util/qemu-option.c | 9 +++------
> 4 files changed, 32 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);
Long line. Please break before Error.
> 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 a71164494e..65607fe55e 100644
> --- a/softmmu/vl.c
> +++ b/softmmu/vl.c
> @@ -3107,20 +3107,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);
> @@ -3230,8 +3226,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;
Long lines. Please keep the line breaks.
> @@ -4258,9 +4253,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
> }
>
Looks safe to me, but I don't quite get why you switch to
qemu_opts_parse(). The commit message explains it is "so that
qemu_opts_set is now only used on merge-lists QemuOptsList (for which it
makes the most sense indeed)..." Is there anything wrong with using ot
on non-merge-lists QemuOptsList?
Am I missing something?
> diff --git a/tests/test-qemu-opts.c b/tests/test-qemu-opts.c
> index 297ffe79dd..322b32871b 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,21 @@ 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", "first_value", &error_abort);
This part the commit message mentions.
> + g_assert(!QTAILQ_EMPTY(&list->head));
> +
> + /* set it again */
> + qemu_opts_set(list, "str3", "value", &error_abort);
> g_assert(!QTAILQ_EMPTY(&list->head));
This one not.
What are you trying to accomplish?
>
> /* get the just created opts */
> diff --git a/util/qemu-option.c b/util/qemu-option.c
> index 59be4f9d21..c88e159f18 100644
> --- a/util/qemu-option.c
> +++ b/util/qemu-option.c
> @@ -665,15 +665,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)
Long line. Please break before Error.
> {
> 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);
> }
Yes, qemu_opts_create() can fail only if its second paramter is
non-null, or its thirs paramter is non-zero.
I can see quite a few such calls. Could be simplified with a wrapper
that takes just the first parameter and can't fail. Not now.
Just enough confusion on my part to withhold my R-by for now.
[PATCH v2 4/6] qemu-option: clean up id vs. list->merge_lists, Paolo Bonzini, 2020/11/09
- Re: [PATCH v2 4/6] qemu-option: clean up id vs. list->merge_lists, Markus Armbruster, 2020/11/09
- Re: [PATCH v2 4/6] qemu-option: clean up id vs. list->merge_lists, Paolo Bonzini, 2020/11/09
- Re: [PATCH v2 4/6] qemu-option: clean up id vs. list->merge_lists, Markus Armbruster, 2020/11/09
- Re: [PATCH v2 4/6] qemu-option: clean up id vs. list->merge_lists, Paolo Bonzini, 2020/11/09
- Re: [PATCH v2 4/6] qemu-option: clean up id vs. list->merge_lists, Markus Armbruster, 2020/11/10
- Re: [PATCH v2 4/6] qemu-option: clean up id vs. list->merge_lists, Paolo Bonzini, 2020/11/10