* [Qemu-devel] [PATCH qemu] hmp: Print if memory section is registered in KVM
@ 2018-11-08 1:02 Alexey Kardashevskiy
2018-11-08 12:44 ` Daniel Henrique Barboza
2018-11-13 14:51 ` Dr. David Alan Gilbert
0 siblings, 2 replies; 5+ messages in thread
From: Alexey Kardashevskiy @ 2018-11-08 1:02 UTC (permalink / raw)
To: qemu-devel; +Cc: Alexey Kardashevskiy
This adds a "KVM" marker to the "into mtree -f" to tell the user if
a particular memory section is registered as a KVM memory slot; useful
for debugging purposes.
Since it is memory sections which get registered in KVM (rather than
memory regions), this only prints "KVM" for flatviews.
For example:
Root memory region: system
0000000000000000-00000003ffffffff (prio 0, ram): ppc_spapr.ram KVM
0000200000000020-000020000000003f (prio 1, i/o): virtio-pci
Signed-off-by: Alexey Kardashevskiy <aik@ozlabs.ru>
---
include/sysemu/kvm.h | 1 +
accel/kvm/kvm-all.c | 7 +++++++
memory.c | 10 ++++++++++
3 files changed, 18 insertions(+)
diff --git a/include/sysemu/kvm.h b/include/sysemu/kvm.h
index 97d8d9d0d5..9eab5ac1b1 100644
--- a/include/sysemu/kvm.h
+++ b/include/sysemu/kvm.h
@@ -471,6 +471,7 @@ void kvm_set_sigmask_len(KVMState *s, unsigned int sigmask_len);
#if !defined(CONFIG_USER_ONLY)
int kvm_physical_memory_addr_from_host(KVMState *s, void *ram_addr,
hwaddr *phys_addr);
+bool is_kvm_memory(hwaddr start_addr, hwaddr size);
#endif
#endif /* NEED_CPU_H */
diff --git a/accel/kvm/kvm-all.c b/accel/kvm/kvm-all.c
index 4880a05399..d72808aaa6 100644
--- a/accel/kvm/kvm-all.c
+++ b/accel/kvm/kvm-all.c
@@ -216,6 +216,13 @@ static KVMSlot *kvm_lookup_matching_slot(KVMMemoryListener *kml,
return NULL;
}
+bool is_kvm_memory(hwaddr start_addr, hwaddr size)
+{
+ KVMMemoryListener *kml = &kvm_state->memory_listener;
+
+ return NULL != kvm_lookup_matching_slot(kml, start_addr, size);
+}
+
/*
* Calculate and align the start address and the size of the section.
* Return the size. If the size is 0, the aligned section is empty.
diff --git a/memory.c b/memory.c
index 51204aa079..56c733c687 100644
--- a/memory.c
+++ b/memory.c
@@ -2916,6 +2916,7 @@ static void mtree_print_flatview(gpointer key, gpointer value,
int n = view->nr;
int i;
AddressSpace *as;
+ bool print_kvm = false;
p(f, "FlatView #%d\n", fvi->counter);
++fvi->counter;
@@ -2927,6 +2928,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) {
+ print_kvm = true;
+ }
}
p(f, " Root memory region: %s\n",
@@ -2960,6 +2964,12 @@ static void mtree_print_flatview(gpointer key, gpointer value,
if (fvi->owner) {
mtree_print_mr_owner(p, f, mr);
}
+
+ if (kvm_enabled() && print_kvm &&
+ is_kvm_memory(int128_get64(range->addr.start),
+ MR_SIZE(range->addr.size) + 1)) {
+ p(f, " KVM");
+ }
p(f, "\n");
range++;
}
--
2.17.1
^ permalink raw reply related [flat|nested] 5+ messages in thread
* Re: [Qemu-devel] [PATCH qemu] hmp: Print if memory section is registered in KVM
2018-11-08 1:02 [Qemu-devel] [PATCH qemu] hmp: Print if memory section is registered in KVM Alexey Kardashevskiy
@ 2018-11-08 12:44 ` Daniel Henrique Barboza
2018-11-13 14:51 ` Dr. David Alan Gilbert
1 sibling, 0 replies; 5+ messages in thread
From: Daniel Henrique Barboza @ 2018-11-08 12:44 UTC (permalink / raw)
To: Alexey Kardashevskiy, qemu-devel
On 11/7/18 11:02 PM, Alexey Kardashevskiy wrote:
> This adds a "KVM" marker to the "into mtree -f" to tell the user if
> a particular memory section is registered as a KVM memory slot; useful
> for debugging purposes.
>
> Since it is memory sections which get registered in KVM (rather than
> memory regions), this only prints "KVM" for flatviews.
>
> For example:
> Root memory region: system
> 0000000000000000-00000003ffffffff (prio 0, ram): ppc_spapr.ram KVM
> 0000200000000020-000020000000003f (prio 1, i/o): virtio-pci
>
> Signed-off-by: Alexey Kardashevskiy <aik@ozlabs.ru>
> ---
Reviewed-by: Daniel Henrique Barboza <danielhb413@gmail.com>
Tested-by: Daniel Henrique Barboza <danielhb413@gmail.com>
> include/sysemu/kvm.h | 1 +
> accel/kvm/kvm-all.c | 7 +++++++
> memory.c | 10 ++++++++++
> 3 files changed, 18 insertions(+)
>
> diff --git a/include/sysemu/kvm.h b/include/sysemu/kvm.h
> index 97d8d9d0d5..9eab5ac1b1 100644
> --- a/include/sysemu/kvm.h
> +++ b/include/sysemu/kvm.h
> @@ -471,6 +471,7 @@ void kvm_set_sigmask_len(KVMState *s, unsigned int sigmask_len);
> #if !defined(CONFIG_USER_ONLY)
> int kvm_physical_memory_addr_from_host(KVMState *s, void *ram_addr,
> hwaddr *phys_addr);
> +bool is_kvm_memory(hwaddr start_addr, hwaddr size);
> #endif
>
> #endif /* NEED_CPU_H */
> diff --git a/accel/kvm/kvm-all.c b/accel/kvm/kvm-all.c
> index 4880a05399..d72808aaa6 100644
> --- a/accel/kvm/kvm-all.c
> +++ b/accel/kvm/kvm-all.c
> @@ -216,6 +216,13 @@ static KVMSlot *kvm_lookup_matching_slot(KVMMemoryListener *kml,
> return NULL;
> }
>
> +bool is_kvm_memory(hwaddr start_addr, hwaddr size)
> +{
> + KVMMemoryListener *kml = &kvm_state->memory_listener;
> +
> + return NULL != kvm_lookup_matching_slot(kml, start_addr, size);
> +}
> +
> /*
> * Calculate and align the start address and the size of the section.
> * Return the size. If the size is 0, the aligned section is empty.
> diff --git a/memory.c b/memory.c
> index 51204aa079..56c733c687 100644
> --- a/memory.c
> +++ b/memory.c
> @@ -2916,6 +2916,7 @@ static void mtree_print_flatview(gpointer key, gpointer value,
> int n = view->nr;
> int i;
> AddressSpace *as;
> + bool print_kvm = false;
>
> p(f, "FlatView #%d\n", fvi->counter);
> ++fvi->counter;
> @@ -2927,6 +2928,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) {
> + print_kvm = true;
> + }
> }
>
> p(f, " Root memory region: %s\n",
> @@ -2960,6 +2964,12 @@ static void mtree_print_flatview(gpointer key, gpointer value,
> if (fvi->owner) {
> mtree_print_mr_owner(p, f, mr);
> }
> +
> + if (kvm_enabled() && print_kvm &&
> + is_kvm_memory(int128_get64(range->addr.start),
> + MR_SIZE(range->addr.size) + 1)) {
> + p(f, " KVM");
> + }
> p(f, "\n");
> range++;
> }
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [Qemu-devel] [PATCH qemu] hmp: Print if memory section is registered in KVM
2018-11-08 1:02 [Qemu-devel] [PATCH qemu] hmp: Print if memory section is registered in KVM Alexey Kardashevskiy
2018-11-08 12:44 ` Daniel Henrique Barboza
@ 2018-11-13 14:51 ` Dr. David Alan Gilbert
2018-11-13 15:56 ` Paolo Bonzini
1 sibling, 1 reply; 5+ messages in thread
From: Dr. David Alan Gilbert @ 2018-11-13 14:51 UTC (permalink / raw)
To: Alexey Kardashevskiy, pbonzini; +Cc: qemu-devel
* Alexey Kardashevskiy (aik@ozlabs.ru) wrote:
> This adds a "KVM" marker to the "into mtree -f" to tell the user if
> a particular memory section is registered as a KVM memory slot; useful
> for debugging purposes.
>
> Since it is memory sections which get registered in KVM (rather than
> memory regions), this only prints "KVM" for flatviews.
>
> For example:
> Root memory region: system
> 0000000000000000-00000003ffffffff (prio 0, ram): ppc_spapr.ram KVM
> 0000200000000020-000020000000003f (prio 1, i/o): virtio-pci
>
> Signed-off-by: Alexey Kardashevskiy <aik@ozlabs.ru>
From HMP I'm ok with this, but I wonder if we should make this
code more general to other accelerators and not specific to kvm?
Dave
> ---
> include/sysemu/kvm.h | 1 +
> accel/kvm/kvm-all.c | 7 +++++++
> memory.c | 10 ++++++++++
> 3 files changed, 18 insertions(+)
>
> diff --git a/include/sysemu/kvm.h b/include/sysemu/kvm.h
> index 97d8d9d0d5..9eab5ac1b1 100644
> --- a/include/sysemu/kvm.h
> +++ b/include/sysemu/kvm.h
> @@ -471,6 +471,7 @@ void kvm_set_sigmask_len(KVMState *s, unsigned int sigmask_len);
> #if !defined(CONFIG_USER_ONLY)
> int kvm_physical_memory_addr_from_host(KVMState *s, void *ram_addr,
> hwaddr *phys_addr);
> +bool is_kvm_memory(hwaddr start_addr, hwaddr size);
> #endif
>
> #endif /* NEED_CPU_H */
> diff --git a/accel/kvm/kvm-all.c b/accel/kvm/kvm-all.c
> index 4880a05399..d72808aaa6 100644
> --- a/accel/kvm/kvm-all.c
> +++ b/accel/kvm/kvm-all.c
> @@ -216,6 +216,13 @@ static KVMSlot *kvm_lookup_matching_slot(KVMMemoryListener *kml,
> return NULL;
> }
>
> +bool is_kvm_memory(hwaddr start_addr, hwaddr size)
> +{
> + KVMMemoryListener *kml = &kvm_state->memory_listener;
> +
> + return NULL != kvm_lookup_matching_slot(kml, start_addr, size);
> +}
> +
> /*
> * Calculate and align the start address and the size of the section.
> * Return the size. If the size is 0, the aligned section is empty.
> diff --git a/memory.c b/memory.c
> index 51204aa079..56c733c687 100644
> --- a/memory.c
> +++ b/memory.c
> @@ -2916,6 +2916,7 @@ static void mtree_print_flatview(gpointer key, gpointer value,
> int n = view->nr;
> int i;
> AddressSpace *as;
> + bool print_kvm = false;
>
> p(f, "FlatView #%d\n", fvi->counter);
> ++fvi->counter;
> @@ -2927,6 +2928,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) {
> + print_kvm = true;
> + }
> }
>
> p(f, " Root memory region: %s\n",
> @@ -2960,6 +2964,12 @@ static void mtree_print_flatview(gpointer key, gpointer value,
> if (fvi->owner) {
> mtree_print_mr_owner(p, f, mr);
> }
> +
> + if (kvm_enabled() && print_kvm &&
> + is_kvm_memory(int128_get64(range->addr.start),
> + MR_SIZE(range->addr.size) + 1)) {
> + p(f, " KVM");
> + }
> p(f, "\n");
> range++;
> }
> --
> 2.17.1
>
>
--
Dr. David Alan Gilbert / dgilbert@redhat.com / Manchester, UK
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [Qemu-devel] [PATCH qemu] hmp: Print if memory section is registered in KVM
2018-11-13 14:51 ` Dr. David Alan Gilbert
@ 2018-11-13 15:56 ` Paolo Bonzini
2018-12-11 2:36 ` Alexey Kardashevskiy
0 siblings, 1 reply; 5+ messages in thread
From: Paolo Bonzini @ 2018-11-13 15:56 UTC (permalink / raw)
To: Dr. David Alan Gilbert, Alexey Kardashevskiy; +Cc: qemu-devel
On 13/11/2018 15:51, Dr. David Alan Gilbert wrote:
> * Alexey Kardashevskiy (aik@ozlabs.ru) wrote:
>> This adds a "KVM" marker to the "into mtree -f" to tell the user if
>> a particular memory section is registered as a KVM memory slot; useful
>> for debugging purposes.
>>
>> Since it is memory sections which get registered in KVM (rather than
>> memory regions), this only prints "KVM" for flatviews.
>>
>> For example:
>> Root memory region: system
>> 0000000000000000-00000003ffffffff (prio 0, ram): ppc_spapr.ram KVM
>> 0000200000000020-000020000000003f (prio 1, i/o): virtio-pci
>>
>> Signed-off-by: Alexey Kardashevskiy <aik@ozlabs.ru>
>
> From HMP I'm ok with this, but I wonder if we should make this
> code more general to other accelerators and not specific to kvm?
Can't this be derived from the type (ram, i/o, ...)?
Paolo
>
> Dave
>
>> ---
>> include/sysemu/kvm.h | 1 +
>> accel/kvm/kvm-all.c | 7 +++++++
>> memory.c | 10 ++++++++++
>> 3 files changed, 18 insertions(+)
>>
>> diff --git a/include/sysemu/kvm.h b/include/sysemu/kvm.h
>> index 97d8d9d0d5..9eab5ac1b1 100644
>> --- a/include/sysemu/kvm.h
>> +++ b/include/sysemu/kvm.h
>> @@ -471,6 +471,7 @@ void kvm_set_sigmask_len(KVMState *s, unsigned int sigmask_len);
>> #if !defined(CONFIG_USER_ONLY)
>> int kvm_physical_memory_addr_from_host(KVMState *s, void *ram_addr,
>> hwaddr *phys_addr);
>> +bool is_kvm_memory(hwaddr start_addr, hwaddr size);
>> #endif
>>
>> #endif /* NEED_CPU_H */
>> diff --git a/accel/kvm/kvm-all.c b/accel/kvm/kvm-all.c
>> index 4880a05399..d72808aaa6 100644
>> --- a/accel/kvm/kvm-all.c
>> +++ b/accel/kvm/kvm-all.c
>> @@ -216,6 +216,13 @@ static KVMSlot *kvm_lookup_matching_slot(KVMMemoryListener *kml,
>> return NULL;
>> }
>>
>> +bool is_kvm_memory(hwaddr start_addr, hwaddr size)
>> +{
>> + KVMMemoryListener *kml = &kvm_state->memory_listener;
>> +
>> + return NULL != kvm_lookup_matching_slot(kml, start_addr, size);
>> +}
>> +
>> /*
>> * Calculate and align the start address and the size of the section.
>> * Return the size. If the size is 0, the aligned section is empty.
>> diff --git a/memory.c b/memory.c
>> index 51204aa079..56c733c687 100644
>> --- a/memory.c
>> +++ b/memory.c
>> @@ -2916,6 +2916,7 @@ static void mtree_print_flatview(gpointer key, gpointer value,
>> int n = view->nr;
>> int i;
>> AddressSpace *as;
>> + bool print_kvm = false;
>>
>> p(f, "FlatView #%d\n", fvi->counter);
>> ++fvi->counter;
>> @@ -2927,6 +2928,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) {
>> + print_kvm = true;
>> + }
>> }
>>
>> p(f, " Root memory region: %s\n",
>> @@ -2960,6 +2964,12 @@ static void mtree_print_flatview(gpointer key, gpointer value,
>> if (fvi->owner) {
>> mtree_print_mr_owner(p, f, mr);
>> }
>> +
>> + if (kvm_enabled() && print_kvm &&
>> + is_kvm_memory(int128_get64(range->addr.start),
>> + MR_SIZE(range->addr.size) + 1)) {
>> + p(f, " KVM");
>> + }
>> p(f, "\n");
>> range++;
>> }
>> --
>> 2.17.1
>>
>>
> --
> Dr. David Alan Gilbert / dgilbert@redhat.com / Manchester, UK
>
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [Qemu-devel] [PATCH qemu] hmp: Print if memory section is registered in KVM
2018-11-13 15:56 ` Paolo Bonzini
@ 2018-12-11 2:36 ` Alexey Kardashevskiy
0 siblings, 0 replies; 5+ messages in thread
From: Alexey Kardashevskiy @ 2018-12-11 2:36 UTC (permalink / raw)
To: Paolo Bonzini, Dr. David Alan Gilbert; +Cc: qemu-devel
On 14/11/2018 02:56, Paolo Bonzini wrote:
> On 13/11/2018 15:51, Dr. David Alan Gilbert wrote:
>> * Alexey Kardashevskiy (aik@ozlabs.ru) wrote:
>>> This adds a "KVM" marker to the "into mtree -f" to tell the user if
>>> a particular memory section is registered as a KVM memory slot; useful
>>> for debugging purposes.
>>>
>>> Since it is memory sections which get registered in KVM (rather than
>>> memory regions), this only prints "KVM" for flatviews.
>>>
>>> For example:
>>> Root memory region: system
>>> 0000000000000000-00000003ffffffff (prio 0, ram): ppc_spapr.ram KVM
>>> 0000200000000020-000020000000003f (prio 1, i/o): virtio-pci
>>>
>>> Signed-off-by: Alexey Kardashevskiy <aik@ozlabs.ru>
>>
>> From HMP I'm ok with this, but I wonder if we should make this
>> code more general to other accelerators and not specific to kvm?
>
> Can't this be derived from the type (ram, i/o, ...)?
Sorry for the delay with the response.
Derived what? "ramd" is usually KVM but not always if we emulate a
portion of it (a bit of MMIO space from VFIO quirks, for example), and
we could do this to "ram" as well, I just do not have an example handy.
I tried to hack it. I basically need a way to tell in
mtree_print_flatview() if a specific FlatRange is "accelerated.
Option1:
- add FlatRange to MemoryRegionSection (MRSs are always local, FRs are
permanent);
- change kvm_set_phys_mem() to store accelerator in mrs->FlatRange;
- print FlatView->FlatRange->accel name.
Pro: fast - no additional lookups;
Con: accel/kvm/kvm-all.c needs to know the FlatRange definition which is
too invasive for such a small task.
Option2:
- replace global is_kvm_memory() with AccelClass::is_memory_registered();
- define the callback for KVM;
- call that from mtree_print_flatview().
Pro: no touching FlatRange/MemoryRegionSection structures.
Con: suboptimal but we probably do not care as much.
Or have I missed something? Thanks,
>
> Paolo
>
>>
>> Dave
>>
>>> ---
>>> include/sysemu/kvm.h | 1 +
>>> accel/kvm/kvm-all.c | 7 +++++++
>>> memory.c | 10 ++++++++++
>>> 3 files changed, 18 insertions(+)
>>>
>>> diff --git a/include/sysemu/kvm.h b/include/sysemu/kvm.h
>>> index 97d8d9d0d5..9eab5ac1b1 100644
>>> --- a/include/sysemu/kvm.h
>>> +++ b/include/sysemu/kvm.h
>>> @@ -471,6 +471,7 @@ void kvm_set_sigmask_len(KVMState *s, unsigned int sigmask_len);
>>> #if !defined(CONFIG_USER_ONLY)
>>> int kvm_physical_memory_addr_from_host(KVMState *s, void *ram_addr,
>>> hwaddr *phys_addr);
>>> +bool is_kvm_memory(hwaddr start_addr, hwaddr size);
>>> #endif
>>>
>>> #endif /* NEED_CPU_H */
>>> diff --git a/accel/kvm/kvm-all.c b/accel/kvm/kvm-all.c
>>> index 4880a05399..d72808aaa6 100644
>>> --- a/accel/kvm/kvm-all.c
>>> +++ b/accel/kvm/kvm-all.c
>>> @@ -216,6 +216,13 @@ static KVMSlot *kvm_lookup_matching_slot(KVMMemoryListener *kml,
>>> return NULL;
>>> }
>>>
>>> +bool is_kvm_memory(hwaddr start_addr, hwaddr size)
>>> +{
>>> + KVMMemoryListener *kml = &kvm_state->memory_listener;
>>> +
>>> + return NULL != kvm_lookup_matching_slot(kml, start_addr, size);
>>> +}
>>> +
>>> /*
>>> * Calculate and align the start address and the size of the section.
>>> * Return the size. If the size is 0, the aligned section is empty.
>>> diff --git a/memory.c b/memory.c
>>> index 51204aa079..56c733c687 100644
>>> --- a/memory.c
>>> +++ b/memory.c
>>> @@ -2916,6 +2916,7 @@ static void mtree_print_flatview(gpointer key, gpointer value,
>>> int n = view->nr;
>>> int i;
>>> AddressSpace *as;
>>> + bool print_kvm = false;
>>>
>>> p(f, "FlatView #%d\n", fvi->counter);
>>> ++fvi->counter;
>>> @@ -2927,6 +2928,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) {
>>> + print_kvm = true;
>>> + }
>>> }
>>>
>>> p(f, " Root memory region: %s\n",
>>> @@ -2960,6 +2964,12 @@ static void mtree_print_flatview(gpointer key, gpointer value,
>>> if (fvi->owner) {
>>> mtree_print_mr_owner(p, f, mr);
>>> }
>>> +
>>> + if (kvm_enabled() && print_kvm &&
>>> + is_kvm_memory(int128_get64(range->addr.start),
>>> + MR_SIZE(range->addr.size) + 1)) {
>>> + p(f, " KVM");
>>> + }
>>> p(f, "\n");
>>> range++;
>>> }
>>> --
>>> 2.17.1
>>>
>>>
>> --
>> Dr. David Alan Gilbert / dgilbert@redhat.com / Manchester, UK
>>
>
--
Alexey
^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2018-12-11 2:36 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2018-11-08 1:02 [Qemu-devel] [PATCH qemu] hmp: Print if memory section is registered in KVM Alexey Kardashevskiy
2018-11-08 12:44 ` Daniel Henrique Barboza
2018-11-13 14:51 ` Dr. David Alan Gilbert
2018-11-13 15:56 ` Paolo Bonzini
2018-12-11 2:36 ` Alexey Kardashevskiy
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).