On 12/17/18 2:27 AM, Alexey Kardashevskiy wrote: > On 14/12/2018 22:07, Philippe Mathieu-Daudé wrote: >> Hi Alexey, >> >> On 12/14/18 3:58 AM, Alexey Kardashevskiy wrote: >>> This adds an accelerator name to the "into mtree -f" to tell the user if >>> a particular memory section is registered with the accelerator; >>> the primary user for this is KVM and such information is useful >>> for debugging purposes. >>> >>> This adds a has_memory() callback to the accelerator class allowing any >>> accelerator to have a label in that memory tree dump. >>> >>> Since memory sections are passed to memory listeners and get registered >>> in accelerators (rather than memory regions), this only prints new labels >>> for flatviews attached to the system address space. >>> >>> An example: >>> Root memory region: system >>> 0000000000000000-0000002fffffffff (prio 0, ram): /objects/mem0 kvm >>> 0000003000000000-0000005fffffffff (prio 0, ram): /objects/mem1 kvm >>> 0000200000000020-000020000000003f (prio 1, i/o): virtio-pci >>> 0000200080000000-000020008000003f (prio 0, i/o): capabilities >>> >>> Signed-off-by: Alexey Kardashevskiy <a...@ozlabs.ru> >>> --- >>> >>> This supercedes "[PATCH qemu] hmp: Print if memory section is registered in >>> KVM" >>> >>> --- >>> Changes: >>> v2: >>> * added an accelerator callback instead of hardcoding it to kvm only >>> --- >>> include/sysemu/accel.h | 2 ++ >>> accel/kvm/kvm-all.c | 10 ++++++++++ >>> memory.c | 22 ++++++++++++++++++++++ >>> 3 files changed, 34 insertions(+) >>> >>> diff --git a/include/sysemu/accel.h b/include/sysemu/accel.h >>> index 637358f..30b456d 100644 >>> --- a/include/sysemu/accel.h >>> +++ b/include/sysemu/accel.h >>> @@ -25,6 +25,7 @@ >>> >>> #include "qom/object.h" >>> #include "hw/qdev-properties.h" >>> +#include "exec/hwaddr.h" >>> >>> typedef struct AccelState { >>> /*< private >*/ >>> @@ -41,6 +42,7 @@ typedef struct AccelClass { >>> int (*available)(void); >>> int (*init_machine)(MachineState *ms); >>> void (*setup_post)(MachineState *ms, AccelState *accel); >>> + bool (*has_memory)(MachineState *ms, hwaddr start_addr, hwaddr size); >>> bool *allowed; >>> /* >>> * Array of global properties that would be applied when specific >>> diff --git a/accel/kvm/kvm-all.c b/accel/kvm/kvm-all.c >>> index 4880a05..634f386 100644 >>> --- a/accel/kvm/kvm-all.c >>> +++ b/accel/kvm/kvm-all.c >>> @@ -2589,11 +2589,21 @@ int kvm_get_one_reg(CPUState *cs, uint64_t id, void >>> *target) >>> return r; >>> } >>> >>> +static bool kvm_accel_has_memory(MachineState *ms, hwaddr start_addr, >>> + hwaddr size) >>> +{ >>> + KVMState *kvm = KVM_STATE(ms->accelerator); >>> + KVMMemoryListener *kml = &kvm->memory_listener; >>> + >>> + return NULL != kvm_lookup_matching_slot(kml, start_addr, size); >>> +} >>> + >>> static void kvm_accel_class_init(ObjectClass *oc, void *data) >>> { >>> AccelClass *ac = ACCEL_CLASS(oc); >>> ac->name = "KVM"; >>> ac->init_machine = kvm_init; >>> + ac->has_memory = kvm_accel_has_memory; >>> ac->allowed = &kvm_allowed; >>> } >>> >>> diff --git a/memory.c b/memory.c >>> index d14c6de..61e758a 100644 >>> --- a/memory.c >>> +++ b/memory.c >>> @@ -29,7 +29,9 @@ >>> #include "exec/ram_addr.h" >>> #include "sysemu/kvm.h" >>> #include "sysemu/sysemu.h" >>> +#include "sysemu/accel.h" >>> #include "hw/qdev-properties.h" >>> +#include "hw/boards.h" >>> #include "migration/vmstate.h" >>> >>> //#define DEBUG_UNASSIGNED >>> @@ -2924,6 +2926,8 @@ struct FlatViewInfo { >>> int counter; >>> bool dispatch_tree; >>> bool owner; >>> + AccelClass *ac; >>> + const char *ac_name; >>> }; >>> >>> static void mtree_print_flatview(gpointer key, gpointer value, >>> @@ -2939,6 +2943,7 @@ static void mtree_print_flatview(gpointer key, >>> gpointer value, >>> int n = view->nr; >>> int i; >>> AddressSpace *as; >>> + bool system_as = false; >>> >>> p(f, "FlatView #%d\n", fvi->counter); >>> ++fvi->counter; >>> @@ -2950,6 +2955,9 @@ static void mtree_print_flatview(gpointer key, >>> gpointer value, >>> p(f, ", alias %s", memory_region_name(as->root->alias)); >>> } >>> p(f, "\n"); >>> + if (as == &address_space_memory) { >>> + system_as = true; >>> + } >>> } >>> >>> p(f, " Root memory region: %s\n", >>> @@ -2985,6 +2993,13 @@ static void mtree_print_flatview(gpointer key, >>> gpointer value, >>> if (fvi->owner) { >>> mtree_print_mr_owner(p, f, mr); >>> } >>> + >>> + if (system_as && fvi->ac && >>> + fvi->ac->has_memory(current_machine, >>> + int128_get64(range->addr.start), >>> + MR_SIZE(range->addr.size) + 1)) { >>> + p(f, " %s", fvi->ac_name); >> >> Why not simply display fvi->ac->name? >> You could avoid to add the ac_name field. > > > Well, I thought I better print whatever the user passed via the command > line (which is current_machine->accel and equals to "kvm" in my case) > rather than robotic, dry and excessive "kvm-accel".
I have no hit for 'kvm-accel': $ git grep kvm-accel $ Names looks human friendly: $ git grep 'ac->name =' accel/kvm/kvm-all.c:2595: ac->name = "KVM"; accel/tcg/tcg-all.c:74: ac->name = "tcg"; hw/xen/xen-common.c:184: ac->name = "Xen"; target/i386/hax-all.c:1088: ac->name = "HAX"; target/i386/hvf/hvf.c:959: ac->name = "HVF"; target/i386/whpx-all.c:1477: ac->name = "WHPX"; qtest.c:755: ac->name = "QTest"; >> >>> + } >>> p(f, "\n"); >>> range++; >>> } >>> @@ -3028,6 +3043,13 @@ void mtree_info(fprintf_function mon_printf, void >>> *f, bool flatview, >>> }; >>> GArray *fv_address_spaces; >>> GHashTable *views = g_hash_table_new(g_direct_hash, >>> g_direct_equal); >>> + AccelClass *ac = ACCEL_GET_CLASS(current_machine->accelerator); >>> + >>> + if (ac->has_memory) { >>> + fvi.ac = ac; >>> + fvi.ac_name = current_machine->accel ? current_machine->accel : >>> + object_class_get_name(OBJECT_CLASS(ac)); >>> + } >>> >>> /* Gather all FVs in one table */ >>> QTAILQ_FOREACH(as, &address_spaces, address_spaces_link) { >>>