From mboxrd@z Thu Jan 1 00:00:00 1970 From: Jes Sorensen Date: Wed, 29 Apr 2009 15:06:21 +0000 Subject: Re: [PATCH 04/04] qemu-kvm: other archs should maintain memory mapping Message-Id: <49F86CED.3010101@sgi.com> MIME-Version: 1 Content-Type: multipart/mixed; boundary="------------050907010100070201050204" List-Id: References: <706158FABBBA044BAD4FE898A02E4BC236A2BC03@pdsmsx503.ccr.corp.intel.com> In-Reply-To: <706158FABBBA044BAD4FE898A02E4BC236A2BC03@pdsmsx503.ccr.corp.intel.com> To: kvm-ia64@vger.kernel.org This is a multi-part message in MIME format. --------------050907010100070201050204 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Avi Kivity wrote: > Hollis, does this work for you? > > If now, you can add a new define KVM_WANT_MAPPING or something, and > define it for I386 and IA64. Hi, This is the one implementing the KVM_WANT_MAPPING change. Cheers, Jes --------------050907010100070201050204 Content-Type: text/x-patch; name="0005-qemu-kvm-arch-mapping.patch" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="0005-qemu-kvm-arch-mapping.patch" Introduce KVM_WANT_MAPPING define to switch on mapping code, instead of relying on TARGET_ defines. Signed-off-by: Jes Sorensen --- qemu-kvm.c | 42 ++++++++++++++++++++++++++---------------- target-i386/qemu-kvm-arch.h | 2 ++ target-ia64/qemu-kvm-arch.h | 2 ++ 3 files changed, 30 insertions(+), 16 deletions(-) Index: qemu-kvm/qemu-kvm.c =================================================================== --- qemu-kvm.orig/qemu-kvm.c +++ qemu-kvm/qemu-kvm.c @@ -824,7 +824,7 @@ kvm_finalize(kvm_context); } -#ifdef TARGET_I386 +#ifdef KVM_WANT_MAPPING static struct mapping { target_phys_addr_t phys; ram_addr_t ram; @@ -863,6 +863,26 @@ if (p) *p = mappings[--nr_mappings]; } + +static inline void kvm_cpu_drop_mappings(target_phys_addr_t start_addr, + unsigned long size) +{ + struct mapping *p; + + while (size > 0) { + p = find_mapping(start_addr); + if (p) { + kvm_unregister_memory_area(kvm_context, p->phys, p->len); + drop_mapping(p->phys); + } + start_addr += TARGET_PAGE_SIZE; + if (size > TARGET_PAGE_SIZE) { + size -= TARGET_PAGE_SIZE; + } else { + size = 0; + } + } +} #endif void kvm_cpu_register_physical_memory(target_phys_addr_t start_addr, @@ -871,7 +891,7 @@ { int r = 0; unsigned long area_flags; -#ifdef TARGET_I386 +#ifdef KVM_WANT_MAPPING struct mapping *p; #endif @@ -890,19 +910,9 @@ if (kvm_arch_must_use_aliases_target(start_addr)) return; - while (size > 0) { - p = find_mapping(start_addr); - if (p) { - kvm_unregister_memory_area(kvm_context, p->phys, p->len); - drop_mapping(p->phys); - } - start_addr += TARGET_PAGE_SIZE; - if (size > TARGET_PAGE_SIZE) { - size -= TARGET_PAGE_SIZE; - } else { - size = 0; - } - } +#ifdef KVM_WANT_MAPPING + kvm_cpu_drop_mappings(start_addr, size); +#endif return; } @@ -930,7 +940,7 @@ exit(1); } -#ifdef TARGET_I386 +#ifdef KVM_WANT_MAPPING drop_mapping(start_addr); p = &mappings[nr_mappings++]; p->phys = start_addr; Index: qemu-kvm/target-i386/qemu-kvm-arch.h =================================================================== --- qemu-kvm.orig/target-i386/qemu-kvm-arch.h +++ qemu-kvm/target-i386/qemu-kvm-arch.h @@ -14,4 +14,6 @@ extern int kvm_arch_must_use_aliases_source(target_phys_addr_t addr); extern int kvm_arch_must_use_aliases_target(target_phys_addr_t addr); +#define KVM_WANT_MAPPING 1 + #endif Index: qemu-kvm/target-ia64/qemu-kvm-arch.h =================================================================== --- qemu-kvm.orig/target-ia64/qemu-kvm-arch.h +++ qemu-kvm/target-ia64/qemu-kvm-arch.h @@ -19,4 +19,6 @@ return 0; } +#define KVM_WANT_MAPPING 1 + #endif --------------050907010100070201050204--