Re: [kvmarm] [PATCH 5/8] KVM: Add hva_to_memslot

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On 08.08.2012, at 06:55, Christoffer Dall wrote:

> On Tue, Aug 7, 2012 at 6:57 AM, Alexander Graf <agraf@xxxxxxx> wrote:
>> Architecture code might want to figure out if an hva that it gets for example
>> via the mmu notifier callbacks actually is in guest mapped memory, and if so,
>> in which memory slot.
>> 
>> This patch introduces a helper function to enable it to do so. It is a
>> prerequisite for the e500 mmu notifier implementation.
>> 
>> Signed-off-by: Alexander Graf <agraf@xxxxxxx>
>> ---
>> include/linux/kvm_host.h |    1 +
>> virt/kvm/kvm_main.c      |   14 ++++++++++++++
>> 2 files changed, 15 insertions(+), 0 deletions(-)
>> 
>> diff --git a/include/linux/kvm_host.h b/include/linux/kvm_host.h
>> index dbc65f9..2b92928 100644
>> --- a/include/linux/kvm_host.h
>> +++ b/include/linux/kvm_host.h
>> @@ -464,6 +464,7 @@ int kvm_gfn_to_hva_cache_init(struct kvm *kvm, struct gfn_to_hva_cache *ghc,
>> int kvm_clear_guest_page(struct kvm *kvm, gfn_t gfn, int offset, int len);
>> int kvm_clear_guest(struct kvm *kvm, gpa_t gpa, unsigned long len);
>> struct kvm_memory_slot *gfn_to_memslot(struct kvm *kvm, gfn_t gfn);
>> +struct kvm_memory_slot *hva_to_memslot(struct kvm *kvm, hva_t hva);
>> int kvm_is_visible_gfn(struct kvm *kvm, gfn_t gfn);
>> unsigned long kvm_host_page_size(struct kvm *kvm, gfn_t gfn);
>> void mark_page_dirty(struct kvm *kvm, gfn_t gfn);
>> diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c
>> index bcf973e..d42591d 100644
>> --- a/virt/kvm/kvm_main.c
>> +++ b/virt/kvm/kvm_main.c
>> @@ -999,6 +999,20 @@ struct kvm_memory_slot *gfn_to_memslot(struct kvm *kvm, gfn_t gfn)
>> }
>> EXPORT_SYMBOL_GPL(gfn_to_memslot);
>> 
>> +struct kvm_memory_slot *hva_to_memslot(struct kvm *kvm, hva_t hva)
>> +{
>> +       struct kvm_memslots *slots = kvm_memslots(kvm);
>> +       struct kvm_memory_slot *memslot;
>> +
>> +       kvm_for_each_memslot(memslot, slots)
>> +               if (hva >= memslot->userspace_addr &&
>> +                     hva < memslot->userspace_addr + memslot->npages)
> 
> addr + npages, this doesn't look right

Thanks a lot for spotting that one!

> 
>> +                       return memslot;
>> +
>> +       return NULL;
>> +}
>> +EXPORT_SYMBOL_GPL(hva_to_memslot);
> 
> consider also adding a hva_to_gpa wrapper now when you're add it, then
> ARM code will be so happy:
> 
> bool hva_to_gpa(struct kvm *kvm, unsigned long hva, gpa_t *gpa)
> {
> 	struct kvm_memory_slot *memslot;
> 
> 	memslot = hva_to_memslot(kvm, hva);
> 	if (!memslot)
> 		return false;
> 
> 	gpa_t gpa_offset = hva - memslot->userspace_addr;
> 	*gpa = (memslot->base_gfn << PAGE_SHIFT) + gpa_offset;
> 	return true;
> }

What do you need this for? I usually don't like to add framework code that has no users (yet).


Alex

--
To unsubscribe from this list: send the line "unsubscribe kvm" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[Index of Archives]     [KVM ARM]     [KVM ia64]     [KVM ppc]     [Virtualization Tools]     [Spice Development]     [Libvirt]     [Libvirt Users]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite Questions]     [Linux Kernel]     [Linux SCSI]     [XFree86]
  Powered by Linux