From: "Dr. David Alan Gilbert" <dgilbert@redhat.com>
To: guangrong.xiao@gmail.com, quintela@redhat.com
Cc: kvm@vger.kernel.org, mst@redhat.com, mtosatti@redhat.com,
Xiao Guangrong <xiaoguangrong@tencent.com>,
qemu-devel@nongnu.org, pbonzini@redhat.com
Subject: Re: [PATCH 6/8] migration: move calling save_zero_page to the common place
Date: Thu, 15 Mar 2018 12:27:00 +0000 [thread overview]
Message-ID: <20180315122700.GF3062@work-vm> (raw)
In-Reply-To: <20180313075739.11194-7-xiaoguangrong@tencent.com>
* guangrong.xiao@gmail.com (guangrong.xiao@gmail.com) wrote:
> From: Xiao Guangrong <xiaoguangrong@tencent.com>
>
> save_zero_page() is always our first approach to try, move it to
> the common place before calling ram_save_compressed_page
> and ram_save_page
>
> Signed-off-by: Xiao Guangrong <xiaoguangrong@tencent.com>
> ---
> migration/ram.c | 106 ++++++++++++++++++++++++++++++++------------------------
> 1 file changed, 60 insertions(+), 46 deletions(-)
>
> diff --git a/migration/ram.c b/migration/ram.c
> index 839665d866..9627ce18e9 100644
> --- a/migration/ram.c
> +++ b/migration/ram.c
> @@ -1021,15 +1021,8 @@ static int ram_save_page(RAMState *rs, PageSearchStatus *pss, bool last_stage)
> trace_ram_save_page(block->idstr, (uint64_t)offset, p);
>
> XBZRLE_cache_lock();
> - pages = save_zero_page(rs, block, offset);
> - if (pages > 0) {
> - /* Must let xbzrle know, otherwise a previous (now 0'd) cached
> - * page would be stale
> - */
> - xbzrle_cache_zero_page(rs, current_addr);
> - ram_release_pages(block->idstr, offset, pages);
> - } else if (!rs->ram_bulk_stage &&
> - !migration_in_postcopy() && migrate_use_xbzrle()) {
> + if (!rs->ram_bulk_stage && !migration_in_postcopy() &&
> + migrate_use_xbzrle()) {
> pages = save_xbzrle_page(rs, &p, current_addr, block,
> offset, last_stage);
> if (!last_stage) {
> @@ -1172,40 +1165,23 @@ static int ram_save_compressed_page(RAMState *rs, PageSearchStatus *pss,
>
> p = block->host + offset;
>
> - /* When starting the process of a new block, the first page of
> - * the block should be sent out before other pages in the same
> - * block, and all the pages in last block should have been sent
> - * out, keeping this order is important, because the 'cont' flag
> - * is used to avoid resending the block name.
> - */
> if (block != rs->last_sent_block) {
> - flush_compressed_data(rs);
> - pages = save_zero_page(rs, block, offset);
> - if (pages > 0) {
> - ram_release_pages(block->idstr, offset, pages);
> - } else {
> - /*
> - * Make sure the first page is sent out before other pages.
> - *
> - * we post it as normal page as compression will take much
> - * CPU resource.
> - */
> - ram_counters.transferred += save_page_header(rs, rs->f, block,
> - offset | RAM_SAVE_FLAG_PAGE);
> - qemu_put_buffer_async(rs->f, p, TARGET_PAGE_SIZE,
> - migrate_release_ram() &
> - migration_in_postcopy());
> - ram_counters.transferred += TARGET_PAGE_SIZE;
> - ram_counters.normal++;
> - pages = 1;
> - }
> + /*
> + * Make sure the first page is sent out before other pages.
> + *
> + * we post it as normal page as compression will take much
> + * CPU resource.
> + */
> + ram_counters.transferred += save_page_header(rs, rs->f, block,
> + offset | RAM_SAVE_FLAG_PAGE);
> + qemu_put_buffer_async(rs->f, p, TARGET_PAGE_SIZE,
> + migrate_release_ram() &
> + migration_in_postcopy());
> + ram_counters.transferred += TARGET_PAGE_SIZE;
> + ram_counters.normal++;
> + pages = 1;
> } else {
> - pages = save_zero_page(rs, block, offset);
> - if (pages == -1) {
> - pages = compress_page_with_multi_thread(rs, block, offset);
> - } else {
> - ram_release_pages(block->idstr, offset, pages);
> - }
> + pages = compress_page_with_multi_thread(rs, block, offset);
> }
>
> return pages;
> @@ -1447,6 +1423,25 @@ err:
> return -1;
> }
>
> +static bool save_page_use_compression(RAMState *rs)
> +{
> + if (!migrate_use_compression()) {
> + return false;
> + }
> +
> + /*
> + * If xbzrle is on, stop using the data compression after first
> + * round of migration even if compression is enabled. In theory,
> + * xbzrle can do better than compression.
> + */
> + if (rs->ram_bulk_stage || !migrate_use_xbzrle()) {
> + return true;
> + }
> +
> + return false;
> +
> +}
> +
> /**
> * ram_save_target_page: save one target page
> *
> @@ -1472,12 +1467,31 @@ static int ram_save_target_page(RAMState *rs, PageSearchStatus *pss,
> }
>
> /*
> - * If xbzrle is on, stop using the data compression after first
> - * round of migration even if compression is enabled. In theory,
> - * xbzrle can do better than compression.
> + * When starting the process of a new block, the first page of
> + * the block should be sent out before other pages in the same
> + * block, and all the pages in last block should have been sent
> + * out, keeping this order is important, because the 'cont' flag
> + * is used to avoid resending the block name.
> */
> - if (migrate_use_compression() &&
> - (rs->ram_bulk_stage || !migrate_use_xbzrle())) {
> + if (block != rs->last_sent_block && save_page_use_compression(rs)) {
> + flush_compressed_data(rs);
> + }
> +
> + res = save_zero_page(rs, block, offset);
> + if (res > 0) {
> + /* Must let xbzrle know, otherwise a previous (now 0'd) cached
> + * page would be stale
> + */
> + if (!save_page_use_compression(rs)) {
This test is quite interesting; I think the
reason it's different in the compression case is that since we don't put
any none-0 data in the xbzrle cache, we don't need to knock any old
none-0 pages out of the cache.
> + XBZRLE_cache_lock();
> + xbzrle_cache_zero_page(rs, block->offset + offset);
> + XBZRLE_cache_unlock();
> + }
> + ram_release_pages(block->idstr, offset, res);
> + goto page_saved;
> + }
> +
> + if (save_page_use_compression(rs)) {
> res = ram_save_compressed_page(rs, pss, last_stage);
> } else {
> res = ram_save_page(rs, pss, last_stage);
Reviewed-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
> --
> 2.14.3
>
>
--
Dr. David Alan Gilbert / dgilbert@redhat.com / Manchester, UK
next prev parent reply other threads:[~2018-03-15 12:27 UTC|newest]
Thread overview: 63+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-03-13 7:57 [PATCH 0/8] migration: improve and cleanup compression guangrong.xiao
2018-03-13 7:57 ` [PATCH 1/8] migration: stop compressing page in migration thread guangrong.xiao
2018-03-15 10:25 ` Dr. David Alan Gilbert
2018-03-16 8:05 ` Xiao Guangrong
2018-03-19 12:11 ` Dr. David Alan Gilbert
2018-03-21 8:19 ` Peter Xu
2018-03-22 11:38 ` Xiao Guangrong
2018-03-26 9:02 ` Peter Xu
2018-03-26 15:43 ` Xiao Guangrong
2018-03-27 7:33 ` Peter Xu
2018-03-27 19:12 ` Dr. David Alan Gilbert
2018-03-28 3:01 ` Wang, Wei W
2018-03-27 15:24 ` Xiao Guangrong
2018-03-28 7:30 ` Wei Wang
2018-03-28 7:37 ` Peter Xu
2018-03-28 8:30 ` Wei Wang
2018-03-13 7:57 ` [PATCH 2/8] migration: stop allocating and freeing memory frequently guangrong.xiao
2018-03-15 11:03 ` Dr. David Alan Gilbert
2018-03-16 8:19 ` Xiao Guangrong
2018-03-19 10:54 ` Dr. David Alan Gilbert
2018-03-19 12:11 ` Xiao Guangrong
2018-03-19 1:49 ` [PATCH 2/8] migration: stop allocating and freeingmemory frequently jiang.biao2
2018-03-19 4:03 ` Xiao Guangrong
2018-03-19 4:48 ` [PATCH 2/8] migration: stop allocating andfreeingmemory frequently jiang.biao2
2018-03-21 9:06 ` [PATCH 2/8] migration: stop allocating and freeing memory frequently Peter Xu
2018-03-22 11:57 ` Xiao Guangrong
2018-03-27 7:07 ` Peter Xu
2018-03-13 7:57 ` [PATCH 3/8] migration: support to detect compression and decompression errors guangrong.xiao
2018-03-15 11:29 ` Dr. David Alan Gilbert
2018-03-16 8:25 ` Xiao Guangrong
2018-03-19 7:56 ` [PATCH 3/8] migration: support to detect compressionand " jiang.biao2
2018-03-19 8:01 ` Xiao Guangrong
2018-03-21 10:00 ` [PATCH 3/8] migration: support to detect compression and " Peter Xu
2018-03-22 12:03 ` Xiao Guangrong
2018-03-27 7:22 ` Peter Xu
2018-03-26 19:42 ` Xiao Guangrong
2018-03-27 11:17 ` Peter Xu
2018-03-27 1:20 ` Xiao Guangrong
2018-03-28 0:43 ` [PATCH 3/8] migration: support to detectcompression " jiang.biao2
2018-03-27 14:35 ` Xiao Guangrong
2018-03-28 3:03 ` Peter Xu
2018-03-28 4:08 ` [PATCH 3/8] migration: support todetectcompression " jiang.biao2
2018-03-28 4:20 ` Peter Xu
2018-03-27 18:44 ` Xiao Guangrong
2018-03-28 8:07 ` [PATCH 3/8] migration: support todetectcompressionand " jiang.biao2
2018-03-13 7:57 ` [PATCH 4/8] migration: introduce control_save_page() guangrong.xiao
2018-03-15 11:37 ` Dr. David Alan Gilbert
2018-03-16 8:52 ` Xiao Guangrong
2018-03-27 7:47 ` Peter Xu
2018-03-13 7:57 ` [PATCH 5/8] migration: move calling control_save_page to the common place guangrong.xiao
2018-03-15 11:47 ` Dr. David Alan Gilbert
2018-03-16 8:59 ` Xiao Guangrong
2018-03-19 13:15 ` Dr. David Alan Gilbert
2018-03-27 12:35 ` Peter Xu
2018-03-13 7:57 ` [PATCH 6/8] migration: move calling save_zero_page " guangrong.xiao
2018-03-15 12:27 ` Dr. David Alan Gilbert [this message]
2018-03-27 12:49 ` Peter Xu
2018-03-13 7:57 ` [PATCH 7/8] migration: introduce save_normal_page() guangrong.xiao
2018-03-15 12:30 ` Dr. David Alan Gilbert
2018-03-27 12:54 ` Peter Xu
2018-03-13 7:57 ` [PATCH 8/8] migration: remove ram_save_compressed_page() guangrong.xiao
2018-03-15 12:32 ` Dr. David Alan Gilbert
2018-03-27 12:56 ` Peter Xu
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=20180315122700.GF3062@work-vm \
--to=dgilbert@redhat.com \
--cc=guangrong.xiao@gmail.com \
--cc=kvm@vger.kernel.org \
--cc=mst@redhat.com \
--cc=mtosatti@redhat.com \
--cc=pbonzini@redhat.com \
--cc=qemu-devel@nongnu.org \
--cc=quintela@redhat.com \
--cc=xiaoguangrong@tencent.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.