History

KVM: Support vCPU-based gfn->hva cache

Provide versions of struct gfn_to_hva_cache functions that take vcpu as a parameter instead of struct kvm. The existing functions are not needed anymore, so delete them. This allows dirty pages to be logged in the vcpu dirty ring, instead of the global dirty ring, for ring-based dirty memory tracking.

Cao, Lei committed 9 years ago

Commit bbd64111 parent 4bd518f4 files · +55 −58Browse files

Unified · Split

4 files
  1. arch/x86/kvm/lapic.c +10 −12
  2. arch/x86/kvm/x86.c +20 −21
  3. include/linux/kvm_host.h +8 −8
  4. virt/kvm/kvm_main.c +17 −17
arch/x86/kvm/lapic.c+10−12
@@ -529,16 +529,14 @@ int kvm_apic_set_irq(struct kvm_vcpu *vcpu, struct kvm_lapic_irq *irq, · 528 unmodified lines
529529
530530 static int pv_eoi_put_user(struct kvm_vcpu *vcpu, u8 val)
531531 {
532−
533− return kvm_write_guest_cached(vcpu->kvm, &vcpu->arch.pv_eoi.data, &val,
534− sizeof(val));
532+ return kvm_vcpu_write_guest_cached(vcpu, &vcpu->arch.pv_eoi.data, &val,
533+ sizeof(val));
535534 }
536535
537536 static int pv_eoi_get_user(struct kvm_vcpu *vcpu, u8 *val)
538537 {
539−
540− return kvm_read_guest_cached(vcpu->kvm, &vcpu->arch.pv_eoi.data, val,
541− sizeof(*val));
538+ return kvm_vcpu_read_guest_cached(vcpu, &vcpu->arch.pv_eoi.data, val,
539+ sizeof(*val));
542540 }
543541
544542 static inline bool pv_eoi_enabled(struct kvm_vcpu *vcpu)
@@ -2287,8 +2285,8 @@ void kvm_lapic_sync_from_vapic(struct kvm_vcpu *vcpu) · 1742 unmodified lines
22872285 if (!test_bit(KVM_APIC_CHECK_VAPIC, &vcpu->arch.apic_attention))
22882286 return;
22892287
2290− if (kvm_read_guest_cached(vcpu->kvm, &vcpu->arch.apic->vapic_cache, &data,
2291− sizeof(u32)))
2288+ if (kvm_vcpu_read_guest_cached(vcpu, &vcpu->arch.apic->vapic_cache, &data,
2289+ sizeof(u32)))
22922290 return;
22932291
22942292 apic_set_tpr(vcpu->arch.apic, data & 0xff);
@@ -2340,14 +2338,14 @@ void kvm_lapic_sync_to_vapic(struct kvm_vcpu *vcpu) · 45 unmodified lines
23402338 max_isr = 0;
23412339 data = (tpr & 0xff) | ((max_isr & 0xf0) << 8) | (max_irr << 24);
23422340
2343− kvm_write_guest_cached(vcpu->kvm, &vcpu->arch.apic->vapic_cache, &data,
2344− sizeof(u32));
2341+ kvm_vcpu_write_guest_cached(vcpu, &vcpu->arch.apic->vapic_cache, &data,
2342+ sizeof(u32));
23452343 }
23462344
23472345 int kvm_lapic_set_vapic_addr(struct kvm_vcpu *vcpu, gpa_t vapic_addr)
23482346 {
23492347 if (vapic_addr) {
2350− if (kvm_gfn_to_hva_cache_init(vcpu->kvm,
2348+ if (kvm_vcpu_gfn_to_hva_cache_init(vcpu,
23512349 &vcpu->arch.apic->vapic_cache,
23522350 vapic_addr, sizeof(u32)))
23532351 return -EINVAL;
@@ -2441,7 +2439,7 @@ int kvm_lapic_enable_pv_eoi(struct kvm_vcpu *vcpu, u64 data) · 87 unmodified lines
24412439 vcpu->arch.pv_eoi.msr_val = data;
24422440 if (!pv_eoi_enabled(vcpu))
24432441 return 0;
2444− return kvm_gfn_to_hva_cache_init(vcpu->kvm, &vcpu->arch.pv_eoi.data,
2442+ return kvm_vcpu_gfn_to_hva_cache_init(vcpu, &vcpu->arch.pv_eoi.data,
24452443 addr, sizeof(u8));
24462444 }
24472445
arch/x86/kvm/x86.c+20−21
@@ -1811,7 +1811,7 @@ static void kvm_setup_pvclock_page(struct kvm_vcpu *v) · 1810 unmodified lines
18111811 struct kvm_vcpu_arch *vcpu = &v->arch;
18121812 struct pvclock_vcpu_time_info guest_hv_clock;
18131813
1814− if (unlikely(kvm_read_guest_cached(v->kvm, &vcpu->pv_time,
1814+ if (unlikely(kvm_vcpu_read_guest_cached(v, &vcpu->pv_time,
18151815 &guest_hv_clock, sizeof(guest_hv_clock))))
18161816 return;
18171817
@@ -1832,9 +1832,9 @@ static void kvm_setup_pvclock_page(struct kvm_vcpu *v) · 14 unmodified lines
18321832 BUILD_BUG_ON(offsetof(struct pvclock_vcpu_time_info, version) != 0);
18331833
18341834 vcpu->hv_clock.version = guest_hv_clock.version + 1;
1835− kvm_write_guest_cached(v->kvm, &vcpu->pv_time,
1836− &vcpu->hv_clock,
1837− sizeof(vcpu->hv_clock.version));
1835+ kvm_vcpu_write_guest_cached(v, &vcpu->pv_time,
1836+ &vcpu->hv_clock,
1837+ sizeof(vcpu->hv_clock.version));
18381838
18391839 smp_wmb();
18401840
@@ -1848,16 +1848,16 @@ static void kvm_setup_pvclock_page(struct kvm_vcpu *v) · 7 unmodified lines
18481848
18491849 trace_kvm_pvclock_update(v->vcpu_id, &vcpu->hv_clock);
18501850
1851− kvm_write_guest_cached(v->kvm, &vcpu->pv_time,
1852− &vcpu->hv_clock,
1853− sizeof(vcpu->hv_clock));
1851+ kvm_vcpu_write_guest_cached(v, &vcpu->pv_time,
1852+ &vcpu->hv_clock,
1853+ sizeof(vcpu->hv_clock));
18541854
18551855 smp_wmb();
18561856
18571857 vcpu->hv_clock.version++;
1858− kvm_write_guest_cached(v->kvm, &vcpu->pv_time,
1859− &vcpu->hv_clock,
1860− sizeof(vcpu->hv_clock.version));
1858+ kvm_vcpu_write_guest_cached(v, &vcpu->pv_time,
1859+ &vcpu->hv_clock,
1860+ sizeof(vcpu->hv_clock.version));
18611861 }
18621862
18631863 static int kvm_guest_time_update(struct kvm_vcpu *v)
@@ -2090,7 +2090,7 @@ static int kvm_pv_enable_async_pf(struct kvm_vcpu *vcpu, u64 data) · 226 unmodified lines
20902090 return 0;
20912091 }
20922092
2093− if (kvm_gfn_to_hva_cache_init(vcpu->kvm, &vcpu->arch.apf.data, gpa,
2093+ if (kvm_vcpu_gfn_to_hva_cache_init(vcpu, &vcpu->arch.apf.data, gpa,
20942094 sizeof(u32)))
20952095 return 1;
20962096
@@ -2109,7 +2109,7 @@ static void record_steal_time(struct kvm_vcpu *vcpu) · 12 unmodified lines
21092109 if (!(vcpu->arch.st.msr_val & KVM_MSR_ENABLED))
21102110 return;
21112111
2112− if (unlikely(kvm_read_guest_cached(vcpu->kvm, &vcpu->arch.st.stime,
2112+ if (unlikely(kvm_vcpu_read_guest_cached(vcpu, &vcpu->arch.st.stime,
21132113 &vcpu->arch.st.steal, sizeof(struct kvm_steal_time))))
21142114 return;
21152115
@@ -2120,7 +2120,7 @@ static void record_steal_time(struct kvm_vcpu *vcpu) · 4 unmodified lines
21202120
21212121 vcpu->arch.st.steal.version += 1;
21222122
2123− kvm_write_guest_cached(vcpu->kvm, &vcpu->arch.st.stime,
2123+ kvm_vcpu_write_guest_cached(vcpu, &vcpu->arch.st.stime,
21242124 &vcpu->arch.st.steal, sizeof(struct kvm_steal_time));
21252125
21262126 smp_wmb();
@@ -2129,14 +2129,14 @@ static void record_steal_time(struct kvm_vcpu *vcpu) · 2 unmodified lines
21292129 vcpu->arch.st.last_steal;
21302130 vcpu->arch.st.last_steal = current->sched_info.run_delay;
21312131
2132− kvm_write_guest_cached(vcpu->kvm, &vcpu->arch.st.stime,
2132+ kvm_vcpu_write_guest_cached(vcpu, &vcpu->arch.st.stime,
21332133 &vcpu->arch.st.steal, sizeof(struct kvm_steal_time));
21342134
21352135 smp_wmb();
21362136
21372137 vcpu->arch.st.steal.version += 1;
21382138
2139− kvm_write_guest_cached(vcpu->kvm, &vcpu->arch.st.stime,
2139+ kvm_vcpu_write_guest_cached(vcpu, &vcpu->arch.st.stime,
21402140 &vcpu->arch.st.steal, sizeof(struct kvm_steal_time));
21412141 }
21422142
@@ -2241,7 +2241,7 @@ int kvm_set_msr_common(struct kvm_vcpu *vcpu, struct msr_data *msr_info) · 98 unmodified lines
22412241 if (!(data & 1))
22422242 break;
22432243
2244− if (kvm_gfn_to_hva_cache_init(vcpu->kvm,
2244+ if (kvm_vcpu_gfn_to_hva_cache_init(vcpu,
22452245 &vcpu->arch.pv_time, data & ~1ULL,
22462246 sizeof(struct pvclock_vcpu_time_info)))
22472247 vcpu->arch.pv_time_enabled = false;
@@ -2262,7 +2262,7 @@ int kvm_set_msr_common(struct kvm_vcpu *vcpu, struct msr_data *msr_info) · 14 unmodified lines
22622262 if (data & KVM_STEAL_RESERVED_MASK)
22632263 return 1;
22642264
2265− if (kvm_gfn_to_hva_cache_init(vcpu->kvm, &vcpu->arch.st.stime,
2265+ if (kvm_vcpu_gfn_to_hva_cache_init(vcpu, &vcpu->arch.st.stime,
22662266 data & KVM_STEAL_VALID_BITS,
22672267 sizeof(struct kvm_steal_time)))
22682268 return 1;
@@ -2875,7 +2875,7 @@ static void kvm_steal_time_set_preempted(struct kvm_vcpu *vcpu) · 606 unmodified lines
28752875
28762876 vcpu->arch.st.steal.preempted = 1;
28772877
2878− kvm_write_guest_offset_cached(vcpu->kvm, &vcpu->arch.st.stime,
2878+ kvm_vcpu_write_guest_offset_cached(vcpu, &vcpu->arch.st.stime,
28792879 &vcpu->arch.st.steal.preempted,
28802880 offsetof(struct kvm_steal_time, preempted),
28812881 sizeof(vcpu->arch.st.steal.preempted));
@@ -8533,9 +8533,8 @@ static void kvm_del_async_pf_gfn(struct kvm_vcpu *vcpu, gfn_t gfn) · 5651 unmodified lines
85338533
85348534 static int apf_put_user(struct kvm_vcpu *vcpu, u32 val)
85358535 {
8536−
8537− return kvm_write_guest_cached(vcpu->kvm, &vcpu->arch.apf.data, &val,
8538− sizeof(val));
8536+ return kvm_vcpu_write_guest_cached(vcpu, &vcpu->arch.apf.data, &val,
8537+ sizeof(val));
85398538 }
85408539
85418540 void kvm_arch_async_page_not_present(struct kvm_vcpu *vcpu,
include/linux/kvm_host.h+8−8
@@ -641,18 +641,18 @@ int kvm_read_guest_page(struct kvm *kvm, gfn_t gfn, void *data, int offset, · 640 unmodified lines
641641 int kvm_read_guest_atomic(struct kvm *kvm, gpa_t gpa, void *data,
642642 unsigned long len);
643643 int kvm_read_guest(struct kvm *kvm, gpa_t gpa, void *data, unsigned long len);
644−int kvm_read_guest_cached(struct kvm *kvm, struct gfn_to_hva_cache *ghc,
645− void *data, unsigned long len);
644+int kvm_vcpu_read_guest_cached(struct kvm_vcpu *vcpu, struct gfn_to_hva_cache *ghc,
645+ void *data, unsigned long len);
646646 int kvm_write_guest_page(struct kvm *kvm, gfn_t gfn, const void *data,
647647 int offset, int len);
648648 int kvm_write_guest(struct kvm *kvm, gpa_t gpa, const void *data,
649649 unsigned long len);
650−int kvm_write_guest_cached(struct kvm *kvm, struct gfn_to_hva_cache *ghc,
651− void *data, unsigned long len);
652−int kvm_write_guest_offset_cached(struct kvm *kvm, struct gfn_to_hva_cache *ghc,
653− void *data, int offset, unsigned long len);
654−int kvm_gfn_to_hva_cache_init(struct kvm *kvm, struct gfn_to_hva_cache *ghc,
655− gpa_t gpa, unsigned long len);
650+int kvm_vcpu_write_guest_cached(struct kvm_vcpu *v, struct gfn_to_hva_cache *ghc,
651+ void *data, unsigned long len);
652+int kvm_vcpu_write_guest_offset_cached(struct kvm_vcpu *v, struct gfn_to_hva_cache *ghc,
653+ void *data, int offset, unsigned long len);
654+int kvm_vcpu_gfn_to_hva_cache_init(struct kvm_vcpu *v, struct gfn_to_hva_cache *ghc,
655+ gpa_t gpa, unsigned long len);
656656 int kvm_clear_guest_page(struct kvm *kvm, gfn_t gfn, int offset, int len);
657657 int kvm_clear_guest(struct kvm *kvm, gpa_t gpa, unsigned long len);
658658 struct kvm_memory_slot *gfn_to_memslot(struct kvm *kvm, gfn_t gfn);
virt/kvm/kvm_main.c+17−17
@@ -1981,18 +1981,18 @@ static int __kvm_gfn_to_hva_cache_init(struct kvm_memslots *slots, · 1980 unmodified lines
19811981 return 0;
19821982 }
19831983
1984−int kvm_gfn_to_hva_cache_init(struct kvm *kvm, struct gfn_to_hva_cache *ghc,
1984+int kvm_vcpu_gfn_to_hva_cache_init(struct kvm_vcpu *vcpu, struct gfn_to_hva_cache *ghc,
19851985 gpa_t gpa, unsigned long len)
19861986 {
1987− struct kvm_memslots *slots = kvm_memslots(kvm);
1987+ struct kvm_memslots *slots = kvm_vcpu_memslots(vcpu);
19881988 return __kvm_gfn_to_hva_cache_init(slots, ghc, gpa, len);
19891989 }
1990−EXPORT_SYMBOL_GPL(kvm_gfn_to_hva_cache_init);
1990+EXPORT_SYMBOL_GPL(kvm_vcpu_gfn_to_hva_cache_init);
19911991
1992−int kvm_write_guest_offset_cached(struct kvm *kvm, struct gfn_to_hva_cache *ghc,
1993− void *data, int offset, unsigned long len)
1992+int kvm_vcpu_write_guest_offset_cached(struct kvm_vcpu *vcpu, struct gfn_to_hva_cache *ghc,
1993+ void *data, int offset, unsigned long len)
19941994 {
1995− struct kvm_memslots *slots = kvm_memslots(kvm);
1995+ struct kvm_memslots *slots = kvm_vcpu_memslots(vcpu);
19961996 int r;
19971997 gpa_t gpa = ghc->gpa + offset;
19981998
@@ -2002,7 +2002,7 @@ int kvm_write_guest_offset_cached(struct kvm *kvm, struct gfn_to_hva_cache *ghc, · 3 unmodified lines
20022002 __kvm_gfn_to_hva_cache_init(slots, ghc, ghc->gpa, ghc->len);
20032003
20042004 if (unlikely(!ghc->memslot))
2005− return kvm_write_guest(kvm, gpa, data, len);
2005+ return kvm_vcpu_write_guest(vcpu, gpa, data, len);
20062006
20072007 if (kvm_is_error_hva(ghc->hva))
20082008 return -EFAULT;
@@ -2014,19 +2014,19 @@ int kvm_write_guest_offset_cached(struct kvm *kvm, struct gfn_to_hva_cache *ghc, · 5 unmodified lines
20142014
20152015 return 0;
20162016 }
2017−EXPORT_SYMBOL_GPL(kvm_write_guest_offset_cached);
2017+EXPORT_SYMBOL_GPL(kvm_vcpu_write_guest_offset_cached);
20182018
2019−int kvm_write_guest_cached(struct kvm *kvm, struct gfn_to_hva_cache *ghc,
2020− void *data, unsigned long len)
2019+int kvm_vcpu_write_guest_cached(struct kvm_vcpu *vcpu, struct gfn_to_hva_cache *ghc,
2020+ void *data, unsigned long len)
20212021 {
2022− return kvm_write_guest_offset_cached(kvm, ghc, data, 0, len);
2022+ return kvm_vcpu_write_guest_offset_cached(vcpu, ghc, data, 0, len);
20232023 }
2024−EXPORT_SYMBOL_GPL(kvm_write_guest_cached);
2024+EXPORT_SYMBOL_GPL(kvm_vcpu_write_guest_cached);
20252025
2026−int kvm_read_guest_cached(struct kvm *kvm, struct gfn_to_hva_cache *ghc,
2027− void *data, unsigned long len)
2026+int kvm_vcpu_read_guest_cached(struct kvm_vcpu *vcpu, struct gfn_to_hva_cache *ghc,
2027+ void *data, unsigned long len)
20282028 {
2029− struct kvm_memslots *slots = kvm_memslots(kvm);
2029+ struct kvm_memslots *slots = kvm_vcpu_memslots(vcpu);
20302030 int r;
20312031
20322032 BUG_ON(len > ghc->len);
@@ -2035,7 +2035,7 @@ int kvm_read_guest_cached(struct kvm *kvm, struct gfn_to_hva_cache *ghc, · 2 unmodified lines
20352035 __kvm_gfn_to_hva_cache_init(slots, ghc, ghc->gpa, ghc->len);
20362036
20372037 if (unlikely(!ghc->memslot))
2038− return kvm_read_guest(kvm, ghc->gpa, data, len);
2038+ return kvm_vcpu_read_guest(vcpu, ghc->gpa, data, len);
20392039
20402040 if (kvm_is_error_hva(ghc->hva))
20412041 return -EFAULT;
@@ -2046,7 +2046,7 @@ int kvm_read_guest_cached(struct kvm *kvm, struct gfn_to_hva_cache *ghc, · 4 unmodified lines
20462046
20472047 return 0;
20482048 }
2049−EXPORT_SYMBOL_GPL(kvm_read_guest_cached);
2049+EXPORT_SYMBOL_GPL(kvm_vcpu_read_guest_cached);
20502050
20512051 int kvm_clear_guest_page(struct kvm *kvm, gfn_t gfn, int offset, int len)
20522052 {