From: Luiz Capitulino <lcapitulino@redhat.com>
To: "Andreas Färber" <afaerber@suse.de>
Cc: qiaonuohan@cn.fujitsu.com, qemu-devel@nongnu.org
Subject: Re: [Qemu-devel] [PATCH qom-cpu v4 13/18] memory_mapping: Cleanup qemu_get_guest_memory_mapping()
Date: Tue, 11 Jun 2013 11:52:56 -0400 [thread overview]
Message-ID: <20130611115256.76476459@redhat.com> (raw)
In-Reply-To: <1370794247-28267-14-git-send-email-afaerber@suse.de>
On Sun, 9 Jun 2013 18:10:42 +0200
Andreas Färber <afaerber@suse.de> wrote:
> We relied on the CPUClass::get_memory_mapping() implementation being a
> no-op when paging is disabled for that CPU. Therefore we can just as well
> iterate over all CPUs to retrieve mappings.
>
> This allows to use qemu_for_each_cpu() instead of open-coding CPU loops.
>
> Pass any Error out into dump_init() and have it actually stop on errors.
> Whether it is unsupported on a certain CPU can be checked by looking for
> a NULL CPUClass::get_memory_mapping field.
>
> Signed-off-by: Andreas Färber <afaerber@suse.de>
Reviewed-by: Luiz Capitulino <lcapitulino@redhat.com>
> ---
> dump.c | 7 +++++-
> include/sysemu/memory_mapping.h | 8 +------
> memory_mapping.c | 52 ++++++++++++++++++++++++-----------------
> 3 files changed, 38 insertions(+), 29 deletions(-)
>
> diff --git a/dump.c b/dump.c
> index c0d3da5..b44dafc 100644
> --- a/dump.c
> +++ b/dump.c
> @@ -706,6 +706,7 @@ static int dump_init(DumpState *s, int fd, bool paging, bool has_filter,
> {
> CPUArchState *env;
> int nr_cpus;
> + Error *err = NULL;
> int ret;
>
> if (runstate_is_running()) {
> @@ -756,7 +757,11 @@ static int dump_init(DumpState *s, int fd, bool paging, bool has_filter,
> /* get memory mapping */
> memory_mapping_list_init(&s->list);
> if (paging) {
> - qemu_get_guest_memory_mapping(&s->list);
> + qemu_get_guest_memory_mapping(&s->list, &err);
> + if (err != NULL) {
> + error_propagate(errp, err);
> + goto cleanup;
> + }
> } else {
> qemu_get_guest_simple_memory_mapping(&s->list);
> }
> diff --git a/include/sysemu/memory_mapping.h b/include/sysemu/memory_mapping.h
> index c47e6ee..6dfb68d 100644
> --- a/include/sysemu/memory_mapping.h
> +++ b/include/sysemu/memory_mapping.h
> @@ -45,13 +45,7 @@ void memory_mapping_list_free(MemoryMappingList *list);
>
> void memory_mapping_list_init(MemoryMappingList *list);
>
> -/*
> - * Return value:
> - * 0: success
> - * -1: failed
> - * -2: unsupported
> - */
> -int qemu_get_guest_memory_mapping(MemoryMappingList *list);
> +void qemu_get_guest_memory_mapping(MemoryMappingList *list, Error **errp);
>
> /* get guest's memory mapping without do paging(virtual address is 0). */
> void qemu_get_guest_simple_memory_mapping(MemoryMappingList *list);
> diff --git a/memory_mapping.c b/memory_mapping.c
> index 9bd24ce..a19be54 100644
> --- a/memory_mapping.c
> +++ b/memory_mapping.c
> @@ -165,36 +165,48 @@ void memory_mapping_list_init(MemoryMappingList *list)
> QTAILQ_INIT(&list->head);
> }
>
> -static CPUArchState *find_paging_enabled_cpu(CPUArchState *start_cpu)
> +static void find_paging_enabled_cpu(CPUState *cpu, void *data)
> {
> - CPUArchState *env;
> + bool *ret = data;
>
> - for (env = start_cpu; env != NULL; env = env->next_cpu) {
> - if (cpu_paging_enabled(ENV_GET_CPU(env))) {
> - return env;
> - }
> + if (*ret) {
> + return;
> }
> + *ret = cpu_paging_enabled(cpu);
> +}
> +
> +typedef struct GetGuestMemoryMappingData {
> + MemoryMappingList *list;
> + Error *err;
> +} GetGuestMemoryMappingData;
> +
> +static void qemu_get_one_guest_memory_mapping(CPUState *cpu, void *data)
> +{
> + GetGuestMemoryMappingData *s = data;
>
> - return NULL;
> + if (s->err != NULL || !cpu_paging_enabled(cpu)) {
> + return;
> + }
> + cpu_get_memory_mapping(cpu, s->list, &s->err);
> }
>
> -int qemu_get_guest_memory_mapping(MemoryMappingList *list)
> +void qemu_get_guest_memory_mapping(MemoryMappingList *list, Error **errp)
> {
> - CPUArchState *env, *first_paging_enabled_cpu;
> + GetGuestMemoryMappingData s = {
> + .list = list,
> + .err = NULL,
> + };
> + bool paging_enabled = false;
> RAMBlock *block;
> ram_addr_t offset, length;
>
> - first_paging_enabled_cpu = find_paging_enabled_cpu(first_cpu);
> - if (first_paging_enabled_cpu) {
> - for (env = first_paging_enabled_cpu; env != NULL; env = env->next_cpu) {
> - Error *err = NULL;
> - cpu_get_memory_mapping(ENV_GET_CPU(env), list, &err);
> - if (err) {
> - error_free(err);
> - return -1;
> - }
> + qemu_for_each_cpu(find_paging_enabled_cpu, &paging_enabled);
> + if (paging_enabled) {
> + qemu_for_each_cpu(qemu_get_one_guest_memory_mapping, &s);
> + if (s.err != NULL) {
> + error_propagate(errp, s.err);
> }
> - return 0;
> + return;
> }
>
> /*
> @@ -206,8 +218,6 @@ int qemu_get_guest_memory_mapping(MemoryMappingList *list)
> length = block->length;
> create_new_memory_mapping(list, offset, offset, length);
> }
> -
> - return 0;
> }
>
> void qemu_get_guest_simple_memory_mapping(MemoryMappingList *list)
next prev parent reply other threads:[~2013-06-11 15:53 UTC|newest]
Thread overview: 37+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-06-09 16:10 [Qemu-devel] [PATCH qom-cpu v4 00/18] dump: Build cleanups, redone Andreas Färber
2013-06-09 16:10 ` [Qemu-devel] [PATCH qom-cpu v4 01/18] dump: Move stubs into libqemustub.a Andreas Färber
2013-06-09 16:10 ` [Qemu-devel] [PATCH qom-cpu v4 02/18] pc: Fix crash when attempting to hotplug CPU with negative ID Andreas Färber
2013-06-09 16:10 ` [Qemu-devel] [PATCH qom-cpu v4 03/18] pc: Create pc-*-1.6 machine-types Andreas Färber
2013-06-09 16:10 ` [Qemu-devel] [PATCH qom-cpu v4 04/18] target-i386: Update model values on Conroe/Penryn/Nehalem CPU models Andreas Färber
2013-06-09 16:10 ` [Qemu-devel] [PATCH qom-cpu v4 05/18] target-i386: Set level=4 on Conroe/Penryn/Nehalem Andreas Färber
2013-06-09 16:10 ` [Qemu-devel] [PATCH qom-cpu v4 06/18] target-i386: cpu: Fix potential buffer overrun in get_register_name_32() Andreas Färber
2013-06-09 16:10 ` [Qemu-devel] [PATCH qom-cpu v4 07/18] cpu: Turn cpu_paging_enabled() into a CPUState hook Andreas Färber
2013-06-11 8:06 ` Jens Freimann
2013-06-11 14:52 ` Luiz Capitulino
2013-06-09 16:10 ` [Qemu-devel] [PATCH qom-cpu v4 08/18] memory_mapping: Move MemoryMappingList typedef to qemu/typedefs.h Andreas Färber
2013-06-09 16:10 ` [Qemu-devel] [PATCH qom-cpu v4 09/18] cpu: Turn cpu_get_memory_mapping() into a CPUState hook Andreas Färber
2013-06-11 9:20 ` Jens Freimann
2013-06-11 14:56 ` Luiz Capitulino
2013-06-11 16:03 ` Andreas Färber
2013-06-09 16:10 ` [Qemu-devel] [PATCH qom-cpu v4 10/18] memory_mapping: Drop qemu_get_memory_mapping() stub Andreas Färber
2013-06-09 16:10 ` [Qemu-devel] [PATCH qom-cpu v4 11/18] dump: Drop qmp_dump_guest_memory() stub and build for all targets Andreas Färber
2013-06-09 16:10 ` [Qemu-devel] [PATCH qom-cpu v4 12/18] cpu: Change default for CPUClass::get_paging_enabled() Andreas Färber
2013-06-11 9:00 ` Jens Freimann
2013-06-11 15:01 ` Luiz Capitulino
2013-06-09 16:10 ` [Qemu-devel] [PATCH qom-cpu v4 13/18] memory_mapping: Cleanup qemu_get_guest_memory_mapping() Andreas Färber
2013-06-11 15:52 ` Luiz Capitulino [this message]
2013-06-11 17:47 ` Andreas Färber
2013-06-09 16:10 ` [Qemu-devel] [PATCH qom-cpu v4 14/18] dump: Abstract dump_init() with cpu_synchronize_all_states() Andreas Färber
2013-06-11 15:55 ` Luiz Capitulino
2013-06-11 17:46 ` Andreas Färber
2013-06-09 16:10 ` [Qemu-devel] [PATCH qom-cpu v4 15/18] dump: Abstract dump_init() further with qemu_for_each_cpu() Andreas Färber
2013-06-11 15:55 ` Luiz Capitulino
2013-06-09 16:10 ` [Qemu-devel] [PATCH qom-cpu v4 16/18] dump: Abstract write_elf{64, 32}_notes() " Andreas Färber
2013-06-09 16:10 ` [Qemu-devel] [PATCH qom-cpu v4 17/18] memory_mapping: Use hwaddr type for MemoryMapping virt_addr field Andreas Färber
2013-06-09 17:17 ` Peter Maydell
2013-06-09 17:25 ` Andreas Färber
2013-06-09 16:10 ` [Qemu-devel] [PATCH qom-cpu v4 18/18] memory_mapping: Build only once Andreas Färber
2013-06-09 17:29 ` Peter Maydell
2013-06-09 17:36 ` Andreas Färber
2013-06-09 16:19 ` [Qemu-devel] [PATCH qom-cpu v4 00/18] dump: Build cleanups, redone Andreas Färber
2013-06-11 16:54 ` Andreas Färber
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20130611115256.76476459@redhat.com \
--to=lcapitulino@redhat.com \
--cc=afaerber@suse.de \
--cc=qemu-devel@nongnu.org \
--cc=qiaonuohan@cn.fujitsu.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.