All of lore.kernel.org
 help / color / mirror / Atom feed
From: Paolo Bonzini <pbonzini@redhat.com>
To: Xiao Guangrong <guangrong.xiao@linux.intel.com>
Cc: Marcelo Tosatti <mtosatti@redhat.com>,
	kvm@vger.kernel.org,
	"qemu-devel@nongnu.org" <qemu-devel@nongnu.org>,
	"Li, Wanpeng" <wanpeng.li@intel.com>
Subject: Re: [PATCH] kvm: fix slot flags sync between Qemu and KVM
Date: Wed, 08 Apr 2015 12:46:44 +0200	[thread overview]
Message-ID: <55250714.1050400@redhat.com> (raw)
In-Reply-To: <5524CC0E.8020208@linux.intel.com>



On 08/04/2015 08:34, Xiao Guangrong wrote:
> We noticed that KVM keeps tracking dirty for the memslots when
> live migration failed which causes bad performance due to huge
> page mapping disallowed for this kind of memslot
> 
> It is caused by slot flags does not properly sync-ed between Qemu
> and KVM. Current code doing slot update depends on slot->flags
> which hopes to omit unnecessary ioctl. However, slot->flags only
> reflects the stauts of corresponding memory region, vmsave and
> live migration do dirty tracking which overset
> KVM_MEM_LOG_DIRTY_PAGES for the slot. That causes the slot status
> recorded in the flags does not exactly match the stauts in kernel.
> 
> We fixed it by introducing slot->is_dirty_logging which indicates
> the dirty status in kernel so that it helps us to sync the status
> between userspace and kernel
> 
> Wanpeng Li <wanpeng.li@linux.intel.com>
> Signed-off-by: Xiao Guangrong <guangrong.xiao@linux.intel.com>

Hi Xiao,

the patch looks good.

However, I am planning to remove s->migration_log completely from QEMU
2.4 and have slot->flags also track the migration state.  This has the
side effect of fixing this bug.  I'll Cc you on the patches when I post
them (next week probably).

Thanks!

Paolo

