All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Dr. David Alan Gilbert" <dgilbert@redhat.com>
To: Peter Xu <peterx@redhat.com>
Cc: Paolo Bonzini <pbonzini@redhat.com>,
	qemu-devel@nongnu.org, "Michael S . Tsirkin" <mst@redhat.com>
Subject: Re: [PATCH RFC 3/9] memory: Introduce log_sync_global() to memory listener
Date: Wed, 25 Mar 2020 16:52:52 +0000	[thread overview]
Message-ID: <20200325165252.GB2635@work-vm> (raw)
In-Reply-To: <20200205141749.378044-4-peterx@redhat.com>

* Peter Xu (peterx@redhat.com) wrote:
> Some of the memory listener may want to do log synchronization without
> being able to specify a range of memory to sync but always globally.
> Such a memory listener should provide this new method instead of the
> log_sync() method.
> 
> Obviously we can also achieve similar thing when we put the global
> sync logic into a log_sync() handler. However that's not efficient
> enough because otherwise memory_global_dirty_log_sync() may do the
> global sync N times, where N is the number of flat views.
> 
> Make this new method be exclusive to log_sync().
> 
> Signed-off-by: Peter Xu <peterx@redhat.com>

OK, so I guess the idea here is that when you have a ring with dirty
pages on it, you just need to clear all outstanding things on the ring
whereever they came from.

Reviewed-by: Dr. David Alan Gilbert <dgilbert@redhat.com>

