* [PATCH] memory: Have 'info mtree' remove duplicated Address Space information
@ 2021-08-20 10:54 Philippe Mathieu-Daudé
2021-08-20 10:58 ` Philippe Mathieu-Daudé
0 siblings, 1 reply; 5+ messages in thread
From: Philippe Mathieu-Daudé @ 2021-08-20 10:54 UTC (permalink / raw)
To: qemu-devel
Cc: Peter Maydell, David Hildenbrand, Mark Cave-Ayland, Peter Xu,
Gerd Hoffmann, Paolo Bonzini, Philippe Mathieu-Daudé
Per Peter Maydell [*]:
'info mtree' monitor command was designed on the assumption that
there's really only one or two interesting address spaces, and
with more recent developments that's just not the case any more.
Similarly about how the FlatView are sorted using a GHashTable,
sort the AddressSpace objects to remove the duplications (AS
using the same root MemoryRegion).
This drastically reduce 'info mtree' on some boards.
Before:
$ (echo info mtree; echo q) \
| qemu-system-aarch64 -S -monitor stdio -M raspi3b \
| wc -l
423
After:
$ (echo info mtree; echo q) \
| qemu-system-aarch64 -S -monitor stdio -M raspi3b \
| wc -l
108
(qemu) info mtree
address-space: I/O
0000000000000000-000000000000ffff (prio 0, i/o): io
address-space shared 9 times:
- cpu-memory-0
- cpu-memory-1
- cpu-memory-2
- cpu-memory-3
- cpu-secure-memory-0
- cpu-secure-memory-1
- cpu-secure-memory-2
- cpu-secure-memory-3
- memory
0000000000000000-ffffffffffffffff (prio 0, i/o): system
0000000000000000-000000003fffffff (prio 0, ram): ram
000000003f000000-000000003fffffff (prio 1, i/o): bcm2835-peripherals
000000003f003000-000000003f00301f (prio 0, i/o): bcm2835-sys-timer
000000003f004000-000000003f004fff (prio -1000, i/o): bcm2835-txp
000000003f006000-000000003f006fff (prio 0, i/o): mphi
000000003f007000-000000003f007fff (prio 0, i/o): bcm2835-dma
000000003f00b200-000000003f00b3ff (prio 0, i/o): bcm2835-ic
000000003f00b400-000000003f00b43f (prio -1000, i/o): bcm2835-sp804
000000003f00b800-000000003f00bbff (prio 0, i/o): bcm2835-mbox
000000003f100000-000000003f1001ff (prio 0, i/o): bcm2835-powermgt
000000003f101000-000000003f102fff (prio 0, i/o): bcm2835-cprman
000000003f104000-000000003f10400f (prio 0, i/o): bcm2835-rng
000000003f200000-000000003f200fff (prio 0, i/o): bcm2835_gpio
000000003f201000-000000003f201fff (prio 0, i/o): pl011
000000003f202000-000000003f202fff (prio 0, i/o): bcm2835-sdhost
000000003f203000-000000003f2030ff (prio -1000, i/o): bcm2835-i2s
000000003f204000-000000003f20401f (prio -1000, i/o): bcm2835-spi0
000000003f205000-000000003f20501f (prio -1000, i/o): bcm2835-i2c0
000000003f20f000-000000003f20f07f (prio -1000, i/o): bcm2835-otp
000000003f212000-000000003f212007 (prio 0, i/o): bcm2835-thermal
000000003f214000-000000003f2140ff (prio -1000, i/o): bcm2835-spis
000000003f215000-000000003f2150ff (prio 0, i/o): bcm2835-aux
000000003f300000-000000003f3000ff (prio 0, i/o): sdhci
000000003f600000-000000003f6000ff (prio -1000, i/o): bcm2835-smi
000000003f804000-000000003f80401f (prio -1000, i/o): bcm2835-i2c1
000000003f805000-000000003f80501f (prio -1000, i/o): bcm2835-i2c2
000000003f900000-000000003f907fff (prio -1000, i/o): bcm2835-dbus
000000003f910000-000000003f917fff (prio -1000, i/o): bcm2835-ave0
000000003f980000-000000003f990fff (prio 0, i/o): dwc2
000000003f980000-000000003f980fff (prio 0, i/o): dwc2-io
000000003f981000-000000003f990fff (prio 0, i/o): dwc2-fifo
000000003fc00000-000000003fc00fff (prio -1000, i/o): bcm2835-v3d
000000003fe00000-000000003fe000ff (prio -1000, i/o): bcm2835-sdramc
000000003fe05000-000000003fe050ff (prio 0, i/o): bcm2835-dma-chan15
0000000040000000-00000000400000ff (prio 0, i/o): bcm2836-control
address-space shared 4 times:
- bcm2835-dma-memory
- bcm2835-fb-memory
- bcm2835-property-memory
- dwc2
0000000000000000-00000000ffffffff (prio 0, i/o): bcm2835-gpu
0000000000000000-000000003fffffff (prio 0, ram): alias bcm2835-gpu-ram-alias[*] @ram 0000000000000000-000000003fffffff
0000000040000000-000000007fffffff (prio 0, ram): alias bcm2835-gpu-ram-alias[*] @ram 0000000000000000-000000003fffffff
000000007e000000-000000007effffff (prio 1, i/o): alias bcm2835-peripherals @bcm2835-peripherals 0000000000000000-0000000000ffffff
0000000080000000-00000000bfffffff (prio 0, ram): alias bcm2835-gpu-ram-alias[*] @ram 0000000000000000-000000003fffffff
00000000c0000000-00000000ffffffff (prio 0, ram): alias bcm2835-gpu-ram-alias[*] @ram 0000000000000000-000000003fffffff
address-space: bcm2835-mbox-memory
0000000000000000-000000000000008f (prio 0, i/o): bcm2835-mbox
0000000000000010-000000000000001f (prio 0, i/o): bcm2835-fb
0000000000000080-000000000000008f (prio 0, i/o): bcm2835-property
memory-region: ram
0000000000000000-000000003fffffff (prio 0, ram): ram
memory-region: bcm2835-peripherals
000000003f000000-000000003fffffff (prio 1, i/o): bcm2835-peripherals
000000003f003000-000000003f00301f (prio 0, i/o): bcm2835-sys-timer
000000003f004000-000000003f004fff (prio -1000, i/o): bcm2835-txp
000000003f006000-000000003f006fff (prio 0, i/o): mphi
000000003f007000-000000003f007fff (prio 0, i/o): bcm2835-dma
000000003f00b200-000000003f00b3ff (prio 0, i/o): bcm2835-ic
000000003f00b400-000000003f00b43f (prio -1000, i/o): bcm2835-sp804
000000003f00b800-000000003f00bbff (prio 0, i/o): bcm2835-mbox
000000003f100000-000000003f1001ff (prio 0, i/o): bcm2835-powermgt
000000003f101000-000000003f102fff (prio 0, i/o): bcm2835-cprman
000000003f104000-000000003f10400f (prio 0, i/o): bcm2835-rng
000000003f200000-000000003f200fff (prio 0, i/o): bcm2835_gpio
000000003f201000-000000003f201fff (prio 0, i/o): pl011
000000003f202000-000000003f202fff (prio 0, i/o): bcm2835-sdhost
000000003f203000-000000003f2030ff (prio -1000, i/o): bcm2835-i2s
000000003f204000-000000003f20401f (prio -1000, i/o): bcm2835-spi0
000000003f205000-000000003f20501f (prio -1000, i/o): bcm2835-i2c0
000000003f20f000-000000003f20f07f (prio -1000, i/o): bcm2835-otp
000000003f212000-000000003f212007 (prio 0, i/o): bcm2835-thermal
000000003f214000-000000003f2140ff (prio -1000, i/o): bcm2835-spis
000000003f215000-000000003f2150ff (prio 0, i/o): bcm2835-aux
000000003f300000-000000003f3000ff (prio 0, i/o): sdhci
000000003f600000-000000003f6000ff (prio -1000, i/o): bcm2835-smi
000000003f804000-000000003f80401f (prio -1000, i/o): bcm2835-i2c1
000000003f805000-000000003f80501f (prio -1000, i/o): bcm2835-i2c2
000000003f900000-000000003f907fff (prio -1000, i/o): bcm2835-dbus
000000003f910000-000000003f917fff (prio -1000, i/o): bcm2835-ave0
000000003f980000-000000003f990fff (prio 0, i/o): dwc2
000000003f980000-000000003f980fff (prio 0, i/o): dwc2-io
000000003f981000-000000003f990fff (prio 0, i/o): dwc2-fifo
000000003fc00000-000000003fc00fff (prio -1000, i/o): bcm2835-v3d
000000003fe00000-000000003fe000ff (prio -1000, i/o): bcm2835-sdramc
000000003fe05000-000000003fe050ff (prio 0, i/o): bcm2835-dma-chan15
(qemu) q
[*] https://www.mail-archive.com/qemu-devel@nongnu.org/msg829821.html
Suggested-by: Peter Maydell <peter.maydell@linaro.org>
Signed-off-by: Philippe Mathieu-Daudé <philmd@redhat.com>
---
softmmu/memory.c | 73 +++++++++++++++++++++++++++++++++++++++++++++---
1 file changed, 69 insertions(+), 4 deletions(-)
diff --git a/softmmu/memory.c b/softmmu/memory.c
index bfedaf9c4df..0653b06b7cf 100644
--- a/softmmu/memory.c
+++ b/softmmu/memory.c
@@ -3246,11 +3246,64 @@ static gboolean mtree_info_flatview_free(gpointer key, gpointer value,
return true;
}
+struct AddressSpaceInfo {
+ MemoryRegionListHead *ml_head;
+ int counter;
+ bool owner;
+ bool disabled;
+};
+
+/* Returns negative value if a < b; zero if a = b; positive value if a > b. */
+static gint address_space_compare_name(gconstpointer a, gconstpointer b)
+{
+ const AddressSpace *as_a = a;
+ const AddressSpace *as_b = b;
+
+ return g_strcmp0(as_a->name, as_b->name);
+}
+static void mtree_print_as_name(gpointer data, gpointer user_data)
+{
+ AddressSpace *as = data;
+
+ qemu_printf(" - %s\n", as->name);
+}
+
+static void mtree_print_as(gpointer key, gpointer value, gpointer user_data)
+{
+ MemoryRegion *mr = key;
+ GSList *as_same_root_mr_list = value;
+ struct AddressSpaceInfo *asi = user_data;
+ guint same_root_len = g_slist_length(as_same_root_mr_list);
+
+ if (same_root_len == 1) {
+ AddressSpace *as = g_slist_nth_data(as_same_root_mr_list, 0);
+
+ qemu_printf("address-space: %s\n", as->name);
+ } else {
+ qemu_printf("address-space shared %u times:\n", same_root_len);
+ g_slist_foreach(as_same_root_mr_list, mtree_print_as_name, NULL);
+ }
+ mtree_print_mr(mr, 1, 0, asi->ml_head, asi->owner, asi->disabled);
+ qemu_printf("\n");
+}
+
+static gboolean mtree_info_as_free(gpointer key, gpointer value,
+ gpointer user_data)
+{
+ GSList *as_same_root_mr_list = value;
+
+ g_slist_free(as_same_root_mr_list);
+
+ return true;
+}
+
void mtree_info(bool flatview, bool dispatch_tree, bool owner, bool disabled)
{
MemoryRegionListHead ml_head;
MemoryRegionList *ml, *ml2;
AddressSpace *as;
+ GHashTable *views = g_hash_table_new(g_direct_hash, g_direct_equal);
+ GSList *as_same_root_mr_list;
if (flatview) {
FlatView *view;
@@ -3260,7 +3313,6 @@ void mtree_info(bool flatview, bool dispatch_tree, bool owner, bool disabled)
.owner = owner,
};
GArray *fv_address_spaces;
- GHashTable *views = g_hash_table_new(g_direct_hash, g_direct_equal);
AccelClass *ac = ACCEL_GET_CLASS(current_accel());
if (ac->has_memory) {
@@ -3293,11 +3345,24 @@ void mtree_info(bool flatview, bool dispatch_tree, bool owner, bool disabled)
QTAILQ_INIT(&ml_head);
QTAILQ_FOREACH(as, &address_spaces, address_spaces_link) {
- qemu_printf("address-space: %s\n", as->name);
- mtree_print_mr(as->root, 1, 0, &ml_head, owner, disabled);
- qemu_printf("\n");
+ /* Create hashtable, key=AS root MR, value = list of AS */
+ as_same_root_mr_list = g_hash_table_lookup(views, as->root);
+ as_same_root_mr_list = g_slist_insert_sorted(as_same_root_mr_list, as,
+ address_space_compare_name);
+ g_hash_table_insert(views, as->root, as_same_root_mr_list);
}
+ struct AddressSpaceInfo asi = {
+ .ml_head = &ml_head,
+ .owner = owner,
+ .disabled = disabled,
+ };
+
+ /* print address spaces */
+ g_hash_table_foreach(views, mtree_print_as, &asi);
+ g_hash_table_foreach_remove(views, mtree_info_as_free, 0);
+ g_hash_table_unref(views);
+
/* print aliased regions */
QTAILQ_FOREACH(ml, &ml_head, mrqueue) {
qemu_printf("memory-region: %s\n", memory_region_name(ml->mr));
--
2.31.1
^ permalink raw reply related [flat|nested] 5+ messages in thread
* Re: [PATCH] memory: Have 'info mtree' remove duplicated Address Space information
2021-08-20 10:54 [PATCH] memory: Have 'info mtree' remove duplicated Address Space information Philippe Mathieu-Daudé
@ 2021-08-20 10:58 ` Philippe Mathieu-Daudé
2021-08-20 20:16 ` Peter Xu
0 siblings, 1 reply; 5+ messages in thread
From: Philippe Mathieu-Daudé @ 2021-08-20 10:58 UTC (permalink / raw)
To: qemu-devel
Cc: Peter Maydell, David Hildenbrand, Mark Cave-Ayland, Peter Xu,
Gerd Hoffmann, Paolo Bonzini
On 8/20/21 12:54 PM, Philippe Mathieu-Daudé wrote:
> Per Peter Maydell [*]:
>
> 'info mtree' monitor command was designed on the assumption that
> there's really only one or two interesting address spaces, and
> with more recent developments that's just not the case any more.
>
> Similarly about how the FlatView are sorted using a GHashTable,
> sort the AddressSpace objects to remove the duplications (AS
> using the same root MemoryRegion).
>
> This drastically reduce 'info mtree' on some boards.
>
> Before:
>
> $ (echo info mtree; echo q) \
> | qemu-system-aarch64 -S -monitor stdio -M raspi3b \
> | wc -l
> 423
>
> After:
>
> $ (echo info mtree; echo q) \
> | qemu-system-aarch64 -S -monitor stdio -M raspi3b \
> | wc -l
> 108
>
> (qemu) info mtree
> address-space: I/O
> 0000000000000000-000000000000ffff (prio 0, i/o): io
>
> address-space shared 9 times:
> - cpu-memory-0
> - cpu-memory-1
> - cpu-memory-2
> - cpu-memory-3
> - cpu-secure-memory-0
> - cpu-secure-memory-1
> - cpu-secure-memory-2
> - cpu-secure-memory-3
> - memory
> 0000000000000000-ffffffffffffffff (prio 0, i/o): system
> 0000000000000000-000000003fffffff (prio 0, ram): ram
> 000000003f000000-000000003fffffff (prio 1, i/o): bcm2835-peripherals
> 000000003f003000-000000003f00301f (prio 0, i/o): bcm2835-sys-timer
> 000000003f004000-000000003f004fff (prio -1000, i/o): bcm2835-txp
> 000000003f006000-000000003f006fff (prio 0, i/o): mphi
> 000000003f007000-000000003f007fff (prio 0, i/o): bcm2835-dma
> 000000003f00b200-000000003f00b3ff (prio 0, i/o): bcm2835-ic
> 000000003f00b400-000000003f00b43f (prio -1000, i/o): bcm2835-sp804
> 000000003f00b800-000000003f00bbff (prio 0, i/o): bcm2835-mbox
> 000000003f100000-000000003f1001ff (prio 0, i/o): bcm2835-powermgt
> 000000003f101000-000000003f102fff (prio 0, i/o): bcm2835-cprman
> 000000003f104000-000000003f10400f (prio 0, i/o): bcm2835-rng
> 000000003f200000-000000003f200fff (prio 0, i/o): bcm2835_gpio
> 000000003f201000-000000003f201fff (prio 0, i/o): pl011
> 000000003f202000-000000003f202fff (prio 0, i/o): bcm2835-sdhost
> 000000003f203000-000000003f2030ff (prio -1000, i/o): bcm2835-i2s
> 000000003f204000-000000003f20401f (prio -1000, i/o): bcm2835-spi0
> 000000003f205000-000000003f20501f (prio -1000, i/o): bcm2835-i2c0
> 000000003f20f000-000000003f20f07f (prio -1000, i/o): bcm2835-otp
> 000000003f212000-000000003f212007 (prio 0, i/o): bcm2835-thermal
> 000000003f214000-000000003f2140ff (prio -1000, i/o): bcm2835-spis
> 000000003f215000-000000003f2150ff (prio 0, i/o): bcm2835-aux
> 000000003f300000-000000003f3000ff (prio 0, i/o): sdhci
> 000000003f600000-000000003f6000ff (prio -1000, i/o): bcm2835-smi
> 000000003f804000-000000003f80401f (prio -1000, i/o): bcm2835-i2c1
> 000000003f805000-000000003f80501f (prio -1000, i/o): bcm2835-i2c2
> 000000003f900000-000000003f907fff (prio -1000, i/o): bcm2835-dbus
> 000000003f910000-000000003f917fff (prio -1000, i/o): bcm2835-ave0
> 000000003f980000-000000003f990fff (prio 0, i/o): dwc2
> 000000003f980000-000000003f980fff (prio 0, i/o): dwc2-io
> 000000003f981000-000000003f990fff (prio 0, i/o): dwc2-fifo
> 000000003fc00000-000000003fc00fff (prio -1000, i/o): bcm2835-v3d
> 000000003fe00000-000000003fe000ff (prio -1000, i/o): bcm2835-sdramc
> 000000003fe05000-000000003fe050ff (prio 0, i/o): bcm2835-dma-chan15
> 0000000040000000-00000000400000ff (prio 0, i/o): bcm2836-control
>
> address-space shared 4 times:
> - bcm2835-dma-memory
> - bcm2835-fb-memory
> - bcm2835-property-memory
> - dwc2
> 0000000000000000-00000000ffffffff (prio 0, i/o): bcm2835-gpu
> 0000000000000000-000000003fffffff (prio 0, ram): alias bcm2835-gpu-ram-alias[*] @ram 0000000000000000-000000003fffffff
> 0000000040000000-000000007fffffff (prio 0, ram): alias bcm2835-gpu-ram-alias[*] @ram 0000000000000000-000000003fffffff
> 000000007e000000-000000007effffff (prio 1, i/o): alias bcm2835-peripherals @bcm2835-peripherals 0000000000000000-0000000000ffffff
> 0000000080000000-00000000bfffffff (prio 0, ram): alias bcm2835-gpu-ram-alias[*] @ram 0000000000000000-000000003fffffff
> 00000000c0000000-00000000ffffffff (prio 0, ram): alias bcm2835-gpu-ram-alias[*] @ram 0000000000000000-000000003fffffff
>
> address-space: bcm2835-mbox-memory
> 0000000000000000-000000000000008f (prio 0, i/o): bcm2835-mbox
> 0000000000000010-000000000000001f (prio 0, i/o): bcm2835-fb
> 0000000000000080-000000000000008f (prio 0, i/o): bcm2835-property
>
> memory-region: ram
> 0000000000000000-000000003fffffff (prio 0, ram): ram
>
> memory-region: bcm2835-peripherals
> 000000003f000000-000000003fffffff (prio 1, i/o): bcm2835-peripherals
> 000000003f003000-000000003f00301f (prio 0, i/o): bcm2835-sys-timer
> 000000003f004000-000000003f004fff (prio -1000, i/o): bcm2835-txp
> 000000003f006000-000000003f006fff (prio 0, i/o): mphi
> 000000003f007000-000000003f007fff (prio 0, i/o): bcm2835-dma
> 000000003f00b200-000000003f00b3ff (prio 0, i/o): bcm2835-ic
> 000000003f00b400-000000003f00b43f (prio -1000, i/o): bcm2835-sp804
> 000000003f00b800-000000003f00bbff (prio 0, i/o): bcm2835-mbox
> 000000003f100000-000000003f1001ff (prio 0, i/o): bcm2835-powermgt
> 000000003f101000-000000003f102fff (prio 0, i/o): bcm2835-cprman
> 000000003f104000-000000003f10400f (prio 0, i/o): bcm2835-rng
> 000000003f200000-000000003f200fff (prio 0, i/o): bcm2835_gpio
> 000000003f201000-000000003f201fff (prio 0, i/o): pl011
> 000000003f202000-000000003f202fff (prio 0, i/o): bcm2835-sdhost
> 000000003f203000-000000003f2030ff (prio -1000, i/o): bcm2835-i2s
> 000000003f204000-000000003f20401f (prio -1000, i/o): bcm2835-spi0
> 000000003f205000-000000003f20501f (prio -1000, i/o): bcm2835-i2c0
> 000000003f20f000-000000003f20f07f (prio -1000, i/o): bcm2835-otp
> 000000003f212000-000000003f212007 (prio 0, i/o): bcm2835-thermal
> 000000003f214000-000000003f2140ff (prio -1000, i/o): bcm2835-spis
> 000000003f215000-000000003f2150ff (prio 0, i/o): bcm2835-aux
> 000000003f300000-000000003f3000ff (prio 0, i/o): sdhci
> 000000003f600000-000000003f6000ff (prio -1000, i/o): bcm2835-smi
> 000000003f804000-000000003f80401f (prio -1000, i/o): bcm2835-i2c1
> 000000003f805000-000000003f80501f (prio -1000, i/o): bcm2835-i2c2
> 000000003f900000-000000003f907fff (prio -1000, i/o): bcm2835-dbus
> 000000003f910000-000000003f917fff (prio -1000, i/o): bcm2835-ave0
> 000000003f980000-000000003f990fff (prio 0, i/o): dwc2
> 000000003f980000-000000003f980fff (prio 0, i/o): dwc2-io
> 000000003f981000-000000003f990fff (prio 0, i/o): dwc2-fifo
> 000000003fc00000-000000003fc00fff (prio -1000, i/o): bcm2835-v3d
> 000000003fe00000-000000003fe000ff (prio -1000, i/o): bcm2835-sdramc
> 000000003fe05000-000000003fe050ff (prio 0, i/o): bcm2835-dma-chan15
>
> (qemu) q
>
> [*] https://www.mail-archive.com/qemu-devel@nongnu.org/msg829821.html
>
> Suggested-by: Peter Maydell <peter.maydell@linaro.org>
> Signed-off-by: Philippe Mathieu-Daudé <philmd@redhat.com>
> ---
> softmmu/memory.c | 73 +++++++++++++++++++++++++++++++++++++++++++++---
> 1 file changed, 69 insertions(+), 4 deletions(-)
>
> diff --git a/softmmu/memory.c b/softmmu/memory.c
> index bfedaf9c4df..0653b06b7cf 100644
> --- a/softmmu/memory.c
> +++ b/softmmu/memory.c
> @@ -3246,11 +3246,64 @@ static gboolean mtree_info_flatview_free(gpointer key, gpointer value,
> return true;
> }
>
> +struct AddressSpaceInfo {
> + MemoryRegionListHead *ml_head;
> + int counter;
Doh this field is unused :/
> + bool owner;
> + bool disabled;
> +};
> +
> +/* Returns negative value if a < b; zero if a = b; positive value if a > b. */
> +static gint address_space_compare_name(gconstpointer a, gconstpointer b)
> +{
> + const AddressSpace *as_a = a;
> + const AddressSpace *as_b = b;
> +
> + return g_strcmp0(as_a->name, as_b->name);
> +}
> +static void mtree_print_as_name(gpointer data, gpointer user_data)
> +{
> + AddressSpace *as = data;
> +
> + qemu_printf(" - %s\n", as->name);
> +}
> +
> +static void mtree_print_as(gpointer key, gpointer value, gpointer user_data)
> +{
> + MemoryRegion *mr = key;
> + GSList *as_same_root_mr_list = value;
> + struct AddressSpaceInfo *asi = user_data;
> + guint same_root_len = g_slist_length(as_same_root_mr_list);
> +
> + if (same_root_len == 1) {
> + AddressSpace *as = g_slist_nth_data(as_same_root_mr_list, 0);
> +
> + qemu_printf("address-space: %s\n", as->name);
> + } else {
> + qemu_printf("address-space shared %u times:\n", same_root_len);
> + g_slist_foreach(as_same_root_mr_list, mtree_print_as_name, NULL);
> + }
> + mtree_print_mr(mr, 1, 0, asi->ml_head, asi->owner, asi->disabled);
> + qemu_printf("\n");
> +}
> +
> +static gboolean mtree_info_as_free(gpointer key, gpointer value,
> + gpointer user_data)
> +{
> + GSList *as_same_root_mr_list = value;
> +
> + g_slist_free(as_same_root_mr_list);
> +
> + return true;
> +}
> +
> void mtree_info(bool flatview, bool dispatch_tree, bool owner, bool disabled)
> {
> MemoryRegionListHead ml_head;
> MemoryRegionList *ml, *ml2;
> AddressSpace *as;
> + GHashTable *views = g_hash_table_new(g_direct_hash, g_direct_equal);
> + GSList *as_same_root_mr_list;
>
> if (flatview) {
> FlatView *view;
> @@ -3260,7 +3313,6 @@ void mtree_info(bool flatview, bool dispatch_tree, bool owner, bool disabled)
> .owner = owner,
> };
> GArray *fv_address_spaces;
> - GHashTable *views = g_hash_table_new(g_direct_hash, g_direct_equal);
> AccelClass *ac = ACCEL_GET_CLASS(current_accel());
>
> if (ac->has_memory) {
> @@ -3293,11 +3345,24 @@ void mtree_info(bool flatview, bool dispatch_tree, bool owner, bool disabled)
> QTAILQ_INIT(&ml_head);
>
> QTAILQ_FOREACH(as, &address_spaces, address_spaces_link) {
> - qemu_printf("address-space: %s\n", as->name);
> - mtree_print_mr(as->root, 1, 0, &ml_head, owner, disabled);
> - qemu_printf("\n");
> + /* Create hashtable, key=AS root MR, value = list of AS */
> + as_same_root_mr_list = g_hash_table_lookup(views, as->root);
> + as_same_root_mr_list = g_slist_insert_sorted(as_same_root_mr_list, as,
> + address_space_compare_name);
> + g_hash_table_insert(views, as->root, as_same_root_mr_list);
> }
>
> + struct AddressSpaceInfo asi = {
> + .ml_head = &ml_head,
> + .owner = owner,
> + .disabled = disabled,
> + };
> +
> + /* print address spaces */
> + g_hash_table_foreach(views, mtree_print_as, &asi);
> + g_hash_table_foreach_remove(views, mtree_info_as_free, 0);
> + g_hash_table_unref(views);
> +
> /* print aliased regions */
> QTAILQ_FOREACH(ml, &ml_head, mrqueue) {
> qemu_printf("memory-region: %s\n", memory_region_name(ml->mr));
>
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH] memory: Have 'info mtree' remove duplicated Address Space information
2021-08-20 10:58 ` Philippe Mathieu-Daudé
@ 2021-08-20 20:16 ` Peter Xu
2021-08-20 22:50 ` Philippe Mathieu-Daudé
2021-08-23 8:39 ` David Hildenbrand
0 siblings, 2 replies; 5+ messages in thread
From: Peter Xu @ 2021-08-20 20:16 UTC (permalink / raw)
To: Philippe Mathieu-Daudé
Cc: Peter Maydell, David Hildenbrand, Mark Cave-Ayland, qemu-devel,
Gerd Hoffmann, Paolo Bonzini
Phil,
On Fri, Aug 20, 2021 at 12:58:05PM +0200, Philippe Mathieu-Daudé wrote:
> > (qemu) info mtree
> > address-space: I/O
> > 0000000000000000-000000000000ffff (prio 0, i/o): io
> >
> > address-space shared 9 times:
> > - cpu-memory-0
> > - cpu-memory-1
> > - cpu-memory-2
> > - cpu-memory-3
> > - cpu-secure-memory-0
> > - cpu-secure-memory-1
> > - cpu-secure-memory-2
> > - cpu-secure-memory-3
> > - memory
Do you think below would look better?
address-space cpu-memory-0:
address-space cpu-memory-1:
address-space cpu-memory-3:
...
address-space memory:
[memory ranges]
"info mtree -f" has something similar:
FlatView #2
AS "ich9-ahci", root: bus master container
AS "vtd-root", root: vtd-00.0
AS "virtio-blk-pci", root: bus master container
AS "vtd-root", root: vtd-01.0
AS "vtd-root", root: vtd-02.0
AS "vtd-root", root: vtd-03.0
AS "vtd-root", root: vtd-04.0
AS "vtd-root", root: vtd-1f.0
AS "vtd-root", root: vtd-1f.2
AS "vtd-root", root: vtd-1f.3
Root memory region: vtd-nodmar
[memory ranges]
[...]
> > +struct AddressSpaceInfo {
> > + MemoryRegionListHead *ml_head;
> > + int counter;
>
> Doh this field is unused :/
Looks good to me otherwise.
Thanks,
--
Peter Xu
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH] memory: Have 'info mtree' remove duplicated Address Space information
2021-08-20 20:16 ` Peter Xu
@ 2021-08-20 22:50 ` Philippe Mathieu-Daudé
2021-08-23 8:39 ` David Hildenbrand
1 sibling, 0 replies; 5+ messages in thread
From: Philippe Mathieu-Daudé @ 2021-08-20 22:50 UTC (permalink / raw)
To: Peter Xu
Cc: Peter Maydell, David Hildenbrand, Mark Cave-Ayland, qemu-devel,
Gerd Hoffmann, Paolo Bonzini
On 8/20/21 10:16 PM, Peter Xu wrote:
> Phil,
>
> On Fri, Aug 20, 2021 at 12:58:05PM +0200, Philippe Mathieu-Daudé wrote:
>>> (qemu) info mtree
>>> address-space: I/O
>>> 0000000000000000-000000000000ffff (prio 0, i/o): io
>>>
>>> address-space shared 9 times:
>>> - cpu-memory-0
>>> - cpu-memory-1
>>> - cpu-memory-2
>>> - cpu-memory-3
>>> - cpu-secure-memory-0
>>> - cpu-secure-memory-1
>>> - cpu-secure-memory-2
>>> - cpu-secure-memory-3
>>> - memory
>
> Do you think below would look better?
>
> address-space cpu-memory-0:
> address-space cpu-memory-1:
> address-space cpu-memory-3:
> ...
> address-space memory:
> [memory ranges]
OK.
> "info mtree -f" has something similar:
>
> FlatView #2
> AS "ich9-ahci", root: bus master container
> AS "vtd-root", root: vtd-00.0
> AS "virtio-blk-pci", root: bus master container
> AS "vtd-root", root: vtd-01.0
> AS "vtd-root", root: vtd-02.0
> AS "vtd-root", root: vtd-03.0
> AS "vtd-root", root: vtd-04.0
> AS "vtd-root", root: vtd-1f.0
> AS "vtd-root", root: vtd-1f.2
> AS "vtd-root", root: vtd-1f.3
> Root memory region: vtd-nodmar
> [memory ranges]
>
> [...]
>
>>> +struct AddressSpaceInfo {
>>> + MemoryRegionListHead *ml_head;
>>> + int counter;
>>
>> Doh this field is unused :/
>
> Looks good to me otherwise.
Thanks!
Phil.
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH] memory: Have 'info mtree' remove duplicated Address Space information
2021-08-20 20:16 ` Peter Xu
2021-08-20 22:50 ` Philippe Mathieu-Daudé
@ 2021-08-23 8:39 ` David Hildenbrand
1 sibling, 0 replies; 5+ messages in thread
From: David Hildenbrand @ 2021-08-23 8:39 UTC (permalink / raw)
To: Peter Xu, Philippe Mathieu-Daudé
Cc: Peter Maydell, Paolo Bonzini, Mark Cave-Ayland, qemu-devel,
Gerd Hoffmann
On 20.08.21 22:16, Peter Xu wrote:
> Phil,
>
> On Fri, Aug 20, 2021 at 12:58:05PM +0200, Philippe Mathieu-Daudé wrote:
>>> (qemu) info mtree
>>> address-space: I/O
>>> 0000000000000000-000000000000ffff (prio 0, i/o): io
>>>
>>> address-space shared 9 times:
>>> - cpu-memory-0
>>> - cpu-memory-1
>>> - cpu-memory-2
>>> - cpu-memory-3
>>> - cpu-secure-memory-0
>>> - cpu-secure-memory-1
>>> - cpu-secure-memory-2
>>> - cpu-secure-memory-3
>>> - memory
>
> Do you think below would look better?
>
> address-space cpu-memory-0:
> address-space cpu-memory-1:
> address-space cpu-memory-3:
> ...
> address-space memory:
> [memory ranges]
>
+1
--
Thanks,
David / dhildenb
^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2021-08-23 8:41 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-08-20 10:54 [PATCH] memory: Have 'info mtree' remove duplicated Address Space information Philippe Mathieu-Daudé
2021-08-20 10:58 ` Philippe Mathieu-Daudé
2021-08-20 20:16 ` Peter Xu
2021-08-20 22:50 ` Philippe Mathieu-Daudé
2021-08-23 8:39 ` David Hildenbrand
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).