All of lore.kernel.org
 help / color / mirror / Atom feed
From: Paolo Bonzini <pbonzini@redhat.com>
To: qemu-devel@nongnu.org
Cc: Fam Zheng <famz@redhat.com>
Subject: [Qemu-devel] [PULL 09/15] exec: Introduce AddressSpaceDispatch.mru_section
Date: Mon,  7 Mar 2016 18:36:55 +0100	[thread overview]
Message-ID: <1457372221-19285-10-git-send-email-pbonzini@redhat.com> (raw)
In-Reply-To: <1457372221-19285-1-git-send-email-pbonzini@redhat.com>

From: Fam Zheng <famz@redhat.com>

Under heavy workloads the lookup will likely end up with the same
MemoryRegionSection from last time. Using a pointer to cache the result,
like ram_list.mru_block, significantly reduces cost of
address_space_translate.

During address space topology update, as->dispatch will be reallocated
so the pointer is invalidated automatically.

Perf reports a visible drop on the cpu usage, because phys_page_find is
not called.  Before:

   2.35%  qemu-system-x86_64       [.] phys_page_find
   0.97%  qemu-system-x86_64       [.] address_space_translate_internal
   0.95%  qemu-system-x86_64       [.] address_space_translate
   0.55%  qemu-system-x86_64       [.] address_space_lookup_region

After:

   0.97%  qemu-system-x86_64       [.] address_space_translate_internal
   0.97%  qemu-system-x86_64       [.] address_space_lookup_region
   0.84%  qemu-system-x86_64       [.] address_space_translate

Signed-off-by: Fam Zheng <famz@redhat.com>
Message-Id: <1456813104-25902-8-git-send-email-famz@redhat.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
---
 exec.c | 16 ++++++++++++++--
 1 file changed, 14 insertions(+), 2 deletions(-)

diff --git a/exec.c b/exec.c
index 9279af5..f09dd4e 100644
--- a/exec.c
+++ b/exec.c
@@ -135,6 +135,7 @@ typedef struct PhysPageMap {
 struct AddressSpaceDispatch {
     struct rcu_head rcu;
 
+    MemoryRegionSection *mru_section;
     /* This is a multi-level map on the physical address space.
      * The bottom level has pointers to MemoryRegionSections.
      */
@@ -351,14 +352,25 @@ static MemoryRegionSection *address_space_lookup_region(AddressSpaceDispatch *d,
                                                         hwaddr addr,
                                                         bool resolve_subpage)
 {
-    MemoryRegionSection *section;
+    MemoryRegionSection *section = atomic_read(&d->mru_section);
     subpage_t *subpage;
+    bool update;
 
-    section = phys_page_find(d->phys_map, addr, d->map.nodes, d->map.sections);
+    if (section && section != &d->map.sections[PHYS_SECTION_UNASSIGNED] &&
+        section_covers_addr(section, addr)) {
+        update = false;
+    } else {
+        section = phys_page_find(d->phys_map, addr, d->map.nodes,
+                                 d->map.sections);
+        update = true;
+    }
     if (resolve_subpage && section->mr->subpage) {
         subpage = container_of(section->mr, subpage_t, iomem);
         section = &d->map.sections[subpage->sub_section[SUBPAGE_IDX(addr)]];
     }
+    if (update) {
+        atomic_set(&d->mru_section, section);
+    }
     return section;
 }
 
-- 
2.5.0

  parent reply	other threads:[~2016-03-07 17:37 UTC|newest]

Thread overview: 17+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-03-07 17:36 [Qemu-devel] [PULL 00/15] Memory changes and misc bug fixes for 2016-03-07 Paolo Bonzini
2016-03-07 17:36 ` [Qemu-devel] [PULL 01/15] log: do not log if QEMU is daemonized but without -D Paolo Bonzini
2016-03-07 17:36 ` [Qemu-devel] [PULL 02/15] i8257: fix Terminal Count status Paolo Bonzini
2016-03-07 17:36 ` [Qemu-devel] [PULL 03/15] exec: Return RAMBlock pointer from allocating functions Paolo Bonzini
2016-03-07 17:36 ` [Qemu-devel] [PULL 04/15] memory: Move assignment to ram_block to memory_region_init_* Paolo Bonzini
2016-03-07 17:36 ` [Qemu-devel] [PULL 05/15] memory: Implement memory_region_get_ram_addr with mr->ram_block Paolo Bonzini
2016-03-07 17:36 ` [Qemu-devel] [PULL 06/15] memory: Drop MemoryRegion.ram_addr Paolo Bonzini
2016-03-07 17:36 ` [Qemu-devel] [PULL 07/15] exec: Pass RAMBlock pointer to qemu_ram_free Paolo Bonzini
2016-03-07 17:36 ` [Qemu-devel] [PULL 08/15] exec: Factor out section_covers_addr Paolo Bonzini
2016-03-07 17:36 ` Paolo Bonzini [this message]
2016-03-07 17:36 ` [Qemu-devel] [PULL 10/15] icount: possible options for sleep are on or off Paolo Bonzini
2016-03-07 17:36 ` [Qemu-devel] [PULL 11/15] doc/memory.txt: correct a logic error Paolo Bonzini
2016-03-07 17:36 ` [Qemu-devel] [PULL 12/15] doc/memory.txt: correct description of MemoryRegionOps fields Paolo Bonzini
2016-03-07 17:36 ` [Qemu-devel] [PULL 13/15] MAINTAINERS: Add entry for include/sysemu/kvm*.h Paolo Bonzini
2016-03-07 17:37 ` [Qemu-devel] [PULL 14/15] kvm/irqchip: use bitmap utility for gsi tracking Paolo Bonzini
2016-03-07 17:37 ` [Qemu-devel] [PULL 15/15] scsi-bus: Remove tape command from scsi_req_xfer Paolo Bonzini
2016-03-08  5:48 ` [Qemu-devel] [PULL 00/15] Memory changes and misc bug fixes for 2016-03-07 Peter Maydell

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=1457372221-19285-10-git-send-email-pbonzini@redhat.com \
    --to=pbonzini@redhat.com \
    --cc=famz@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.