diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2013-07-03 16:21:40 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2013-07-03 16:21:40 -0400 |
commit | fe489bf4505ae26d3c6d6a1f1d3064c2a9c5cd85 (patch) | |
tree | 46596fd7edf7c4da1dafdb2c62011841e71cf32d /arch/s390/include | |
parent | 3e34131a65127e73fbae68c82748f32c8af7e4a4 (diff) | |
parent | a3ff5fbc94a829680d4aa005cd17add1c1a1fb5b (diff) |
Merge tag 'for-linus' of git://git.kernel.org/pub/scm/virt/kvm/kvm
Pull KVM fixes from Paolo Bonzini:
"On the x86 side, there are some optimizations and documentation
updates. The big ARM/KVM change for 3.11, support for AArch64, will
come through Catalin Marinas's tree. s390 and PPC have misc cleanups
and bugfixes"
* tag 'for-linus' of git://git.kernel.org/pub/scm/virt/kvm/kvm: (87 commits)
KVM: PPC: Ignore PIR writes
KVM: PPC: Book3S PR: Invalidate SLB entries properly
KVM: PPC: Book3S PR: Allow guest to use 1TB segments
KVM: PPC: Book3S PR: Don't keep scanning HPTEG after we find a match
KVM: PPC: Book3S PR: Fix invalidation of SLB entry 0 on guest entry
KVM: PPC: Book3S PR: Fix proto-VSID calculations
KVM: PPC: Guard doorbell exception with CONFIG_PPC_DOORBELL
KVM: Fix RTC interrupt coalescing tracking
kvm: Add a tracepoint write_tsc_offset
KVM: MMU: Inform users of mmio generation wraparound
KVM: MMU: document fast invalidate all mmio sptes
KVM: MMU: document fast invalidate all pages
KVM: MMU: document fast page fault
KVM: MMU: document mmio page fault
KVM: MMU: document write_flooding_count
KVM: MMU: document clear_spte_count
KVM: MMU: drop kvm_mmu_zap_mmio_sptes
KVM: MMU: init kvm generation close to mmio wrap-around value
KVM: MMU: add tracepoint for check_mmio_spte
KVM: MMU: fast invalidate all mmio sptes
...
Diffstat (limited to 'arch/s390/include')
-rw-r--r-- | arch/s390/include/asm/kvm_host.h | 18 | ||||
-rw-r--r-- | arch/s390/include/asm/perf_event.h | 10 | ||||
-rw-r--r-- | arch/s390/include/asm/pgtable.h | 83 |
3 files changed, 64 insertions, 47 deletions
diff --git a/arch/s390/include/asm/kvm_host.h b/arch/s390/include/asm/kvm_host.h index 16bd5d169cdb..3238d4004e84 100644 --- a/arch/s390/include/asm/kvm_host.h +++ b/arch/s390/include/asm/kvm_host.h | |||
@@ -62,13 +62,20 @@ struct sca_block { | |||
62 | #define CPUSTAT_MCDS 0x00000100 | 62 | #define CPUSTAT_MCDS 0x00000100 |
63 | #define CPUSTAT_SM 0x00000080 | 63 | #define CPUSTAT_SM 0x00000080 |
64 | #define CPUSTAT_G 0x00000008 | 64 | #define CPUSTAT_G 0x00000008 |
65 | #define CPUSTAT_GED 0x00000004 | ||
65 | #define CPUSTAT_J 0x00000002 | 66 | #define CPUSTAT_J 0x00000002 |
66 | #define CPUSTAT_P 0x00000001 | 67 | #define CPUSTAT_P 0x00000001 |
67 | 68 | ||
68 | struct kvm_s390_sie_block { | 69 | struct kvm_s390_sie_block { |
69 | atomic_t cpuflags; /* 0x0000 */ | 70 | atomic_t cpuflags; /* 0x0000 */ |
70 | __u32 prefix; /* 0x0004 */ | 71 | __u32 prefix; /* 0x0004 */ |
71 | __u8 reserved8[32]; /* 0x0008 */ | 72 | __u8 reserved08[4]; /* 0x0008 */ |
73 | #define PROG_IN_SIE (1<<0) | ||
74 | __u32 prog0c; /* 0x000c */ | ||
75 | __u8 reserved10[16]; /* 0x0010 */ | ||
76 | #define PROG_BLOCK_SIE 0x00000001 | ||
77 | atomic_t prog20; /* 0x0020 */ | ||
78 | __u8 reserved24[4]; /* 0x0024 */ | ||
72 | __u64 cputm; /* 0x0028 */ | 79 | __u64 cputm; /* 0x0028 */ |
73 | __u64 ckc; /* 0x0030 */ | 80 | __u64 ckc; /* 0x0030 */ |
74 | __u64 epoch; /* 0x0038 */ | 81 | __u64 epoch; /* 0x0038 */ |
@@ -90,7 +97,8 @@ struct kvm_s390_sie_block { | |||
90 | __u32 scaoh; /* 0x005c */ | 97 | __u32 scaoh; /* 0x005c */ |
91 | __u8 reserved60; /* 0x0060 */ | 98 | __u8 reserved60; /* 0x0060 */ |
92 | __u8 ecb; /* 0x0061 */ | 99 | __u8 ecb; /* 0x0061 */ |
93 | __u8 reserved62[2]; /* 0x0062 */ | 100 | __u8 ecb2; /* 0x0062 */ |
101 | __u8 reserved63[1]; /* 0x0063 */ | ||
94 | __u32 scaol; /* 0x0064 */ | 102 | __u32 scaol; /* 0x0064 */ |
95 | __u8 reserved68[4]; /* 0x0068 */ | 103 | __u8 reserved68[4]; /* 0x0068 */ |
96 | __u32 todpr; /* 0x006c */ | 104 | __u32 todpr; /* 0x006c */ |
@@ -130,6 +138,7 @@ struct kvm_vcpu_stat { | |||
130 | u32 deliver_program_int; | 138 | u32 deliver_program_int; |
131 | u32 deliver_io_int; | 139 | u32 deliver_io_int; |
132 | u32 exit_wait_state; | 140 | u32 exit_wait_state; |
141 | u32 instruction_pfmf; | ||
133 | u32 instruction_stidp; | 142 | u32 instruction_stidp; |
134 | u32 instruction_spx; | 143 | u32 instruction_spx; |
135 | u32 instruction_stpx; | 144 | u32 instruction_stpx; |
@@ -166,7 +175,7 @@ struct kvm_s390_ext_info { | |||
166 | }; | 175 | }; |
167 | 176 | ||
168 | #define PGM_OPERATION 0x01 | 177 | #define PGM_OPERATION 0x01 |
169 | #define PGM_PRIVILEGED_OPERATION 0x02 | 178 | #define PGM_PRIVILEGED_OP 0x02 |
170 | #define PGM_EXECUTE 0x03 | 179 | #define PGM_EXECUTE 0x03 |
171 | #define PGM_PROTECTION 0x04 | 180 | #define PGM_PROTECTION 0x04 |
172 | #define PGM_ADDRESSING 0x05 | 181 | #define PGM_ADDRESSING 0x05 |
@@ -219,7 +228,7 @@ struct kvm_s390_local_interrupt { | |||
219 | atomic_t active; | 228 | atomic_t active; |
220 | struct kvm_s390_float_interrupt *float_int; | 229 | struct kvm_s390_float_interrupt *float_int; |
221 | int timer_due; /* event indicator for waitqueue below */ | 230 | int timer_due; /* event indicator for waitqueue below */ |
222 | wait_queue_head_t wq; | 231 | wait_queue_head_t *wq; |
223 | atomic_t *cpuflags; | 232 | atomic_t *cpuflags; |
224 | unsigned int action_bits; | 233 | unsigned int action_bits; |
225 | }; | 234 | }; |
@@ -266,4 +275,5 @@ struct kvm_arch{ | |||
266 | }; | 275 | }; |
267 | 276 | ||
268 | extern int sie64a(struct kvm_s390_sie_block *, u64 *); | 277 | extern int sie64a(struct kvm_s390_sie_block *, u64 *); |
278 | extern char sie_exit; | ||
269 | #endif | 279 | #endif |
diff --git a/arch/s390/include/asm/perf_event.h b/arch/s390/include/asm/perf_event.h index 5f0173a31693..1141fb3e7b21 100644 --- a/arch/s390/include/asm/perf_event.h +++ b/arch/s390/include/asm/perf_event.h | |||
@@ -14,3 +14,13 @@ | |||
14 | /* Per-CPU flags for PMU states */ | 14 | /* Per-CPU flags for PMU states */ |
15 | #define PMU_F_RESERVED 0x1000 | 15 | #define PMU_F_RESERVED 0x1000 |
16 | #define PMU_F_ENABLED 0x2000 | 16 | #define PMU_F_ENABLED 0x2000 |
17 | |||
18 | #ifdef CONFIG_64BIT | ||
19 | |||
20 | /* Perf callbacks */ | ||
21 | struct pt_regs; | ||
22 | extern unsigned long perf_instruction_pointer(struct pt_regs *regs); | ||
23 | extern unsigned long perf_misc_flags(struct pt_regs *regs); | ||
24 | #define perf_misc_flags(regs) perf_misc_flags(regs) | ||
25 | |||
26 | #endif /* CONFIG_64BIT */ | ||
diff --git a/arch/s390/include/asm/pgtable.h b/arch/s390/include/asm/pgtable.h index 9aefa3c64eb2..0ea4e591fa78 100644 --- a/arch/s390/include/asm/pgtable.h +++ b/arch/s390/include/asm/pgtable.h | |||
@@ -296,18 +296,16 @@ extern unsigned long MODULES_END; | |||
296 | #define _SEGMENT_ENTRY_EMPTY (_SEGMENT_ENTRY_INV) | 296 | #define _SEGMENT_ENTRY_EMPTY (_SEGMENT_ENTRY_INV) |
297 | 297 | ||
298 | /* Page status table bits for virtualization */ | 298 | /* Page status table bits for virtualization */ |
299 | #define RCP_ACC_BITS 0xf0000000UL | 299 | #define PGSTE_ACC_BITS 0xf0000000UL |
300 | #define RCP_FP_BIT 0x08000000UL | 300 | #define PGSTE_FP_BIT 0x08000000UL |
301 | #define RCP_PCL_BIT 0x00800000UL | 301 | #define PGSTE_PCL_BIT 0x00800000UL |
302 | #define RCP_HR_BIT 0x00400000UL | 302 | #define PGSTE_HR_BIT 0x00400000UL |
303 | #define RCP_HC_BIT 0x00200000UL | 303 | #define PGSTE_HC_BIT 0x00200000UL |
304 | #define RCP_GR_BIT 0x00040000UL | 304 | #define PGSTE_GR_BIT 0x00040000UL |
305 | #define RCP_GC_BIT 0x00020000UL | 305 | #define PGSTE_GC_BIT 0x00020000UL |
306 | #define RCP_IN_BIT 0x00002000UL /* IPTE notify bit */ | 306 | #define PGSTE_UR_BIT 0x00008000UL |
307 | 307 | #define PGSTE_UC_BIT 0x00004000UL /* user dirty (migration) */ | |
308 | /* User dirty / referenced bit for KVM's migration feature */ | 308 | #define PGSTE_IN_BIT 0x00002000UL /* IPTE notify bit */ |
309 | #define KVM_UR_BIT 0x00008000UL | ||
310 | #define KVM_UC_BIT 0x00004000UL | ||
311 | 309 | ||
312 | #else /* CONFIG_64BIT */ | 310 | #else /* CONFIG_64BIT */ |
313 | 311 | ||
@@ -364,18 +362,16 @@ extern unsigned long MODULES_END; | |||
364 | | _SEGMENT_ENTRY_SPLIT | _SEGMENT_ENTRY_CO) | 362 | | _SEGMENT_ENTRY_SPLIT | _SEGMENT_ENTRY_CO) |
365 | 363 | ||
366 | /* Page status table bits for virtualization */ | 364 | /* Page status table bits for virtualization */ |
367 | #define RCP_ACC_BITS 0xf000000000000000UL | 365 | #define PGSTE_ACC_BITS 0xf000000000000000UL |
368 | #define RCP_FP_BIT 0x0800000000000000UL | 366 | #define PGSTE_FP_BIT 0x0800000000000000UL |
369 | #define RCP_PCL_BIT 0x0080000000000000UL | 367 | #define PGSTE_PCL_BIT 0x0080000000000000UL |
370 | #define RCP_HR_BIT 0x0040000000000000UL | 368 | #define PGSTE_HR_BIT 0x0040000000000000UL |
371 | #define RCP_HC_BIT 0x0020000000000000UL | 369 | #define PGSTE_HC_BIT 0x0020000000000000UL |
372 | #define RCP_GR_BIT 0x0004000000000000UL | 370 | #define PGSTE_GR_BIT 0x0004000000000000UL |
373 | #define RCP_GC_BIT 0x0002000000000000UL | 371 | #define PGSTE_GC_BIT 0x0002000000000000UL |
374 | #define RCP_IN_BIT 0x0000200000000000UL /* IPTE notify bit */ | 372 | #define PGSTE_UR_BIT 0x0000800000000000UL |
375 | 373 | #define PGSTE_UC_BIT 0x0000400000000000UL /* user dirty (migration) */ | |
376 | /* User dirty / referenced bit for KVM's migration feature */ | 374 | #define PGSTE_IN_BIT 0x0000200000000000UL /* IPTE notify bit */ |
377 | #define KVM_UR_BIT 0x0000800000000000UL | ||
378 | #define KVM_UC_BIT 0x0000400000000000UL | ||
379 | 375 | ||
380 | #endif /* CONFIG_64BIT */ | 376 | #endif /* CONFIG_64BIT */ |
381 | 377 | ||
@@ -615,8 +611,8 @@ static inline pgste_t pgste_get_lock(pte_t *ptep) | |||
615 | asm( | 611 | asm( |
616 | " lg %0,%2\n" | 612 | " lg %0,%2\n" |
617 | "0: lgr %1,%0\n" | 613 | "0: lgr %1,%0\n" |
618 | " nihh %0,0xff7f\n" /* clear RCP_PCL_BIT in old */ | 614 | " nihh %0,0xff7f\n" /* clear PCL bit in old */ |
619 | " oihh %1,0x0080\n" /* set RCP_PCL_BIT in new */ | 615 | " oihh %1,0x0080\n" /* set PCL bit in new */ |
620 | " csg %0,%1,%2\n" | 616 | " csg %0,%1,%2\n" |
621 | " jl 0b\n" | 617 | " jl 0b\n" |
622 | : "=&d" (old), "=&d" (new), "=Q" (ptep[PTRS_PER_PTE]) | 618 | : "=&d" (old), "=&d" (new), "=Q" (ptep[PTRS_PER_PTE]) |
@@ -629,7 +625,7 @@ static inline void pgste_set_unlock(pte_t *ptep, pgste_t pgste) | |||
629 | { | 625 | { |
630 | #ifdef CONFIG_PGSTE | 626 | #ifdef CONFIG_PGSTE |
631 | asm( | 627 | asm( |
632 | " nihh %1,0xff7f\n" /* clear RCP_PCL_BIT */ | 628 | " nihh %1,0xff7f\n" /* clear PCL bit */ |
633 | " stg %1,%0\n" | 629 | " stg %1,%0\n" |
634 | : "=Q" (ptep[PTRS_PER_PTE]) | 630 | : "=Q" (ptep[PTRS_PER_PTE]) |
635 | : "d" (pgste_val(pgste)), "Q" (ptep[PTRS_PER_PTE]) | 631 | : "d" (pgste_val(pgste)), "Q" (ptep[PTRS_PER_PTE]) |
@@ -662,14 +658,14 @@ static inline pgste_t pgste_update_all(pte_t *ptep, pgste_t pgste) | |||
662 | else if (bits) | 658 | else if (bits) |
663 | page_reset_referenced(address); | 659 | page_reset_referenced(address); |
664 | /* Transfer page changed & referenced bit to guest bits in pgste */ | 660 | /* Transfer page changed & referenced bit to guest bits in pgste */ |
665 | pgste_val(pgste) |= bits << 48; /* RCP_GR_BIT & RCP_GC_BIT */ | 661 | pgste_val(pgste) |= bits << 48; /* GR bit & GC bit */ |
666 | /* Get host changed & referenced bits from pgste */ | 662 | /* Get host changed & referenced bits from pgste */ |
667 | bits |= (pgste_val(pgste) & (RCP_HR_BIT | RCP_HC_BIT)) >> 52; | 663 | bits |= (pgste_val(pgste) & (PGSTE_HR_BIT | PGSTE_HC_BIT)) >> 52; |
668 | /* Transfer page changed & referenced bit to kvm user bits */ | 664 | /* Transfer page changed & referenced bit to kvm user bits */ |
669 | pgste_val(pgste) |= bits << 45; /* KVM_UR_BIT & KVM_UC_BIT */ | 665 | pgste_val(pgste) |= bits << 45; /* PGSTE_UR_BIT & PGSTE_UC_BIT */ |
670 | /* Clear relevant host bits in pgste. */ | 666 | /* Clear relevant host bits in pgste. */ |
671 | pgste_val(pgste) &= ~(RCP_HR_BIT | RCP_HC_BIT); | 667 | pgste_val(pgste) &= ~(PGSTE_HR_BIT | PGSTE_HC_BIT); |
672 | pgste_val(pgste) &= ~(RCP_ACC_BITS | RCP_FP_BIT); | 668 | pgste_val(pgste) &= ~(PGSTE_ACC_BITS | PGSTE_FP_BIT); |
673 | /* Copy page access key and fetch protection bit to pgste */ | 669 | /* Copy page access key and fetch protection bit to pgste */ |
674 | pgste_val(pgste) |= | 670 | pgste_val(pgste) |= |
675 | (unsigned long) (skey & (_PAGE_ACC_BITS | _PAGE_FP_BIT)) << 56; | 671 | (unsigned long) (skey & (_PAGE_ACC_BITS | _PAGE_FP_BIT)) << 56; |
@@ -690,15 +686,15 @@ static inline pgste_t pgste_update_young(pte_t *ptep, pgste_t pgste) | |||
690 | /* Get referenced bit from storage key */ | 686 | /* Get referenced bit from storage key */ |
691 | young = page_reset_referenced(pte_val(*ptep) & PAGE_MASK); | 687 | young = page_reset_referenced(pte_val(*ptep) & PAGE_MASK); |
692 | if (young) | 688 | if (young) |
693 | pgste_val(pgste) |= RCP_GR_BIT; | 689 | pgste_val(pgste) |= PGSTE_GR_BIT; |
694 | /* Get host referenced bit from pgste */ | 690 | /* Get host referenced bit from pgste */ |
695 | if (pgste_val(pgste) & RCP_HR_BIT) { | 691 | if (pgste_val(pgste) & PGSTE_HR_BIT) { |
696 | pgste_val(pgste) &= ~RCP_HR_BIT; | 692 | pgste_val(pgste) &= ~PGSTE_HR_BIT; |
697 | young = 1; | 693 | young = 1; |
698 | } | 694 | } |
699 | /* Transfer referenced bit to kvm user bits and pte */ | 695 | /* Transfer referenced bit to kvm user bits and pte */ |
700 | if (young) { | 696 | if (young) { |
701 | pgste_val(pgste) |= KVM_UR_BIT; | 697 | pgste_val(pgste) |= PGSTE_UR_BIT; |
702 | pte_val(*ptep) |= _PAGE_SWR; | 698 | pte_val(*ptep) |= _PAGE_SWR; |
703 | } | 699 | } |
704 | #endif | 700 | #endif |
@@ -720,7 +716,7 @@ static inline void pgste_set_key(pte_t *ptep, pgste_t pgste, pte_t entry) | |||
720 | * The guest C/R information is still in the PGSTE, set real | 716 | * The guest C/R information is still in the PGSTE, set real |
721 | * key C/R to 0. | 717 | * key C/R to 0. |
722 | */ | 718 | */ |
723 | nkey = (pgste_val(pgste) & (RCP_ACC_BITS | RCP_FP_BIT)) >> 56; | 719 | nkey = (pgste_val(pgste) & (PGSTE_ACC_BITS | PGSTE_FP_BIT)) >> 56; |
724 | page_set_storage_key(address, nkey, 0); | 720 | page_set_storage_key(address, nkey, 0); |
725 | #endif | 721 | #endif |
726 | } | 722 | } |
@@ -750,6 +746,7 @@ struct gmap { | |||
750 | struct mm_struct *mm; | 746 | struct mm_struct *mm; |
751 | unsigned long *table; | 747 | unsigned long *table; |
752 | unsigned long asce; | 748 | unsigned long asce; |
749 | void *private; | ||
753 | struct list_head crst_list; | 750 | struct list_head crst_list; |
754 | }; | 751 | }; |
755 | 752 | ||
@@ -808,8 +805,8 @@ static inline pgste_t pgste_ipte_notify(struct mm_struct *mm, | |||
808 | pte_t *ptep, pgste_t pgste) | 805 | pte_t *ptep, pgste_t pgste) |
809 | { | 806 | { |
810 | #ifdef CONFIG_PGSTE | 807 | #ifdef CONFIG_PGSTE |
811 | if (pgste_val(pgste) & RCP_IN_BIT) { | 808 | if (pgste_val(pgste) & PGSTE_IN_BIT) { |
812 | pgste_val(pgste) &= ~RCP_IN_BIT; | 809 | pgste_val(pgste) &= ~PGSTE_IN_BIT; |
813 | gmap_do_ipte_notify(mm, addr, ptep); | 810 | gmap_do_ipte_notify(mm, addr, ptep); |
814 | } | 811 | } |
815 | #endif | 812 | #endif |
@@ -977,8 +974,8 @@ static inline int ptep_test_and_clear_user_dirty(struct mm_struct *mm, | |||
977 | if (mm_has_pgste(mm)) { | 974 | if (mm_has_pgste(mm)) { |
978 | pgste = pgste_get_lock(ptep); | 975 | pgste = pgste_get_lock(ptep); |
979 | pgste = pgste_update_all(ptep, pgste); | 976 | pgste = pgste_update_all(ptep, pgste); |
980 | dirty = !!(pgste_val(pgste) & KVM_UC_BIT); | 977 | dirty = !!(pgste_val(pgste) & PGSTE_UC_BIT); |
981 | pgste_val(pgste) &= ~KVM_UC_BIT; | 978 | pgste_val(pgste) &= ~PGSTE_UC_BIT; |
982 | pgste_set_unlock(ptep, pgste); | 979 | pgste_set_unlock(ptep, pgste); |
983 | return dirty; | 980 | return dirty; |
984 | } | 981 | } |
@@ -997,8 +994,8 @@ static inline int ptep_test_and_clear_user_young(struct mm_struct *mm, | |||
997 | if (mm_has_pgste(mm)) { | 994 | if (mm_has_pgste(mm)) { |
998 | pgste = pgste_get_lock(ptep); | 995 | pgste = pgste_get_lock(ptep); |
999 | pgste = pgste_update_young(ptep, pgste); | 996 | pgste = pgste_update_young(ptep, pgste); |
1000 | young = !!(pgste_val(pgste) & KVM_UR_BIT); | 997 | young = !!(pgste_val(pgste) & PGSTE_UR_BIT); |
1001 | pgste_val(pgste) &= ~KVM_UR_BIT; | 998 | pgste_val(pgste) &= ~PGSTE_UR_BIT; |
1002 | pgste_set_unlock(ptep, pgste); | 999 | pgste_set_unlock(ptep, pgste); |
1003 | } | 1000 | } |
1004 | return young; | 1001 | return young; |