> ---
>  kvm-all.c | 19 ++++++++++++++++++-
>  1 file changed, 18 insertions(+), 1 deletion(-)
> 
> diff --git a/kvm-all.c b/kvm-all.c
> index dd44f8c..69fa233 100644
> --- a/kvm-all.c
> +++ b/kvm-all.c
> @@ -60,6 +60,15 @@
> 
>  #define KVM_MSI_HASHTAB_SIZE    256
> 
> +/*
> + * @flags only reflects the stauts of corresponding memory region,
> however,
> + * vmsave and live migration do dirty tracking which overset
> + * KVM_MEM_LOG_DIRTY_PAGES for the slot. That causes the slot status
> recorded
> + * in @flags does not exactly match the stauts in kernel.
> + *
> + * @is_dirty_logging indicating the dirty status in kernel helps us to
> sync
> + * the status between userspace and kernel.
> + */
>  typedef struct KVMSlot
>  {
>      hwaddr start_addr;
> @@ -67,6 +76,7 @@ typedef struct KVMSlot
>      void *ram;
>      int slot;
>      int flags;
> +    bool is_dirty_logging;
>  } KVMSlot;
> 
>  typedef struct kvm_dirty_log KVMDirtyLog;
> @@ -245,6 +255,7 @@ static int kvm_set_user_memory_region(KVMState *s,
> KVMSlot *slot)
>          kvm_vm_ioctl(s, KVM_SET_USER_MEMORY_REGION, &mem);
>      }
>      mem.memory_size = slot->memory_size;
> +    slot->is_dirty_logging = !!(mem.flags & KVM_MEM_LOG_DIRTY_PAGES);
>      return kvm_vm_ioctl(s, KVM_SET_USER_MEMORY_REGION, &mem);
>  }
> 
> @@ -312,6 +323,7 @@ static int kvm_slot_dirty_pages_log_change(KVMSlot
> *mem, bool log_dirty)
>      int old_flags;
> 
>      old_flags = mem->flags;
> +    old_flags |= mem->is_dirty_logging ? KVM_MEM_LOG_DIRTY_PAGES : 0;
> 
>      flags = (mem->flags & ~mask) | kvm_mem_flags(s, log_dirty, false);
>      mem->flags = flags;
> @@ -376,12 +388,17 @@ static int kvm_set_migration_log(bool enable)
>      s->migration_log = enable;
> 
>      for (i = 0; i < s->nr_slots; i++) {
> +        int dirty_enable;
> +
>          mem = &s->slots[i];
> 
>          if (!mem->memory_size) {
>              continue;
>          }
> -        if (!!(mem->flags & KVM_MEM_LOG_DIRTY_PAGES) == enable) {
> +
> +        /* Keep the dirty bit if it is tracked by the memory region. */
> +        dirty_enable = enable | (mem->flags & KVM_MEM_LOG_DIRTY_PAGES);
> +        if (mem->is_dirty_logging == dirty_enable) {
>              continue;
>          }
>          err = kvm_set_user_memory_region(s, mem);

WARNING: multiple messages have this Message-ID (diff)
From: Paolo Bonzini <pbonzini@redhat.com>
To: Xiao Guangrong <guangrong.xiao@linux.intel.com>
Cc: "Li, Wanpeng" <wanpeng.li@intel.com>,
	Marcelo Tosatti <mtosatti@redhat.com>,
	"qemu-devel@nongnu.org" <qemu-devel@nongnu.org>,
	kvm@vger.kernel.org
Subject: Re: [Qemu-devel] [PATCH] kvm: fix slot flags sync between Qemu and KVM
Date: Wed, 08 Apr 2015 12:46:44 +0200	[thread overview]
Message-ID: <55250714.1050400@redhat.com> (raw)
In-Reply-To: <5524CC0E.8020208@linux.intel.com>



On 08/04/2015 08:34, Xiao Guangrong wrote:
> We noticed that KVM keeps tracking dirty for the memslots when
> live migration failed which causes bad performance due to huge
> page mapping disallowed for this kind of memslot
> 
> It is caused by slot flags does not properly sync-ed between Qemu
> and KVM. Current code doing slot update depends on slot->flags
> which hopes to omit unnecessary ioctl. However, slot->flags only
> reflects the stauts of corresponding memory region, vmsave and
> live migration do dirty tracking which overset
> KVM_MEM_LOG_DIRTY_PAGES for the slot. That causes the slot status
> recorded in the flags does not exactly match the stauts in kernel.
> 
> We fixed it by introducing slot->is_dirty_logging which indicates
> the dirty status in kernel so that it helps us to sync the status
> between userspace and kernel
> 
> Wanpeng Li <wanpeng.li@linux.intel.com>
> Signed-off-by: Xiao Guangrong <guangrong.xiao@linux.intel.com>

Hi Xiao,

the patch looks good.

However, I am planning to remove s->migration_log completely from QEMU
2.4 and have slot->flags also track the migration state.  This has the
side effect of fixing this bug.  I'll Cc you on the patches when I post
them (next week probably).

Thanks!

Paolo

> ---
>  kvm-all.c | 19 ++++++++++++++++++-
>  1 file changed, 18 insertions(+), 1 deletion(-)
> 
> diff --git a/kvm-all.c b/kvm-all.c
> index dd44f8c..69fa233 100644
> --- a/kvm-all.c
> +++ b/kvm-all.c
> @@ -60,6 +60,15 @@
> 
>  #define KVM_MSI_HASHTAB_SIZE    256
> 
> +/*
> + * @flags only reflects the stauts of corresponding memory region,
> however,
> + * vmsave and live migration do dirty tracking which overset
> + * KVM_MEM_LOG_DIRTY_PAGES for the slot. That causes the slot status
> recorded
> + * in @flags does not exactly match the stauts in kernel.
> + *
> + * @is_dirty_logging indicating the dirty status in kernel helps us to
> sync
> + * the status between userspace and kernel.
> + */
>  typedef struct KVMSlot
>  {
>      hwaddr start_addr;
> @@ -67,6 +76,7 @@ typedef struct KVMSlot
>      void *ram;
>      int slot;
>      int flags;
> +    bool is_dirty_logging;
>  } KVMSlot;
> 
>  typedef struct kvm_dirty_log KVMDirtyLog;
> @@ -245,6 +255,7 @@ static int kvm_set_user_memory_region(KVMState *s,
> KVMSlot *slot)
>          kvm_vm_ioctl(s, KVM_SET_USER_MEMORY_REGION, &mem);
>      }
>      mem.memory_size = slot->memory_size;
> +    slot->is_dirty_logging = !!(mem.flags & KVM_MEM_LOG_DIRTY_PAGES);
>      return kvm_vm_ioctl(s, KVM_SET_USER_MEMORY_REGION, &mem);
>  }
> 
> @@ -312,6 +323,7 @@ static int kvm_slot_dirty_pages_log_change(KVMSlot
> *mem, bool log_dirty)
>      int old_flags;
> 
>      old_flags = mem->flags;
> +    old_flags |= mem->is_dirty_logging ? KVM_MEM_LOG_DIRTY_PAGES : 0;
> 
>      flags = (mem->flags & ~mask) | kvm_mem_flags(s, log_dirty, false);
>      mem->flags = flags;
> @@ -376,12 +388,17 @@ static int kvm_set_migration_log(bool enable)
>      s->migration_log = enable;
> 
>      for (i = 0; i < s->nr_slots; i++) {
> +        int dirty_enable;
> +
>          mem = &s->slots[i];
> 
>          if (!mem->memory_size) {
>              continue;
>          }
> -        if (!!(mem->flags & KVM_MEM_LOG_DIRTY_PAGES) == enable) {
> +
> +        /* Keep the dirty bit if it is tracked by the memory region. */
> +        dirty_enable = enable | (mem->flags & KVM_MEM_LOG_DIRTY_PAGES);
> +        if (mem->is_dirty_logging == dirty_enable) {
>              continue;
>          }
>          err = kvm_set_user_memory_region(s, mem);

  parent reply	other threads:[~2015-04-08 10:46 UTC|newest]

Thread overview: 8+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-04-08  6:34 [PATCH] kvm: fix slot flags sync between Qemu and KVM Xiao Guangrong
2015-04-08  6:34 ` [Qemu-devel] " Xiao Guangrong
2015-04-08  6:37 ` Xiao Guangrong
2015-04-08  6:37   ` [Qemu-devel] " Xiao Guangrong
2015-04-08 10:46 ` Paolo Bonzini [this message]
2015-04-08 10:46   ` Paolo Bonzini
2015-04-09  1:24   ` Xiao Guangrong
2015-04-09  1:24     ` [Qemu-devel] " Xiao Guangrong

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=55250714.1050400@redhat.com \
    --to=pbonzini@redhat.com \
    --cc=guangrong.xiao@linux.intel.com \
    --cc=kvm@vger.kernel.org \
    --cc=mtosatti@redhat.com \
    --cc=qemu-devel@nongnu.org \
    --cc=wanpeng.li@intel.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.