> ---
>  include/exec/memory.h | 12 ++++++++++++
>  memory.c              | 33 +++++++++++++++++++++++----------
>  2 files changed, 35 insertions(+), 10 deletions(-)
> 
> diff --git a/include/exec/memory.h b/include/exec/memory.h
> index e85b7de99a..c4427094bb 100644
> --- a/include/exec/memory.h
> +++ b/include/exec/memory.h
> @@ -533,6 +533,18 @@ struct MemoryListener {
>       */
>      void (*log_sync)(MemoryListener *listener, MemoryRegionSection *section);
>  
> +    /**
> +     * @log_sync_global:
> +     *
> +     * This is the global version of @log_sync when the listener does
> +     * not have a way to synchronize the log with finer granularity.
> +     * When the listener registers with @log_sync_global defined, then
> +     * its @log_sync must be NULL.  Vice versa.
> +     *
> +     * @listener: The #MemoryListener.
> +     */
> +    void (*log_sync_global)(MemoryListener *listener);
> +
>      /**
>       * @log_clear:
>       *
> diff --git a/memory.c b/memory.c
> index aeaa8dcc9e..53828ba00c 100644
> --- a/memory.c
> +++ b/memory.c
> @@ -2016,6 +2016,10 @@ void memory_region_set_dirty(MemoryRegion *mr, hwaddr addr,
>                                          memory_region_get_dirty_log_mask(mr));
>  }
>  
> +/*
> + * If memory region `mr' is NULL, do global sync.  Otherwise, sync
> + * dirty bitmap for the specified memory region.
> + */
>  static void memory_region_sync_dirty_bitmap(MemoryRegion *mr)
>  {
>      MemoryListener *listener;
> @@ -2029,18 +2033,24 @@ static void memory_region_sync_dirty_bitmap(MemoryRegion *mr)
>       * address space once.
>       */
>      QTAILQ_FOREACH(listener, &memory_listeners, link) {
> -        if (!listener->log_sync) {
> -            continue;
> -        }
> -        as = listener->address_space;
> -        view = address_space_get_flatview(as);
> -        FOR_EACH_FLAT_RANGE(fr, view) {
> -            if (fr->dirty_log_mask && (!mr || fr->mr == mr)) {
> -                MemoryRegionSection mrs = section_from_flat_range(fr, view);
> -                listener->log_sync(listener, &mrs);
> +        if (listener->log_sync) {
> +            as = listener->address_space;
> +            view = address_space_get_flatview(as);
> +            FOR_EACH_FLAT_RANGE(fr, view) {
> +                if (fr->dirty_log_mask && (!mr || fr->mr == mr)) {
> +                    MemoryRegionSection mrs = section_from_flat_range(fr, view);
> +                    listener->log_sync(listener, &mrs);
> +                }
>              }
> +            flatview_unref(view);
> +        } else if (listener->log_sync_global) {
> +            /*
> +             * No matter whether MR is specified, what we can do here
> +             * is to do a global sync, because we are not capable to
> +             * sync in a finer granularity.
> +             */
> +            listener->log_sync_global(listener);
>          }
> -        flatview_unref(view);
>      }
>  }
>  
> @@ -2727,6 +2737,9 @@ void memory_listener_register(MemoryListener *listener, AddressSpace *as)
>  {
>      MemoryListener *other = NULL;
>  
> +    /* Only one of them can be defined for a listener */
> +    assert(!(listener->log_sync && listener->log_sync_global));
> +
>      listener->address_space = as;
>      if (QTAILQ_EMPTY(&memory_listeners)
>          || listener->priority >= QTAILQ_LAST(&memory_listeners)->priority) {
> -- 
> 2.24.1
> 
> 
--
Dr. David Alan Gilbert / dgilbert@redhat.com / Manchester, UK



  reply	other threads:[~2020-03-25 16:53 UTC|newest]

Thread overview: 31+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-02-05 14:17 [PATCH RFC 0/9] KVM: Dirty ring support (QEMU part) Peter Xu
2020-02-05 14:17 ` [PATCH RFC 1/9] KVM: Fixup kvm_log_clear_one_slot() ioctl return check Peter Xu
2020-03-25 16:34   ` Dr. David Alan Gilbert
2020-03-25 17:43   ` Peter Xu
2020-02-05 14:17 ` [PATCH RFC 2/9] linux-headers: Update Peter Xu
2020-02-05 14:17 ` [PATCH RFC 3/9] memory: Introduce log_sync_global() to memory listener Peter Xu
2020-03-25 16:52   ` Dr. David Alan Gilbert [this message]
2020-03-25 17:02     ` Peter Xu
2020-02-05 14:17 ` [PATCH RFC 4/9] KVM: Create the KVMSlot dirty bitmap on flag changes Peter Xu
2020-03-25 17:44   ` Dr. David Alan Gilbert
2020-02-05 14:17 ` [PATCH RFC 5/9] KVM: Provide helper to get kvm dirty log Peter Xu
2020-03-25 17:52   ` Dr. David Alan Gilbert
2020-03-25 18:15     ` Peter Xu
2020-02-05 14:17 ` [PATCH RFC 6/9] KVM: Provide helper to sync dirty bitmap from slot to ramblock Peter Xu
2020-03-25 18:47   ` Dr. David Alan Gilbert
2020-02-05 14:17 ` [PATCH RFC 7/9] KVM: Cache kvm slot dirty bitmap size Peter Xu
2020-03-25 18:49   ` Dr. David Alan Gilbert
2020-02-05 14:17 ` [PATCH RFC 8/9] KVM: Add dirty-ring-size property Peter Xu
2020-03-25 20:00   ` Dr. David Alan Gilbert
2020-03-25 20:42     ` Peter Xu
2020-03-26 13:41       ` Dr. David Alan Gilbert
2020-03-26 16:03         ` Peter Xu
2020-03-25 20:14   ` Dr. David Alan Gilbert
2020-03-25 20:48     ` Peter Xu
2020-02-05 14:17 ` [PATCH RFC 9/9] KVM: Dirty ring support Peter Xu
2020-03-25 20:41   ` Dr. David Alan Gilbert
2020-03-25 21:32     ` Peter Xu
2020-03-26 14:14       ` Dr. David Alan Gilbert
2020-03-26 16:10         ` Peter Xu
2020-02-05 14:51 ` [PATCH RFC 0/9] KVM: Dirty ring support (QEMU part) no-reply
2020-03-03 17:32 ` 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=20200325165252.GB2635@work-vm \
    --to=dgilbert@redhat.com \
    --cc=mst@redhat.com \
    --cc=pbonzini@redhat.com \
    --cc=peterx@redhat.com \
    --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.