* Alexey Kardashevskiy (a...@ozlabs.ru) wrote:
> 
> 
> On 17/12/2018 23:47, Philippe Mathieu-Daudé wrote:
> > 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:
> 
> 
> Ah, I confused with object_class_get_name(). Anyway, I'd still show the
> user provided accelerator name than some internal name.

Aren't they exactly the same? I think the accel= thing from the user is
parsed by comparing it with the ACCEL_CLASS_NAME declarations:

./target/i386/whpx-all.c:    .name = ACCEL_CLASS_NAME("whpx"),
./target/i386/hax-all.c:    .name = ACCEL_CLASS_NAME("hax"),
./hw/xen/xen-common.c:#define TYPE_XEN_ACCEL ACCEL_CLASS_NAME("xen")
./qtest.c:#define TYPE_QTEST_ACCEL ACCEL_CLASS_NAME("qtest")
./accel/tcg/tcg-all.c:#define TYPE_TCG_ACCEL ACCEL_CLASS_NAME("tcg")
./include/sysemu/hvf.h:#define TYPE_HVF_ACCEL ACCEL_CLASS_NAME("hvf")
./include/sysemu/kvm_int.h:#define TYPE_KVM_ACCEL ACCEL_CLASS_NAME("kvm")

and the code in accel/accel.c accel_find

Dave

> 
> > 
> > $ 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) {
> >>>>
> 
> -- 
> Alexey
--
Dr. David Alan Gilbert / dgilb...@redhat.com / Manchester, UK

Reply via email to