From: "Richard W.M. Jones" <rjones@redhat.com>
To: Paolo Bonzini <pbonzini@redhat.com>
Cc: qemu-devel@nongnu.org, armbru@redhat.com
Subject: Re: [Qemu-devel] [PATCH v2] watchdog: convert to QemuOpts
Date: Wed, 27 May 2015 15:06:49 +0100 [thread overview]
Message-ID: <20150527140649.GO29283@redhat.com> (raw)
In-Reply-To: <1432732141-33915-1-git-send-email-pbonzini@redhat.com>
On Wed, May 27, 2015 at 03:09:01PM +0200, Paolo Bonzini wrote:
> This makes it possible to specify a watchdog action in a configuration file.
> The previous behavior of "-watchdog" is moved to the (implied) "-watchdog
> model" suboption. This is already more or less obsolete, since it is possible
> to achieve the same effect with "-device", but "-watchdog-action" does not have
> an equivalent.
>
> One alternative implementation is possible, namely to add an "action"
> property to each watchdog device. However, boards often have embedded
> watchdog devices; even if they currently don't, these should call
> watchdog_perform_action() so that they are affected by -watchdog-action.
> (This is listed in our BiteSizedTasks wiki page).
>
> For these boards, "-watchdog action=foo" has two advantages:
>
> 1) it is much easier to use than a "-global" option, and can be
> configured globally for all boards.
>
> 2) it is harder to add a property to a device than it is to just
> s/qemu_system_reset_request/watchdog_perform_action/; in some cases,
> the devices are not even qdev-ified at all. The chance of the conversion
> happening then would basically be zero if one had to add a property as
> a prerequisite.
>
> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
> ---
> tweak brackets in help messages [Eric]
> fix missing error message for -watchdog action [Richard]
> ---
> docs/qdev-device-use.txt | 4 ++++
> qemu-options.hx | 37 +++++++++++++++--------------
> vl.c | 61 +++++++++++++++++++++++++++++++++++-------------
> 3 files changed, 69 insertions(+), 33 deletions(-)
>
> diff --git a/docs/qdev-device-use.txt b/docs/qdev-device-use.txt
> index 136d271..1906b7d 100644
> --- a/docs/qdev-device-use.txt
> +++ b/docs/qdev-device-use.txt
> @@ -365,6 +365,10 @@ The old way to define a guest watchdog device is -watchdog DEVNAME.
> The new way is -device DEVNAME. For PCI devices, you can add
> bus=PCI-BUS,addr=DEVFN to control the PCI device address, as usual.
>
> +No matter if you use -watchdog or -device to define the guest watchdog
> +device, you can specify the watchdog action with "-watchdog-action ACTION"
> +or "-watchdog action=ACTION".
> +
> === Host Device Assignment ===
>
> QEMU supports assigning host PCI devices (qemu-kvm only at this time)
> diff --git a/qemu-options.hx b/qemu-options.hx
> index ec356f6..628f282 100644
> --- a/qemu-options.hx
> +++ b/qemu-options.hx
> @@ -3115,12 +3115,20 @@ when the shift value is high (how high depends on the host machine).
> ETEXI
>
> DEF("watchdog", HAS_ARG, QEMU_OPTION_watchdog, \
> - "-watchdog i6300esb|ib700\n" \
> - " enable virtual hardware watchdog [default=none]\n",
> + "-watchdog [[model=]i6300esb|ib700]\n" \
> + " [,action=reset|shutdown|poweroff|pause|debug|none]\n" \
> + " enable virtual hardware watchdog (default: model=none,action=reset)\n",
> + QEMU_ARCH_ALL)
> +DEF("watchdog-action", HAS_ARG, QEMU_OPTION_watchdog_action, \
> + "-watchdog-action reset|shutdown|poweroff|pause|debug|none\n" \
> + " action when watchdog fires (default: reset)\n",
> QEMU_ARCH_ALL)
> STEXI
> -@item -watchdog @var{model}
> +@item -watchdog [[model=]@var{model}][,action=@var{action}]
> @findex -watchdog
> +@itemx -watchdog-action @var{action}
> +@findex -watchdog-action
> +
> Create a virtual hardware watchdog device. Once enabled (by a guest
> action), the watchdog must be periodically polled by an agent inside
> the guest or else the guest will be restarted.
> @@ -3129,22 +3137,16 @@ The @var{model} is the model of hardware watchdog to emulate. Choices
> for model are: @code{ib700} (iBASE 700) which is a very simple ISA
> watchdog with a single timer, or @code{i6300esb} (Intel 6300ESB I/O
> controller hub) which is a much more featureful PCI-based dual-timer
> -watchdog. Choose a model for which your guest has drivers.
> -
> -Use @code{-watchdog help} to list available hardware models. Only one
> +watchdog. Choose a model for which your guest has drivers;
> +use @code{-watchdog help} to list available hardware models. Only one
> watchdog can be enabled for a guest.
> -ETEXI
> -
> -DEF("watchdog-action", HAS_ARG, QEMU_OPTION_watchdog_action, \
> - "-watchdog-action reset|shutdown|poweroff|pause|debug|none\n" \
> - " action when watchdog fires [default=reset]\n",
> - QEMU_ARCH_ALL)
> -STEXI
> -@item -watchdog-action @var{action}
> -@findex -watchdog-action
>
> The @var{action} controls what QEMU will do when the watchdog timer
> -expires.
> +expires. It can be specified directly in the @option{-watchdog} option,
> +or as the argument of a separate @option{-watchdog-action} parameter.
> +The effect is the same. The watchdog action can be specified even if
> +the watchdog is enabled through the @option{-device} option.
> +
> The default is
> @code{reset} (forcefully reset the guest).
> Other possible actions are:
> @@ -3162,8 +3164,9 @@ situations where the watchdog would have expired, and thus
> Examples:
>
> @table @code
> -@item -watchdog i6300esb -watchdog-action pause
> +@item -watchdog i6300esb,action=pause
> @item -watchdog ib700
> +@item -device ib700 -watchdog action=poweroff
> @end table
> ETEXI
>
> diff --git a/vl.c b/vl.c
> index 9a04ad4..55363fe 100644
> --- a/vl.c
> +++ b/vl.c
> @@ -168,7 +168,6 @@ static int no_reboot;
> int no_shutdown = 0;
> int cursor_hide = 1;
> int graphic_rotate = 0;
> -const char *watchdog;
> QEMUOptionRom option_rom[MAX_OPTION_ROMS];
> int nb_option_roms;
> int semihosting_enabled = 0;
> @@ -475,6 +474,23 @@ static QemuOptsList qemu_icount_opts = {
> },
> };
>
> +static QemuOptsList qemu_watchdog_opts = {
> + .name = "watchdog",
> + .implied_opt_name = "model",
> + .merge_lists = true,
> + .head = QTAILQ_HEAD_INITIALIZER(qemu_watchdog_opts.head),
> + .desc = {
> + {
> + .name = "model",
> + .type = QEMU_OPT_STRING,
> + }, {
> + .name = "action",
> + .type = QEMU_OPT_STRING,
> + },
> + { /* end of list */ }
> + },
> +};
> +
> static QemuOptsList qemu_semihosting_config_opts = {
> .name = "semihosting-config",
> .implied_opt_name = "enable",
> @@ -1224,6 +1240,26 @@ static void configure_msg(QemuOpts *opts)
> enable_timestamp_msg = qemu_opt_get_bool(opts, "timestamp", true);
> }
>
> +static void configure_watchdog(QemuOpts *opts)
> +{
> + const char *s;
> +
> + s = qemu_opt_get(opts, "model");
> + if (s) {
> + int i = select_watchdog(s);
> + if (i != 0) {
> + exit (i <= 1 ? 1 : 0);
> + }
> + }
> + s = qemu_opt_get(opts, "action");
> + if (s) {
> + int i = select_watchdog_action(s);
> + if (i != 0) {
> + exit (i <= 1 ? 1 : 0);
> + }
> + }
> +}
> +
> /***********************************************************/
> /* USB devices */
>
> @@ -2739,7 +2775,6 @@ static void set_memory_options(uint64_t *ram_slots, ram_addr_t *maxram_size)
>
> int main(int argc, char **argv, char **envp)
> {
> - int i;
> int snapshot, linux_boot;
> const char *initrd_filename;
> const char *kernel_filename, *kernel_cmdline;
> @@ -2815,6 +2850,7 @@ int main(int argc, char **argv, char **envp)
> qemu_add_opts(&qemu_name_opts);
> qemu_add_opts(&qemu_numa_opts);
> qemu_add_opts(&qemu_icount_opts);
> + qemu_add_opts(&qemu_watchdog_opts);
> qemu_add_opts(&qemu_semihosting_config_opts);
>
> runstate_init();
> @@ -3343,18 +3379,15 @@ int main(int argc, char **argv, char **envp)
> }
> break;
> case QEMU_OPTION_watchdog:
> - if (watchdog) {
> - fprintf(stderr,
> - "qemu: only one watchdog option may be given\n");
> - return 1;
> + olist = qemu_find_opts("watchdog");
> + opts = qemu_opts_parse(olist, optarg, 1);
> + if (!opts) {
> + exit(1);
> }
> - watchdog = optarg;
> break;
> case QEMU_OPTION_watchdog_action:
> - if (select_watchdog_action(optarg) == -1) {
> - fprintf(stderr, "Unknown -watchdog-action parameter\n");
> - exit(1);
> - }
> + qemu_opts_set(qemu_find_opts("watchdog"), 0, "action", optarg,
> + &error_abort);
> break;
> case QEMU_OPTION_virtiocon:
> add_device_config(DEV_VIRTCON, optarg);
> @@ -4227,11 +4260,7 @@ int main(int argc, char **argv, char **envp)
> select_vgahw(vga_model);
> }
>
> - if (watchdog) {
> - i = select_watchdog(watchdog);
> - if (i > 0)
> - exit (i == 1 ? 1 : 0);
> - }
> + configure_watchdog(qemu_find_opts_singleton("watchdog"));
>
> if (machine_class->compat_props) {
> qdev_prop_register_global_list(machine_class->compat_props);
> --
ACK.
Rich.
--
Richard Jones, Virtualization Group, Red Hat http://people.redhat.com/~rjones
Read my programming and virtualization blog: http://rwmj.wordpress.com
libguestfs lets you edit virtual machines. Supports shell scripting,
bindings from many languages. http://libguestfs.org
next prev parent reply other threads:[~2015-05-27 14:07 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-05-27 13:09 [Qemu-devel] [PATCH v2] watchdog: convert to QemuOpts Paolo Bonzini
2015-05-27 14:06 ` Richard W.M. Jones [this message]
2015-05-27 14:17 ` Eric Blake
2015-05-27 14:40 ` Paolo Bonzini
2015-06-03 13:14 ` Markus Armbruster
2015-06-03 13:40 ` Paolo Bonzini
2015-06-03 15:27 ` Markus Armbruster
2015-06-03 15:38 ` Paolo Bonzini
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=20150527140649.GO29283@redhat.com \
--to=rjones@redhat.com \
--cc=armbru@redhat.com \
--cc=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.