qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-devel] [PATCH] exec: Skip mru section if it's a partial page a


From: Paolo Bonzini
Subject: Re: [Qemu-devel] [PATCH] exec: Skip mru section if it's a partial page and not resolving subpage
Date: Wed, 15 Nov 2017 14:56:23 +0100
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Thunderbird/52.4.0

On 14/11/2017 23:42, BALATON Zoltan wrote:
> This fixes a crash caused by picking the wrong memory region in
> address_space_lookup_region seen with client code accessing a device
> model that uses alias memory regions.
> 
> Signed-off-by: BALATON Zoltan <address@hidden>
> ---
>  exec.c | 1 +
>  1 file changed, 1 insertion(+)
> 
> diff --git a/exec.c b/exec.c
> index 97a24a8..e5f2b9a 100644
> --- a/exec.c
> +++ b/exec.c
> @@ -413,6 +413,7 @@ static MemoryRegionSection 
> *address_space_lookup_region(AddressSpaceDispatch *d,
>      bool update;
>  
>      if (section && section != &d->map.sections[PHYS_SECTION_UNASSIGNED] &&
> +        (resolve_subpage || !section->offset_within_region) &&
>          section_covers_addr(section, addr)) {
>          update = false;
>      } else {
> 

This is another possibility:

diff --git a/exec.c b/exec.c
index 97a24a875e..3bb9fcf257 100644
--- a/exec.c
+++ b/exec.c
@@ -410,22 +410,16 @@ static MemoryRegionSection 
*address_space_lookup_region(AddressSpaceDispatch *d,
 {
     MemoryRegionSection *section = atomic_read(&d->mru_section);
     subpage_t *subpage;
-    bool update;
 
-    if (section && section != &d->map.sections[PHYS_SECTION_UNASSIGNED] &&
-        section_covers_addr(section, addr)) {
-        update = false;
-    } else {
+    if (!section || section == &d->map.sections[PHYS_SECTION_UNASSIGNED] ||
+        !section_covers_addr(section, addr)) {
         section = phys_page_find(d, addr);
-        update = true;
+        atomic_set(&d->mru_section, section);
     }
     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;
 }
 

It will skip the expensive phys_page_find but not the cheap subpage lookup.
Does it work for you?

Paolo



reply via email to

[Prev in Thread] Current Thread [Next in Thread]