From: Anthony Liguori <anthony@codemonkey.ws>
To: qemu-devel@nongnu.org
Subject: Re: [Qemu-devel] [PATCH 5/6] Introduce kvm logging interface.
Date: Wed, 19 Nov 2008 09:18:43 -0600 [thread overview]
Message-ID: <49242E53.6000802@codemonkey.ws> (raw)
In-Reply-To: <1227108377-8442-6-git-send-email-glommer@redhat.com>
Glauber Costa wrote:
> Introduce functions to stop and start logging of memory regions.
> We select region based on its start address.
>
> Signed-off-by: Glauber Costa <glommer@redhat.com>
> ---
> kvm-all.c | 153 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
> kvm.h | 5 ++
> 2 files changed, 158 insertions(+), 0 deletions(-)
>
> diff --git a/kvm-all.c b/kvm-all.c
> index 9700e50..c522205 100644
> --- a/kvm-all.c
> +++ b/kvm-all.c
> @@ -32,8 +32,13 @@
> do { } while (0)
> #endif
>
> +#define warning(fmt, ...) \
> + do { dprintf("%s:%d" fmt, __func__, __LINE__, ## __VA_ARGS__); } while (0)
>
I don't think this macro really serves a purpose. You can just add
"%s:%d: " to the beginning of dprintf() if you want.
Also note that it gives goofy output right now because of the missing
space after %d.
> +/*
> + * dirty pages logging control
> + */
> +static int kvm_dirty_pages_log_change(KVMSlot *mem,
> + unsigned flags,
> + unsigned mask)
> +{
> + int r = -1;
> + KVMState *s = kvm_state;
> +
> + flags = (mem->flags & ~mask) | flags;
> + if (flags == mem->flags)
> + return 0;
> +
> + mem->flags = flags;
> +
> + r = kvm_vm_ioctl(s, KVM_SET_USER_MEMORY_REGION, mem);
> + if (r == -1)
> + fprintf(stderr, "%s: %m\n", __FUNCTION__);
> +
> + return r;
> +}
> +
> +int kvm_log_start(target_phys_addr_t phys_addr, target_phys_addr_t end_addr)
> +{
> + KVMState *s = kvm_state;
> + KVMSlot *mem = kvm_lookup_slot(s, phys_addr);
> +
> + /*
> + * We don't need to do dirty tracking of alias slots. If we track the
> + * memory the alias is pointing to, it should be enough
> + */
> + if (kvm_arch_is_alias_slot(phys_addr))
> + return 0;
> +
> + if (mem == NULL) {
> + warning("invalid parameters %llx-%llx\n", phys_addr, end_addr);
> + return -EINVAL;
> + }
> +
> + /* Already logging, no need to issue ioctl */
> + if (mem->flags & KVM_MEM_LOG_DIRTY_PAGES)
> + return 0;
> +
> + dprintf("slot %d: enable logging (phys %llx, uaddr %llx)\n",
> + mem->slot, mem->guest_phys_addr, mem->userspace_addr);
> +
> + return kvm_dirty_pages_log_change(mem,
> + KVM_MEM_LOG_DIRTY_PAGES,
> + KVM_MEM_LOG_DIRTY_PAGES);
> +}
> +
> +int kvm_log_stop(target_phys_addr_t phys_addr, target_phys_addr_t end_addr)
> +{
> +
> + KVMState *s = kvm_state;
> + KVMSlot *mem = kvm_lookup_slot(s, phys_addr);
> +
> + if (kvm_arch_is_alias_slot(phys_addr))
> + return 0;
> +
> + if (mem == NULL) {
> + warning("invalid parameters %llx - %llx \n", phys_addr, end_addr);
> + return -EINVAL;
> + }
> +
> + /* Not logging, no need to issue ioctl */
> + if (!(mem->flags & KVM_MEM_LOG_DIRTY_PAGES))
> + return 0;
> +
> + dprintf("slot %d: disabling logging\n", mem->slot);
> + return kvm_dirty_pages_log_change(mem,
> + 0,
> + KVM_MEM_LOG_DIRTY_PAGES);
> +}
>
Note that start and stop are identical except for a different printf().
The call a common helper function. Why not fold everything into
kvm_dirty_pages_log_change() and make that the public interface
(kvm_set_log).
> +static inline int lookup_bitmap_phys(unsigned long *dirty, unsigned nr)
> +{
> + unsigned word = nr / (sizeof(*dirty) * 8);
> + unsigned bit = nr % (sizeof(*dirty) * 8);
> + int ret;
> +
> + ret = (dirty[word] >> bit) & 1;
> + return ret;
> +}
> +
> +/**
> + * kvm_physical_sync_dirty_bitmap - Grab dirty bitmap from kernel space
> + * If a phys_offset parameter is given, this function updates qemu's dirty
> + * bitmap using cpu_physical_memory_set_dirty(). This means all bits are set
> + * to dirty.
> + *
> + * @start_add: start of logged region. This is what we use to search the memslot
> + * @end_addr: end of logged region. Only matters if we are updating qemu dirty bitmap.
> + * @phys_offset: the phys_offset we want to use for qemu dirty bitmap update. Passing
> + * NULL makes the update not happen. In this case, we only grab the bitmap
> + * from kernel.
> + */
> +void kvm_physical_sync_dirty_bitmap(target_phys_addr_t start_addr, target_phys_addr_t end_addr,
> + ram_addr_t phys_offset)
>
This interface is weird and broken. If we wanted to use this for live
migration, we would end up passing phys_offset=0 but that has a special
meaning here.
But why are we passing phys_offset at all? Why can't we do the lookup here?
Regards,
Anthony Liguori
next prev parent reply other threads:[~2008-11-19 15:18 UTC|newest]
Thread overview: 18+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-11-19 15:26 [Qemu-devel] [PATCH 0/6] New shot at VGA optimization Glauber Costa
2008-11-19 14:23 ` Avi Kivity
2008-11-19 14:34 ` Glauber Costa
2008-11-19 15:26 ` [Qemu-devel] [PATCH 1/6] kvm: memory aliasing support for kvm Glauber Costa
2008-11-19 15:07 ` Anthony Liguori
2008-11-19 15:26 ` [Qemu-devel] [PATCH 2/6] better type checking for vga Glauber Costa
2008-11-19 15:08 ` Anthony Liguori
2008-11-19 15:26 ` [Qemu-devel] [PATCH 3/6] move vga_io_address to VGA State Glauber Costa
2008-11-19 15:26 ` [Qemu-devel] [PATCH 4/6] kvm: de-register mem region for MMIO Glauber Costa
2008-11-19 15:10 ` Anthony Liguori
2008-11-19 15:26 ` [Qemu-devel] [PATCH 5/6] Introduce kvm logging interface Glauber Costa
2008-11-19 15:18 ` Anthony Liguori [this message]
2008-11-19 17:23 ` Glauber Costa
2008-11-19 17:51 ` Anthony Liguori
2008-11-19 15:26 ` [Qemu-devel] [PATCH 6/6] kvm: vga optimization Glauber Costa
2008-11-19 15:23 ` Anthony Liguori
2008-11-19 17:19 ` Glauber Costa
2008-11-19 17:26 ` Anthony Liguori
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=49242E53.6000802@codemonkey.ws \
--to=anthony@codemonkey.ws \
--cc=qemu-devel@nongnu.org \
/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.