diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2012-07-24 15:01:20 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2012-07-24 15:01:20 -0400 |
commit | 5fecc9d8f59e765c2a48379dd7c6f5cf88c7d75a (patch) | |
tree | d1fc25d9650d3ac24591bba6f5e2e7a1afc54796 /drivers/s390/char | |
parent | 3c4cfadef6a1665d9cd02a543782d03d3e6740c6 (diff) | |
parent | 1a577b72475d161b6677c05abe57301362023bb2 (diff) |
Merge tag 'kvm-3.6-1' of git://git.kernel.org/pub/scm/virt/kvm/kvm
Pull KVM updates from Avi Kivity:
"Highlights include
- full big real mode emulation on pre-Westmere Intel hosts (can be
disabled with emulate_invalid_guest_state=0)
- relatively small ppc and s390 updates
- PCID/INVPCID support in guests
- EOI avoidance; 3.6 guests should perform better on 3.6 hosts on
interrupt intensive workloads)
- Lockless write faults during live migration
- EPT accessed/dirty bits support for new Intel processors"
Fix up conflicts in:
- Documentation/virtual/kvm/api.txt:
Stupid subchapter numbering, added next to each other.
- arch/powerpc/kvm/booke_interrupts.S:
PPC asm changes clashing with the KVM fixes
- arch/s390/include/asm/sigp.h, arch/s390/kvm/sigp.c:
Duplicated commits through the kvm tree and the s390 tree, with
subsequent edits in the KVM tree.
* tag 'kvm-3.6-1' of git://git.kernel.org/pub/scm/virt/kvm/kvm: (93 commits)
KVM: fix race with level interrupts
x86, hyper: fix build with !CONFIG_KVM_GUEST
Revert "apic: fix kvm build on UP without IOAPIC"
KVM guest: switch to apic_set_eoi_write, apic_write
apic: add apic_set_eoi_write for PV use
KVM: VMX: Implement PCID/INVPCID for guests with EPT
KVM: Add x86_hyper_kvm to complete detect_hypervisor_platform check
KVM: PPC: Critical interrupt emulation support
KVM: PPC: e500mc: Fix tlbilx emulation for 64-bit guests
KVM: PPC64: booke: Set interrupt computation mode for 64-bit host
KVM: PPC: bookehv: Add ESR flag to Data Storage Interrupt
KVM: PPC: bookehv64: Add support for std/ld emulation.
booke: Added crit/mc exception handler for e500v2
booke/bookehv: Add host crit-watchdog exception support
KVM: MMU: document mmu-lock and fast page fault
KVM: MMU: fix kvm_mmu_pagetable_walk tracepoint
KVM: MMU: trace fast page fault
KVM: MMU: fast path of handling guest page fault
KVM: MMU: introduce SPTE_MMU_WRITEABLE bit
KVM: MMU: fold tlb flush judgement into mmu_spte_update
...
Diffstat (limited to 'drivers/s390/char')
-rw-r--r-- | drivers/s390/char/sclp.c | 10 | ||||
-rw-r--r-- | drivers/s390/char/sclp.h | 10 | ||||
-rw-r--r-- | drivers/s390/char/sclp_cmd.c | 38 |
3 files changed, 48 insertions, 10 deletions
diff --git a/drivers/s390/char/sclp.c b/drivers/s390/char/sclp.c index 30f29a0020a1..3fcc000efc53 100644 --- a/drivers/s390/char/sclp.c +++ b/drivers/s390/char/sclp.c | |||
@@ -654,16 +654,6 @@ sclp_remove_processed(struct sccb_header *sccb) | |||
654 | 654 | ||
655 | EXPORT_SYMBOL(sclp_remove_processed); | 655 | EXPORT_SYMBOL(sclp_remove_processed); |
656 | 656 | ||
657 | struct init_sccb { | ||
658 | struct sccb_header header; | ||
659 | u16 _reserved; | ||
660 | u16 mask_length; | ||
661 | sccb_mask_t receive_mask; | ||
662 | sccb_mask_t send_mask; | ||
663 | sccb_mask_t sclp_receive_mask; | ||
664 | sccb_mask_t sclp_send_mask; | ||
665 | } __attribute__((packed)); | ||
666 | |||
667 | /* Prepare init mask request. Called while sclp_lock is locked. */ | 657 | /* Prepare init mask request. Called while sclp_lock is locked. */ |
668 | static inline void | 658 | static inline void |
669 | __sclp_make_init_req(u32 receive_mask, u32 send_mask) | 659 | __sclp_make_init_req(u32 receive_mask, u32 send_mask) |
diff --git a/drivers/s390/char/sclp.h b/drivers/s390/char/sclp.h index 49a1bb52bc87..d7e97ae9ef6d 100644 --- a/drivers/s390/char/sclp.h +++ b/drivers/s390/char/sclp.h | |||
@@ -88,6 +88,16 @@ struct sccb_header { | |||
88 | u16 response_code; | 88 | u16 response_code; |
89 | } __attribute__((packed)); | 89 | } __attribute__((packed)); |
90 | 90 | ||
91 | struct init_sccb { | ||
92 | struct sccb_header header; | ||
93 | u16 _reserved; | ||
94 | u16 mask_length; | ||
95 | sccb_mask_t receive_mask; | ||
96 | sccb_mask_t send_mask; | ||
97 | sccb_mask_t sclp_receive_mask; | ||
98 | sccb_mask_t sclp_send_mask; | ||
99 | } __attribute__((packed)); | ||
100 | |||
91 | extern u64 sclp_facilities; | 101 | extern u64 sclp_facilities; |
92 | #define SCLP_HAS_CHP_INFO (sclp_facilities & 0x8000000000000000ULL) | 102 | #define SCLP_HAS_CHP_INFO (sclp_facilities & 0x8000000000000000ULL) |
93 | #define SCLP_HAS_CHP_RECONFIG (sclp_facilities & 0x2000000000000000ULL) | 103 | #define SCLP_HAS_CHP_RECONFIG (sclp_facilities & 0x2000000000000000ULL) |
diff --git a/drivers/s390/char/sclp_cmd.c b/drivers/s390/char/sclp_cmd.c index 766cb7b19b40..71ea923c322d 100644 --- a/drivers/s390/char/sclp_cmd.c +++ b/drivers/s390/char/sclp_cmd.c | |||
@@ -48,6 +48,7 @@ struct read_info_sccb { | |||
48 | u8 _reserved5[4096 - 112]; /* 112-4095 */ | 48 | u8 _reserved5[4096 - 112]; /* 112-4095 */ |
49 | } __attribute__((packed, aligned(PAGE_SIZE))); | 49 | } __attribute__((packed, aligned(PAGE_SIZE))); |
50 | 50 | ||
51 | static struct init_sccb __initdata early_event_mask_sccb __aligned(PAGE_SIZE); | ||
51 | static struct read_info_sccb __initdata early_read_info_sccb; | 52 | static struct read_info_sccb __initdata early_read_info_sccb; |
52 | static int __initdata early_read_info_sccb_valid; | 53 | static int __initdata early_read_info_sccb_valid; |
53 | 54 | ||
@@ -104,6 +105,19 @@ static void __init sclp_read_info_early(void) | |||
104 | } | 105 | } |
105 | } | 106 | } |
106 | 107 | ||
108 | static void __init sclp_event_mask_early(void) | ||
109 | { | ||
110 | struct init_sccb *sccb = &early_event_mask_sccb; | ||
111 | int rc; | ||
112 | |||
113 | do { | ||
114 | memset(sccb, 0, sizeof(*sccb)); | ||
115 | sccb->header.length = sizeof(*sccb); | ||
116 | sccb->mask_length = sizeof(sccb_mask_t); | ||
117 | rc = sclp_cmd_sync_early(SCLP_CMDW_WRITE_EVENT_MASK, sccb); | ||
118 | } while (rc == -EBUSY); | ||
119 | } | ||
120 | |||
107 | void __init sclp_facilities_detect(void) | 121 | void __init sclp_facilities_detect(void) |
108 | { | 122 | { |
109 | struct read_info_sccb *sccb; | 123 | struct read_info_sccb *sccb; |
@@ -119,6 +133,30 @@ void __init sclp_facilities_detect(void) | |||
119 | rnmax = sccb->rnmax ? sccb->rnmax : sccb->rnmax2; | 133 | rnmax = sccb->rnmax ? sccb->rnmax : sccb->rnmax2; |
120 | rzm = sccb->rnsize ? sccb->rnsize : sccb->rnsize2; | 134 | rzm = sccb->rnsize ? sccb->rnsize : sccb->rnsize2; |
121 | rzm <<= 20; | 135 | rzm <<= 20; |
136 | |||
137 | sclp_event_mask_early(); | ||
138 | } | ||
139 | |||
140 | bool __init sclp_has_linemode(void) | ||
141 | { | ||
142 | struct init_sccb *sccb = &early_event_mask_sccb; | ||
143 | |||
144 | if (sccb->header.response_code != 0x20) | ||
145 | return 0; | ||
146 | if (sccb->sclp_send_mask & (EVTYP_MSG_MASK | EVTYP_PMSGCMD_MASK)) | ||
147 | return 1; | ||
148 | return 0; | ||
149 | } | ||
150 | |||
151 | bool __init sclp_has_vt220(void) | ||
152 | { | ||
153 | struct init_sccb *sccb = &early_event_mask_sccb; | ||
154 | |||
155 | if (sccb->header.response_code != 0x20) | ||
156 | return 0; | ||
157 | if (sccb->sclp_send_mask & EVTYP_VT220MSG_MASK) | ||
158 | return 1; | ||
159 | return 0; | ||
122 | } | 160 | } |
123 | 161 | ||
124 | unsigned long long sclp_get_rnmax(void) | 162 | unsigned long long sclp_get_rnmax(void) |