From: "Michael S. Tsirkin" <mst@redhat.com>
To: Wei Wang <wei.w.wang@intel.com>
Cc: qemu-devel@nongnu.org, virtio-dev@lists.oasis-open.org,
quintela@redhat.com, dgilbert@redhat.com, pbonzini@redhat.com,
liliang.opensource@gmail.com, yang.zhang.wz@gmail.com,
quan.xu0@gmail.com, nilal@redhat.com, riel@redhat.com
Subject: [virtio-dev] Re: [PATCH v2 3/3] virtio-balloon: add a timer to limit the free page report waiting time
Date: Wed, 7 Feb 2018 01:43:36 +0200 [thread overview]
Message-ID: <20180207013925-mutt-send-email-mst@kernel.org> (raw)
In-Reply-To: <1517915299-15349-4-git-send-email-wei.w.wang@intel.com>
On Tue, Feb 06, 2018 at 07:08:19PM +0800, Wei Wang wrote:
> This patch adds a timer to limit the time that host waits for the free
> page hints reported by the guest. Users can specify the time in ms via
> "free-page-wait-time" command line option. If a user doesn't specify a
> time, host waits till the guest finishes reporting all the free page
> hints. The policy (wait for all the free page hints to be reported or
> use a time limit) is determined by the orchestration layer.
>
> Signed-off-by: Wei Wang <wei.w.wang@intel.com>
> CC: Michael S. Tsirkin <mst@redhat.com>
Looks like an option the migration command should get,
as opposed to a device feature.
> ---
> hw/virtio/virtio-balloon.c | 84 +++++++++++++++++++++++++++++++++++++-
> hw/virtio/virtio-pci.c | 3 ++
> include/hw/virtio/virtio-balloon.h | 4 ++
> 3 files changed, 90 insertions(+), 1 deletion(-)
>
> diff --git a/hw/virtio/virtio-balloon.c b/hw/virtio/virtio-balloon.c
> index b424d4e..9ee0de4 100644
> --- a/hw/virtio/virtio-balloon.c
> +++ b/hw/virtio/virtio-balloon.c
> @@ -207,6 +207,65 @@ static void balloon_stats_set_poll_interval(Object *obj, Visitor *v,
> balloon_stats_change_timer(s, 0);
> }
>
> +static void balloon_free_page_change_timer(VirtIOBalloon *s, int64_t ms)
> +{
> + timer_mod(s->free_page_timer,
> + qemu_clock_get_ms(QEMU_CLOCK_REALTIME) + ms);
> +}
> +
> +static void balloon_stop_free_page_report(void *opaque)
> +{
> + VirtIOBalloon *dev = opaque;
> + VirtIODevice *vdev = VIRTIO_DEVICE(dev);
> +
> + timer_del(dev->free_page_timer);
> + timer_free(dev->free_page_timer);
> + dev->free_page_timer = NULL;
> +
> + if (dev->free_page_report_status == FREE_PAGE_REPORT_S_START) {
> + dev->host_stop_free_page = true;
> + virtio_notify_config(vdev);
> + }
> +}
> +
> +static void balloon_free_page_get_wait_time(Object *obj, Visitor *v,
> + const char *name, void *opaque,
> + Error **errp)
> +{
> + VirtIOBalloon *s = opaque;
> +
> + visit_type_int(v, name, &s->free_page_wait_time, errp);
> +}
> +
> +static void balloon_free_page_set_wait_time(Object *obj, Visitor *v,
> + const char *name, void *opaque,
> + Error **errp)
> +{
> + VirtIOBalloon *s = opaque;
> + Error *local_err = NULL;
> + int64_t value;
> +
> + visit_type_int(v, name, &value, &local_err);
> + if (local_err) {
> + error_propagate(errp, local_err);
> + return;
> + }
> + if (value < 0) {
> + error_setg(errp, "free page wait time must be greater than zero");
> + return;
> + }
> +
> + if (value > UINT32_MAX) {
> + error_setg(errp, "free page wait time value is too big");
> + return;
> + }
> +
> + s->free_page_wait_time = value;
> + g_assert(s->free_page_timer == NULL);
> + s->free_page_timer = timer_new_ms(QEMU_CLOCK_REALTIME,
> + balloon_stop_free_page_report, s);
> +}
> +
> static void virtio_balloon_handle_output(VirtIODevice *vdev, VirtQueue *vq)
> {
> VirtIOBalloon *s = VIRTIO_BALLOON(vdev);
> @@ -330,6 +389,7 @@ static void virtio_balloon_poll_free_page_hints(VirtIOBalloon *dev)
> if (id == dev->free_page_report_cmd_id) {
> dev->free_page_report_status = FREE_PAGE_REPORT_S_START;
> } else {
> + dev->host_stop_free_page = false;
> dev->free_page_report_status = FREE_PAGE_REPORT_S_STOP;
> break;
> }
> @@ -385,6 +445,10 @@ static void virtio_balloon_free_page_poll(void *opaque)
> virtio_notify_config(vdev);
> s->free_page_report_status = FREE_PAGE_REPORT_S_REQUESTED;
>
> + if (s->free_page_wait_time) {
> + balloon_free_page_change_timer(s, s->free_page_wait_time);
> + }
> +
> virtio_balloon_poll_free_page_hints(s);
> }
>
> @@ -395,7 +459,19 @@ static void virtio_balloon_get_config(VirtIODevice *vdev, uint8_t *config_data)
>
> config.num_pages = cpu_to_le32(dev->num_pages);
> config.actual = cpu_to_le32(dev->actual);
> - config.free_page_report_cmd_id = cpu_to_le32(dev->free_page_report_cmd_id);
> + if (dev->host_stop_free_page) {
> + /*
> + * Host is actively requesting to stop the free page reporting, send
> + * the stop sign to the guest. This happens when the migration thread
> + * has reached the phase to send pages to the destination while the
> + * guest hasn't done the reporting.
> + */
> + config.free_page_report_cmd_id =
> + VIRTIO_BALLOON_FREE_PAGE_REPORT_STOP_ID;
> + } else {
> + config.free_page_report_cmd_id =
> + cpu_to_le32(dev->free_page_report_cmd_id);
> + }
>
> trace_virtio_balloon_get_config(config.num_pages, config.actual);
> memcpy(config_data, &config, sizeof(struct virtio_balloon_config));
> @@ -539,6 +615,7 @@ static void virtio_balloon_device_realize(DeviceState *dev, Error **errp)
> s->free_page_vq = virtio_add_queue(vdev, VIRTQUEUE_MAX_SIZE, NULL);
> s->free_page_report_status = FREE_PAGE_REPORT_S_STOP;
> s->free_page_report_cmd_id = VIRTIO_BALLOON_FREE_PAGE_REPORT_STOP_ID;
> + s->host_stop_free_page = false;
> }
> reset_stats(s);
> }
> @@ -602,6 +679,11 @@ static void virtio_balloon_instance_init(Object *obj)
> balloon_stats_get_poll_interval,
> balloon_stats_set_poll_interval,
> NULL, s, NULL);
> +
> + object_property_add(obj, "free-page-wait-time", "int",
> + balloon_free_page_get_wait_time,
> + balloon_free_page_set_wait_time,
> + NULL, s, NULL);
> }
>
> static const VMStateDescription vmstate_virtio_balloon = {
> diff --git a/hw/virtio/virtio-pci.c b/hw/virtio/virtio-pci.c
> index 6c75cca..3345104 100644
> --- a/hw/virtio/virtio-pci.c
> +++ b/hw/virtio/virtio-pci.c
> @@ -2250,6 +2250,9 @@ static void virtio_balloon_pci_instance_init(Object *obj)
> object_property_add_alias(obj, "guest-stats-polling-interval",
> OBJECT(&dev->vdev),
> "guest-stats-polling-interval", &error_abort);
> + object_property_add_alias(obj, "free-page-wait-time",
> + OBJECT(&dev->vdev),
> + "free-page-wait-time", &error_abort);
> }
>
> static const TypeInfo virtio_balloon_pci_info = {
> diff --git a/include/hw/virtio/virtio-balloon.h b/include/hw/virtio/virtio-balloon.h
> index 11b4e01..c16855b 100644
> --- a/include/hw/virtio/virtio-balloon.h
> +++ b/include/hw/virtio/virtio-balloon.h
> @@ -40,6 +40,8 @@ enum virtio_balloon_free_page_report_status {
> typedef struct VirtIOBalloon {
> VirtIODevice parent_obj;
> VirtQueue *ivq, *dvq, *svq, *free_page_vq;
> + /* Host is requesting the guest to stop free page reporting */
> + bool host_stop_free_page;
> uint32_t free_page_report_status;
> uint32_t num_pages;
> uint32_t actual;
> @@ -49,8 +51,10 @@ typedef struct VirtIOBalloon {
> VirtQueueElement *stats_vq_elem;
> size_t stats_vq_offset;
> QEMUTimer *stats_timer;
> + QEMUTimer *free_page_timer;
> int64_t stats_last_update;
> int64_t stats_poll_interval;
> + int64_t free_page_wait_time;
> uint32_t host_features;
> } VirtIOBalloon;
>
> --
> 1.8.3.1
---------------------------------------------------------------------
To unsubscribe, e-mail: virtio-dev-unsubscribe@lists.oasis-open.org
For additional commands, e-mail: virtio-dev-help@lists.oasis-open.org
WARNING: multiple messages have this Message-ID (diff)
From: "Michael S. Tsirkin" <mst@redhat.com>
To: Wei Wang <wei.w.wang@intel.com>
Cc: qemu-devel@nongnu.org, virtio-dev@lists.oasis-open.org,
quintela@redhat.com, dgilbert@redhat.com, pbonzini@redhat.com,
liliang.opensource@gmail.com, yang.zhang.wz@gmail.com,
quan.xu0@gmail.com, nilal@redhat.com, riel@redhat.com
Subject: Re: [Qemu-devel] [PATCH v2 3/3] virtio-balloon: add a timer to limit the free page report waiting time
Date: Wed, 7 Feb 2018 01:43:36 +0200 [thread overview]
Message-ID: <20180207013925-mutt-send-email-mst@kernel.org> (raw)
In-Reply-To: <1517915299-15349-4-git-send-email-wei.w.wang@intel.com>
On Tue, Feb 06, 2018 at 07:08:19PM +0800, Wei Wang wrote:
> This patch adds a timer to limit the time that host waits for the free
> page hints reported by the guest. Users can specify the time in ms via
> "free-page-wait-time" command line option. If a user doesn't specify a
> time, host waits till the guest finishes reporting all the free page
> hints. The policy (wait for all the free page hints to be reported or
> use a time limit) is determined by the orchestration layer.
>
> Signed-off-by: Wei Wang <wei.w.wang@intel.com>
> CC: Michael S. Tsirkin <mst@redhat.com>
Looks like an option the migration command should get,
as opposed to a device feature.
> ---
> hw/virtio/virtio-balloon.c | 84 +++++++++++++++++++++++++++++++++++++-
> hw/virtio/virtio-pci.c | 3 ++
> include/hw/virtio/virtio-balloon.h | 4 ++
> 3 files changed, 90 insertions(+), 1 deletion(-)
>
> diff --git a/hw/virtio/virtio-balloon.c b/hw/virtio/virtio-balloon.c
> index b424d4e..9ee0de4 100644
> --- a/hw/virtio/virtio-balloon.c
> +++ b/hw/virtio/virtio-balloon.c
> @@ -207,6 +207,65 @@ static void balloon_stats_set_poll_interval(Object *obj, Visitor *v,
> balloon_stats_change_timer(s, 0);
> }
>
> +static void balloon_free_page_change_timer(VirtIOBalloon *s, int64_t ms)
> +{
> + timer_mod(s->free_page_timer,
> + qemu_clock_get_ms(QEMU_CLOCK_REALTIME) + ms);
> +}
> +
> +static void balloon_stop_free_page_report(void *opaque)
> +{
> + VirtIOBalloon *dev = opaque;
> + VirtIODevice *vdev = VIRTIO_DEVICE(dev);
> +
> + timer_del(dev->free_page_timer);
> + timer_free(dev->free_page_timer);
> + dev->free_page_timer = NULL;
> +
> + if (dev->free_page_report_status == FREE_PAGE_REPORT_S_START) {
> + dev->host_stop_free_page = true;
> + virtio_notify_config(vdev);
> + }
> +}
> +
> +static void balloon_free_page_get_wait_time(Object *obj, Visitor *v,
> + const char *name, void *opaque,
> + Error **errp)
> +{
> + VirtIOBalloon *s = opaque;
> +
> + visit_type_int(v, name, &s->free_page_wait_time, errp);
> +}
> +
> +static void balloon_free_page_set_wait_time(Object *obj, Visitor *v,
> + const char *name, void *opaque,
> + Error **errp)
> +{
> + VirtIOBalloon *s = opaque;
> + Error *local_err = NULL;
> + int64_t value;
> +
> + visit_type_int(v, name, &value, &local_err);
> + if (local_err) {
> + error_propagate(errp, local_err);
> + return;
> + }
> + if (value < 0) {
> + error_setg(errp, "free page wait time must be greater than zero");
> + return;
> + }
> +
> + if (value > UINT32_MAX) {
> + error_setg(errp, "free page wait time value is too big");
> + return;
> + }
> +
> + s->free_page_wait_time = value;
> + g_assert(s->free_page_timer == NULL);
> + s->free_page_timer = timer_new_ms(QEMU_CLOCK_REALTIME,
> + balloon_stop_free_page_report, s);
> +}
> +
> static void virtio_balloon_handle_output(VirtIODevice *vdev, VirtQueue *vq)
> {
> VirtIOBalloon *s = VIRTIO_BALLOON(vdev);
> @@ -330,6 +389,7 @@ static void virtio_balloon_poll_free_page_hints(VirtIOBalloon *dev)
> if (id == dev->free_page_report_cmd_id) {
> dev->free_page_report_status = FREE_PAGE_REPORT_S_START;
> } else {
> + dev->host_stop_free_page = false;
> dev->free_page_report_status = FREE_PAGE_REPORT_S_STOP;
> break;
> }
> @@ -385,6 +445,10 @@ static void virtio_balloon_free_page_poll(void *opaque)
> virtio_notify_config(vdev);
> s->free_page_report_status = FREE_PAGE_REPORT_S_REQUESTED;
>
> + if (s->free_page_wait_time) {
> + balloon_free_page_change_timer(s, s->free_page_wait_time);
> + }
> +
> virtio_balloon_poll_free_page_hints(s);
> }
>
> @@ -395,7 +459,19 @@ static void virtio_balloon_get_config(VirtIODevice *vdev, uint8_t *config_data)
>
> config.num_pages = cpu_to_le32(dev->num_pages);
> config.actual = cpu_to_le32(dev->actual);
> - config.free_page_report_cmd_id = cpu_to_le32(dev->free_page_report_cmd_id);
> + if (dev->host_stop_free_page) {
> + /*
> + * Host is actively requesting to stop the free page reporting, send
> + * the stop sign to the guest. This happens when the migration thread
> + * has reached the phase to send pages to the destination while the
> + * guest hasn't done the reporting.
> + */
> + config.free_page_report_cmd_id =
> + VIRTIO_BALLOON_FREE_PAGE_REPORT_STOP_ID;
> + } else {
> + config.free_page_report_cmd_id =
> + cpu_to_le32(dev->free_page_report_cmd_id);
> + }
>
> trace_virtio_balloon_get_config(config.num_pages, config.actual);
> memcpy(config_data, &config, sizeof(struct virtio_balloon_config));
> @@ -539,6 +615,7 @@ static void virtio_balloon_device_realize(DeviceState *dev, Error **errp)
> s->free_page_vq = virtio_add_queue(vdev, VIRTQUEUE_MAX_SIZE, NULL);
> s->free_page_report_status = FREE_PAGE_REPORT_S_STOP;
> s->free_page_report_cmd_id = VIRTIO_BALLOON_FREE_PAGE_REPORT_STOP_ID;
> + s->host_stop_free_page = false;
> }
> reset_stats(s);
> }
> @@ -602,6 +679,11 @@ static void virtio_balloon_instance_init(Object *obj)
> balloon_stats_get_poll_interval,
> balloon_stats_set_poll_interval,
> NULL, s, NULL);
> +
> + object_property_add(obj, "free-page-wait-time", "int",
> + balloon_free_page_get_wait_time,
> + balloon_free_page_set_wait_time,
> + NULL, s, NULL);
> }
>
> static const VMStateDescription vmstate_virtio_balloon = {
> diff --git a/hw/virtio/virtio-pci.c b/hw/virtio/virtio-pci.c
> index 6c75cca..3345104 100644
> --- a/hw/virtio/virtio-pci.c
> +++ b/hw/virtio/virtio-pci.c
> @@ -2250,6 +2250,9 @@ static void virtio_balloon_pci_instance_init(Object *obj)
> object_property_add_alias(obj, "guest-stats-polling-interval",
> OBJECT(&dev->vdev),
> "guest-stats-polling-interval", &error_abort);
> + object_property_add_alias(obj, "free-page-wait-time",
> + OBJECT(&dev->vdev),
> + "free-page-wait-time", &error_abort);
> }
>
> static const TypeInfo virtio_balloon_pci_info = {
> diff --git a/include/hw/virtio/virtio-balloon.h b/include/hw/virtio/virtio-balloon.h
> index 11b4e01..c16855b 100644
> --- a/include/hw/virtio/virtio-balloon.h
> +++ b/include/hw/virtio/virtio-balloon.h
> @@ -40,6 +40,8 @@ enum virtio_balloon_free_page_report_status {
> typedef struct VirtIOBalloon {
> VirtIODevice parent_obj;
> VirtQueue *ivq, *dvq, *svq, *free_page_vq;
> + /* Host is requesting the guest to stop free page reporting */
> + bool host_stop_free_page;
> uint32_t free_page_report_status;
> uint32_t num_pages;
> uint32_t actual;
> @@ -49,8 +51,10 @@ typedef struct VirtIOBalloon {
> VirtQueueElement *stats_vq_elem;
> size_t stats_vq_offset;
> QEMUTimer *stats_timer;
> + QEMUTimer *free_page_timer;
> int64_t stats_last_update;
> int64_t stats_poll_interval;
> + int64_t free_page_wait_time;
> uint32_t host_features;
> } VirtIOBalloon;
>
> --
> 1.8.3.1
next prev parent reply other threads:[~2018-02-06 23:43 UTC|newest]
Thread overview: 40+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-02-06 11:08 [virtio-dev] [PATCH v2 0/3] virtio-balloon: free page hint reporting support Wei Wang
2018-02-06 11:08 ` [Qemu-devel] " Wei Wang
2018-02-06 11:08 ` [virtio-dev] [PATCH v2 1/3] virtio-balloon: VIRTIO_BALLOON_F_FREE_PAGE_HINT Wei Wang
2018-02-06 11:08 ` [Qemu-devel] " Wei Wang
2018-02-07 1:04 ` [virtio-dev] " Michael S. Tsirkin
2018-02-07 1:04 ` [Qemu-devel] " Michael S. Tsirkin
2018-03-02 9:32 ` [virtio-dev] " Wei Wang
2018-03-02 9:32 ` [Qemu-devel] " Wei Wang
2018-02-09 12:06 ` Dr. David Alan Gilbert
2018-02-06 11:08 ` [virtio-dev] [PATCH v2 2/3] migration: use the free page reporting feature from balloon Wei Wang
2018-02-06 11:08 ` [Qemu-devel] " Wei Wang
2018-02-06 23:57 ` [virtio-dev] " Michael S. Tsirkin
2018-02-06 23:57 ` [Qemu-devel] " Michael S. Tsirkin
2018-02-08 3:54 ` [virtio-dev] " Wei Wang
2018-02-08 3:54 ` [Qemu-devel] " Wei Wang
2018-02-09 11:50 ` Dr. David Alan Gilbert
2018-02-26 5:07 ` Wei Wang
2018-02-26 9:22 ` Wang, Wei W
2018-02-06 11:08 ` [virtio-dev] [PATCH v2 3/3] virtio-balloon: add a timer to limit the free page report waiting time Wei Wang
2018-02-06 11:08 ` [Qemu-devel] " Wei Wang
2018-02-06 23:43 ` Michael S. Tsirkin [this message]
2018-02-06 23:43 ` Michael S. Tsirkin
2018-02-09 12:15 ` Dr. David Alan Gilbert
2018-02-26 4:35 ` Wei Wang
2018-02-27 0:50 ` Michael S. Tsirkin
2018-02-27 10:10 ` Wei Wang
2018-02-27 13:08 ` Liang Li
2018-02-28 10:33 ` Wei Wang
2018-02-27 10:34 ` Dr. David Alan Gilbert
2018-02-28 10:37 ` Wei Wang
2018-02-07 0:02 ` [virtio-dev] Re: [PATCH v2 0/3] virtio-balloon: free page hint reporting support Michael S. Tsirkin
2018-02-07 0:02 ` [Qemu-devel] " Michael S. Tsirkin
2018-02-08 5:38 ` [virtio-dev] " Wei Wang
2018-02-08 5:38 ` [Qemu-devel] " Wei Wang
2018-02-08 20:15 ` Dr. David Alan Gilbert
2018-02-09 3:10 ` [virtio-dev] " Wei Wang
2018-02-09 3:10 ` [Qemu-devel] " Wei Wang
2018-02-09 10:53 ` Dr. David Alan Gilbert
2018-02-26 4:42 ` [virtio-dev] " Wei Wang
2018-02-26 4:42 ` [Qemu-devel] " Wei Wang
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=20180207013925-mutt-send-email-mst@kernel.org \
--to=mst@redhat.com \
--cc=dgilbert@redhat.com \
--cc=liliang.opensource@gmail.com \
--cc=nilal@redhat.com \
--cc=pbonzini@redhat.com \
--cc=qemu-devel@nongnu.org \
--cc=quan.xu0@gmail.com \
--cc=quintela@redhat.com \
--cc=riel@redhat.com \
--cc=virtio-dev@lists.oasis-open.org \
--cc=wei.w.wang@intel.com \
--cc=yang.zhang.wz@gmail.com \
/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.