qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
* [Qemu-devel] [PATCH 0/2] memory: Dead code removals
@ 2016-03-25 10:10 Fam Zheng
  2016-03-25 10:10 ` [Qemu-devel] [PATCH 1/2] memory: Remove code for mr->may_overlap Fam Zheng
                   ` (2 more replies)
  0 siblings, 3 replies; 8+ messages in thread
From: Fam Zheng @ 2016-03-25 10:10 UTC (permalink / raw)
  To: qemu-devel; +Cc: Paolo Bonzini




Fam Zheng (2):
  memory: Remove code for mr->may_overlap
  memory: Drop FlatRange.romd_mode

 include/exec/memory.h |  1 -
 memory.c              | 39 ---------------------------------------
 2 files changed, 40 deletions(-)

-- 
2.4.3

^ permalink raw reply	[flat|nested] 8+ messages in thread

* [Qemu-devel] [PATCH 1/2] memory: Remove code for mr->may_overlap
  2016-03-25 10:10 [Qemu-devel] [PATCH 0/2] memory: Dead code removals Fam Zheng
@ 2016-03-25 10:10 ` Fam Zheng
  2016-03-29 16:14   ` Peter Maydell
  2016-03-25 10:10 ` [Qemu-devel] [PATCH 2/2] memory: Drop FlatRange.romd_mode Fam Zheng
  2016-03-25 11:19 ` [Qemu-devel] [PATCH 0/2] memory: Dead code removals Paolo Bonzini
  2 siblings, 1 reply; 8+ messages in thread
From: Fam Zheng @ 2016-03-25 10:10 UTC (permalink / raw)
  To: qemu-devel; +Cc: Paolo Bonzini

The collision check does nothing and hasn't been used. Remove the
variable together with related code.

Signed-off-by: Fam Zheng <famz@redhat.com>
---
 include/exec/memory.h |  1 -
 memory.c              | 35 -----------------------------------
 2 files changed, 36 deletions(-)

