[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [PATCHv4 5/9] migration: search for zero instead of dup
From: |
Orit Wasserman |
Subject: |
Re: [Qemu-devel] [PATCHv4 5/9] migration: search for zero instead of dup pages |
Date: |
Mon, 25 Mar 2013 11:30:10 +0200 |
User-agent: |
Mozilla/5.0 (X11; Linux x86_64; rv:17.0) Gecko/20130110 Thunderbird/17.0.2 |
On 03/22/2013 02:46 PM, Peter Lieven wrote:
> virtually all dup pages are zero pages. remove
> the special is_dup_page() function and use the
> optimized buffer_find_nonzero_offset() function
> instead.
>
> here buffer_find_nonzero_offset() is used directly
> to avoid the unnecssary additional checks in
> buffer_is_zero().
>
> raw performace gain checking zeroed memory
> over is_dup_page() is approx. 15-20% with SSE2.
>
> Signed-off-by: Peter Lieven <address@hidden>
> ---
> arch_init.c | 21 ++++++---------------
> 1 file changed, 6 insertions(+), 15 deletions(-)
>
> diff --git a/arch_init.c b/arch_init.c
> index 1b71912..9ebca83 100644
> --- a/arch_init.c
> +++ b/arch_init.c
> @@ -144,19 +144,10 @@ int qemu_read_default_config_files(bool userconfig)
> return 0;
> }
>
> -static int is_dup_page(uint8_t *page)
> +static inline bool is_zero_page(uint8_t *p)
> {
> - VECTYPE *p = (VECTYPE *)page;
> - VECTYPE val = SPLAT(page);
> - int i;
> -
> - for (i = 0; i < TARGET_PAGE_SIZE / sizeof(VECTYPE); i++) {
> - if (!ALL_EQ(val, p[i])) {
> - return 0;
> - }
> - }
> -
> - return 1;
> + return buffer_find_nonzero_offset(p, TARGET_PAGE_SIZE) ==
> + TARGET_PAGE_SIZE;
> }
>
> /* struct contains XBZRLE cache and a static page
> @@ -443,12 +434,12 @@ static int ram_save_block(QEMUFile *f, bool last_stage)
>
> /* In doubt sent page as normal */
> bytes_sent = -1;
> - if (is_dup_page(p)) {
> + if (is_zero_page(p)) {
> acct_info.dup_pages++;
> bytes_sent = save_block_hdr(f, block, offset, cont,
> RAM_SAVE_FLAG_COMPRESS);
> - qemu_put_byte(f, *p);
> - bytes_sent += 1;
> + qemu_put_byte(f, 0);
> + bytes_sent++;
> } else if (migrate_use_xbzrle()) {
> current_addr = block->offset + offset;
> bytes_sent = save_xbzrle_page(f, p, current_addr, block,
>
Reviewed-by: Orit Wasserman <address@hidden>
- [Qemu-devel] [PATCHv4 0/9] buffer_is_zero / migration optimizations, Peter Lieven, 2013/03/22
- [Qemu-devel] [PATCHv4 5/9] migration: search for zero instead of dup pages, Peter Lieven, 2013/03/22
- [Qemu-devel] [PATCHv4 3/9] buffer_is_zero: use vector optimizations if possible, Peter Lieven, 2013/03/22
- [Qemu-devel] [PATCHv4 8/9] migration: do not search dirty pages in bulk stage, Peter Lieven, 2013/03/22
- [Qemu-devel] [PATCHv4 1/9] move vector definitions to qemu-common.h, Peter Lieven, 2013/03/22
- [Qemu-devel] [PATCHv4 9/9] migration: use XBZRLE only after bulk stage, Peter Lieven, 2013/03/22
- [Qemu-devel] [PATCHv4 4/9] bitops: use vector algorithm to optimize find_next_bit(), Peter Lieven, 2013/03/22