aboutsummaryrefslogtreecommitdiffstats
path: root/include/linux
diff options
context:
space:
mode:
authorMarcelo Tosatti <mtosatti@redhat.com>2009-12-23 11:35:21 -0500
committerMarcelo Tosatti <mtosatti@redhat.com>2010-03-01 10:35:44 -0500
commitbc6678a33d9b952981a8e44a4f876c3ad64ca4d8 (patch)
treee26027179eb0d76f234509145a395dd6e5910074 /include/linux
parent3ad26d8139a82b0510b1e0435ee82ae461d33401 (diff)
KVM: introduce kvm->srcu and convert kvm_set_memory_region to SRCU update
Use two steps for memslot deletion: mark the slot invalid (which stops instantiation of new shadow pages for that slot, but allows destruction), then instantiate the new empty slot. Also simplifies kvm_handle_hva locking. Signed-off-by: Marcelo Tosatti <mtosatti@redhat.com>
Diffstat (limited to 'include/linux')
-rw-r--r--include/linux/kvm.h2
-rw-r--r--include/linux/kvm_host.h7
2 files changed, 3 insertions, 6 deletions
diff --git a/include/linux/kvm.h b/include/linux/kvm.h
index a24de0b1858e..f2feef68ffd6 100644
--- a/include/linux/kvm.h
+++ b/include/linux/kvm.h
@@ -103,7 +103,7 @@ struct kvm_userspace_memory_region {
103 103
104/* for kvm_memory_region::flags */ 104/* for kvm_memory_region::flags */
105#define KVM_MEM_LOG_DIRTY_PAGES 1UL 105#define KVM_MEM_LOG_DIRTY_PAGES 1UL
106 106#define KVM_MEMSLOT_INVALID (1UL << 1)
107 107
108/* for KVM_IRQ_LINE */ 108/* for KVM_IRQ_LINE */
109struct kvm_irq_level { 109struct kvm_irq_level {
diff --git a/include/linux/kvm_host.h b/include/linux/kvm_host.h
index 9af240387fe6..93bd30701ca7 100644
--- a/include/linux/kvm_host.h
+++ b/include/linux/kvm_host.h
@@ -162,6 +162,7 @@ struct kvm {
162 struct rw_semaphore slots_lock; 162 struct rw_semaphore slots_lock;
163 struct mm_struct *mm; /* userspace tied to this vm */ 163 struct mm_struct *mm; /* userspace tied to this vm */
164 struct kvm_memslots *memslots; 164 struct kvm_memslots *memslots;
165 struct srcu_struct srcu;
165#ifdef CONFIG_KVM_APIC_ARCHITECTURE 166#ifdef CONFIG_KVM_APIC_ARCHITECTURE
166 u32 bsp_vcpu_id; 167 u32 bsp_vcpu_id;
167 struct kvm_vcpu *bsp_vcpu; 168 struct kvm_vcpu *bsp_vcpu;
@@ -275,6 +276,7 @@ void kvm_set_page_accessed(struct page *page);
275pfn_t gfn_to_pfn(struct kvm *kvm, gfn_t gfn); 276pfn_t gfn_to_pfn(struct kvm *kvm, gfn_t gfn);
276pfn_t gfn_to_pfn_memslot(struct kvm *kvm, 277pfn_t gfn_to_pfn_memslot(struct kvm *kvm,
277 struct kvm_memory_slot *slot, gfn_t gfn); 278 struct kvm_memory_slot *slot, gfn_t gfn);
279int memslot_id(struct kvm *kvm, gfn_t gfn);
278void kvm_release_pfn_dirty(pfn_t); 280void kvm_release_pfn_dirty(pfn_t);
279void kvm_release_pfn_clean(pfn_t pfn); 281void kvm_release_pfn_clean(pfn_t pfn);
280void kvm_set_pfn_dirty(pfn_t pfn); 282void kvm_set_pfn_dirty(pfn_t pfn);
@@ -490,11 +492,6 @@ static inline void kvm_guest_exit(void)
490 current->flags &= ~PF_VCPU; 492 current->flags &= ~PF_VCPU;
491} 493}
492 494
493static inline int memslot_id(struct kvm *kvm, struct kvm_memory_slot *slot)
494{
495 return slot - kvm->memslots->memslots;
496}
497
498static inline gpa_t gfn_to_gpa(gfn_t gfn) 495static inline gpa_t gfn_to_gpa(gfn_t gfn)
499{ 496{
500 return (gpa_t)gfn << PAGE_SHIFT; 497 return (gpa_t)gfn << PAGE_SHIFT;