From mboxrd@z Thu Jan 1 00:00:00 1970 From: Glauber Costa Subject: [PATCH 4/9] substitute is_allocated_mem with more general is_containing_region Date: Fri, 12 Sep 2008 12:10:45 -0300 Message-ID: <1221232250-9653-5-git-send-email-glommer@redhat.com> References: <1221232250-9653-1-git-send-email-glommer@redhat.com> Cc: jes@sgi.com, avi@qumranet.com, aliguori@us.ibm.com To: kvm@vger.kernel.org Return-path: Received: from mx2.redhat.com ([66.187.237.31]:56425 "EHLO mx2.redhat.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751326AbYILPQk (ORCPT ); Fri, 12 Sep 2008 11:16:40 -0400 In-Reply-To: <1221232250-9653-1-git-send-email-glommer@redhat.com> Sender: kvm-owner@vger.kernel.org List-ID: is_allocated_mem is a function that checks if every relevant aspect of the memory slot match (start and size). Replace it with a more generic function that checks if a memory region is totally contained into another. The former case is also covered. Signed-off-by: Glauber Costa --- libkvm/libkvm.c | 34 +++++++++++++++++++++------------- libkvm/libkvm.h | 2 +- qemu/qemu-kvm.c | 4 ++-- 3 files changed, 24 insertions(+), 16 deletions(-) diff --git a/libkvm/libkvm.c b/libkvm/libkvm.c index fa65c30..a5e20bb 100644 --- a/libkvm/libkvm.c +++ b/libkvm/libkvm.c @@ -136,6 +136,27 @@ int get_intersecting_slot(unsigned long phys_addr) return -1; } +/* Returns -1 if this slot is not totally contained on any other, + * and the number of the slot otherwise */ +int get_container_slot(uint64_t phys_addr, unsigned long size) +{ + int i; + + for (i = 0; i < KVM_MAX_NUM_MEM_REGIONS ; ++i) + if (slots[i].len && slots[i].phys_addr <= phys_addr && + (slots[i].phys_addr + slots[i].len) >= phys_addr + size) + return i; + return -1; +} + +int kvm_is_containing_region(kvm_context_t kvm, unsigned long phys_addr, unsigned long size) +{ + int slot = get_container_slot(phys_addr, size); + if (slot == -1) + return 0; + return 1; +} + /* * dirty pages logging control */ @@ -423,19 +444,6 @@ int kvm_is_intersecting_mem(kvm_context_t kvm, unsigned long phys_start) return get_intersecting_slot(phys_start) != -1; } -int kvm_is_allocated_mem(kvm_context_t kvm, unsigned long phys_start, - unsigned long len) -{ - int slot; - - slot = get_slot(phys_start); - if (slot == -1) - return 0; - if (slots[slot].len == len) - return 1; - return 0; -} - int kvm_register_phys_mem(kvm_context_t kvm, unsigned long phys_start, void *userspace_addr, unsigned long len, int log) diff --git a/libkvm/libkvm.h b/libkvm/libkvm.h index 79dd769..1e89993 100644 --- a/libkvm/libkvm.h +++ b/libkvm/libkvm.h @@ -454,7 +454,7 @@ void *kvm_create_phys_mem(kvm_context_t, unsigned long phys_start, unsigned long len, int log, int writable); void kvm_destroy_phys_mem(kvm_context_t, unsigned long phys_start, unsigned long len); -int kvm_is_intersecting_mem(kvm_context_t kvm, unsigned long phys_start); +int kvm_is_containing_region(kvm_context_t kvm, unsigned long phys_start, unsigned long size); int kvm_is_allocated_mem(kvm_context_t kvm, unsigned long phys_start, unsigned long len); int kvm_create_mem_hole(kvm_context_t kvm, unsigned long phys_start, diff --git a/qemu/qemu-kvm.c b/qemu/qemu-kvm.c index cff04c5..e0b114a 100644 --- a/qemu/qemu-kvm.c +++ b/qemu/qemu-kvm.c @@ -778,10 +778,10 @@ void kvm_cpu_register_physical_memory(target_phys_addr_t start_addr, int r = 0; phys_offset &= ~IO_MEM_ROM; - r = kvm_is_allocated_mem(kvm_context, start_addr, size); + r = kvm_is_containing_region(kvm_context, start_addr, size); if (r) return; - r = kvm_is_intersecting_mem(kvm_context, start_addr); + r = kvm_is_intersecting_mem(kvm_context, start_addr); if (r) { printf("Ignoring intersecting memory %llx (%lx)\n", start_addr, size); } else -- 1.5.5.1