diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2009-06-28 14:12:52 -0400 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2009-06-28 14:12:52 -0400 |
| commit | 9a8fb9ee7a80f5280388b98dc7636d537866fa72 (patch) | |
| tree | c52f1af6afdc9d1e56d548c92ff23ee00a010dd8 | |
| parent | 4142ac678a864972ce1dfad6d9cb22f075fee5de (diff) | |
| parent | bde892232532ed522bb56b04576d07f91e59b3c7 (diff) | |
Merge branch 'kvm-updates/2.6.31' of git://git.kernel.org/pub/scm/virt/kvm/kvm
* 'kvm-updates/2.6.31' of git://git.kernel.org/pub/scm/virt/kvm/kvm:
KVM: shut up uninit compiler warning in paging_tmpl.h
KVM: Ignore reads to K7 EVNTSEL MSRs
KVM: VMX: Handle vmx instruction vmexits
KVM: s390: Allow stfle instruction in the guest
KVM: kvm/x86_emulate.c toggle_interruptibility() should be static
KVM: ia64: fix ia64 build due to missing kallsyms_lookup() and double export
KVM: protect concurrent make_all_cpus_request
KVM: MMU: Allow 4K ptes with bit 7 (PAT) set
KVM: Fix dirty bit tracking for slots with large pages
| -rw-r--r-- | arch/ia64/kvm/kvm_lib.c | 6 | ||||
| -rw-r--r-- | arch/s390/include/asm/kvm_host.h | 4 | ||||
| -rw-r--r-- | arch/s390/kvm/kvm-s390.c | 23 | ||||
| -rw-r--r-- | arch/s390/kvm/priv.c | 2 | ||||
| -rw-r--r-- | arch/x86/kvm/mmu.c | 6 | ||||
| -rw-r--r-- | arch/x86/kvm/paging_tmpl.h | 2 | ||||
| -rw-r--r-- | arch/x86/kvm/vmx.c | 15 | ||||
| -rw-r--r-- | arch/x86/kvm/x86.c | 1 | ||||
| -rw-r--r-- | arch/x86/kvm/x86_emulate.c | 2 | ||||
| -rw-r--r-- | include/linux/kvm_host.h | 1 | ||||
| -rw-r--r-- | virt/kvm/kvm_main.c | 5 |
11 files changed, 59 insertions, 8 deletions
diff --git a/arch/ia64/kvm/kvm_lib.c b/arch/ia64/kvm/kvm_lib.c index a85cb611ecd7..f1268b8e6f9e 100644 --- a/arch/ia64/kvm/kvm_lib.c +++ b/arch/ia64/kvm/kvm_lib.c | |||
| @@ -11,5 +11,11 @@ | |||
| 11 | * | 11 | * |
| 12 | */ | 12 | */ |
| 13 | #undef CONFIG_MODULES | 13 | #undef CONFIG_MODULES |
| 14 | #include <linux/module.h> | ||
| 15 | #undef CONFIG_KALLSYMS | ||
| 16 | #undef EXPORT_SYMBOL | ||
| 17 | #undef EXPORT_SYMBOL_GPL | ||
| 18 | #define EXPORT_SYMBOL(sym) | ||
| 19 | #define EXPORT_SYMBOL_GPL(sym) | ||
| 14 | #include "../../../lib/vsprintf.c" | 20 | #include "../../../lib/vsprintf.c" |
| 15 | #include "../../../lib/ctype.c" | 21 | #include "../../../lib/ctype.c" |
diff --git a/arch/s390/include/asm/kvm_host.h b/arch/s390/include/asm/kvm_host.h index a27d0d5a6f86..1cd02f6073a0 100644 --- a/arch/s390/include/asm/kvm_host.h +++ b/arch/s390/include/asm/kvm_host.h | |||
| @@ -99,7 +99,9 @@ struct kvm_s390_sie_block { | |||
| 99 | __u8 reservedd0[48]; /* 0x00d0 */ | 99 | __u8 reservedd0[48]; /* 0x00d0 */ |
| 100 | __u64 gcr[16]; /* 0x0100 */ | 100 | __u64 gcr[16]; /* 0x0100 */ |
| 101 | __u64 gbea; /* 0x0180 */ | 101 | __u64 gbea; /* 0x0180 */ |
| 102 | __u8 reserved188[120]; /* 0x0188 */ | 102 | __u8 reserved188[24]; /* 0x0188 */ |
| 103 | __u32 fac; /* 0x01a0 */ | ||
| 104 | __u8 reserved1a4[92]; /* 0x01a4 */ | ||
| 103 | } __attribute__((packed)); | 105 | } __attribute__((packed)); |
| 104 | 106 | ||
| 105 | struct kvm_vcpu_stat { | 107 | struct kvm_vcpu_stat { |
diff --git a/arch/s390/kvm/kvm-s390.c b/arch/s390/kvm/kvm-s390.c index c18b21d6991c..90d9d1ba258b 100644 --- a/arch/s390/kvm/kvm-s390.c +++ b/arch/s390/kvm/kvm-s390.c | |||
| @@ -25,6 +25,7 @@ | |||
| 25 | #include <asm/lowcore.h> | 25 | #include <asm/lowcore.h> |
| 26 | #include <asm/pgtable.h> | 26 | #include <asm/pgtable.h> |
| 27 | #include <asm/nmi.h> | 27 | #include <asm/nmi.h> |
| 28 | #include <asm/system.h> | ||
| 28 | #include "kvm-s390.h" | 29 | #include "kvm-s390.h" |
| 29 | #include "gaccess.h" | 30 | #include "gaccess.h" |
| 30 | 31 | ||
| @@ -69,6 +70,7 @@ struct kvm_stats_debugfs_item debugfs_entries[] = { | |||
| 69 | { NULL } | 70 | { NULL } |
| 70 | }; | 71 | }; |
| 71 | 72 | ||
| 73 | static unsigned long long *facilities; | ||
| 72 | 74 | ||
| 73 | /* Section: not file related */ | 75 | /* Section: not file related */ |
| 74 | void kvm_arch_hardware_enable(void *garbage) | 76 | void kvm_arch_hardware_enable(void *garbage) |
| @@ -288,6 +290,7 @@ int kvm_arch_vcpu_setup(struct kvm_vcpu *vcpu) | |||
| 288 | vcpu->arch.sie_block->gmsor = vcpu->kvm->arch.guest_origin; | 290 | vcpu->arch.sie_block->gmsor = vcpu->kvm->arch.guest_origin; |
| 289 | vcpu->arch.sie_block->ecb = 2; | 291 | vcpu->arch.sie_block->ecb = 2; |
| 290 | vcpu->arch.sie_block->eca = 0xC1002001U; | 292 | vcpu->arch.sie_block->eca = 0xC1002001U; |
| 293 | vcpu->arch.sie_block->fac = (int) (long) facilities; | ||
| 291 | hrtimer_init(&vcpu->arch.ckc_timer, CLOCK_REALTIME, HRTIMER_MODE_ABS); | 294 | hrtimer_init(&vcpu->arch.ckc_timer, CLOCK_REALTIME, HRTIMER_MODE_ABS); |
| 292 | tasklet_init(&vcpu->arch.tasklet, kvm_s390_tasklet, | 295 | tasklet_init(&vcpu->arch.tasklet, kvm_s390_tasklet, |
| 293 | (unsigned long) vcpu); | 296 | (unsigned long) vcpu); |
| @@ -739,11 +742,29 @@ gfn_t unalias_gfn(struct kvm *kvm, gfn_t gfn) | |||
| 739 | 742 | ||
| 740 | static int __init kvm_s390_init(void) | 743 | static int __init kvm_s390_init(void) |
| 741 | { | 744 | { |
| 742 | return kvm_init(NULL, sizeof(struct kvm_vcpu), THIS_MODULE); | 745 | int ret; |
| 746 | ret = kvm_init(NULL, sizeof(struct kvm_vcpu), THIS_MODULE); | ||
| 747 | if (ret) | ||
| 748 | return ret; | ||
| 749 | |||
| 750 | /* | ||
| 751 | * guests can ask for up to 255+1 double words, we need a full page | ||
| 752 | * to hold the maximum amount of facilites. On the other hand, we | ||
| 753 | * only set facilities that are known to work in KVM. | ||
| 754 | */ | ||
| 755 | facilities = (unsigned long long *) get_zeroed_page(GFP_DMA); | ||
| 756 | if (!facilities) { | ||
| 757 | kvm_exit(); | ||
| 758 | return -ENOMEM; | ||
| 759 | } | ||
| 760 | stfle(facilities, 1); | ||
| 761 | facilities[0] &= 0xff00fff3f0700000ULL; | ||
| 762 | return 0; | ||
| 743 | } | 763 | } |
| 744 | 764 | ||
| 745 | static void __exit kvm_s390_exit(void) | 765 | static void __exit kvm_s390_exit(void) |
| 746 | { | 766 | { |
| 767 | free_page((unsigned long) facilities); | ||
| 747 | kvm_exit(); | 768 | kvm_exit(); |
| 748 | } | 769 | } |
| 749 | 770 | ||
diff --git a/arch/s390/kvm/priv.c b/arch/s390/kvm/priv.c index 93ecd06e1a74..d426aac8095d 100644 --- a/arch/s390/kvm/priv.c +++ b/arch/s390/kvm/priv.c | |||
| @@ -158,7 +158,7 @@ static int handle_stfl(struct kvm_vcpu *vcpu) | |||
| 158 | 158 | ||
| 159 | vcpu->stat.instruction_stfl++; | 159 | vcpu->stat.instruction_stfl++; |
| 160 | /* only pass the facility bits, which we can handle */ | 160 | /* only pass the facility bits, which we can handle */ |
| 161 | facility_list &= 0xfe00fff3; | 161 | facility_list &= 0xff00fff3; |
| 162 | 162 | ||
| 163 | rc = copy_to_guest(vcpu, offsetof(struct _lowcore, stfl_fac_list), | 163 | rc = copy_to_guest(vcpu, offsetof(struct _lowcore, stfl_fac_list), |
| 164 | &facility_list, sizeof(facility_list)); | 164 | &facility_list, sizeof(facility_list)); |
diff --git a/arch/x86/kvm/mmu.c b/arch/x86/kvm/mmu.c index 5c3d6e81a7dc..7030b5f911bf 100644 --- a/arch/x86/kvm/mmu.c +++ b/arch/x86/kvm/mmu.c | |||
| @@ -2157,7 +2157,7 @@ static void reset_rsvds_bits_mask(struct kvm_vcpu *vcpu, int level) | |||
| 2157 | else | 2157 | else |
| 2158 | /* 32 bits PSE 4MB page */ | 2158 | /* 32 bits PSE 4MB page */ |
| 2159 | context->rsvd_bits_mask[1][1] = rsvd_bits(13, 21); | 2159 | context->rsvd_bits_mask[1][1] = rsvd_bits(13, 21); |
| 2160 | context->rsvd_bits_mask[1][0] = ~0ull; | 2160 | context->rsvd_bits_mask[1][0] = context->rsvd_bits_mask[1][0]; |
| 2161 | break; | 2161 | break; |
| 2162 | case PT32E_ROOT_LEVEL: | 2162 | case PT32E_ROOT_LEVEL: |
| 2163 | context->rsvd_bits_mask[0][2] = | 2163 | context->rsvd_bits_mask[0][2] = |
| @@ -2170,7 +2170,7 @@ static void reset_rsvds_bits_mask(struct kvm_vcpu *vcpu, int level) | |||
| 2170 | context->rsvd_bits_mask[1][1] = exb_bit_rsvd | | 2170 | context->rsvd_bits_mask[1][1] = exb_bit_rsvd | |
| 2171 | rsvd_bits(maxphyaddr, 62) | | 2171 | rsvd_bits(maxphyaddr, 62) | |
| 2172 | rsvd_bits(13, 20); /* large page */ | 2172 | rsvd_bits(13, 20); /* large page */ |
| 2173 | context->rsvd_bits_mask[1][0] = ~0ull; | 2173 | context->rsvd_bits_mask[1][0] = context->rsvd_bits_mask[1][0]; |
| 2174 | break; | 2174 | break; |
| 2175 | case PT64_ROOT_LEVEL: | 2175 | case PT64_ROOT_LEVEL: |
| 2176 | context->rsvd_bits_mask[0][3] = exb_bit_rsvd | | 2176 | context->rsvd_bits_mask[0][3] = exb_bit_rsvd | |
| @@ -2186,7 +2186,7 @@ static void reset_rsvds_bits_mask(struct kvm_vcpu *vcpu, int level) | |||
| 2186 | context->rsvd_bits_mask[1][1] = exb_bit_rsvd | | 2186 | context->rsvd_bits_mask[1][1] = exb_bit_rsvd | |
| 2187 | rsvd_bits(maxphyaddr, 51) | | 2187 | rsvd_bits(maxphyaddr, 51) | |
| 2188 | rsvd_bits(13, 20); /* large page */ | 2188 | rsvd_bits(13, 20); /* large page */ |
| 2189 | context->rsvd_bits_mask[1][0] = ~0ull; | 2189 | context->rsvd_bits_mask[1][0] = context->rsvd_bits_mask[1][0]; |
| 2190 | break; | 2190 | break; |
| 2191 | } | 2191 | } |
| 2192 | } | 2192 | } |
diff --git a/arch/x86/kvm/paging_tmpl.h b/arch/x86/kvm/paging_tmpl.h index 258e4591e1ca..67785f635399 100644 --- a/arch/x86/kvm/paging_tmpl.h +++ b/arch/x86/kvm/paging_tmpl.h | |||
| @@ -281,7 +281,7 @@ static u64 *FNAME(fetch)(struct kvm_vcpu *vcpu, gva_t addr, | |||
| 281 | { | 281 | { |
| 282 | unsigned access = gw->pt_access; | 282 | unsigned access = gw->pt_access; |
| 283 | struct kvm_mmu_page *shadow_page; | 283 | struct kvm_mmu_page *shadow_page; |
| 284 | u64 spte, *sptep; | 284 | u64 spte, *sptep = NULL; |
| 285 | int direct; | 285 | int direct; |
| 286 | gfn_t table_gfn; | 286 | gfn_t table_gfn; |
| 287 | int r; | 287 | int r; |
diff --git a/arch/x86/kvm/vmx.c b/arch/x86/kvm/vmx.c index e770bf349ec4..356a0ce85c68 100644 --- a/arch/x86/kvm/vmx.c +++ b/arch/x86/kvm/vmx.c | |||
| @@ -3012,6 +3012,12 @@ static int handle_vmcall(struct kvm_vcpu *vcpu, struct kvm_run *kvm_run) | |||
| 3012 | return 1; | 3012 | return 1; |
| 3013 | } | 3013 | } |
| 3014 | 3014 | ||
| 3015 | static int handle_vmx_insn(struct kvm_vcpu *vcpu, struct kvm_run *kvm_run) | ||
| 3016 | { | ||
| 3017 | kvm_queue_exception(vcpu, UD_VECTOR); | ||
| 3018 | return 1; | ||
| 3019 | } | ||
| 3020 | |||
| 3015 | static int handle_invlpg(struct kvm_vcpu *vcpu, struct kvm_run *kvm_run) | 3021 | static int handle_invlpg(struct kvm_vcpu *vcpu, struct kvm_run *kvm_run) |
| 3016 | { | 3022 | { |
| 3017 | unsigned long exit_qualification = vmcs_readl(EXIT_QUALIFICATION); | 3023 | unsigned long exit_qualification = vmcs_readl(EXIT_QUALIFICATION); |
| @@ -3198,6 +3204,15 @@ static int (*kvm_vmx_exit_handlers[])(struct kvm_vcpu *vcpu, | |||
| 3198 | [EXIT_REASON_HLT] = handle_halt, | 3204 | [EXIT_REASON_HLT] = handle_halt, |
| 3199 | [EXIT_REASON_INVLPG] = handle_invlpg, | 3205 | [EXIT_REASON_INVLPG] = handle_invlpg, |
| 3200 | [EXIT_REASON_VMCALL] = handle_vmcall, | 3206 | [EXIT_REASON_VMCALL] = handle_vmcall, |
| 3207 | [EXIT_REASON_VMCLEAR] = handle_vmx_insn, | ||
| 3208 | [EXIT_REASON_VMLAUNCH] = handle_vmx_insn, | ||
| 3209 | [EXIT_REASON_VMPTRLD] = handle_vmx_insn, | ||
| 3210 | [EXIT_REASON_VMPTRST] = handle_vmx_insn, | ||
| 3211 | [EXIT_REASON_VMREAD] = handle_vmx_insn, | ||
| 3212 | [EXIT_REASON_VMRESUME] = handle_vmx_insn, | ||
| 3213 | [EXIT_REASON_VMWRITE] = handle_vmx_insn, | ||
| 3214 | [EXIT_REASON_VMOFF] = handle_vmx_insn, | ||
| 3215 | [EXIT_REASON_VMON] = handle_vmx_insn, | ||
| 3201 | [EXIT_REASON_TPR_BELOW_THRESHOLD] = handle_tpr_below_threshold, | 3216 | [EXIT_REASON_TPR_BELOW_THRESHOLD] = handle_tpr_below_threshold, |
| 3202 | [EXIT_REASON_APIC_ACCESS] = handle_apic_access, | 3217 | [EXIT_REASON_APIC_ACCESS] = handle_apic_access, |
| 3203 | [EXIT_REASON_WBINVD] = handle_wbinvd, | 3218 | [EXIT_REASON_WBINVD] = handle_wbinvd, |
diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c index 249540f98513..fe5474aec41a 100644 --- a/arch/x86/kvm/x86.c +++ b/arch/x86/kvm/x86.c | |||
| @@ -898,6 +898,7 @@ int kvm_get_msr_common(struct kvm_vcpu *vcpu, u32 msr, u64 *pdata) | |||
| 898 | case MSR_VM_HSAVE_PA: | 898 | case MSR_VM_HSAVE_PA: |
| 899 | case MSR_P6_EVNTSEL0: | 899 | case MSR_P6_EVNTSEL0: |
| 900 | case MSR_P6_EVNTSEL1: | 900 | case MSR_P6_EVNTSEL1: |
| 901 | case MSR_K7_EVNTSEL0: | ||
| 901 | data = 0; | 902 | data = 0; |
| 902 | break; | 903 | break; |
| 903 | case MSR_MTRRcap: | 904 | case MSR_MTRRcap: |
diff --git a/arch/x86/kvm/x86_emulate.c b/arch/x86/kvm/x86_emulate.c index c1b6c232e02b..616de4628d60 100644 --- a/arch/x86/kvm/x86_emulate.c +++ b/arch/x86/kvm/x86_emulate.c | |||
| @@ -1361,7 +1361,7 @@ static inline int writeback(struct x86_emulate_ctxt *ctxt, | |||
| 1361 | return 0; | 1361 | return 0; |
| 1362 | } | 1362 | } |
| 1363 | 1363 | ||
| 1364 | void toggle_interruptibility(struct x86_emulate_ctxt *ctxt, u32 mask) | 1364 | static void toggle_interruptibility(struct x86_emulate_ctxt *ctxt, u32 mask) |
| 1365 | { | 1365 | { |
| 1366 | u32 int_shadow = kvm_x86_ops->get_interrupt_shadow(ctxt->vcpu, mask); | 1366 | u32 int_shadow = kvm_x86_ops->get_interrupt_shadow(ctxt->vcpu, mask); |
| 1367 | /* | 1367 | /* |
diff --git a/include/linux/kvm_host.h b/include/linux/kvm_host.h index aacc5449f586..16713dc672e4 100644 --- a/include/linux/kvm_host.h +++ b/include/linux/kvm_host.h | |||
| @@ -125,6 +125,7 @@ struct kvm_kernel_irq_routing_entry { | |||
| 125 | struct kvm { | 125 | struct kvm { |
| 126 | struct mutex lock; /* protects the vcpus array and APIC accesses */ | 126 | struct mutex lock; /* protects the vcpus array and APIC accesses */ |
| 127 | spinlock_t mmu_lock; | 127 | spinlock_t mmu_lock; |
| 128 | spinlock_t requests_lock; | ||
| 128 | struct rw_semaphore slots_lock; | 129 | struct rw_semaphore slots_lock; |
| 129 | struct mm_struct *mm; /* userspace tied to this vm */ | 130 | struct mm_struct *mm; /* userspace tied to this vm */ |
| 130 | int nmemslots; | 131 | int nmemslots; |
diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c index 764554350ed8..2884baf1d5f9 100644 --- a/virt/kvm/kvm_main.c +++ b/virt/kvm/kvm_main.c | |||
| @@ -746,6 +746,7 @@ static bool make_all_cpus_request(struct kvm *kvm, unsigned int req) | |||
| 746 | cpumask_clear(cpus); | 746 | cpumask_clear(cpus); |
| 747 | 747 | ||
| 748 | me = get_cpu(); | 748 | me = get_cpu(); |
| 749 | spin_lock(&kvm->requests_lock); | ||
| 749 | for (i = 0; i < KVM_MAX_VCPUS; ++i) { | 750 | for (i = 0; i < KVM_MAX_VCPUS; ++i) { |
| 750 | vcpu = kvm->vcpus[i]; | 751 | vcpu = kvm->vcpus[i]; |
| 751 | if (!vcpu) | 752 | if (!vcpu) |
| @@ -762,6 +763,7 @@ static bool make_all_cpus_request(struct kvm *kvm, unsigned int req) | |||
| 762 | smp_call_function_many(cpus, ack_flush, NULL, 1); | 763 | smp_call_function_many(cpus, ack_flush, NULL, 1); |
| 763 | else | 764 | else |
| 764 | called = false; | 765 | called = false; |
| 766 | spin_unlock(&kvm->requests_lock); | ||
| 765 | put_cpu(); | 767 | put_cpu(); |
| 766 | free_cpumask_var(cpus); | 768 | free_cpumask_var(cpus); |
| 767 | return called; | 769 | return called; |
| @@ -982,6 +984,7 @@ static struct kvm *kvm_create_vm(void) | |||
| 982 | kvm->mm = current->mm; | 984 | kvm->mm = current->mm; |
| 983 | atomic_inc(&kvm->mm->mm_count); | 985 | atomic_inc(&kvm->mm->mm_count); |
| 984 | spin_lock_init(&kvm->mmu_lock); | 986 | spin_lock_init(&kvm->mmu_lock); |
| 987 | spin_lock_init(&kvm->requests_lock); | ||
| 985 | kvm_io_bus_init(&kvm->pio_bus); | 988 | kvm_io_bus_init(&kvm->pio_bus); |
| 986 | mutex_init(&kvm->lock); | 989 | mutex_init(&kvm->lock); |
| 987 | kvm_io_bus_init(&kvm->mmio_bus); | 990 | kvm_io_bus_init(&kvm->mmio_bus); |
| @@ -1194,6 +1197,8 @@ int __kvm_set_memory_region(struct kvm *kvm, | |||
| 1194 | if (!new.dirty_bitmap) | 1197 | if (!new.dirty_bitmap) |
| 1195 | goto out_free; | 1198 | goto out_free; |
| 1196 | memset(new.dirty_bitmap, 0, dirty_bytes); | 1199 | memset(new.dirty_bitmap, 0, dirty_bytes); |
| 1200 | if (old.npages) | ||
| 1201 | kvm_arch_flush_shadow(kvm); | ||
| 1197 | } | 1202 | } |
| 1198 | #endif /* not defined CONFIG_S390 */ | 1203 | #endif /* not defined CONFIG_S390 */ |
| 1199 | 1204 | ||
