From: Peter Xu <peterx@redhat.com>
To: Zenghui Yu <yuzenghui@huawei.com>
Cc: pbonzini@redhat.com, qemu-devel@nongnu.org, wanghaibin.wang@huawei.com
Subject: Re: [PATCH] kvm: Take into account the unaligned section size when preparing bitmap
Date: Tue, 8 Dec 2020 10:16:54 -0500 [thread overview]
Message-ID: <20201208151654.GA6432@xz-x1> (raw)
In-Reply-To: <20201208114013.875-1-yuzenghui@huawei.com>
Hi, Zenghui,
On Tue, Dec 08, 2020 at 07:40:13PM +0800, Zenghui Yu wrote:
> The kernel KVM_CLEAR_DIRTY_LOG interface has align requirement on both the
> start and the size of the given range of pages. We have been careful to
> handle the unaligned cases when performing CLEAR on one slot. But it seems
> that we forget to take the unaligned *size* case into account when
> preparing bitmap for the interface, and we may end up clearing dirty status
> for pages outside of [start, start + size).
Thanks for the patch, though my understanding is that this is not a bug.
Please have a look at kvm_memslot_init_dirty_bitmap() where we'll allocate the
dirty bitmap to be aligned to 8 bytes (assuming that's the possible max of the
value sizeof(unsigned long)). That exactly covers 64 pages.
So here as long as start_delta==0 (so the value of "bmap_npages - size / psize"
won't really matter a lot, imho), then we'll definitely have KVMSlot.dirty_bmap
long enough to cover the range we'd like to clear.
Note that the size of KVMSlot.dirty_bmap can be bigger than the actually size
of the kvm memslot, however since kvm_memslot_init_dirty_bitmap() initialized
it to all zero so the extra bits will always be zero for the whole lifecycle of
the vm/bitmap.
Thanks,
>
> Signed-off-by: Zenghui Yu <yuzenghui@huawei.com>
> ---
> accel/kvm/kvm-all.c | 7 +++++--
> 1 file changed, 5 insertions(+), 2 deletions(-)
>
> diff --git a/accel/kvm/kvm-all.c b/accel/kvm/kvm-all.c
> index bed2455ca5..05d323ba1f 100644
> --- a/accel/kvm/kvm-all.c
> +++ b/accel/kvm/kvm-all.c
> @@ -747,7 +747,7 @@ static int kvm_log_clear_one_slot(KVMSlot *mem, int as_id, uint64_t start,
> assert(bmap_start % BITS_PER_LONG == 0);
> /* We should never do log_clear before log_sync */
> assert(mem->dirty_bmap);
> - if (start_delta) {
> + if (start_delta || bmap_npages - size / psize) {
> /* Slow path - we need to manipulate a temp bitmap */
> bmap_clear = bitmap_new(bmap_npages);
> bitmap_copy_with_src_offset(bmap_clear, mem->dirty_bmap,
> @@ -760,7 +760,10 @@ static int kvm_log_clear_one_slot(KVMSlot *mem, int as_id, uint64_t start,
> bitmap_clear(bmap_clear, 0, start_delta);
> d.dirty_bitmap = bmap_clear;
> } else {
> - /* Fast path - start address aligns well with BITS_PER_LONG */
> + /*
> + * Fast path - both start and size align well with BITS_PER_LONG
> + * (or the end of memory slot)
> + */
> d.dirty_bitmap = mem->dirty_bmap + BIT_WORD(bmap_start);
> }
>
> --
> 2.19.1
>
>
--
Peter Xu
next prev parent reply other threads:[~2020-12-08 15:28 UTC|newest]
Thread overview: 16+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-12-08 11:40 [PATCH] kvm: Take into account the unaligned section size when preparing bitmap Zenghui Yu
2020-12-08 15:16 ` Peter Xu [this message]
2020-12-09 2:33 ` Zenghui Yu
2020-12-09 21:09 ` Peter Xu
2020-12-10 4:23 ` Zenghui Yu
2020-12-10 1:46 ` zhukeqian
2020-12-10 2:08 ` Peter Xu
2020-12-10 2:53 ` zhukeqian
2020-12-10 3:31 ` Zenghui Yu
2020-12-10 14:50 ` Peter Xu
2020-12-11 1:13 ` zhukeqian
2020-12-11 15:25 ` Peter Xu
2020-12-14 2:14 ` zhukeqian
2020-12-14 15:36 ` Peter Xu
2020-12-15 7:23 ` zhukeqian
2020-12-15 7:39 ` Zenghui Yu
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=20201208151654.GA6432@xz-x1 \
--to=peterx@redhat.com \
--cc=pbonzini@redhat.com \
--cc=qemu-devel@nongnu.org \
--cc=wanghaibin.wang@huawei.com \
--cc=yuzenghui@huawei.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.