aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2016-04-05 19:16:00 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2016-04-05 19:16:00 -0400
commit541d8f4d59d79f5d37c8c726f723d42ff307db57 (patch)
tree94c0273fd120338be5942e03da3d529b19bd35f2
parent5003bc6cc60ef700692da9bf4d3953aa0770d300 (diff)
parent95272c29378ee7dc15f43fa2758cb28a5913a06d (diff)
Merge tag 'for-linus' of git://git.kernel.org/pub/scm/virt/kvm/kvm
Pull KVM fixes from Paolo Bonzini: "Miscellaneous bugfixes. The ARM and s390 fixes are for new regressions from the merge window, others are usual stable material" * tag 'for-linus' of git://git.kernel.org/pub/scm/virt/kvm/kvm: compiler-gcc: disable -ftracer for __noclone functions kvm: x86: make lapic hrtimer pinned s390/mm/kvm: fix mis-merge in gmap handling kvm: set page dirty only if page has been writable KVM: x86: reduce default value of halt_poll_ns parameter KVM: Hyper-V: do not do hypercall userspace exits if SynIC is disabled KVM: x86: Inject pending interrupt even if pending nmi exist arm64: KVM: Register CPU notifiers when the kernel runs at HYP arm64: kvm: 4.6-rc1: Fix VTCR_EL2 VS setting
-rw-r--r--arch/arm/kvm/arm.c52
-rw-r--r--arch/arm64/include/asm/kvm_arm.h4
-rw-r--r--arch/arm64/include/asm/sysreg.h3
-rw-r--r--arch/arm64/kvm/hyp/s2-setup.c6
-rw-r--r--arch/s390/mm/gmap.c4
-rw-r--r--arch/x86/include/asm/kvm_host.h2
-rw-r--r--arch/x86/kvm/hyperv.c5
-rw-r--r--arch/x86/kvm/lapic.c8
-rw-r--r--arch/x86/kvm/mmu.c12
-rw-r--r--arch/x86/kvm/x86.c20
-rw-r--r--include/linux/compiler-gcc.h2
11 files changed, 76 insertions, 42 deletions
diff --git a/arch/arm/kvm/arm.c b/arch/arm/kvm/arm.c
index 6accd66d26f0..b5384311dec4 100644
--- a/arch/arm/kvm/arm.c
+++ b/arch/arm/kvm/arm.c
@@ -1061,15 +1061,27 @@ static void cpu_init_hyp_mode(void *dummy)
1061 kvm_arm_init_debug(); 1061 kvm_arm_init_debug();
1062} 1062}
1063 1063
1064static void cpu_hyp_reinit(void)
1065{
1066 if (is_kernel_in_hyp_mode()) {
1067 /*
1068 * cpu_init_stage2() is safe to call even if the PM
1069 * event was cancelled before the CPU was reset.
1070 */
1071 cpu_init_stage2(NULL);
1072 } else {
1073 if (__hyp_get_vectors() == hyp_default_vectors)
1074 cpu_init_hyp_mode(NULL);
1075 }
1076}
1077
1064static int hyp_init_cpu_notify(struct notifier_block *self, 1078static int hyp_init_cpu_notify(struct notifier_block *self,
1065 unsigned long action, void *cpu) 1079 unsigned long action, void *cpu)
1066{ 1080{
1067 switch (action) { 1081 switch (action) {
1068 case CPU_STARTING: 1082 case CPU_STARTING:
1069 case CPU_STARTING_FROZEN: 1083 case CPU_STARTING_FROZEN:
1070 if (__hyp_get_vectors() == hyp_default_vectors) 1084 cpu_hyp_reinit();
1071 cpu_init_hyp_mode(NULL);
1072 break;
1073 } 1085 }
1074 1086
1075 return NOTIFY_OK; 1087 return NOTIFY_OK;
@@ -1084,9 +1096,8 @@ static int hyp_init_cpu_pm_notifier(struct notifier_block *self,
1084 unsigned long cmd, 1096 unsigned long cmd,
1085 void *v) 1097 void *v)
1086{ 1098{
1087 if (cmd == CPU_PM_EXIT && 1099 if (cmd == CPU_PM_EXIT) {
1088 __hyp_get_vectors() == hyp_default_vectors) { 1100 cpu_hyp_reinit();
1089 cpu_init_hyp_mode(NULL);
1090 return NOTIFY_OK; 1101 return NOTIFY_OK;
1091 } 1102 }
1092 1103
@@ -1128,6 +1139,22 @@ static int init_subsystems(void)
1128 int err; 1139 int err;
1129 1140
1130 /* 1141 /*
1142 * Register CPU Hotplug notifier
1143 */
1144 cpu_notifier_register_begin();
1145 err = __register_cpu_notifier(&hyp_init_cpu_nb);
1146 cpu_notifier_register_done();
1147 if (err) {
1148 kvm_err("Cannot register KVM init CPU notifier (%d)\n", err);
1149 return err;
1150 }
1151
1152 /*
1153 * Register CPU lower-power notifier
1154 */
1155 hyp_cpu_pm_init();
1156
1157 /*
1131 * Init HYP view of VGIC 1158 * Init HYP view of VGIC
1132 */ 1159 */
1133 err = kvm_vgic_hyp_init(); 1160 err = kvm_vgic_hyp_init();
@@ -1270,19 +1297,6 @@ static int init_hyp_mode(void)
1270 free_boot_hyp_pgd(); 1297 free_boot_hyp_pgd();
1271#endif 1298#endif
1272 1299
1273 cpu_notifier_register_begin();
1274
1275 err = __register_cpu_notifier(&hyp_init_cpu_nb);
1276
1277 cpu_notifier_register_done();
1278
1279 if (err) {
1280 kvm_err("Cannot register HYP init CPU notifier (%d)\n", err);
1281 goto out_err;
1282 }
1283
1284 hyp_cpu_pm_init();
1285
1286 /* set size of VMID supported by CPU */ 1300 /* set size of VMID supported by CPU */
1287 kvm_vmid_bits = kvm_get_vmid_bits(); 1301 kvm_vmid_bits = kvm_get_vmid_bits();
1288 kvm_info("%d-bit VMID\n", kvm_vmid_bits); 1302 kvm_info("%d-bit VMID\n", kvm_vmid_bits);
diff --git a/arch/arm64/include/asm/kvm_arm.h b/arch/arm64/include/asm/kvm_arm.h
index 0e391dbfc420..4150fd8bae01 100644
--- a/arch/arm64/include/asm/kvm_arm.h
+++ b/arch/arm64/include/asm/kvm_arm.h
@@ -124,7 +124,9 @@
124#define VTCR_EL2_SL0_LVL1 (1 << 6) 124#define VTCR_EL2_SL0_LVL1 (1 << 6)
125#define VTCR_EL2_T0SZ_MASK 0x3f 125#define VTCR_EL2_T0SZ_MASK 0x3f
126#define VTCR_EL2_T0SZ_40B 24 126#define VTCR_EL2_T0SZ_40B 24
127#define VTCR_EL2_VS 19 127#define VTCR_EL2_VS_SHIFT 19
128#define VTCR_EL2_VS_8BIT (0 << VTCR_EL2_VS_SHIFT)
129#define VTCR_EL2_VS_16BIT (1 << VTCR_EL2_VS_SHIFT)
128 130
129/* 131/*
130 * We configure the Stage-2 page tables to always restrict the IPA space to be 132 * We configure the Stage-2 page tables to always restrict the IPA space to be
diff --git a/arch/arm64/include/asm/sysreg.h b/arch/arm64/include/asm/sysreg.h
index 1a78d6e2a78b..12874164b0ae 100644
--- a/arch/arm64/include/asm/sysreg.h
+++ b/arch/arm64/include/asm/sysreg.h
@@ -141,6 +141,9 @@
141#define ID_AA64MMFR1_VMIDBITS_SHIFT 4 141#define ID_AA64MMFR1_VMIDBITS_SHIFT 4
142#define ID_AA64MMFR1_HADBS_SHIFT 0 142#define ID_AA64MMFR1_HADBS_SHIFT 0
143 143
144#define ID_AA64MMFR1_VMIDBITS_8 0
145#define ID_AA64MMFR1_VMIDBITS_16 2
146
144/* id_aa64mmfr2 */ 147/* id_aa64mmfr2 */
145#define ID_AA64MMFR2_UAO_SHIFT 4 148#define ID_AA64MMFR2_UAO_SHIFT 4
146 149
diff --git a/arch/arm64/kvm/hyp/s2-setup.c b/arch/arm64/kvm/hyp/s2-setup.c
index bfc54fd82797..5a9f3bf542b0 100644
--- a/arch/arm64/kvm/hyp/s2-setup.c
+++ b/arch/arm64/kvm/hyp/s2-setup.c
@@ -36,8 +36,10 @@ void __hyp_text __init_stage2_translation(void)
36 * Read the VMIDBits bits from ID_AA64MMFR1_EL1 and set the VS 36 * Read the VMIDBits bits from ID_AA64MMFR1_EL1 and set the VS
37 * bit in VTCR_EL2. 37 * bit in VTCR_EL2.
38 */ 38 */
39 tmp = (read_sysreg(id_aa64mmfr1_el1) >> 4) & 0xf; 39 tmp = (read_sysreg(id_aa64mmfr1_el1) >> ID_AA64MMFR1_VMIDBITS_SHIFT) & 0xf;
40 val |= (tmp == 2) ? VTCR_EL2_VS : 0; 40 val |= (tmp == ID_AA64MMFR1_VMIDBITS_16) ?
41 VTCR_EL2_VS_16BIT :
42 VTCR_EL2_VS_8BIT;
41 43
42 write_sysreg(val, vtcr_el2); 44 write_sysreg(val, vtcr_el2);
43} 45}
diff --git a/arch/s390/mm/gmap.c b/arch/s390/mm/gmap.c
index 69247b4dcc43..cace818d86eb 100644
--- a/arch/s390/mm/gmap.c
+++ b/arch/s390/mm/gmap.c
@@ -23,7 +23,7 @@
23/** 23/**
24 * gmap_alloc - allocate a guest address space 24 * gmap_alloc - allocate a guest address space
25 * @mm: pointer to the parent mm_struct 25 * @mm: pointer to the parent mm_struct
26 * @limit: maximum size of the gmap address space 26 * @limit: maximum address of the gmap address space
27 * 27 *
28 * Returns a guest address space structure. 28 * Returns a guest address space structure.
29 */ 29 */
@@ -292,7 +292,7 @@ int gmap_map_segment(struct gmap *gmap, unsigned long from,
292 if ((from | to | len) & (PMD_SIZE - 1)) 292 if ((from | to | len) & (PMD_SIZE - 1))
293 return -EINVAL; 293 return -EINVAL;
294 if (len == 0 || from + len < from || to + len < to || 294 if (len == 0 || from + len < from || to + len < to ||
295 from + len > TASK_MAX_SIZE || to + len > gmap->asce_end) 295 from + len - 1 > TASK_MAX_SIZE || to + len - 1 > gmap->asce_end)
296 return -EINVAL; 296 return -EINVAL;
297 297
298 flush = 0; 298 flush = 0;
diff --git a/arch/x86/include/asm/kvm_host.h b/arch/x86/include/asm/kvm_host.h
index f62a9f37f79f..b7e394485a5f 100644
--- a/arch/x86/include/asm/kvm_host.h
+++ b/arch/x86/include/asm/kvm_host.h
@@ -43,7 +43,7 @@
43 43
44#define KVM_PIO_PAGE_OFFSET 1 44#define KVM_PIO_PAGE_OFFSET 1
45#define KVM_COALESCED_MMIO_PAGE_OFFSET 2 45#define KVM_COALESCED_MMIO_PAGE_OFFSET 2
46#define KVM_HALT_POLL_NS_DEFAULT 500000 46#define KVM_HALT_POLL_NS_DEFAULT 400000
47 47
48#define KVM_IRQCHIP_NUM_PINS KVM_IOAPIC_NUM_PINS 48#define KVM_IRQCHIP_NUM_PINS KVM_IOAPIC_NUM_PINS
49 49
diff --git a/arch/x86/kvm/hyperv.c b/arch/x86/kvm/hyperv.c
index 5ff3485acb60..01bd7b7a6866 100644
--- a/arch/x86/kvm/hyperv.c
+++ b/arch/x86/kvm/hyperv.c
@@ -1116,6 +1116,11 @@ int kvm_hv_hypercall(struct kvm_vcpu *vcpu)
1116 break; 1116 break;
1117 case HVCALL_POST_MESSAGE: 1117 case HVCALL_POST_MESSAGE:
1118 case HVCALL_SIGNAL_EVENT: 1118 case HVCALL_SIGNAL_EVENT:
1119 /* don't bother userspace if it has no way to handle it */
1120 if (!vcpu_to_synic(vcpu)->active) {
1121 res = HV_STATUS_INVALID_HYPERCALL_CODE;
1122 break;
1123 }
1119 vcpu->run->exit_reason = KVM_EXIT_HYPERV; 1124 vcpu->run->exit_reason = KVM_EXIT_HYPERV;
1120 vcpu->run->hyperv.type = KVM_EXIT_HYPERV_HCALL; 1125 vcpu->run->hyperv.type = KVM_EXIT_HYPERV_HCALL;
1121 vcpu->run->hyperv.u.hcall.input = param; 1126 vcpu->run->hyperv.u.hcall.input = param;
diff --git a/arch/x86/kvm/lapic.c b/arch/x86/kvm/lapic.c
index 443d2a57ad3d..1a2da0e5a373 100644
--- a/arch/x86/kvm/lapic.c
+++ b/arch/x86/kvm/lapic.c
@@ -1369,7 +1369,7 @@ static void start_apic_timer(struct kvm_lapic *apic)
1369 1369
1370 hrtimer_start(&apic->lapic_timer.timer, 1370 hrtimer_start(&apic->lapic_timer.timer,
1371 ktime_add_ns(now, apic->lapic_timer.period), 1371 ktime_add_ns(now, apic->lapic_timer.period),
1372 HRTIMER_MODE_ABS); 1372 HRTIMER_MODE_ABS_PINNED);
1373 1373
1374 apic_debug("%s: bus cycle is %" PRId64 "ns, now 0x%016" 1374 apic_debug("%s: bus cycle is %" PRId64 "ns, now 0x%016"
1375 PRIx64 ", " 1375 PRIx64 ", "
@@ -1402,7 +1402,7 @@ static void start_apic_timer(struct kvm_lapic *apic)
1402 expire = ktime_add_ns(now, ns); 1402 expire = ktime_add_ns(now, ns);
1403 expire = ktime_sub_ns(expire, lapic_timer_advance_ns); 1403 expire = ktime_sub_ns(expire, lapic_timer_advance_ns);
1404 hrtimer_start(&apic->lapic_timer.timer, 1404 hrtimer_start(&apic->lapic_timer.timer,
1405 expire, HRTIMER_MODE_ABS); 1405 expire, HRTIMER_MODE_ABS_PINNED);
1406 } else 1406 } else
1407 apic_timer_expired(apic); 1407 apic_timer_expired(apic);
1408 1408
@@ -1868,7 +1868,7 @@ int kvm_create_lapic(struct kvm_vcpu *vcpu)
1868 apic->vcpu = vcpu; 1868 apic->vcpu = vcpu;
1869 1869
1870 hrtimer_init(&apic->lapic_timer.timer, CLOCK_MONOTONIC, 1870 hrtimer_init(&apic->lapic_timer.timer, CLOCK_MONOTONIC,
1871 HRTIMER_MODE_ABS); 1871 HRTIMER_MODE_ABS_PINNED);
1872 apic->lapic_timer.timer.function = apic_timer_fn; 1872 apic->lapic_timer.timer.function = apic_timer_fn;
1873 1873
1874 /* 1874 /*
@@ -2003,7 +2003,7 @@ void __kvm_migrate_apic_timer(struct kvm_vcpu *vcpu)
2003 2003
2004 timer = &vcpu->arch.apic->lapic_timer.timer; 2004 timer = &vcpu->arch.apic->lapic_timer.timer;
2005 if (hrtimer_cancel(timer)) 2005 if (hrtimer_cancel(timer))
2006 hrtimer_start_expires(timer, HRTIMER_MODE_ABS); 2006 hrtimer_start_expires(timer, HRTIMER_MODE_ABS_PINNED);
2007} 2007}
2008 2008
2009/* 2009/*
diff --git a/arch/x86/kvm/mmu.c b/arch/x86/kvm/mmu.c
index 70e95d097ef1..1ff4dbb73fb7 100644
--- a/arch/x86/kvm/mmu.c
+++ b/arch/x86/kvm/mmu.c
@@ -557,8 +557,15 @@ static bool mmu_spte_update(u64 *sptep, u64 new_spte)
557 !is_writable_pte(new_spte)) 557 !is_writable_pte(new_spte))
558 ret = true; 558 ret = true;
559 559
560 if (!shadow_accessed_mask) 560 if (!shadow_accessed_mask) {
561 /*
562 * We don't set page dirty when dropping non-writable spte.
563 * So do it now if the new spte is becoming non-writable.
564 */
565 if (ret)
566 kvm_set_pfn_dirty(spte_to_pfn(old_spte));
561 return ret; 567 return ret;
568 }
562 569
563 /* 570 /*
564 * Flush TLB when accessed/dirty bits are changed in the page tables, 571 * Flush TLB when accessed/dirty bits are changed in the page tables,
@@ -605,7 +612,8 @@ static int mmu_spte_clear_track_bits(u64 *sptep)
605 612
606 if (!shadow_accessed_mask || old_spte & shadow_accessed_mask) 613 if (!shadow_accessed_mask || old_spte & shadow_accessed_mask)
607 kvm_set_pfn_accessed(pfn); 614 kvm_set_pfn_accessed(pfn);
608 if (!shadow_dirty_mask || (old_spte & shadow_dirty_mask)) 615 if (old_spte & (shadow_dirty_mask ? shadow_dirty_mask :
616 PT_WRITABLE_MASK))
609 kvm_set_pfn_dirty(pfn); 617 kvm_set_pfn_dirty(pfn);
610 return 1; 618 return 1;
611} 619}
diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c
index 742d0f7d3556..0a2c70e43bc8 100644
--- a/arch/x86/kvm/x86.c
+++ b/arch/x86/kvm/x86.c
@@ -6095,12 +6095,10 @@ static int inject_pending_event(struct kvm_vcpu *vcpu, bool req_int_win)
6095 } 6095 }
6096 6096
6097 /* try to inject new event if pending */ 6097 /* try to inject new event if pending */
6098 if (vcpu->arch.nmi_pending) { 6098 if (vcpu->arch.nmi_pending && kvm_x86_ops->nmi_allowed(vcpu)) {
6099 if (kvm_x86_ops->nmi_allowed(vcpu)) { 6099 --vcpu->arch.nmi_pending;
6100 --vcpu->arch.nmi_pending; 6100 vcpu->arch.nmi_injected = true;
6101 vcpu->arch.nmi_injected = true; 6101 kvm_x86_ops->set_nmi(vcpu);
6102 kvm_x86_ops->set_nmi(vcpu);
6103 }
6104 } else if (kvm_cpu_has_injectable_intr(vcpu)) { 6102 } else if (kvm_cpu_has_injectable_intr(vcpu)) {
6105 /* 6103 /*
6106 * Because interrupts can be injected asynchronously, we are 6104 * Because interrupts can be injected asynchronously, we are
@@ -6569,10 +6567,12 @@ static int vcpu_enter_guest(struct kvm_vcpu *vcpu)
6569 if (inject_pending_event(vcpu, req_int_win) != 0) 6567 if (inject_pending_event(vcpu, req_int_win) != 0)
6570 req_immediate_exit = true; 6568 req_immediate_exit = true;
6571 /* enable NMI/IRQ window open exits if needed */ 6569 /* enable NMI/IRQ window open exits if needed */
6572 else if (vcpu->arch.nmi_pending) 6570 else {
6573 kvm_x86_ops->enable_nmi_window(vcpu); 6571 if (vcpu->arch.nmi_pending)
6574 else if (kvm_cpu_has_injectable_intr(vcpu) || req_int_win) 6572 kvm_x86_ops->enable_nmi_window(vcpu);
6575 kvm_x86_ops->enable_irq_window(vcpu); 6573 if (kvm_cpu_has_injectable_intr(vcpu) || req_int_win)
6574 kvm_x86_ops->enable_irq_window(vcpu);
6575 }
6576 6576
6577 if (kvm_lapic_enabled(vcpu)) { 6577 if (kvm_lapic_enabled(vcpu)) {
6578 update_cr8_intercept(vcpu); 6578 update_cr8_intercept(vcpu);
diff --git a/include/linux/compiler-gcc.h b/include/linux/compiler-gcc.h
index 22ab246feed3..eeae401a2412 100644
--- a/include/linux/compiler-gcc.h
+++ b/include/linux/compiler-gcc.h
@@ -199,7 +199,7 @@
199#define unreachable() __builtin_unreachable() 199#define unreachable() __builtin_unreachable()
200 200
201/* Mark a function definition as prohibited from being cloned. */ 201/* Mark a function definition as prohibited from being cloned. */
202#define __noclone __attribute__((__noclone__)) 202#define __noclone __attribute__((__noclone__, __optimize__("no-tracer")))
203 203
204#endif /* GCC_VERSION >= 40500 */ 204#endif /* GCC_VERSION >= 40500 */
205 205