diff --git a/include/exec/memory.h b/include/exec/memory.h
index 2de7898..f071a7c 100644
--- a/include/exec/memory.h
+++ b/include/exec/memory.h
@@ -188,7 +188,6 @@ struct MemoryRegion {
     MemoryRegion *alias;
     hwaddr alias_offset;
     int32_t priority;
-    bool may_overlap;
     QTAILQ_HEAD(subregions, MemoryRegion) subregions;
     QTAILQ_ENTRY(MemoryRegion) subregions_link;
     QTAILQ_HEAD(coalesced_ranges, CoalescedMemoryRange) coalesced;
diff --git a/memory.c b/memory.c
index 95f7209..d5b75f2 100644
--- a/memory.c
+++ b/memory.c
@@ -1054,13 +1054,6 @@ static void memory_region_get_priority(Object *obj, Visitor *v,
     visit_type_int32(v, name, &value, errp);
 }
 
-static bool memory_region_get_may_overlap(Object *obj, Error **errp)
-{
-    MemoryRegion *mr = MEMORY_REGION(obj);
-
-    return mr->may_overlap;
-}
-
 static void memory_region_get_size(Object *obj, Visitor *v, const char *name,
                                    void *opaque, Error **errp)
 {
@@ -1098,10 +1091,6 @@ static void memory_region_initfn(Object *obj)
                         memory_region_get_priority,
                         NULL, /* memory_region_set_priority */
                         NULL, NULL, &error_abort);
-    object_property_add_bool(OBJECT(mr), "may-overlap",
-                             memory_region_get_may_overlap,
-                             NULL, /* memory_region_set_may_overlap */
-                             &error_abort);
     object_property_add(OBJECT(mr), "size", "uint64",
                         memory_region_get_size,
                         NULL, /* memory_region_set_size, */
@@ -1861,7 +1850,6 @@ void memory_region_del_eventfd(MemoryRegion *mr,
 
 static void memory_region_update_container_subregions(MemoryRegion *subregion)
 {
-    hwaddr offset = subregion->addr;
     MemoryRegion *mr = subregion->container;
     MemoryRegion *other;
 
@@ -1869,27 +1857,6 @@ static void memory_region_update_container_subregions(MemoryRegion *subregion)
 
     memory_region_ref(subregion);
     QTAILQ_FOREACH(other, &mr->subregions, subregions_link) {
-        if (subregion->may_overlap || other->may_overlap) {
-            continue;
-        }
-        if (int128_ge(int128_make64(offset),
-                      int128_add(int128_make64(other->addr), other->size))
-            || int128_le(int128_add(int128_make64(offset), subregion->size),
-                         int128_make64(other->addr))) {
-            continue;
-        }
-#if 0
-        printf("warning: subregion collision %llx/%llx (%s) "
-               "vs %llx/%llx (%s)\n",
-               (unsigned long long)offset,
-               (unsigned long long)int128_get64(subregion->size),
-               subregion->name,
-               (unsigned long long)other->addr,
-               (unsigned long long)int128_get64(other->size),
-               other->name);
-#endif
-    }
-    QTAILQ_FOREACH(other, &mr->subregions, subregions_link) {
         if (subregion->priority >= other->priority) {
             QTAILQ_INSERT_BEFORE(other, subregion, subregions_link);
             goto done;
@@ -1915,7 +1882,6 @@ void memory_region_add_subregion(MemoryRegion *mr,
                                  hwaddr offset,
                                  MemoryRegion *subregion)
 {
-    subregion->may_overlap = false;
     subregion->priority = 0;
     memory_region_add_subregion_common(mr, offset, subregion);
 }
@@ -1925,7 +1891,6 @@ void memory_region_add_subregion_overlap(MemoryRegion *mr,
                                          MemoryRegion *subregion,
                                          int priority)
 {
-    subregion->may_overlap = true;
     subregion->priority = priority;
     memory_region_add_subregion_common(mr, offset, subregion);
 }
-- 
2.4.3

^ permalink raw reply related	[flat|nested] 8+ messages in thread

* [Qemu-devel] [PATCH 2/2] memory: Drop FlatRange.romd_mode
  2016-03-25 10:10 [Qemu-devel] [PATCH 0/2] memory: Dead code removals Fam Zheng
  2016-03-25 10:10 ` [Qemu-devel] [PATCH 1/2] memory: Remove code for mr->may_overlap Fam Zheng
@ 2016-03-25 10:10 ` Fam Zheng
  2016-05-24 17:47   ` Laszlo Ersek
  2016-03-25 11:19 ` [Qemu-devel] [PATCH 0/2] memory: Dead code removals Paolo Bonzini
  2 siblings, 1 reply; 8+ messages in thread
From: Fam Zheng @ 2016-03-25 10:10 UTC (permalink / raw)
  To: qemu-devel; +Cc: Paolo Bonzini

Its value is alway set to mr->romd_mode, so the removed comparisons are
fully superseded by "a->mr == b->mr".

Signed-off-by: Fam Zheng <famz@redhat.com>
---
 memory.c | 4 ----
 1 file changed, 4 deletions(-)

diff --git a/memory.c b/memory.c
index d5b75f2..26af83f 100644
--- a/memory.c
+++ b/memory.c
@@ -224,7 +224,6 @@ struct FlatRange {
     hwaddr offset_in_region;
     AddrRange addr;
     uint8_t dirty_log_mask;
-    bool romd_mode;
     bool readonly;
 };
 
@@ -249,7 +248,6 @@ static bool flatrange_equal(FlatRange *a, FlatRange *b)
     return a->mr == b->mr
         && addrrange_equal(a->addr, b->addr)
         && a->offset_in_region == b->offset_in_region
-        && a->romd_mode == b->romd_mode
         && a->readonly == b->readonly;
 }
 
@@ -309,7 +307,6 @@ static bool can_merge(FlatRange *r1, FlatRange *r2)
                                 r1->addr.size),
                      int128_make64(r2->offset_in_region))
         && r1->dirty_log_mask == r2->dirty_log_mask
-        && r1->romd_mode == r2->romd_mode
         && r1->readonly == r2->readonly;
 }
 
@@ -663,7 +660,6 @@ static void render_memory_region(FlatView *view,
 
     fr.mr = mr;
     fr.dirty_log_mask = memory_region_get_dirty_log_mask(mr);
-    fr.romd_mode = mr->romd_mode;
     fr.readonly = readonly;
 
     /* Render the region itself into any gaps left by the current view. */
-- 
2.4.3

^ permalink raw reply related	[flat|nested] 8+ messages in thread

* Re: [Qemu-devel] [PATCH 0/2] memory: Dead code removals
  2016-03-25 10:10 [Qemu-devel] [PATCH 0/2] memory: Dead code removals Fam Zheng
  2016-03-25 10:10 ` [Qemu-devel] [PATCH 1/2] memory: Remove code for mr->may_overlap Fam Zheng
  2016-03-25 10:10 ` [Qemu-devel] [PATCH 2/2] memory: Drop FlatRange.romd_mode Fam Zheng
@ 2016-03-25 11:19 ` Paolo Bonzini
  2 siblings, 0 replies; 8+ messages in thread
From: Paolo Bonzini @ 2016-03-25 11:19 UTC (permalink / raw)
  To: Fam Zheng; +Cc: qemu-devel

> Fam Zheng (2):
>   memory: Remove code for mr->may_overlap
>   memory: Drop FlatRange.romd_mode
> 
>  include/exec/memory.h |  1 -
>  memory.c              | 39 ---------------------------------------
>  2 files changed, 40 deletions(-)


Thanks, both look good.  Not sure they'll make it in 2.6 though.

Paolo

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [Qemu-devel] [PATCH 1/2] memory: Remove code for mr->may_overlap
  2016-03-25 10:10 ` [Qemu-devel] [PATCH 1/2] memory: Remove code for mr->may_overlap Fam Zheng
@ 2016-03-29 16:14   ` Peter Maydell
  0 siblings, 0 replies; 8+ messages in thread
From: Peter Maydell @ 2016-03-29 16:14 UTC (permalink / raw)
  To: Fam Zheng; +Cc: Paolo Bonzini, QEMU Developers

On 25 March 2016 at 10:10, Fam Zheng <famz@redhat.com> wrote:
> The collision check does nothing and hasn't been used. Remove the
> variable together with related code.
>
> Signed-off-by: Fam Zheng <famz@redhat.com>

I would prefer it if we enabled the collision check and fixed
the things which weren't specifying overlap priorities.

thanks
-- PMM

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [Qemu-devel] [PATCH 2/2] memory: Drop FlatRange.romd_mode
  2016-03-25 10:10 ` [Qemu-devel] [PATCH 2/2] memory: Drop FlatRange.romd_mode Fam Zheng
@ 2016-05-24 17:47   ` Laszlo Ersek
  2016-05-24 19:25     ` Paolo Bonzini
  2016-05-25  1:29     ` Fam Zheng
  0 siblings, 2 replies; 8+ messages in thread
From: Laszlo Ersek @ 2016-05-24 17:47 UTC (permalink / raw)
  To: Fam Zheng, qemu-devel
  Cc: Paolo Bonzini, Drew Jones, Ard Biesheuvel, Peter Maydell

On 03/25/16 11:10, Fam Zheng wrote:
> Its value is alway set to mr->romd_mode, so the removed comparisons are
> fully superseded by "a->mr == b->mr".
> 
> Signed-off-by: Fam Zheng <famz@redhat.com>
> ---
>  memory.c | 4 ----
>  1 file changed, 4 deletions(-)
> 
> diff --git a/memory.c b/memory.c
> index d5b75f2..26af83f 100644
> --- a/memory.c
> +++ b/memory.c
> @@ -224,7 +224,6 @@ struct FlatRange {
>      hwaddr offset_in_region;
>      AddrRange addr;
>      uint8_t dirty_log_mask;
> -    bool romd_mode;
>      bool readonly;
>  };
>  
> @@ -249,7 +248,6 @@ static bool flatrange_equal(FlatRange *a, FlatRange *b)
>      return a->mr == b->mr
>          && addrrange_equal(a->addr, b->addr)
>          && a->offset_in_region == b->offset_in_region
> -        && a->romd_mode == b->romd_mode
>          && a->readonly == b->readonly;
>  }
>  
> @@ -309,7 +307,6 @@ static bool can_merge(FlatRange *r1, FlatRange *r2)
>                                  r1->addr.size),
>                       int128_make64(r2->offset_in_region))
>          && r1->dirty_log_mask == r2->dirty_log_mask
> -        && r1->romd_mode == r2->romd_mode
>          && r1->readonly == r2->readonly;
>  }
>  
> @@ -663,7 +660,6 @@ static void render_memory_region(FlatView *view,
>  
>      fr.mr = mr;
>      fr.dirty_log_mask = memory_region_get_dirty_log_mask(mr);
> -    fr.romd_mode = mr->romd_mode;
>      fr.readonly = readonly;
>  
>      /* Render the region itself into any gaps left by the current view. */
> 

This patch breaks the UEFI guest firmware (known as ArmVirtPkg or AAVMF) running in the "virt" machine type of "qemu-system-aarch64":

> 5b5660adf1fdb61db14ec681b10463b8cba633f1 is the first bad commit
> commit 5b5660adf1fdb61db14ec681b10463b8cba633f1
> Author: Fam Zheng <famz@redhat.com>
> Date:   Fri Mar 25 18:10:29 2016 +0800
> 
>     memory: Drop FlatRange.romd_mode
>     
>     Its value is alway set to mr->romd_mode, so the removed comparisons are
>     fully superseded by "a->mr == b->mr".
>     
>     Signed-off-by: Fam Zheng <famz@redhat.com>
>     Message-Id: <1458900629-2334-3-git-send-email-famz@redhat.com>
>     Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
> 
> :100644 100644 ac5236b51587ee397edd177502fc20ce159f2235 9d00dc5e7ea7406a248d32312fbf044e0ff24a3b M      memory.c

Bisection log follows:

> git bisect start
> # good: [975eb6a547f809608ccb08c221552f666611af25] Update version for v2.6.0-rc4 release
> git bisect good 975eb6a547f809608ccb08c221552f666611af25
> # bad: [287db79df8af8e31f18e262feb5e05103a09e4d4] Merge remote-tracking branch 'remotes/ehabkost/tags/x86-pull-request' into staging
> git bisect bad 287db79df8af8e31f18e262feb5e05103a09e4d4
> # good: [2cdc848eb5bd7caf467942aee63f813f52db4e40] slirp: Remove some unused code from slirp.h
> git bisect good 2cdc848eb5bd7caf467942aee63f813f52db4e40
> # good: [776efef32439a31cb13a6acfe8aab833687745ad] Merge remote-tracking branch 'remotes/bonzini/tags/for-upstream' into staging
> git bisect good 776efef32439a31cb13a6acfe8aab833687745ad
> # good: [2fe760554eb3769d70f608a158474f728ba45ba6] virtio-gpu: check max_outputs only
> git bisect good 2fe760554eb3769d70f608a158474f728ba45ba6
> # bad: [c9158547617584bb9d19db7fb139998fbef80133] Merge remote-tracking branch 'remotes/bonzini/tags/for-upstream' into staging
> git bisect bad c9158547617584bb9d19db7fb139998fbef80133
> # bad: [fd28938b7adb33f8af11849cdd0d0b2fb92990e3] scripts/signrom.py: Check for magic in option ROMs.
> git bisect bad fd28938b7adb33f8af11849cdd0d0b2fb92990e3
> # good: [e92a2d9cb3d8f589c9fe5d2eacc83d8dddea0e16] vl: change runstate only if new state is different from current state
> git bisect good e92a2d9cb3d8f589c9fe5d2eacc83d8dddea0e16
> # bad: [5b5660adf1fdb61db14ec681b10463b8cba633f1] memory: Drop FlatRange.romd_mode
> git bisect bad 5b5660adf1fdb61db14ec681b10463b8cba633f1
> # good: [ab0a99560857302b60053c245d1231acbd976cd4] exec: adjust rcu_read_lock requirement
> git bisect good ab0a99560857302b60053c245d1231acbd976cd4
> # good: [b61359781958759317ee6fd1a45b59be0b7dbbe1] memory: Remove code for mr->may_overlap
> git bisect good b61359781958759317ee6fd1a45b59be0b7dbbe1
> # first bad commit: [5b5660adf1fdb61db14ec681b10463b8cba633f1] memory: Drop FlatRange.romd_mode

The AAVMF breakage occurs during access to the pflash chip.

The pflash chip ("hw/block/pflash_cfi01.c") is a ROMD device. It means that the guest-phys address range that is backed by pflash normally behaves as ROM (romd_mode==1): it is readable and executable without traps, but writing to it causes a trap. In this mode, KVM backs the memory range with a read-only memory slot.

When writing to the pflash chip in this mode, the device is flipped over to "programming mode" or "command mode". In this mode, (romd_mode==0). KVM removes the read-only memory slot (that is, no memory at all will back the guest-phys address range), and both reads and writes to the range will trap to QEMU, every single access. There is a special command that, when written, flips the device back to ROMD mode (-> reads and executes again without traps, as ROM).

The patch breaks this behavior. Namely, contrary to the commit message, (a->mr == b->mr) does *not* imply that (a->romd_mode == b->romd_mode): the pflash device model calls memory_region_rom_device_set_romd() -- for switching between the above modes --, and that function changes mr->romd_mode *only*:

void memory_region_rom_device_set_romd(MemoryRegion *mr, bool romd_mode)
{
    if (mr->romd_mode != romd_mode) {
        memory_region_transaction_begin();
        mr->romd_mode = romd_mode;
        memory_region_update_pending |= mr->enabled;
        memory_region_transaction_commit();
    }
}

Which I think satisfies (a->mr == b->mr), but falsifies (a->romd_mode == b->romd_mode).

In effect, the patch seems to allow merging and equality between FlatRange objects when they only differ in romd_mode, and that's wrong.

Given that the cover letter for this series says "memory: Dead code removals", I'm requesting that this patch be simply reverted.

Drew and myself bisected this independently, in parallel. The bug was originally reported by Drew, so I think on the revert commit, the Reported-by should belong to him. Beyond the bisection, Drew also tested the exact revert, and it restores functionality. For which reason, I'm proposing, for the revert patch:

Reported-by: Drew Jones <drjones@redhat.com>
Tested-by: Drew Jones <drjones@redhat.com>

If my analysis above is correct, then I wouldn't mind taking credit for it, something like:

Analyzed-by: Laszlo Ersek <lersek@redhat.com>

Final protip: assert() is our friend! :)

Cheers!
Laszlo

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [Qemu-devel] [PATCH 2/2] memory: Drop FlatRange.romd_mode
  2016-05-24 17:47   ` Laszlo Ersek
@ 2016-05-24 19:25     ` Paolo Bonzini
  2016-05-25  1:29     ` Fam Zheng
  1 sibling, 0 replies; 8+ messages in thread
From: Paolo Bonzini @ 2016-05-24 19:25 UTC (permalink / raw)
  To: Laszlo Ersek, Fam Zheng, qemu-devel
  Cc: Peter Maydell, Drew Jones, Ard Biesheuvel



On 24/05/2016 19:47, Laszlo Ersek wrote:
> Which I think satisfies (a->mr == b->mr), but falsifies (a->romd_mode
> == b->romd_mode).
> 
> In effect, the patch seems to allow merging and equality between
> FlatRange objects when they only differ in romd_mode, and that's
> wrong.
> 
> Given that the cover letter for this series says "memory: Dead code
> removals", I'm requesting that this patch be simply reverted.
> 
> Drew and myself bisected this independently, in parallel. The bug was
> originally reported by Drew, so I think on the revert commit, the
> Reported-by should belong to him. Beyond the bisection, Drew also
> tested the exact revert, and it restores functionality. For which
> reason, I'm proposing, for the revert patch:
> 
> Reported-by: Drew Jones <drjones@redhat.com>
> Tested-by: Drew Jones <drjones@redhat.com>
> 
> If my analysis above is correct, then I wouldn't mind taking credit
> for it, something like:
> 
> Analyzed-by: Laszlo Ersek <lersek@redhat.com>

That makes a lot of sense.  Revert on the way.

Thanks,

Paolo

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [Qemu-devel] [PATCH 2/2] memory: Drop FlatRange.romd_mode
  2016-05-24 17:47   ` Laszlo Ersek
  2016-05-24 19:25     ` Paolo Bonzini
@ 2016-05-25  1:29     ` Fam Zheng
  1 sibling, 0 replies; 8+ messages in thread
From: Fam Zheng @ 2016-05-25  1:29 UTC (permalink / raw)
  To: Laszlo Ersek
  Cc: qemu-devel, Paolo Bonzini, Drew Jones, Ard Biesheuvel,
	Peter Maydell

On Tue, 05/24 19:47, Laszlo Ersek wrote:
> Which I think satisfies (a->mr == b->mr), but falsifies (a->romd_mode ==
> b->romd_mode).
> 
> In effect, the patch seems to allow merging and equality between FlatRange
> objects when they only differ in romd_mode, and that's wrong.
> 
> Given that the cover letter for this series says "memory: Dead code
> removals", I'm requesting that this patch be simply reverted.

Yes, it is a mistake, let's revert it. Thanks a lot for the analysis!

Fam

^ permalink raw reply	[flat|nested] 8+ messages in thread

end of thread, other threads:[~2016-05-25  1:29 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2016-03-25 10:10 [Qemu-devel] [PATCH 0/2] memory: Dead code removals Fam Zheng
2016-03-25 10:10 ` [Qemu-devel] [PATCH 1/2] memory: Remove code for mr->may_overlap Fam Zheng
2016-03-29 16:14   ` Peter Maydell
2016-03-25 10:10 ` [Qemu-devel] [PATCH 2/2] memory: Drop FlatRange.romd_mode Fam Zheng
2016-05-24 17:47   ` Laszlo Ersek
2016-05-24 19:25     ` Paolo Bonzini
2016-05-25  1:29     ` Fam Zheng
2016-03-25 11:19 ` [Qemu-devel] [PATCH 0/2] memory: Dead code removals Paolo Bonzini

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).