Annotation of /trunk/kernel-magellan/patches-3.8/0108-3.8.9-all-fixes.patch
Parent Directory | Revision Log
Revision 2160 -
(hide annotations)
(download)
Tue Apr 30 12:25:39 2013 UTC (11 years, 4 months ago) by niro
File size: 57030 byte(s)
Tue Apr 30 12:25:39 2013 UTC (11 years, 4 months ago) by niro
File size: 57030 byte(s)
-linux-3.8.9
1 | niro | 2160 | diff --git a/arch/arm/kernel/perf_event.c b/arch/arm/kernel/perf_event.c |
2 | index f9e8657..23fa6a2 100644 | ||
3 | --- a/arch/arm/kernel/perf_event.c | ||
4 | +++ b/arch/arm/kernel/perf_event.c | ||
5 | @@ -261,7 +261,10 @@ validate_event(struct pmu_hw_events *hw_events, | ||
6 | struct arm_pmu *armpmu = to_arm_pmu(event->pmu); | ||
7 | struct pmu *leader_pmu = event->group_leader->pmu; | ||
8 | |||
9 | - if (event->pmu != leader_pmu || event->state <= PERF_EVENT_STATE_OFF) | ||
10 | + if (event->pmu != leader_pmu || event->state < PERF_EVENT_STATE_OFF) | ||
11 | + return 1; | ||
12 | + | ||
13 | + if (event->state == PERF_EVENT_STATE_OFF && !event->attr.enable_on_exec) | ||
14 | return 1; | ||
15 | |||
16 | return armpmu->get_event_idx(hw_events, event) >= 0; | ||
17 | diff --git a/arch/arm/mach-imx/clk-imx35.c b/arch/arm/mach-imx/clk-imx35.c | ||
18 | index 0edce4b..5e3ca7a 100644 | ||
19 | --- a/arch/arm/mach-imx/clk-imx35.c | ||
20 | +++ b/arch/arm/mach-imx/clk-imx35.c | ||
21 | @@ -265,6 +265,8 @@ int __init mx35_clocks_init() | ||
22 | clk_prepare_enable(clk[gpio3_gate]); | ||
23 | clk_prepare_enable(clk[iim_gate]); | ||
24 | clk_prepare_enable(clk[emi_gate]); | ||
25 | + clk_prepare_enable(clk[max_gate]); | ||
26 | + clk_prepare_enable(clk[iomuxc_gate]); | ||
27 | |||
28 | /* | ||
29 | * SCC is needed to boot via mmc after a watchdog reset. The clock code | ||
30 | diff --git a/arch/arm/mm/cache-feroceon-l2.c b/arch/arm/mm/cache-feroceon-l2.c | ||
31 | index dd3d591..48bc3c0 100644 | ||
32 | --- a/arch/arm/mm/cache-feroceon-l2.c | ||
33 | +++ b/arch/arm/mm/cache-feroceon-l2.c | ||
34 | @@ -343,6 +343,7 @@ void __init feroceon_l2_init(int __l2_wt_override) | ||
35 | outer_cache.inv_range = feroceon_l2_inv_range; | ||
36 | outer_cache.clean_range = feroceon_l2_clean_range; | ||
37 | outer_cache.flush_range = feroceon_l2_flush_range; | ||
38 | + outer_cache.inv_all = l2_inv_all; | ||
39 | |||
40 | enable_l2(); | ||
41 | |||
42 | diff --git a/arch/arm/mm/proc-arm920.S b/arch/arm/mm/proc-arm920.S | ||
43 | index 2c3b942..2556cf1 100644 | ||
44 | --- a/arch/arm/mm/proc-arm920.S | ||
45 | +++ b/arch/arm/mm/proc-arm920.S | ||
46 | @@ -387,7 +387,7 @@ ENTRY(cpu_arm920_set_pte_ext) | ||
47 | /* Suspend/resume support: taken from arch/arm/plat-s3c24xx/sleep.S */ | ||
48 | .globl cpu_arm920_suspend_size | ||
49 | .equ cpu_arm920_suspend_size, 4 * 3 | ||
50 | -#ifdef CONFIG_PM_SLEEP | ||
51 | +#ifdef CONFIG_ARM_CPU_SUSPEND | ||
52 | ENTRY(cpu_arm920_do_suspend) | ||
53 | stmfd sp!, {r4 - r6, lr} | ||
54 | mrc p15, 0, r4, c13, c0, 0 @ PID | ||
55 | diff --git a/arch/arm/mm/proc-arm926.S b/arch/arm/mm/proc-arm926.S | ||
56 | index f1803f7e..344c8a5 100644 | ||
57 | --- a/arch/arm/mm/proc-arm926.S | ||
58 | +++ b/arch/arm/mm/proc-arm926.S | ||
59 | @@ -402,7 +402,7 @@ ENTRY(cpu_arm926_set_pte_ext) | ||
60 | /* Suspend/resume support: taken from arch/arm/plat-s3c24xx/sleep.S */ | ||
61 | .globl cpu_arm926_suspend_size | ||
62 | .equ cpu_arm926_suspend_size, 4 * 3 | ||
63 | -#ifdef CONFIG_PM_SLEEP | ||
64 | +#ifdef CONFIG_ARM_CPU_SUSPEND | ||
65 | ENTRY(cpu_arm926_do_suspend) | ||
66 | stmfd sp!, {r4 - r6, lr} | ||
67 | mrc p15, 0, r4, c13, c0, 0 @ PID | ||
68 | diff --git a/arch/arm/mm/proc-mohawk.S b/arch/arm/mm/proc-mohawk.S | ||
69 | index 82f9cdc..0b60dd3 100644 | ||
70 | --- a/arch/arm/mm/proc-mohawk.S | ||
71 | +++ b/arch/arm/mm/proc-mohawk.S | ||
72 | @@ -350,7 +350,7 @@ ENTRY(cpu_mohawk_set_pte_ext) | ||
73 | |||
74 | .globl cpu_mohawk_suspend_size | ||
75 | .equ cpu_mohawk_suspend_size, 4 * 6 | ||
76 | -#ifdef CONFIG_PM_SLEEP | ||
77 | +#ifdef CONFIG_ARM_CPU_SUSPEND | ||
78 | ENTRY(cpu_mohawk_do_suspend) | ||
79 | stmfd sp!, {r4 - r9, lr} | ||
80 | mrc p14, 0, r4, c6, c0, 0 @ clock configuration, for turbo mode | ||
81 | diff --git a/arch/arm/mm/proc-sa1100.S b/arch/arm/mm/proc-sa1100.S | ||
82 | index 3aa0da1..d92dfd0 100644 | ||
83 | --- a/arch/arm/mm/proc-sa1100.S | ||
84 | +++ b/arch/arm/mm/proc-sa1100.S | ||
85 | @@ -172,7 +172,7 @@ ENTRY(cpu_sa1100_set_pte_ext) | ||
86 | |||
87 | .globl cpu_sa1100_suspend_size | ||
88 | .equ cpu_sa1100_suspend_size, 4 * 3 | ||
89 | -#ifdef CONFIG_PM_SLEEP | ||
90 | +#ifdef CONFIG_ARM_CPU_SUSPEND | ||
91 | ENTRY(cpu_sa1100_do_suspend) | ||
92 | stmfd sp!, {r4 - r6, lr} | ||
93 | mrc p15, 0, r4, c3, c0, 0 @ domain ID | ||
94 | diff --git a/arch/arm/mm/proc-v6.S b/arch/arm/mm/proc-v6.S | ||
95 | index 09c5233..d222215 100644 | ||
96 | --- a/arch/arm/mm/proc-v6.S | ||
97 | +++ b/arch/arm/mm/proc-v6.S | ||
98 | @@ -138,7 +138,7 @@ ENTRY(cpu_v6_set_pte_ext) | ||
99 | /* Suspend/resume support: taken from arch/arm/mach-s3c64xx/sleep.S */ | ||
100 | .globl cpu_v6_suspend_size | ||
101 | .equ cpu_v6_suspend_size, 4 * 6 | ||
102 | -#ifdef CONFIG_PM_SLEEP | ||
103 | +#ifdef CONFIG_ARM_CPU_SUSPEND | ||
104 | ENTRY(cpu_v6_do_suspend) | ||
105 | stmfd sp!, {r4 - r9, lr} | ||
106 | mrc p15, 0, r4, c13, c0, 0 @ FCSE/PID | ||
107 | diff --git a/arch/arm/mm/proc-xsc3.S b/arch/arm/mm/proc-xsc3.S | ||
108 | index eb93d64..e8efd83 100644 | ||
109 | --- a/arch/arm/mm/proc-xsc3.S | ||
110 | +++ b/arch/arm/mm/proc-xsc3.S | ||
111 | @@ -413,7 +413,7 @@ ENTRY(cpu_xsc3_set_pte_ext) | ||
112 | |||
113 | .globl cpu_xsc3_suspend_size | ||
114 | .equ cpu_xsc3_suspend_size, 4 * 6 | ||
115 | -#ifdef CONFIG_PM_SLEEP | ||
116 | +#ifdef CONFIG_ARM_CPU_SUSPEND | ||
117 | ENTRY(cpu_xsc3_do_suspend) | ||
118 | stmfd sp!, {r4 - r9, lr} | ||
119 | mrc p14, 0, r4, c6, c0, 0 @ clock configuration, for turbo mode | ||
120 | diff --git a/arch/arm/mm/proc-xscale.S b/arch/arm/mm/proc-xscale.S | ||
121 | index 2551036..e766f88 100644 | ||
122 | --- a/arch/arm/mm/proc-xscale.S | ||
123 | +++ b/arch/arm/mm/proc-xscale.S | ||
124 | @@ -528,7 +528,7 @@ ENTRY(cpu_xscale_set_pte_ext) | ||
125 | |||
126 | .globl cpu_xscale_suspend_size | ||
127 | .equ cpu_xscale_suspend_size, 4 * 6 | ||
128 | -#ifdef CONFIG_PM_SLEEP | ||
129 | +#ifdef CONFIG_ARM_CPU_SUSPEND | ||
130 | ENTRY(cpu_xscale_do_suspend) | ||
131 | stmfd sp!, {r4 - r9, lr} | ||
132 | mrc p14, 0, r4, c6, c0, 0 @ clock configuration, for turbo mode | ||
133 | diff --git a/arch/mips/include/asm/page.h b/arch/mips/include/asm/page.h | ||
134 | index dbaec94..21bff32 100644 | ||
135 | --- a/arch/mips/include/asm/page.h | ||
136 | +++ b/arch/mips/include/asm/page.h | ||
137 | @@ -31,7 +31,7 @@ | ||
138 | #define PAGE_SHIFT 16 | ||
139 | #endif | ||
140 | #define PAGE_SIZE (_AC(1,UL) << PAGE_SHIFT) | ||
141 | -#define PAGE_MASK (~(PAGE_SIZE - 1)) | ||
142 | +#define PAGE_MASK (~((1 << PAGE_SHIFT) - 1)) | ||
143 | |||
144 | #ifdef CONFIG_MIPS_HUGE_TLB_SUPPORT | ||
145 | #define HPAGE_SHIFT (PAGE_SHIFT + PAGE_SHIFT - 3) | ||
146 | diff --git a/arch/powerpc/kernel/entry_64.S b/arch/powerpc/kernel/entry_64.S | ||
147 | index 3d990d3..e0822a3 100644 | ||
148 | --- a/arch/powerpc/kernel/entry_64.S | ||
149 | +++ b/arch/powerpc/kernel/entry_64.S | ||
150 | @@ -634,7 +634,7 @@ resume_kernel: | ||
151 | /* Clear _TIF_EMULATE_STACK_STORE flag */ | ||
152 | lis r11,_TIF_EMULATE_STACK_STORE@h | ||
153 | addi r5,r9,TI_FLAGS | ||
154 | - ldarx r4,0,r5 | ||
155 | +0: ldarx r4,0,r5 | ||
156 | andc r4,r4,r11 | ||
157 | stdcx. r4,0,r5 | ||
158 | bne- 0b | ||
159 | diff --git a/arch/powerpc/kvm/e500mc.c b/arch/powerpc/kvm/e500mc.c | ||
160 | index 1f89d26..2f4baa0 100644 | ||
161 | --- a/arch/powerpc/kvm/e500mc.c | ||
162 | +++ b/arch/powerpc/kvm/e500mc.c | ||
163 | @@ -108,6 +108,8 @@ void kvmppc_mmu_msr_notify(struct kvm_vcpu *vcpu, u32 old_msr) | ||
164 | { | ||
165 | } | ||
166 | |||
167 | +static DEFINE_PER_CPU(struct kvm_vcpu *, last_vcpu_on_cpu); | ||
168 | + | ||
169 | void kvmppc_core_vcpu_load(struct kvm_vcpu *vcpu, int cpu) | ||
170 | { | ||
171 | struct kvmppc_vcpu_e500 *vcpu_e500 = to_e500(vcpu); | ||
172 | @@ -136,8 +138,11 @@ void kvmppc_core_vcpu_load(struct kvm_vcpu *vcpu, int cpu) | ||
173 | mtspr(SPRN_GDEAR, vcpu->arch.shared->dar); | ||
174 | mtspr(SPRN_GESR, vcpu->arch.shared->esr); | ||
175 | |||
176 | - if (vcpu->arch.oldpir != mfspr(SPRN_PIR)) | ||
177 | + if (vcpu->arch.oldpir != mfspr(SPRN_PIR) || | ||
178 | + __get_cpu_var(last_vcpu_on_cpu) != vcpu) { | ||
179 | kvmppc_e500_tlbil_all(vcpu_e500); | ||
180 | + __get_cpu_var(last_vcpu_on_cpu) = vcpu; | ||
181 | + } | ||
182 | |||
183 | kvmppc_load_guest_fp(vcpu); | ||
184 | } | ||
185 | diff --git a/arch/s390/include/asm/io.h b/arch/s390/include/asm/io.h | ||
186 | index 27cb321..379d96e 100644 | ||
187 | --- a/arch/s390/include/asm/io.h | ||
188 | +++ b/arch/s390/include/asm/io.h | ||
189 | @@ -50,10 +50,6 @@ void unxlate_dev_mem_ptr(unsigned long phys, void *addr); | ||
190 | #define ioremap_nocache(addr, size) ioremap(addr, size) | ||
191 | #define ioremap_wc ioremap_nocache | ||
192 | |||
193 | -/* TODO: s390 cannot support io_remap_pfn_range... */ | ||
194 | -#define io_remap_pfn_range(vma, vaddr, pfn, size, prot) \ | ||
195 | - remap_pfn_range(vma, vaddr, pfn, size, prot) | ||
196 | - | ||
197 | static inline void __iomem *ioremap(unsigned long offset, unsigned long size) | ||
198 | { | ||
199 | return (void __iomem *) offset; | ||
200 | diff --git a/arch/s390/include/asm/pgtable.h b/arch/s390/include/asm/pgtable.h | ||
201 | index 098adbb..1532d7f 100644 | ||
202 | --- a/arch/s390/include/asm/pgtable.h | ||
203 | +++ b/arch/s390/include/asm/pgtable.h | ||
204 | @@ -56,6 +56,10 @@ extern unsigned long zero_page_mask; | ||
205 | (((unsigned long)(vaddr)) &zero_page_mask)))) | ||
206 | #define __HAVE_COLOR_ZERO_PAGE | ||
207 | |||
208 | +/* TODO: s390 cannot support io_remap_pfn_range... */ | ||
209 | +#define io_remap_pfn_range(vma, vaddr, pfn, size, prot) \ | ||
210 | + remap_pfn_range(vma, vaddr, pfn, size, prot) | ||
211 | + | ||
212 | #endif /* !__ASSEMBLY__ */ | ||
213 | |||
214 | /* | ||
215 | diff --git a/arch/x86/include/asm/kvm_host.h b/arch/x86/include/asm/kvm_host.h | ||
216 | index dc87b65..85039f9 100644 | ||
217 | --- a/arch/x86/include/asm/kvm_host.h | ||
218 | +++ b/arch/x86/include/asm/kvm_host.h | ||
219 | @@ -419,8 +419,8 @@ struct kvm_vcpu_arch { | ||
220 | gpa_t time; | ||
221 | struct pvclock_vcpu_time_info hv_clock; | ||
222 | unsigned int hw_tsc_khz; | ||
223 | - unsigned int time_offset; | ||
224 | - struct page *time_page; | ||
225 | + struct gfn_to_hva_cache pv_time; | ||
226 | + bool pv_time_enabled; | ||
227 | /* set guest stopped flag in pvclock flags field */ | ||
228 | bool pvclock_set_guest_stopped_request; | ||
229 | |||
230 | diff --git a/arch/x86/kernel/cpu/perf_event_intel.c b/arch/x86/kernel/cpu/perf_event_intel.c | ||
231 | index 4914e94..70602f8 100644 | ||
232 | --- a/arch/x86/kernel/cpu/perf_event_intel.c | ||
233 | +++ b/arch/x86/kernel/cpu/perf_event_intel.c | ||
234 | @@ -128,8 +128,14 @@ static struct event_constraint intel_gen_event_constraints[] __read_mostly = | ||
235 | }; | ||
236 | |||
237 | static struct extra_reg intel_snb_extra_regs[] __read_mostly = { | ||
238 | - INTEL_EVENT_EXTRA_REG(0xb7, MSR_OFFCORE_RSP_0, 0x3fffffffffull, RSP_0), | ||
239 | - INTEL_EVENT_EXTRA_REG(0xbb, MSR_OFFCORE_RSP_1, 0x3fffffffffull, RSP_1), | ||
240 | + INTEL_EVENT_EXTRA_REG(0xb7, MSR_OFFCORE_RSP_0, 0x3f807f8fffull, RSP_0), | ||
241 | + INTEL_EVENT_EXTRA_REG(0xbb, MSR_OFFCORE_RSP_1, 0x3f807f8fffull, RSP_1), | ||
242 | + EVENT_EXTRA_END | ||
243 | +}; | ||
244 | + | ||
245 | +static struct extra_reg intel_snbep_extra_regs[] __read_mostly = { | ||
246 | + INTEL_EVENT_EXTRA_REG(0xb7, MSR_OFFCORE_RSP_0, 0x3fffff8fffull, RSP_0), | ||
247 | + INTEL_EVENT_EXTRA_REG(0xbb, MSR_OFFCORE_RSP_1, 0x3fffff8fffull, RSP_1), | ||
248 | EVENT_EXTRA_END | ||
249 | }; | ||
250 | |||
251 | @@ -2072,7 +2078,10 @@ __init int intel_pmu_init(void) | ||
252 | x86_pmu.event_constraints = intel_snb_event_constraints; | ||
253 | x86_pmu.pebs_constraints = intel_snb_pebs_event_constraints; | ||
254 | x86_pmu.pebs_aliases = intel_pebs_aliases_snb; | ||
255 | - x86_pmu.extra_regs = intel_snb_extra_regs; | ||
256 | + if (boot_cpu_data.x86_model == 45) | ||
257 | + x86_pmu.extra_regs = intel_snbep_extra_regs; | ||
258 | + else | ||
259 | + x86_pmu.extra_regs = intel_snb_extra_regs; | ||
260 | /* all extra regs are per-cpu when HT is on */ | ||
261 | x86_pmu.er_flags |= ERF_HAS_RSP_1; | ||
262 | x86_pmu.er_flags |= ERF_NO_HT_SHARING; | ||
263 | @@ -2098,7 +2107,10 @@ __init int intel_pmu_init(void) | ||
264 | x86_pmu.event_constraints = intel_snb_event_constraints; | ||
265 | x86_pmu.pebs_constraints = intel_ivb_pebs_event_constraints; | ||
266 | x86_pmu.pebs_aliases = intel_pebs_aliases_snb; | ||
267 | - x86_pmu.extra_regs = intel_snb_extra_regs; | ||
268 | + if (boot_cpu_data.x86_model == 62) | ||
269 | + x86_pmu.extra_regs = intel_snbep_extra_regs; | ||
270 | + else | ||
271 | + x86_pmu.extra_regs = intel_snb_extra_regs; | ||
272 | /* all extra regs are per-cpu when HT is on */ | ||
273 | x86_pmu.er_flags |= ERF_HAS_RSP_1; | ||
274 | x86_pmu.er_flags |= ERF_NO_HT_SHARING; | ||
275 | diff --git a/arch/x86/kvm/lapic.c b/arch/x86/kvm/lapic.c | ||
276 | index 9392f52..a2f492c 100644 | ||
277 | --- a/arch/x86/kvm/lapic.c | ||
278 | +++ b/arch/x86/kvm/lapic.c | ||
279 | @@ -1781,7 +1781,7 @@ int kvm_lapic_enable_pv_eoi(struct kvm_vcpu *vcpu, u64 data) | ||
280 | if (!pv_eoi_enabled(vcpu)) | ||
281 | return 0; | ||
282 | return kvm_gfn_to_hva_cache_init(vcpu->kvm, &vcpu->arch.pv_eoi.data, | ||
283 | - addr); | ||
284 | + addr, sizeof(u8)); | ||
285 | } | ||
286 | |||
287 | void kvm_lapic_init(void) | ||
288 | diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c | ||
289 | index c243b81..9a51121 100644 | ||
290 | --- a/arch/x86/kvm/x86.c | ||
291 | +++ b/arch/x86/kvm/x86.c | ||
292 | @@ -1408,10 +1408,9 @@ static int kvm_guest_time_update(struct kvm_vcpu *v) | ||
293 | unsigned long flags, this_tsc_khz; | ||
294 | struct kvm_vcpu_arch *vcpu = &v->arch; | ||
295 | struct kvm_arch *ka = &v->kvm->arch; | ||
296 | - void *shared_kaddr; | ||
297 | s64 kernel_ns, max_kernel_ns; | ||
298 | u64 tsc_timestamp, host_tsc; | ||
299 | - struct pvclock_vcpu_time_info *guest_hv_clock; | ||
300 | + struct pvclock_vcpu_time_info guest_hv_clock; | ||
301 | u8 pvclock_flags; | ||
302 | bool use_master_clock; | ||
303 | |||
304 | @@ -1465,7 +1464,7 @@ static int kvm_guest_time_update(struct kvm_vcpu *v) | ||
305 | |||
306 | local_irq_restore(flags); | ||
307 | |||
308 | - if (!vcpu->time_page) | ||
309 | + if (!vcpu->pv_time_enabled) | ||
310 | return 0; | ||
311 | |||
312 | /* | ||
313 | @@ -1527,12 +1526,12 @@ static int kvm_guest_time_update(struct kvm_vcpu *v) | ||
314 | */ | ||
315 | vcpu->hv_clock.version += 2; | ||
316 | |||
317 | - shared_kaddr = kmap_atomic(vcpu->time_page); | ||
318 | - | ||
319 | - guest_hv_clock = shared_kaddr + vcpu->time_offset; | ||
320 | + if (unlikely(kvm_read_guest_cached(v->kvm, &vcpu->pv_time, | ||
321 | + &guest_hv_clock, sizeof(guest_hv_clock)))) | ||
322 | + return 0; | ||
323 | |||
324 | /* retain PVCLOCK_GUEST_STOPPED if set in guest copy */ | ||
325 | - pvclock_flags = (guest_hv_clock->flags & PVCLOCK_GUEST_STOPPED); | ||
326 | + pvclock_flags = (guest_hv_clock.flags & PVCLOCK_GUEST_STOPPED); | ||
327 | |||
328 | if (vcpu->pvclock_set_guest_stopped_request) { | ||
329 | pvclock_flags |= PVCLOCK_GUEST_STOPPED; | ||
330 | @@ -1545,12 +1544,9 @@ static int kvm_guest_time_update(struct kvm_vcpu *v) | ||
331 | |||
332 | vcpu->hv_clock.flags = pvclock_flags; | ||
333 | |||
334 | - memcpy(shared_kaddr + vcpu->time_offset, &vcpu->hv_clock, | ||
335 | - sizeof(vcpu->hv_clock)); | ||
336 | - | ||
337 | - kunmap_atomic(shared_kaddr); | ||
338 | - | ||
339 | - mark_page_dirty(v->kvm, vcpu->time >> PAGE_SHIFT); | ||
340 | + kvm_write_guest_cached(v->kvm, &vcpu->pv_time, | ||
341 | + &vcpu->hv_clock, | ||
342 | + sizeof(vcpu->hv_clock)); | ||
343 | return 0; | ||
344 | } | ||
345 | |||
346 | @@ -1829,7 +1825,8 @@ static int kvm_pv_enable_async_pf(struct kvm_vcpu *vcpu, u64 data) | ||
347 | return 0; | ||
348 | } | ||
349 | |||
350 | - if (kvm_gfn_to_hva_cache_init(vcpu->kvm, &vcpu->arch.apf.data, gpa)) | ||
351 | + if (kvm_gfn_to_hva_cache_init(vcpu->kvm, &vcpu->arch.apf.data, gpa, | ||
352 | + sizeof(u32))) | ||
353 | return 1; | ||
354 | |||
355 | vcpu->arch.apf.send_user_only = !(data & KVM_ASYNC_PF_SEND_ALWAYS); | ||
356 | @@ -1839,10 +1836,7 @@ static int kvm_pv_enable_async_pf(struct kvm_vcpu *vcpu, u64 data) | ||
357 | |||
358 | static void kvmclock_reset(struct kvm_vcpu *vcpu) | ||
359 | { | ||
360 | - if (vcpu->arch.time_page) { | ||
361 | - kvm_release_page_dirty(vcpu->arch.time_page); | ||
362 | - vcpu->arch.time_page = NULL; | ||
363 | - } | ||
364 | + vcpu->arch.pv_time_enabled = false; | ||
365 | } | ||
366 | |||
367 | static void accumulate_steal_time(struct kvm_vcpu *vcpu) | ||
368 | @@ -1948,6 +1942,7 @@ int kvm_set_msr_common(struct kvm_vcpu *vcpu, struct msr_data *msr_info) | ||
369 | break; | ||
370 | case MSR_KVM_SYSTEM_TIME_NEW: | ||
371 | case MSR_KVM_SYSTEM_TIME: { | ||
372 | + u64 gpa_offset; | ||
373 | kvmclock_reset(vcpu); | ||
374 | |||
375 | vcpu->arch.time = data; | ||
376 | @@ -1957,14 +1952,14 @@ int kvm_set_msr_common(struct kvm_vcpu *vcpu, struct msr_data *msr_info) | ||
377 | if (!(data & 1)) | ||
378 | break; | ||
379 | |||
380 | - /* ...but clean it before doing the actual write */ | ||
381 | - vcpu->arch.time_offset = data & ~(PAGE_MASK | 1); | ||
382 | - | ||
383 | - vcpu->arch.time_page = | ||
384 | - gfn_to_page(vcpu->kvm, data >> PAGE_SHIFT); | ||
385 | + gpa_offset = data & ~(PAGE_MASK | 1); | ||
386 | |||
387 | - if (is_error_page(vcpu->arch.time_page)) | ||
388 | - vcpu->arch.time_page = NULL; | ||
389 | + if (kvm_gfn_to_hva_cache_init(vcpu->kvm, | ||
390 | + &vcpu->arch.pv_time, data & ~1ULL, | ||
391 | + sizeof(struct pvclock_vcpu_time_info))) | ||
392 | + vcpu->arch.pv_time_enabled = false; | ||
393 | + else | ||
394 | + vcpu->arch.pv_time_enabled = true; | ||
395 | |||
396 | break; | ||
397 | } | ||
398 | @@ -1981,7 +1976,8 @@ int kvm_set_msr_common(struct kvm_vcpu *vcpu, struct msr_data *msr_info) | ||
399 | return 1; | ||
400 | |||
401 | if (kvm_gfn_to_hva_cache_init(vcpu->kvm, &vcpu->arch.st.stime, | ||
402 | - data & KVM_STEAL_VALID_BITS)) | ||
403 | + data & KVM_STEAL_VALID_BITS, | ||
404 | + sizeof(struct kvm_steal_time))) | ||
405 | return 1; | ||
406 | |||
407 | vcpu->arch.st.msr_val = data; | ||
408 | @@ -2967,7 +2963,7 @@ static int kvm_vcpu_ioctl_x86_set_xcrs(struct kvm_vcpu *vcpu, | ||
409 | */ | ||
410 | static int kvm_set_guest_paused(struct kvm_vcpu *vcpu) | ||
411 | { | ||
412 | - if (!vcpu->arch.time_page) | ||
413 | + if (!vcpu->arch.pv_time_enabled) | ||
414 | return -EINVAL; | ||
415 | vcpu->arch.pvclock_set_guest_stopped_request = true; | ||
416 | kvm_make_request(KVM_REQ_CLOCK_UPDATE, vcpu); | ||
417 | @@ -6661,6 +6657,7 @@ int kvm_arch_vcpu_init(struct kvm_vcpu *vcpu) | ||
418 | goto fail_free_wbinvd_dirty_mask; | ||
419 | |||
420 | vcpu->arch.ia32_tsc_adjust_msr = 0x0; | ||
421 | + vcpu->arch.pv_time_enabled = false; | ||
422 | kvm_async_pf_hash_reset(vcpu); | ||
423 | kvm_pmu_init(vcpu); | ||
424 | |||
425 | diff --git a/crypto/algif_hash.c b/crypto/algif_hash.c | ||
426 | index ef5356c..0262210 100644 | ||
427 | --- a/crypto/algif_hash.c | ||
428 | +++ b/crypto/algif_hash.c | ||
429 | @@ -161,6 +161,8 @@ static int hash_recvmsg(struct kiocb *unused, struct socket *sock, | ||
430 | else if (len < ds) | ||
431 | msg->msg_flags |= MSG_TRUNC; | ||
432 | |||
433 | + msg->msg_namelen = 0; | ||
434 | + | ||
435 | lock_sock(sk); | ||
436 | if (ctx->more) { | ||
437 | ctx->more = 0; | ||
438 | diff --git a/crypto/algif_skcipher.c b/crypto/algif_skcipher.c | ||
439 | index 6a6dfc0..a1c4f0a 100644 | ||
440 | --- a/crypto/algif_skcipher.c | ||
441 | +++ b/crypto/algif_skcipher.c | ||
442 | @@ -432,6 +432,7 @@ static int skcipher_recvmsg(struct kiocb *unused, struct socket *sock, | ||
443 | long copied = 0; | ||
444 | |||
445 | lock_sock(sk); | ||
446 | + msg->msg_namelen = 0; | ||
447 | for (iov = msg->msg_iov, iovlen = msg->msg_iovlen; iovlen > 0; | ||
448 | iovlen--, iov++) { | ||
449 | unsigned long seglen = iov->iov_len; | ||
450 | diff --git a/drivers/char/hpet.c b/drivers/char/hpet.c | ||
451 | index fe6d4be..615d262 100644 | ||
452 | --- a/drivers/char/hpet.c | ||
453 | +++ b/drivers/char/hpet.c | ||
454 | @@ -373,26 +373,14 @@ static int hpet_mmap(struct file *file, struct vm_area_struct *vma) | ||
455 | struct hpet_dev *devp; | ||
456 | unsigned long addr; | ||
457 | |||
458 | - if (((vma->vm_end - vma->vm_start) != PAGE_SIZE) || vma->vm_pgoff) | ||
459 | - return -EINVAL; | ||
460 | - | ||
461 | devp = file->private_data; | ||
462 | addr = devp->hd_hpets->hp_hpet_phys; | ||
463 | |||
464 | if (addr & (PAGE_SIZE - 1)) | ||
465 | return -ENOSYS; | ||
466 | |||
467 | - vma->vm_flags |= VM_IO; | ||
468 | vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot); | ||
469 | - | ||
470 | - if (io_remap_pfn_range(vma, vma->vm_start, addr >> PAGE_SHIFT, | ||
471 | - PAGE_SIZE, vma->vm_page_prot)) { | ||
472 | - printk(KERN_ERR "%s: io_remap_pfn_range failed\n", | ||
473 | - __func__); | ||
474 | - return -EAGAIN; | ||
475 | - } | ||
476 | - | ||
477 | - return 0; | ||
478 | + return vm_iomap_memory(vma, addr, PAGE_SIZE); | ||
479 | #else | ||
480 | return -ENOSYS; | ||
481 | #endif | ||
482 | diff --git a/drivers/md/raid1.c b/drivers/md/raid1.c | ||
483 | index 75b1f89..fd86b37 100644 | ||
484 | --- a/drivers/md/raid1.c | ||
485 | +++ b/drivers/md/raid1.c | ||
486 | @@ -1001,6 +1001,7 @@ static void make_request(struct mddev *mddev, struct bio * bio) | ||
487 | const unsigned long do_flush_fua = (bio->bi_rw & (REQ_FLUSH | REQ_FUA)); | ||
488 | const unsigned long do_discard = (bio->bi_rw | ||
489 | & (REQ_DISCARD | REQ_SECURE)); | ||
490 | + const unsigned long do_same = (bio->bi_rw & REQ_WRITE_SAME); | ||
491 | struct md_rdev *blocked_rdev; | ||
492 | struct blk_plug_cb *cb; | ||
493 | struct raid1_plug_cb *plug = NULL; | ||
494 | @@ -1302,7 +1303,8 @@ read_again: | ||
495 | conf->mirrors[i].rdev->data_offset); | ||
496 | mbio->bi_bdev = conf->mirrors[i].rdev->bdev; | ||
497 | mbio->bi_end_io = raid1_end_write_request; | ||
498 | - mbio->bi_rw = WRITE | do_flush_fua | do_sync | do_discard; | ||
499 | + mbio->bi_rw = | ||
500 | + WRITE | do_flush_fua | do_sync | do_discard | do_same; | ||
501 | mbio->bi_private = r1_bio; | ||
502 | |||
503 | atomic_inc(&r1_bio->remaining); | ||
504 | @@ -2819,6 +2821,9 @@ static int run(struct mddev *mddev) | ||
505 | if (IS_ERR(conf)) | ||
506 | return PTR_ERR(conf); | ||
507 | |||
508 | + if (mddev->queue) | ||
509 | + blk_queue_max_write_same_sectors(mddev->queue, | ||
510 | + mddev->chunk_sectors); | ||
511 | rdev_for_each(rdev, mddev) { | ||
512 | if (!mddev->gendisk) | ||
513 | continue; | ||
514 | diff --git a/drivers/md/raid10.c b/drivers/md/raid10.c | ||
515 | index 8d925dc..b3898d4 100644 | ||
516 | --- a/drivers/md/raid10.c | ||
517 | +++ b/drivers/md/raid10.c | ||
518 | @@ -1106,6 +1106,7 @@ static void make_request(struct mddev *mddev, struct bio * bio) | ||
519 | const unsigned long do_fua = (bio->bi_rw & REQ_FUA); | ||
520 | const unsigned long do_discard = (bio->bi_rw | ||
521 | & (REQ_DISCARD | REQ_SECURE)); | ||
522 | + const unsigned long do_same = (bio->bi_rw & REQ_WRITE_SAME); | ||
523 | unsigned long flags; | ||
524 | struct md_rdev *blocked_rdev; | ||
525 | struct blk_plug_cb *cb; | ||
526 | @@ -1461,7 +1462,8 @@ retry_write: | ||
527 | rdev)); | ||
528 | mbio->bi_bdev = rdev->bdev; | ||
529 | mbio->bi_end_io = raid10_end_write_request; | ||
530 | - mbio->bi_rw = WRITE | do_sync | do_fua | do_discard; | ||
531 | + mbio->bi_rw = | ||
532 | + WRITE | do_sync | do_fua | do_discard | do_same; | ||
533 | mbio->bi_private = r10_bio; | ||
534 | |||
535 | atomic_inc(&r10_bio->remaining); | ||
536 | @@ -1503,7 +1505,8 @@ retry_write: | ||
537 | r10_bio, rdev)); | ||
538 | mbio->bi_bdev = rdev->bdev; | ||
539 | mbio->bi_end_io = raid10_end_write_request; | ||
540 | - mbio->bi_rw = WRITE | do_sync | do_fua | do_discard; | ||
541 | + mbio->bi_rw = | ||
542 | + WRITE | do_sync | do_fua | do_discard | do_same; | ||
543 | mbio->bi_private = r10_bio; | ||
544 | |||
545 | atomic_inc(&r10_bio->remaining); | ||
546 | @@ -3570,6 +3573,8 @@ static int run(struct mddev *mddev) | ||
547 | if (mddev->queue) { | ||
548 | blk_queue_max_discard_sectors(mddev->queue, | ||
549 | mddev->chunk_sectors); | ||
550 | + blk_queue_max_write_same_sectors(mddev->queue, | ||
551 | + mddev->chunk_sectors); | ||
552 | blk_queue_io_min(mddev->queue, chunk_size); | ||
553 | if (conf->geo.raid_disks % conf->geo.near_copies) | ||
554 | blk_queue_io_opt(mddev->queue, chunk_size * conf->geo.raid_disks); | ||
555 | diff --git a/drivers/mtd/mtdchar.c b/drivers/mtd/mtdchar.c | ||
556 | index 82c0616..6e3d6dc 100644 | ||
557 | --- a/drivers/mtd/mtdchar.c | ||
558 | +++ b/drivers/mtd/mtdchar.c | ||
559 | @@ -1159,45 +1159,17 @@ static int mtdchar_mmap(struct file *file, struct vm_area_struct *vma) | ||
560 | struct mtd_file_info *mfi = file->private_data; | ||
561 | struct mtd_info *mtd = mfi->mtd; | ||
562 | struct map_info *map = mtd->priv; | ||
563 | - resource_size_t start, off; | ||
564 | - unsigned long len, vma_len; | ||
565 | |||
566 | /* This is broken because it assumes the MTD device is map-based | ||
567 | and that mtd->priv is a valid struct map_info. It should be | ||
568 | replaced with something that uses the mtd_get_unmapped_area() | ||
569 | operation properly. */ | ||
570 | if (0 /*mtd->type == MTD_RAM || mtd->type == MTD_ROM*/) { | ||
571 | - off = get_vm_offset(vma); | ||
572 | - start = map->phys; | ||
573 | - len = PAGE_ALIGN((start & ~PAGE_MASK) + map->size); | ||
574 | - start &= PAGE_MASK; | ||
575 | - vma_len = get_vm_size(vma); | ||
576 | - | ||
577 | - /* Overflow in off+len? */ | ||
578 | - if (vma_len + off < off) | ||
579 | - return -EINVAL; | ||
580 | - /* Does it fit in the mapping? */ | ||
581 | - if (vma_len + off > len) | ||
582 | - return -EINVAL; | ||
583 | - | ||
584 | - off += start; | ||
585 | - /* Did that overflow? */ | ||
586 | - if (off < start) | ||
587 | - return -EINVAL; | ||
588 | - if (set_vm_offset(vma, off) < 0) | ||
589 | - return -EINVAL; | ||
590 | - vma->vm_flags |= VM_IO | VM_DONTEXPAND | VM_DONTDUMP; | ||
591 | - | ||
592 | #ifdef pgprot_noncached | ||
593 | - if (file->f_flags & O_DSYNC || off >= __pa(high_memory)) | ||
594 | + if (file->f_flags & O_DSYNC || map->phys >= __pa(high_memory)) | ||
595 | vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot); | ||
596 | #endif | ||
597 | - if (io_remap_pfn_range(vma, vma->vm_start, off >> PAGE_SHIFT, | ||
598 | - vma->vm_end - vma->vm_start, | ||
599 | - vma->vm_page_prot)) | ||
600 | - return -EAGAIN; | ||
601 | - | ||
602 | - return 0; | ||
603 | + return vm_iomap_memory(vma, map->phys, map->size); | ||
604 | } | ||
605 | return -ENOSYS; | ||
606 | #else | ||
607 | diff --git a/drivers/net/can/mcp251x.c b/drivers/net/can/mcp251x.c | ||
608 | index 5eaf47b..42b6d69 100644 | ||
609 | --- a/drivers/net/can/mcp251x.c | ||
610 | +++ b/drivers/net/can/mcp251x.c | ||
611 | @@ -922,6 +922,7 @@ static int mcp251x_open(struct net_device *net) | ||
612 | struct mcp251x_priv *priv = netdev_priv(net); | ||
613 | struct spi_device *spi = priv->spi; | ||
614 | struct mcp251x_platform_data *pdata = spi->dev.platform_data; | ||
615 | + unsigned long flags; | ||
616 | int ret; | ||
617 | |||
618 | ret = open_candev(net); | ||
619 | @@ -938,9 +939,14 @@ static int mcp251x_open(struct net_device *net) | ||
620 | priv->tx_skb = NULL; | ||
621 | priv->tx_len = 0; | ||
622 | |||
623 | + flags = IRQF_ONESHOT; | ||
624 | + if (pdata->irq_flags) | ||
625 | + flags |= pdata->irq_flags; | ||
626 | + else | ||
627 | + flags |= IRQF_TRIGGER_FALLING; | ||
628 | + | ||
629 | ret = request_threaded_irq(spi->irq, NULL, mcp251x_can_ist, | ||
630 | - pdata->irq_flags ? pdata->irq_flags : IRQF_TRIGGER_FALLING, | ||
631 | - DEVICE_NAME, priv); | ||
632 | + flags, DEVICE_NAME, priv); | ||
633 | if (ret) { | ||
634 | dev_err(&spi->dev, "failed to acquire irq %d\n", spi->irq); | ||
635 | if (pdata->transceiver_enable) | ||
636 | diff --git a/drivers/net/can/sja1000/sja1000_of_platform.c b/drivers/net/can/sja1000/sja1000_of_platform.c | ||
637 | index 6433b81..8e0c4a0 100644 | ||
638 | --- a/drivers/net/can/sja1000/sja1000_of_platform.c | ||
639 | +++ b/drivers/net/can/sja1000/sja1000_of_platform.c | ||
640 | @@ -96,8 +96,8 @@ static int sja1000_ofp_probe(struct platform_device *ofdev) | ||
641 | struct net_device *dev; | ||
642 | struct sja1000_priv *priv; | ||
643 | struct resource res; | ||
644 | - const u32 *prop; | ||
645 | - int err, irq, res_size, prop_size; | ||
646 | + u32 prop; | ||
647 | + int err, irq, res_size; | ||
648 | void __iomem *base; | ||
649 | |||
650 | err = of_address_to_resource(np, 0, &res); | ||
651 | @@ -138,27 +138,27 @@ static int sja1000_ofp_probe(struct platform_device *ofdev) | ||
652 | priv->read_reg = sja1000_ofp_read_reg; | ||
653 | priv->write_reg = sja1000_ofp_write_reg; | ||
654 | |||
655 | - prop = of_get_property(np, "nxp,external-clock-frequency", &prop_size); | ||
656 | - if (prop && (prop_size == sizeof(u32))) | ||
657 | - priv->can.clock.freq = *prop / 2; | ||
658 | + err = of_property_read_u32(np, "nxp,external-clock-frequency", &prop); | ||
659 | + if (!err) | ||
660 | + priv->can.clock.freq = prop / 2; | ||
661 | else | ||
662 | priv->can.clock.freq = SJA1000_OFP_CAN_CLOCK; /* default */ | ||
663 | |||
664 | - prop = of_get_property(np, "nxp,tx-output-mode", &prop_size); | ||
665 | - if (prop && (prop_size == sizeof(u32))) | ||
666 | - priv->ocr |= *prop & OCR_MODE_MASK; | ||
667 | + err = of_property_read_u32(np, "nxp,tx-output-mode", &prop); | ||
668 | + if (!err) | ||
669 | + priv->ocr |= prop & OCR_MODE_MASK; | ||
670 | else | ||
671 | priv->ocr |= OCR_MODE_NORMAL; /* default */ | ||
672 | |||
673 | - prop = of_get_property(np, "nxp,tx-output-config", &prop_size); | ||
674 | - if (prop && (prop_size == sizeof(u32))) | ||
675 | - priv->ocr |= (*prop << OCR_TX_SHIFT) & OCR_TX_MASK; | ||
676 | + err = of_property_read_u32(np, "nxp,tx-output-config", &prop); | ||
677 | + if (!err) | ||
678 | + priv->ocr |= (prop << OCR_TX_SHIFT) & OCR_TX_MASK; | ||
679 | else | ||
680 | priv->ocr |= OCR_TX0_PULLDOWN; /* default */ | ||
681 | |||
682 | - prop = of_get_property(np, "nxp,clock-out-frequency", &prop_size); | ||
683 | - if (prop && (prop_size == sizeof(u32)) && *prop) { | ||
684 | - u32 divider = priv->can.clock.freq * 2 / *prop; | ||
685 | + err = of_property_read_u32(np, "nxp,clock-out-frequency", &prop); | ||
686 | + if (!err && prop) { | ||
687 | + u32 divider = priv->can.clock.freq * 2 / prop; | ||
688 | |||
689 | if (divider > 1) | ||
690 | priv->cdr |= divider / 2 - 1; | ||
691 | @@ -168,8 +168,7 @@ static int sja1000_ofp_probe(struct platform_device *ofdev) | ||
692 | priv->cdr |= CDR_CLK_OFF; /* default */ | ||
693 | } | ||
694 | |||
695 | - prop = of_get_property(np, "nxp,no-comparator-bypass", NULL); | ||
696 | - if (!prop) | ||
697 | + if (!of_property_read_bool(np, "nxp,no-comparator-bypass")) | ||
698 | priv->cdr |= CDR_CBP; /* default */ | ||
699 | |||
700 | priv->irq_flags = IRQF_SHARED; | ||
701 | diff --git a/drivers/net/ethernet/broadcom/tg3.c b/drivers/net/ethernet/broadcom/tg3.c | ||
702 | index 8a5253c..6917998 100644 | ||
703 | --- a/drivers/net/ethernet/broadcom/tg3.c | ||
704 | +++ b/drivers/net/ethernet/broadcom/tg3.c | ||
705 | @@ -330,6 +330,7 @@ static DEFINE_PCI_DEVICE_TABLE(tg3_pci_tbl) = { | ||
706 | {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, TG3PCI_DEVICE_TIGON3_5719)}, | ||
707 | {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, TG3PCI_DEVICE_TIGON3_5720)}, | ||
708 | {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, TG3PCI_DEVICE_TIGON3_57762)}, | ||
709 | + {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, TG3PCI_DEVICE_TIGON3_57766)}, | ||
710 | {PCI_DEVICE(PCI_VENDOR_ID_SYSKONNECT, PCI_DEVICE_ID_SYSKONNECT_9DXX)}, | ||
711 | {PCI_DEVICE(PCI_VENDOR_ID_SYSKONNECT, PCI_DEVICE_ID_SYSKONNECT_9MXX)}, | ||
712 | {PCI_DEVICE(PCI_VENDOR_ID_ALTIMA, PCI_DEVICE_ID_ALTIMA_AC1000)}, | ||
713 | @@ -9103,7 +9104,14 @@ static int tg3_reset_hw(struct tg3 *tp, int reset_phy) | ||
714 | } | ||
715 | |||
716 | if (GET_CHIP_REV(tp->pci_chip_rev_id) != CHIPREV_57765_AX) { | ||
717 | - u32 grc_mode = tr32(GRC_MODE); | ||
718 | + u32 grc_mode; | ||
719 | + | ||
720 | + /* Fix transmit hangs */ | ||
721 | + val = tr32(TG3_CPMU_PADRNG_CTL); | ||
722 | + val |= TG3_CPMU_PADRNG_CTL_RDIV2; | ||
723 | + tw32(TG3_CPMU_PADRNG_CTL, val); | ||
724 | + | ||
725 | + grc_mode = tr32(GRC_MODE); | ||
726 | |||
727 | /* Access the lower 1K of DL PCIE block registers. */ | ||
728 | val = grc_mode & ~GRC_MODE_PCIE_PORT_MASK; | ||
729 | @@ -9413,6 +9421,14 @@ static int tg3_reset_hw(struct tg3 *tp, int reset_phy) | ||
730 | if (tg3_flag(tp, PCI_EXPRESS)) | ||
731 | rdmac_mode |= RDMAC_MODE_FIFO_LONG_BURST; | ||
732 | |||
733 | + if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_57766) { | ||
734 | + tp->dma_limit = 0; | ||
735 | + if (tp->dev->mtu <= ETH_DATA_LEN) { | ||
736 | + rdmac_mode |= RDMAC_MODE_JMB_2K_MMRR; | ||
737 | + tp->dma_limit = TG3_TX_BD_DMA_MAX_2K; | ||
738 | + } | ||
739 | + } | ||
740 | + | ||
741 | if (tg3_flag(tp, HW_TSO_1) || | ||
742 | tg3_flag(tp, HW_TSO_2) || | ||
743 | tg3_flag(tp, HW_TSO_3)) | ||
744 | diff --git a/drivers/net/ethernet/broadcom/tg3.h b/drivers/net/ethernet/broadcom/tg3.h | ||
745 | index d330e81..6f9b74c 100644 | ||
746 | --- a/drivers/net/ethernet/broadcom/tg3.h | ||
747 | +++ b/drivers/net/ethernet/broadcom/tg3.h | ||
748 | @@ -1159,6 +1159,8 @@ | ||
749 | #define CPMU_MUTEX_GNT_DRIVER 0x00001000 | ||
750 | #define TG3_CPMU_PHY_STRAP 0x00003664 | ||
751 | #define TG3_CPMU_PHY_STRAP_IS_SERDES 0x00000020 | ||
752 | +#define TG3_CPMU_PADRNG_CTL 0x00003668 | ||
753 | +#define TG3_CPMU_PADRNG_CTL_RDIV2 0x00040000 | ||
754 | /* 0x3664 --> 0x36b0 unused */ | ||
755 | |||
756 | #define TG3_CPMU_EEE_MODE 0x000036b0 | ||
757 | diff --git a/drivers/net/wireless/ath/ath9k/ar9580_1p0_initvals.h b/drivers/net/wireless/ath/ath9k/ar9580_1p0_initvals.h | ||
758 | index 6e1915a..c00c13a 100644 | ||
759 | --- a/drivers/net/wireless/ath/ath9k/ar9580_1p0_initvals.h | ||
760 | +++ b/drivers/net/wireless/ath/ath9k/ar9580_1p0_initvals.h | ||
761 | @@ -519,7 +519,7 @@ static const u32 ar9580_1p0_mac_core[][2] = { | ||
762 | {0x00008258, 0x00000000}, | ||
763 | {0x0000825c, 0x40000000}, | ||
764 | {0x00008260, 0x00080922}, | ||
765 | - {0x00008264, 0x9bc00010}, | ||
766 | + {0x00008264, 0x9d400010}, | ||
767 | {0x00008268, 0xffffffff}, | ||
768 | {0x0000826c, 0x0000ffff}, | ||
769 | {0x00008270, 0x00000000}, | ||
770 | diff --git a/drivers/net/wireless/ath/ath9k/htc_drv_init.c b/drivers/net/wireless/ath/ath9k/htc_drv_init.c | ||
771 | index 05d5ba6..0663653 100644 | ||
772 | --- a/drivers/net/wireless/ath/ath9k/htc_drv_init.c | ||
773 | +++ b/drivers/net/wireless/ath/ath9k/htc_drv_init.c | ||
774 | @@ -796,7 +796,7 @@ static int ath9k_init_firmware_version(struct ath9k_htc_priv *priv) | ||
775 | * required version. | ||
776 | */ | ||
777 | if (priv->fw_version_major != MAJOR_VERSION_REQ || | ||
778 | - priv->fw_version_minor != MINOR_VERSION_REQ) { | ||
779 | + priv->fw_version_minor < MINOR_VERSION_REQ) { | ||
780 | dev_err(priv->dev, "ath9k_htc: Please upgrade to FW version %d.%d\n", | ||
781 | MAJOR_VERSION_REQ, MINOR_VERSION_REQ); | ||
782 | return -EINVAL; | ||
783 | diff --git a/drivers/net/wireless/b43/phy_n.c b/drivers/net/wireless/b43/phy_n.c | ||
784 | index e8486c1..b70f220 100644 | ||
785 | --- a/drivers/net/wireless/b43/phy_n.c | ||
786 | +++ b/drivers/net/wireless/b43/phy_n.c | ||
787 | @@ -5165,7 +5165,8 @@ static void b43_nphy_pmu_spur_avoid(struct b43_wldev *dev, bool avoid) | ||
788 | #endif | ||
789 | #ifdef CONFIG_B43_SSB | ||
790 | case B43_BUS_SSB: | ||
791 | - /* FIXME */ | ||
792 | + ssb_pmu_spuravoid_pllupdate(&dev->dev->sdev->bus->chipco, | ||
793 | + avoid); | ||
794 | break; | ||
795 | #endif | ||
796 | } | ||
797 | diff --git a/drivers/ssb/driver_chipcommon_pmu.c b/drivers/ssb/driver_chipcommon_pmu.c | ||
798 | index a43415a..bc75528 100644 | ||
799 | --- a/drivers/ssb/driver_chipcommon_pmu.c | ||
800 | +++ b/drivers/ssb/driver_chipcommon_pmu.c | ||
801 | @@ -675,3 +675,32 @@ u32 ssb_pmu_get_controlclock(struct ssb_chipcommon *cc) | ||
802 | return 0; | ||
803 | } | ||
804 | } | ||
805 | + | ||
806 | +void ssb_pmu_spuravoid_pllupdate(struct ssb_chipcommon *cc, int spuravoid) | ||
807 | +{ | ||
808 | + u32 pmu_ctl = 0; | ||
809 | + | ||
810 | + switch (cc->dev->bus->chip_id) { | ||
811 | + case 0x4322: | ||
812 | + ssb_chipco_pll_write(cc, SSB_PMU1_PLLCTL0, 0x11100070); | ||
813 | + ssb_chipco_pll_write(cc, SSB_PMU1_PLLCTL1, 0x1014140a); | ||
814 | + ssb_chipco_pll_write(cc, SSB_PMU1_PLLCTL5, 0x88888854); | ||
815 | + if (spuravoid == 1) | ||
816 | + ssb_chipco_pll_write(cc, SSB_PMU1_PLLCTL2, 0x05201828); | ||
817 | + else | ||
818 | + ssb_chipco_pll_write(cc, SSB_PMU1_PLLCTL2, 0x05001828); | ||
819 | + pmu_ctl = SSB_CHIPCO_PMU_CTL_PLL_UPD; | ||
820 | + break; | ||
821 | + case 43222: | ||
822 | + /* TODO: BCM43222 requires updating PLLs too */ | ||
823 | + return; | ||
824 | + default: | ||
825 | + ssb_printk(KERN_ERR PFX | ||
826 | + "Unknown spuravoidance settings for chip 0x%04X, not changing PLL\n", | ||
827 | + cc->dev->bus->chip_id); | ||
828 | + return; | ||
829 | + } | ||
830 | + | ||
831 | + chipco_set32(cc, SSB_CHIPCO_PMU_CTL, pmu_ctl); | ||
832 | +} | ||
833 | +EXPORT_SYMBOL_GPL(ssb_pmu_spuravoid_pllupdate); | ||
834 | diff --git a/drivers/video/fbmem.c b/drivers/video/fbmem.c | ||
835 | index dc61c12..0a49456 100644 | ||
836 | --- a/drivers/video/fbmem.c | ||
837 | +++ b/drivers/video/fbmem.c | ||
838 | @@ -1373,15 +1373,12 @@ fb_mmap(struct file *file, struct vm_area_struct * vma) | ||
839 | { | ||
840 | struct fb_info *info = file_fb_info(file); | ||
841 | struct fb_ops *fb; | ||
842 | - unsigned long off; | ||
843 | + unsigned long mmio_pgoff; | ||
844 | unsigned long start; | ||
845 | u32 len; | ||
846 | |||
847 | if (!info) | ||
848 | return -ENODEV; | ||
849 | - if (vma->vm_pgoff > (~0UL >> PAGE_SHIFT)) | ||
850 | - return -EINVAL; | ||
851 | - off = vma->vm_pgoff << PAGE_SHIFT; | ||
852 | fb = info->fbops; | ||
853 | if (!fb) | ||
854 | return -ENODEV; | ||
855 | @@ -1393,32 +1390,24 @@ fb_mmap(struct file *file, struct vm_area_struct * vma) | ||
856 | return res; | ||
857 | } | ||
858 | |||
859 | - /* frame buffer memory */ | ||
860 | + /* | ||
861 | + * Ugh. This can be either the frame buffer mapping, or | ||
862 | + * if pgoff points past it, the mmio mapping. | ||
863 | + */ | ||
864 | start = info->fix.smem_start; | ||
865 | - len = PAGE_ALIGN((start & ~PAGE_MASK) + info->fix.smem_len); | ||
866 | - if (off >= len) { | ||
867 | - /* memory mapped io */ | ||
868 | - off -= len; | ||
869 | - if (info->var.accel_flags) { | ||
870 | - mutex_unlock(&info->mm_lock); | ||
871 | - return -EINVAL; | ||
872 | - } | ||
873 | + len = info->fix.smem_len; | ||
874 | + mmio_pgoff = PAGE_ALIGN((start & ~PAGE_MASK) + len) >> PAGE_SHIFT; | ||
875 | + if (vma->vm_pgoff >= mmio_pgoff) { | ||
876 | + vma->vm_pgoff -= mmio_pgoff; | ||
877 | start = info->fix.mmio_start; | ||
878 | - len = PAGE_ALIGN((start & ~PAGE_MASK) + info->fix.mmio_len); | ||
879 | + len = info->fix.mmio_len; | ||
880 | } | ||
881 | mutex_unlock(&info->mm_lock); | ||
882 | - start &= PAGE_MASK; | ||
883 | - if ((vma->vm_end - vma->vm_start + off) > len) | ||
884 | - return -EINVAL; | ||
885 | - off += start; | ||
886 | - vma->vm_pgoff = off >> PAGE_SHIFT; | ||
887 | - /* VM_IO | VM_DONTEXPAND | VM_DONTDUMP are set by io_remap_pfn_range()*/ | ||
888 | + | ||
889 | vma->vm_page_prot = vm_get_page_prot(vma->vm_flags); | ||
890 | - fb_pgprotect(file, vma, off); | ||
891 | - if (io_remap_pfn_range(vma, vma->vm_start, off >> PAGE_SHIFT, | ||
892 | - vma->vm_end - vma->vm_start, vma->vm_page_prot)) | ||
893 | - return -EAGAIN; | ||
894 | - return 0; | ||
895 | + fb_pgprotect(file, vma, start); | ||
896 | + | ||
897 | + return vm_iomap_memory(vma, start, len); | ||
898 | } | ||
899 | |||
900 | static int | ||
901 | diff --git a/fs/binfmt_elf.c b/fs/binfmt_elf.c | ||
902 | index 0c42cdb..5843a47 100644 | ||
903 | --- a/fs/binfmt_elf.c | ||
904 | +++ b/fs/binfmt_elf.c | ||
905 | @@ -1132,6 +1132,7 @@ static unsigned long vma_dump_size(struct vm_area_struct *vma, | ||
906 | goto whole; | ||
907 | if (!(vma->vm_flags & VM_SHARED) && FILTER(HUGETLB_PRIVATE)) | ||
908 | goto whole; | ||
909 | + return 0; | ||
910 | } | ||
911 | |||
912 | /* Do not dump I/O mapped devices or special mappings */ | ||
913 | diff --git a/fs/btrfs/tree-log.c b/fs/btrfs/tree-log.c | ||
914 | index 744a69b..8a00e2f 100644 | ||
915 | --- a/fs/btrfs/tree-log.c | ||
916 | +++ b/fs/btrfs/tree-log.c | ||
917 | @@ -318,6 +318,7 @@ static noinline int overwrite_item(struct btrfs_trans_handle *trans, | ||
918 | unsigned long src_ptr; | ||
919 | unsigned long dst_ptr; | ||
920 | int overwrite_root = 0; | ||
921 | + bool inode_item = key->type == BTRFS_INODE_ITEM_KEY; | ||
922 | |||
923 | if (root->root_key.objectid != BTRFS_TREE_LOG_OBJECTID) | ||
924 | overwrite_root = 1; | ||
925 | @@ -327,6 +328,9 @@ static noinline int overwrite_item(struct btrfs_trans_handle *trans, | ||
926 | |||
927 | /* look for the key in the destination tree */ | ||
928 | ret = btrfs_search_slot(NULL, root, key, path, 0, 0); | ||
929 | + if (ret < 0) | ||
930 | + return ret; | ||
931 | + | ||
932 | if (ret == 0) { | ||
933 | char *src_copy; | ||
934 | char *dst_copy; | ||
935 | @@ -368,6 +372,30 @@ static noinline int overwrite_item(struct btrfs_trans_handle *trans, | ||
936 | return 0; | ||
937 | } | ||
938 | |||
939 | + /* | ||
940 | + * We need to load the old nbytes into the inode so when we | ||
941 | + * replay the extents we've logged we get the right nbytes. | ||
942 | + */ | ||
943 | + if (inode_item) { | ||
944 | + struct btrfs_inode_item *item; | ||
945 | + u64 nbytes; | ||
946 | + | ||
947 | + item = btrfs_item_ptr(path->nodes[0], path->slots[0], | ||
948 | + struct btrfs_inode_item); | ||
949 | + nbytes = btrfs_inode_nbytes(path->nodes[0], item); | ||
950 | + item = btrfs_item_ptr(eb, slot, | ||
951 | + struct btrfs_inode_item); | ||
952 | + btrfs_set_inode_nbytes(eb, item, nbytes); | ||
953 | + } | ||
954 | + } else if (inode_item) { | ||
955 | + struct btrfs_inode_item *item; | ||
956 | + | ||
957 | + /* | ||
958 | + * New inode, set nbytes to 0 so that the nbytes comes out | ||
959 | + * properly when we replay the extents. | ||
960 | + */ | ||
961 | + item = btrfs_item_ptr(eb, slot, struct btrfs_inode_item); | ||
962 | + btrfs_set_inode_nbytes(eb, item, 0); | ||
963 | } | ||
964 | insert: | ||
965 | btrfs_release_path(path); | ||
966 | @@ -488,7 +516,7 @@ static noinline int replay_one_extent(struct btrfs_trans_handle *trans, | ||
967 | u64 mask = root->sectorsize - 1; | ||
968 | u64 extent_end; | ||
969 | u64 start = key->offset; | ||
970 | - u64 saved_nbytes; | ||
971 | + u64 nbytes = 0; | ||
972 | struct btrfs_file_extent_item *item; | ||
973 | struct inode *inode = NULL; | ||
974 | unsigned long size; | ||
975 | @@ -498,10 +526,19 @@ static noinline int replay_one_extent(struct btrfs_trans_handle *trans, | ||
976 | found_type = btrfs_file_extent_type(eb, item); | ||
977 | |||
978 | if (found_type == BTRFS_FILE_EXTENT_REG || | ||
979 | - found_type == BTRFS_FILE_EXTENT_PREALLOC) | ||
980 | - extent_end = start + btrfs_file_extent_num_bytes(eb, item); | ||
981 | - else if (found_type == BTRFS_FILE_EXTENT_INLINE) { | ||
982 | + found_type == BTRFS_FILE_EXTENT_PREALLOC) { | ||
983 | + nbytes = btrfs_file_extent_num_bytes(eb, item); | ||
984 | + extent_end = start + nbytes; | ||
985 | + | ||
986 | + /* | ||
987 | + * We don't add to the inodes nbytes if we are prealloc or a | ||
988 | + * hole. | ||
989 | + */ | ||
990 | + if (btrfs_file_extent_disk_bytenr(eb, item) == 0) | ||
991 | + nbytes = 0; | ||
992 | + } else if (found_type == BTRFS_FILE_EXTENT_INLINE) { | ||
993 | size = btrfs_file_extent_inline_len(eb, item); | ||
994 | + nbytes = btrfs_file_extent_ram_bytes(eb, item); | ||
995 | extent_end = (start + size + mask) & ~mask; | ||
996 | } else { | ||
997 | ret = 0; | ||
998 | @@ -550,7 +587,6 @@ static noinline int replay_one_extent(struct btrfs_trans_handle *trans, | ||
999 | } | ||
1000 | btrfs_release_path(path); | ||
1001 | |||
1002 | - saved_nbytes = inode_get_bytes(inode); | ||
1003 | /* drop any overlapping extents */ | ||
1004 | ret = btrfs_drop_extents(trans, root, inode, start, extent_end, 1); | ||
1005 | BUG_ON(ret); | ||
1006 | @@ -637,7 +673,7 @@ static noinline int replay_one_extent(struct btrfs_trans_handle *trans, | ||
1007 | BUG_ON(ret); | ||
1008 | } | ||
1009 | |||
1010 | - inode_set_bytes(inode, saved_nbytes); | ||
1011 | + inode_add_bytes(inode, nbytes); | ||
1012 | ret = btrfs_update_inode(trans, root, inode); | ||
1013 | out: | ||
1014 | if (inode) | ||
1015 | diff --git a/fs/hfsplus/extents.c b/fs/hfsplus/extents.c | ||
1016 | index eba76ea..fc8ddc1 100644 | ||
1017 | --- a/fs/hfsplus/extents.c | ||
1018 | +++ b/fs/hfsplus/extents.c | ||
1019 | @@ -533,7 +533,7 @@ void hfsplus_file_truncate(struct inode *inode) | ||
1020 | struct address_space *mapping = inode->i_mapping; | ||
1021 | struct page *page; | ||
1022 | void *fsdata; | ||
1023 | - u32 size = inode->i_size; | ||
1024 | + loff_t size = inode->i_size; | ||
1025 | |||
1026 | res = pagecache_write_begin(NULL, mapping, size, 0, | ||
1027 | AOP_FLAG_UNINTERRUPTIBLE, | ||
1028 | diff --git a/fs/hugetlbfs/inode.c b/fs/hugetlbfs/inode.c | ||
1029 | index 78bde32..ccee8cc 100644 | ||
1030 | --- a/fs/hugetlbfs/inode.c | ||
1031 | +++ b/fs/hugetlbfs/inode.c | ||
1032 | @@ -110,7 +110,7 @@ static int hugetlbfs_file_mmap(struct file *file, struct vm_area_struct *vma) | ||
1033 | * way when do_mmap_pgoff unwinds (may be important on powerpc | ||
1034 | * and ia64). | ||
1035 | */ | ||
1036 | - vma->vm_flags |= VM_HUGETLB | VM_DONTEXPAND | VM_DONTDUMP; | ||
1037 | + vma->vm_flags |= VM_HUGETLB | VM_DONTEXPAND; | ||
1038 | vma->vm_ops = &hugetlb_vm_ops; | ||
1039 | |||
1040 | if (vma->vm_pgoff & (~huge_page_mask(h) >> PAGE_SHIFT)) | ||
1041 | diff --git a/fs/proc/array.c b/fs/proc/array.c | ||
1042 | index 6a91e6f..be3c22f 100644 | ||
1043 | --- a/fs/proc/array.c | ||
1044 | +++ b/fs/proc/array.c | ||
1045 | @@ -143,6 +143,7 @@ static const char * const task_state_array[] = { | ||
1046 | "x (dead)", /* 64 */ | ||
1047 | "K (wakekill)", /* 128 */ | ||
1048 | "W (waking)", /* 256 */ | ||
1049 | + "P (parked)", /* 512 */ | ||
1050 | }; | ||
1051 | |||
1052 | static inline const char *get_task_state(struct task_struct *tsk) | ||
1053 | diff --git a/include/linux/kvm_host.h b/include/linux/kvm_host.h | ||
1054 | index 2c497ab..ffdf8b7 100644 | ||
1055 | --- a/include/linux/kvm_host.h | ||
1056 | +++ b/include/linux/kvm_host.h | ||
1057 | @@ -511,7 +511,7 @@ int kvm_write_guest(struct kvm *kvm, gpa_t gpa, const void *data, | ||
1058 | int kvm_write_guest_cached(struct kvm *kvm, struct gfn_to_hva_cache *ghc, | ||
1059 | void *data, unsigned long len); | ||
1060 | int kvm_gfn_to_hva_cache_init(struct kvm *kvm, struct gfn_to_hva_cache *ghc, | ||
1061 | - gpa_t gpa); | ||
1062 | + gpa_t gpa, unsigned long len); | ||
1063 | int kvm_clear_guest_page(struct kvm *kvm, gfn_t gfn, int offset, int len); | ||
1064 | int kvm_clear_guest(struct kvm *kvm, gpa_t gpa, unsigned long len); | ||
1065 | struct kvm_memory_slot *gfn_to_memslot(struct kvm *kvm, gfn_t gfn); | ||
1066 | diff --git a/include/linux/kvm_types.h b/include/linux/kvm_types.h | ||
1067 | index fa7cc72..b0bcce0 100644 | ||
1068 | --- a/include/linux/kvm_types.h | ||
1069 | +++ b/include/linux/kvm_types.h | ||
1070 | @@ -71,6 +71,7 @@ struct gfn_to_hva_cache { | ||
1071 | u64 generation; | ||
1072 | gpa_t gpa; | ||
1073 | unsigned long hva; | ||
1074 | + unsigned long len; | ||
1075 | struct kvm_memory_slot *memslot; | ||
1076 | }; | ||
1077 | |||
1078 | diff --git a/include/linux/mm.h b/include/linux/mm.h | ||
1079 | index 66e2f7c..9568b90 100644 | ||
1080 | --- a/include/linux/mm.h | ||
1081 | +++ b/include/linux/mm.h | ||
1082 | @@ -1623,6 +1623,8 @@ int vm_insert_pfn(struct vm_area_struct *vma, unsigned long addr, | ||
1083 | unsigned long pfn); | ||
1084 | int vm_insert_mixed(struct vm_area_struct *vma, unsigned long addr, | ||
1085 | unsigned long pfn); | ||
1086 | +int vm_iomap_memory(struct vm_area_struct *vma, phys_addr_t start, unsigned long len); | ||
1087 | + | ||
1088 | |||
1089 | struct page *follow_page(struct vm_area_struct *, unsigned long address, | ||
1090 | unsigned int foll_flags); | ||
1091 | diff --git a/include/linux/sched.h b/include/linux/sched.h | ||
1092 | index d211247..7e49270 100644 | ||
1093 | --- a/include/linux/sched.h | ||
1094 | +++ b/include/linux/sched.h | ||
1095 | @@ -163,9 +163,10 @@ print_cfs_rq(struct seq_file *m, int cpu, struct cfs_rq *cfs_rq) | ||
1096 | #define TASK_DEAD 64 | ||
1097 | #define TASK_WAKEKILL 128 | ||
1098 | #define TASK_WAKING 256 | ||
1099 | -#define TASK_STATE_MAX 512 | ||
1100 | +#define TASK_PARKED 512 | ||
1101 | +#define TASK_STATE_MAX 1024 | ||
1102 | |||
1103 | -#define TASK_STATE_TO_CHAR_STR "RSDTtZXxKW" | ||
1104 | +#define TASK_STATE_TO_CHAR_STR "RSDTtZXxKWP" | ||
1105 | |||
1106 | extern char ___assert_task_state[1 - 2*!!( | ||
1107 | sizeof(TASK_STATE_TO_CHAR_STR)-1 != ilog2(TASK_STATE_MAX)+1)]; | ||
1108 | diff --git a/include/linux/ssb/ssb_driver_chipcommon.h b/include/linux/ssb/ssb_driver_chipcommon.h | ||
1109 | index 9e492be..6fcfe99 100644 | ||
1110 | --- a/include/linux/ssb/ssb_driver_chipcommon.h | ||
1111 | +++ b/include/linux/ssb/ssb_driver_chipcommon.h | ||
1112 | @@ -219,6 +219,7 @@ | ||
1113 | #define SSB_CHIPCO_PMU_CTL 0x0600 /* PMU control */ | ||
1114 | #define SSB_CHIPCO_PMU_CTL_ILP_DIV 0xFFFF0000 /* ILP div mask */ | ||
1115 | #define SSB_CHIPCO_PMU_CTL_ILP_DIV_SHIFT 16 | ||
1116 | +#define SSB_CHIPCO_PMU_CTL_PLL_UPD 0x00000400 | ||
1117 | #define SSB_CHIPCO_PMU_CTL_NOILPONW 0x00000200 /* No ILP on wait */ | ||
1118 | #define SSB_CHIPCO_PMU_CTL_HTREQEN 0x00000100 /* HT req enable */ | ||
1119 | #define SSB_CHIPCO_PMU_CTL_ALPREQEN 0x00000080 /* ALP req enable */ | ||
1120 | @@ -667,5 +668,6 @@ enum ssb_pmu_ldo_volt_id { | ||
1121 | void ssb_pmu_set_ldo_voltage(struct ssb_chipcommon *cc, | ||
1122 | enum ssb_pmu_ldo_volt_id id, u32 voltage); | ||
1123 | void ssb_pmu_set_ldo_paref(struct ssb_chipcommon *cc, bool on); | ||
1124 | +void ssb_pmu_spuravoid_pllupdate(struct ssb_chipcommon *cc, int spuravoid); | ||
1125 | |||
1126 | #endif /* LINUX_SSB_CHIPCO_H_ */ | ||
1127 | diff --git a/include/trace/events/sched.h b/include/trace/events/sched.h | ||
1128 | index 5a8671e..e5586ca 100644 | ||
1129 | --- a/include/trace/events/sched.h | ||
1130 | +++ b/include/trace/events/sched.h | ||
1131 | @@ -147,7 +147,7 @@ TRACE_EVENT(sched_switch, | ||
1132 | __print_flags(__entry->prev_state & (TASK_STATE_MAX-1), "|", | ||
1133 | { 1, "S"} , { 2, "D" }, { 4, "T" }, { 8, "t" }, | ||
1134 | { 16, "Z" }, { 32, "X" }, { 64, "x" }, | ||
1135 | - { 128, "W" }) : "R", | ||
1136 | + { 128, "K" }, { 256, "W" }, { 512, "P" }) : "R", | ||
1137 | __entry->prev_state & TASK_STATE_MAX ? "+" : "", | ||
1138 | __entry->next_comm, __entry->next_pid, __entry->next_prio) | ||
1139 | ); | ||
1140 | diff --git a/kernel/events/core.c b/kernel/events/core.c | ||
1141 | index 7b6646a..0600d3b 100644 | ||
1142 | --- a/kernel/events/core.c | ||
1143 | +++ b/kernel/events/core.c | ||
1144 | @@ -5328,7 +5328,7 @@ static void sw_perf_event_destroy(struct perf_event *event) | ||
1145 | |||
1146 | static int perf_swevent_init(struct perf_event *event) | ||
1147 | { | ||
1148 | - int event_id = event->attr.config; | ||
1149 | + u64 event_id = event->attr.config; | ||
1150 | |||
1151 | if (event->attr.type != PERF_TYPE_SOFTWARE) | ||
1152 | return -ENOENT; | ||
1153 | diff --git a/kernel/hrtimer.c b/kernel/hrtimer.c | ||
1154 | index cdd5607..e4cee8d 100644 | ||
1155 | --- a/kernel/hrtimer.c | ||
1156 | +++ b/kernel/hrtimer.c | ||
1157 | @@ -61,6 +61,7 @@ | ||
1158 | DEFINE_PER_CPU(struct hrtimer_cpu_base, hrtimer_bases) = | ||
1159 | { | ||
1160 | |||
1161 | + .lock = __RAW_SPIN_LOCK_UNLOCKED(hrtimer_bases.lock), | ||
1162 | .clock_base = | ||
1163 | { | ||
1164 | { | ||
1165 | @@ -1640,8 +1641,6 @@ static void __cpuinit init_hrtimers_cpu(int cpu) | ||
1166 | struct hrtimer_cpu_base *cpu_base = &per_cpu(hrtimer_bases, cpu); | ||
1167 | int i; | ||
1168 | |||
1169 | - raw_spin_lock_init(&cpu_base->lock); | ||
1170 | - | ||
1171 | for (i = 0; i < HRTIMER_MAX_CLOCK_BASES; i++) { | ||
1172 | cpu_base->clock_base[i].cpu_base = cpu_base; | ||
1173 | timerqueue_init_head(&cpu_base->clock_base[i].active); | ||
1174 | diff --git a/kernel/kthread.c b/kernel/kthread.c | ||
1175 | index 691dc2e..9eb7fed 100644 | ||
1176 | --- a/kernel/kthread.c | ||
1177 | +++ b/kernel/kthread.c | ||
1178 | @@ -124,12 +124,12 @@ void *kthread_data(struct task_struct *task) | ||
1179 | |||
1180 | static void __kthread_parkme(struct kthread *self) | ||
1181 | { | ||
1182 | - __set_current_state(TASK_INTERRUPTIBLE); | ||
1183 | + __set_current_state(TASK_PARKED); | ||
1184 | while (test_bit(KTHREAD_SHOULD_PARK, &self->flags)) { | ||
1185 | if (!test_and_set_bit(KTHREAD_IS_PARKED, &self->flags)) | ||
1186 | complete(&self->parked); | ||
1187 | schedule(); | ||
1188 | - __set_current_state(TASK_INTERRUPTIBLE); | ||
1189 | + __set_current_state(TASK_PARKED); | ||
1190 | } | ||
1191 | clear_bit(KTHREAD_IS_PARKED, &self->flags); | ||
1192 | __set_current_state(TASK_RUNNING); | ||
1193 | @@ -256,8 +256,13 @@ struct task_struct *kthread_create_on_node(int (*threadfn)(void *data), | ||
1194 | } | ||
1195 | EXPORT_SYMBOL(kthread_create_on_node); | ||
1196 | |||
1197 | -static void __kthread_bind(struct task_struct *p, unsigned int cpu) | ||
1198 | +static void __kthread_bind(struct task_struct *p, unsigned int cpu, long state) | ||
1199 | { | ||
1200 | + /* Must have done schedule() in kthread() before we set_task_cpu */ | ||
1201 | + if (!wait_task_inactive(p, state)) { | ||
1202 | + WARN_ON(1); | ||
1203 | + return; | ||
1204 | + } | ||
1205 | /* It's safe because the task is inactive. */ | ||
1206 | do_set_cpus_allowed(p, cpumask_of(cpu)); | ||
1207 | p->flags |= PF_THREAD_BOUND; | ||
1208 | @@ -274,12 +279,7 @@ static void __kthread_bind(struct task_struct *p, unsigned int cpu) | ||
1209 | */ | ||
1210 | void kthread_bind(struct task_struct *p, unsigned int cpu) | ||
1211 | { | ||
1212 | - /* Must have done schedule() in kthread() before we set_task_cpu */ | ||
1213 | - if (!wait_task_inactive(p, TASK_UNINTERRUPTIBLE)) { | ||
1214 | - WARN_ON(1); | ||
1215 | - return; | ||
1216 | - } | ||
1217 | - __kthread_bind(p, cpu); | ||
1218 | + __kthread_bind(p, cpu, TASK_UNINTERRUPTIBLE); | ||
1219 | } | ||
1220 | EXPORT_SYMBOL(kthread_bind); | ||
1221 | |||
1222 | @@ -324,6 +324,22 @@ static struct kthread *task_get_live_kthread(struct task_struct *k) | ||
1223 | return NULL; | ||
1224 | } | ||
1225 | |||
1226 | +static void __kthread_unpark(struct task_struct *k, struct kthread *kthread) | ||
1227 | +{ | ||
1228 | + clear_bit(KTHREAD_SHOULD_PARK, &kthread->flags); | ||
1229 | + /* | ||
1230 | + * We clear the IS_PARKED bit here as we don't wait | ||
1231 | + * until the task has left the park code. So if we'd | ||
1232 | + * park before that happens we'd see the IS_PARKED bit | ||
1233 | + * which might be about to be cleared. | ||
1234 | + */ | ||
1235 | + if (test_and_clear_bit(KTHREAD_IS_PARKED, &kthread->flags)) { | ||
1236 | + if (test_bit(KTHREAD_IS_PER_CPU, &kthread->flags)) | ||
1237 | + __kthread_bind(k, kthread->cpu, TASK_PARKED); | ||
1238 | + wake_up_state(k, TASK_PARKED); | ||
1239 | + } | ||
1240 | +} | ||
1241 | + | ||
1242 | /** | ||
1243 | * kthread_unpark - unpark a thread created by kthread_create(). | ||
1244 | * @k: thread created by kthread_create(). | ||
1245 | @@ -336,20 +352,8 @@ void kthread_unpark(struct task_struct *k) | ||
1246 | { | ||
1247 | struct kthread *kthread = task_get_live_kthread(k); | ||
1248 | |||
1249 | - if (kthread) { | ||
1250 | - clear_bit(KTHREAD_SHOULD_PARK, &kthread->flags); | ||
1251 | - /* | ||
1252 | - * We clear the IS_PARKED bit here as we don't wait | ||
1253 | - * until the task has left the park code. So if we'd | ||
1254 | - * park before that happens we'd see the IS_PARKED bit | ||
1255 | - * which might be about to be cleared. | ||
1256 | - */ | ||
1257 | - if (test_and_clear_bit(KTHREAD_IS_PARKED, &kthread->flags)) { | ||
1258 | - if (test_bit(KTHREAD_IS_PER_CPU, &kthread->flags)) | ||
1259 | - __kthread_bind(k, kthread->cpu); | ||
1260 | - wake_up_process(k); | ||
1261 | - } | ||
1262 | - } | ||
1263 | + if (kthread) | ||
1264 | + __kthread_unpark(k, kthread); | ||
1265 | put_task_struct(k); | ||
1266 | } | ||
1267 | |||
1268 | @@ -407,7 +411,7 @@ int kthread_stop(struct task_struct *k) | ||
1269 | trace_sched_kthread_stop(k); | ||
1270 | if (kthread) { | ||
1271 | set_bit(KTHREAD_SHOULD_STOP, &kthread->flags); | ||
1272 | - clear_bit(KTHREAD_SHOULD_PARK, &kthread->flags); | ||
1273 | + __kthread_unpark(k, kthread); | ||
1274 | wake_up_process(k); | ||
1275 | wait_for_completion(&kthread->exited); | ||
1276 | } | ||
1277 | diff --git a/kernel/sched/core.c b/kernel/sched/core.c | ||
1278 | index 26058d0..5e2f7c3 100644 | ||
1279 | --- a/kernel/sched/core.c | ||
1280 | +++ b/kernel/sched/core.c | ||
1281 | @@ -1488,8 +1488,10 @@ static void try_to_wake_up_local(struct task_struct *p) | ||
1282 | { | ||
1283 | struct rq *rq = task_rq(p); | ||
1284 | |||
1285 | - BUG_ON(rq != this_rq()); | ||
1286 | - BUG_ON(p == current); | ||
1287 | + if (WARN_ON_ONCE(rq != this_rq()) || | ||
1288 | + WARN_ON_ONCE(p == current)) | ||
1289 | + return; | ||
1290 | + | ||
1291 | lockdep_assert_held(&rq->lock); | ||
1292 | |||
1293 | if (!raw_spin_trylock(&p->pi_lock)) { | ||
1294 | @@ -4948,7 +4950,7 @@ static void sd_free_ctl_entry(struct ctl_table **tablep) | ||
1295 | } | ||
1296 | |||
1297 | static int min_load_idx = 0; | ||
1298 | -static int max_load_idx = CPU_LOAD_IDX_MAX; | ||
1299 | +static int max_load_idx = CPU_LOAD_IDX_MAX-1; | ||
1300 | |||
1301 | static void | ||
1302 | set_table_entry(struct ctl_table *entry, | ||
1303 | diff --git a/kernel/signal.c b/kernel/signal.c | ||
1304 | index dec9c30..50e425c 100644 | ||
1305 | --- a/kernel/signal.c | ||
1306 | +++ b/kernel/signal.c | ||
1307 | @@ -2880,7 +2880,7 @@ do_send_specific(pid_t tgid, pid_t pid, int sig, struct siginfo *info) | ||
1308 | |||
1309 | static int do_tkill(pid_t tgid, pid_t pid, int sig) | ||
1310 | { | ||
1311 | - struct siginfo info; | ||
1312 | + struct siginfo info = {}; | ||
1313 | |||
1314 | info.si_signo = sig; | ||
1315 | info.si_errno = 0; | ||
1316 | diff --git a/kernel/user_namespace.c b/kernel/user_namespace.c | ||
1317 | index f45e128..f359dc7 100644 | ||
1318 | --- a/kernel/user_namespace.c | ||
1319 | +++ b/kernel/user_namespace.c | ||
1320 | @@ -25,7 +25,8 @@ | ||
1321 | |||
1322 | static struct kmem_cache *user_ns_cachep __read_mostly; | ||
1323 | |||
1324 | -static bool new_idmap_permitted(struct user_namespace *ns, int cap_setid, | ||
1325 | +static bool new_idmap_permitted(const struct file *file, | ||
1326 | + struct user_namespace *ns, int cap_setid, | ||
1327 | struct uid_gid_map *map); | ||
1328 | |||
1329 | static void set_cred_user_ns(struct cred *cred, struct user_namespace *user_ns) | ||
1330 | @@ -575,10 +576,10 @@ static ssize_t map_write(struct file *file, const char __user *buf, | ||
1331 | if (map->nr_extents != 0) | ||
1332 | goto out; | ||
1333 | |||
1334 | - /* Require the appropriate privilege CAP_SETUID or CAP_SETGID | ||
1335 | - * over the user namespace in order to set the id mapping. | ||
1336 | + /* | ||
1337 | + * Adjusting namespace settings requires capabilities on the target. | ||
1338 | */ | ||
1339 | - if (cap_valid(cap_setid) && !ns_capable(ns, cap_setid)) | ||
1340 | + if (cap_valid(cap_setid) && !file_ns_capable(file, ns, CAP_SYS_ADMIN)) | ||
1341 | goto out; | ||
1342 | |||
1343 | /* Get a buffer */ | ||
1344 | @@ -666,7 +667,7 @@ static ssize_t map_write(struct file *file, const char __user *buf, | ||
1345 | |||
1346 | ret = -EPERM; | ||
1347 | /* Validate the user is allowed to use user id's mapped to. */ | ||
1348 | - if (!new_idmap_permitted(ns, cap_setid, &new_map)) | ||
1349 | + if (!new_idmap_permitted(file, ns, cap_setid, &new_map)) | ||
1350 | goto out; | ||
1351 | |||
1352 | /* Map the lower ids from the parent user namespace to the | ||
1353 | @@ -753,7 +754,8 @@ ssize_t proc_projid_map_write(struct file *file, const char __user *buf, size_t | ||
1354 | &ns->projid_map, &ns->parent->projid_map); | ||
1355 | } | ||
1356 | |||
1357 | -static bool new_idmap_permitted(struct user_namespace *ns, int cap_setid, | ||
1358 | +static bool new_idmap_permitted(const struct file *file, | ||
1359 | + struct user_namespace *ns, int cap_setid, | ||
1360 | struct uid_gid_map *new_map) | ||
1361 | { | ||
1362 | /* Allow mapping to your own filesystem ids */ | ||
1363 | @@ -761,12 +763,12 @@ static bool new_idmap_permitted(struct user_namespace *ns, int cap_setid, | ||
1364 | u32 id = new_map->extent[0].lower_first; | ||
1365 | if (cap_setid == CAP_SETUID) { | ||
1366 | kuid_t uid = make_kuid(ns->parent, id); | ||
1367 | - if (uid_eq(uid, current_fsuid())) | ||
1368 | + if (uid_eq(uid, file->f_cred->fsuid)) | ||
1369 | return true; | ||
1370 | } | ||
1371 | else if (cap_setid == CAP_SETGID) { | ||
1372 | kgid_t gid = make_kgid(ns->parent, id); | ||
1373 | - if (gid_eq(gid, current_fsgid())) | ||
1374 | + if (gid_eq(gid, file->f_cred->fsgid)) | ||
1375 | return true; | ||
1376 | } | ||
1377 | } | ||
1378 | @@ -777,8 +779,10 @@ static bool new_idmap_permitted(struct user_namespace *ns, int cap_setid, | ||
1379 | |||
1380 | /* Allow the specified ids if we have the appropriate capability | ||
1381 | * (CAP_SETUID or CAP_SETGID) over the parent user namespace. | ||
1382 | + * And the opener of the id file also had the approprpiate capability. | ||
1383 | */ | ||
1384 | - if (ns_capable(ns->parent, cap_setid)) | ||
1385 | + if (ns_capable(ns->parent, cap_setid) && | ||
1386 | + file_ns_capable(file, ns->parent, cap_setid)) | ||
1387 | return true; | ||
1388 | |||
1389 | return false; | ||
1390 | diff --git a/mm/hugetlb.c b/mm/hugetlb.c | ||
1391 | index d7cec92..88eb939 100644 | ||
1392 | --- a/mm/hugetlb.c | ||
1393 | +++ b/mm/hugetlb.c | ||
1394 | @@ -2965,7 +2965,17 @@ int follow_hugetlb_page(struct mm_struct *mm, struct vm_area_struct *vma, | ||
1395 | break; | ||
1396 | } | ||
1397 | |||
1398 | - if (absent || | ||
1399 | + /* | ||
1400 | + * We need call hugetlb_fault for both hugepages under migration | ||
1401 | + * (in which case hugetlb_fault waits for the migration,) and | ||
1402 | + * hwpoisoned hugepages (in which case we need to prevent the | ||
1403 | + * caller from accessing to them.) In order to do this, we use | ||
1404 | + * here is_swap_pte instead of is_hugetlb_entry_migration and | ||
1405 | + * is_hugetlb_entry_hwpoisoned. This is because it simply covers | ||
1406 | + * both cases, and because we can't follow correct pages | ||
1407 | + * directly from any kind of swap entries. | ||
1408 | + */ | ||
1409 | + if (absent || is_swap_pte(huge_ptep_get(pte)) || | ||
1410 | ((flags & FOLL_WRITE) && !pte_write(huge_ptep_get(pte)))) { | ||
1411 | int ret; | ||
1412 | |||
1413 | diff --git a/mm/memory.c b/mm/memory.c | ||
1414 | index f8b734a..32a495a 100644 | ||
1415 | --- a/mm/memory.c | ||
1416 | +++ b/mm/memory.c | ||
1417 | @@ -2358,6 +2358,53 @@ int remap_pfn_range(struct vm_area_struct *vma, unsigned long addr, | ||
1418 | } | ||
1419 | EXPORT_SYMBOL(remap_pfn_range); | ||
1420 | |||
1421 | +/** | ||
1422 | + * vm_iomap_memory - remap memory to userspace | ||
1423 | + * @vma: user vma to map to | ||
1424 | + * @start: start of area | ||
1425 | + * @len: size of area | ||
1426 | + * | ||
1427 | + * This is a simplified io_remap_pfn_range() for common driver use. The | ||
1428 | + * driver just needs to give us the physical memory range to be mapped, | ||
1429 | + * we'll figure out the rest from the vma information. | ||
1430 | + * | ||
1431 | + * NOTE! Some drivers might want to tweak vma->vm_page_prot first to get | ||
1432 | + * whatever write-combining details or similar. | ||
1433 | + */ | ||
1434 | +int vm_iomap_memory(struct vm_area_struct *vma, phys_addr_t start, unsigned long len) | ||
1435 | +{ | ||
1436 | + unsigned long vm_len, pfn, pages; | ||
1437 | + | ||
1438 | + /* Check that the physical memory area passed in looks valid */ | ||
1439 | + if (start + len < start) | ||
1440 | + return -EINVAL; | ||
1441 | + /* | ||
1442 | + * You *really* shouldn't map things that aren't page-aligned, | ||
1443 | + * but we've historically allowed it because IO memory might | ||
1444 | + * just have smaller alignment. | ||
1445 | + */ | ||
1446 | + len += start & ~PAGE_MASK; | ||
1447 | + pfn = start >> PAGE_SHIFT; | ||
1448 | + pages = (len + ~PAGE_MASK) >> PAGE_SHIFT; | ||
1449 | + if (pfn + pages < pfn) | ||
1450 | + return -EINVAL; | ||
1451 | + | ||
1452 | + /* We start the mapping 'vm_pgoff' pages into the area */ | ||
1453 | + if (vma->vm_pgoff > pages) | ||
1454 | + return -EINVAL; | ||
1455 | + pfn += vma->vm_pgoff; | ||
1456 | + pages -= vma->vm_pgoff; | ||
1457 | + | ||
1458 | + /* Can we fit all of the mapping? */ | ||
1459 | + vm_len = vma->vm_end - vma->vm_start; | ||
1460 | + if (vm_len >> PAGE_SHIFT > pages) | ||
1461 | + return -EINVAL; | ||
1462 | + | ||
1463 | + /* Ok, let it rip */ | ||
1464 | + return io_remap_pfn_range(vma, vma->vm_start, pfn, vm_len, vma->vm_page_prot); | ||
1465 | +} | ||
1466 | +EXPORT_SYMBOL(vm_iomap_memory); | ||
1467 | + | ||
1468 | static int apply_to_pte_range(struct mm_struct *mm, pmd_t *pmd, | ||
1469 | unsigned long addr, unsigned long end, | ||
1470 | pte_fn_t fn, void *data) | ||
1471 | diff --git a/net/mac80211/mlme.c b/net/mac80211/mlme.c | ||
1472 | index e14e676..a1a7997 100644 | ||
1473 | --- a/net/mac80211/mlme.c | ||
1474 | +++ b/net/mac80211/mlme.c | ||
1475 | @@ -3723,8 +3723,16 @@ int ieee80211_mgd_auth(struct ieee80211_sub_if_data *sdata, | ||
1476 | /* prep auth_data so we don't go into idle on disassoc */ | ||
1477 | ifmgd->auth_data = auth_data; | ||
1478 | |||
1479 | - if (ifmgd->associated) | ||
1480 | - ieee80211_set_disassoc(sdata, 0, 0, false, NULL); | ||
1481 | + if (ifmgd->associated) { | ||
1482 | + u8 frame_buf[IEEE80211_DEAUTH_FRAME_LEN]; | ||
1483 | + | ||
1484 | + ieee80211_set_disassoc(sdata, IEEE80211_STYPE_DEAUTH, | ||
1485 | + WLAN_REASON_UNSPECIFIED, | ||
1486 | + false, frame_buf); | ||
1487 | + | ||
1488 | + __cfg80211_send_deauth(sdata->dev, frame_buf, | ||
1489 | + sizeof(frame_buf)); | ||
1490 | + } | ||
1491 | |||
1492 | sdata_info(sdata, "authenticate with %pM\n", req->bss->bssid); | ||
1493 | |||
1494 | @@ -3783,8 +3791,16 @@ int ieee80211_mgd_assoc(struct ieee80211_sub_if_data *sdata, | ||
1495 | |||
1496 | mutex_lock(&ifmgd->mtx); | ||
1497 | |||
1498 | - if (ifmgd->associated) | ||
1499 | - ieee80211_set_disassoc(sdata, 0, 0, false, NULL); | ||
1500 | + if (ifmgd->associated) { | ||
1501 | + u8 frame_buf[IEEE80211_DEAUTH_FRAME_LEN]; | ||
1502 | + | ||
1503 | + ieee80211_set_disassoc(sdata, IEEE80211_STYPE_DEAUTH, | ||
1504 | + WLAN_REASON_UNSPECIFIED, | ||
1505 | + false, frame_buf); | ||
1506 | + | ||
1507 | + __cfg80211_send_deauth(sdata->dev, frame_buf, | ||
1508 | + sizeof(frame_buf)); | ||
1509 | + } | ||
1510 | |||
1511 | if (ifmgd->auth_data && !ifmgd->auth_data->done) { | ||
1512 | err = -EBUSY; | ||
1513 | diff --git a/sound/core/pcm_native.c b/sound/core/pcm_native.c | ||
1514 | index 09b4286..f4aaf5a 100644 | ||
1515 | --- a/sound/core/pcm_native.c | ||
1516 | +++ b/sound/core/pcm_native.c | ||
1517 | @@ -3222,18 +3222,10 @@ EXPORT_SYMBOL_GPL(snd_pcm_lib_default_mmap); | ||
1518 | int snd_pcm_lib_mmap_iomem(struct snd_pcm_substream *substream, | ||
1519 | struct vm_area_struct *area) | ||
1520 | { | ||
1521 | - long size; | ||
1522 | - unsigned long offset; | ||
1523 | + struct snd_pcm_runtime *runtime = substream->runtime;; | ||
1524 | |||
1525 | area->vm_page_prot = pgprot_noncached(area->vm_page_prot); | ||
1526 | - area->vm_flags |= VM_IO; | ||
1527 | - size = area->vm_end - area->vm_start; | ||
1528 | - offset = area->vm_pgoff << PAGE_SHIFT; | ||
1529 | - if (io_remap_pfn_range(area, area->vm_start, | ||
1530 | - (substream->runtime->dma_addr + offset) >> PAGE_SHIFT, | ||
1531 | - size, area->vm_page_prot)) | ||
1532 | - return -EAGAIN; | ||
1533 | - return 0; | ||
1534 | + return vm_iomap_memory(area, runtime->dma_addr, runtime->dma_bytes); | ||
1535 | } | ||
1536 | |||
1537 | EXPORT_SYMBOL(snd_pcm_lib_mmap_iomem); | ||
1538 | diff --git a/virt/kvm/ioapic.c b/virt/kvm/ioapic.c | ||
1539 | index cfb7e4d..52058f0 100644 | ||
1540 | --- a/virt/kvm/ioapic.c | ||
1541 | +++ b/virt/kvm/ioapic.c | ||
1542 | @@ -73,9 +73,12 @@ static unsigned long ioapic_read_indirect(struct kvm_ioapic *ioapic, | ||
1543 | u32 redir_index = (ioapic->ioregsel - 0x10) >> 1; | ||
1544 | u64 redir_content; | ||
1545 | |||
1546 | - ASSERT(redir_index < IOAPIC_NUM_PINS); | ||
1547 | + if (redir_index < IOAPIC_NUM_PINS) | ||
1548 | + redir_content = | ||
1549 | + ioapic->redirtbl[redir_index].bits; | ||
1550 | + else | ||
1551 | + redir_content = ~0ULL; | ||
1552 | |||
1553 | - redir_content = ioapic->redirtbl[redir_index].bits; | ||
1554 | result = (ioapic->ioregsel & 0x1) ? | ||
1555 | (redir_content >> 32) & 0xffffffff : | ||
1556 | redir_content & 0xffffffff; | ||
1557 | diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c | ||
1558 | index 1cd693a..10afa34 100644 | ||
1559 | --- a/virt/kvm/kvm_main.c | ||
1560 | +++ b/virt/kvm/kvm_main.c | ||
1561 | @@ -1476,21 +1476,38 @@ int kvm_write_guest(struct kvm *kvm, gpa_t gpa, const void *data, | ||
1562 | } | ||
1563 | |||
1564 | int kvm_gfn_to_hva_cache_init(struct kvm *kvm, struct gfn_to_hva_cache *ghc, | ||
1565 | - gpa_t gpa) | ||
1566 | + gpa_t gpa, unsigned long len) | ||
1567 | { | ||
1568 | struct kvm_memslots *slots = kvm_memslots(kvm); | ||
1569 | int offset = offset_in_page(gpa); | ||
1570 | - gfn_t gfn = gpa >> PAGE_SHIFT; | ||
1571 | + gfn_t start_gfn = gpa >> PAGE_SHIFT; | ||
1572 | + gfn_t end_gfn = (gpa + len - 1) >> PAGE_SHIFT; | ||
1573 | + gfn_t nr_pages_needed = end_gfn - start_gfn + 1; | ||
1574 | + gfn_t nr_pages_avail; | ||
1575 | |||
1576 | ghc->gpa = gpa; | ||
1577 | ghc->generation = slots->generation; | ||
1578 | - ghc->memslot = gfn_to_memslot(kvm, gfn); | ||
1579 | - ghc->hva = gfn_to_hva_many(ghc->memslot, gfn, NULL); | ||
1580 | - if (!kvm_is_error_hva(ghc->hva)) | ||
1581 | + ghc->len = len; | ||
1582 | + ghc->memslot = gfn_to_memslot(kvm, start_gfn); | ||
1583 | + ghc->hva = gfn_to_hva_many(ghc->memslot, start_gfn, &nr_pages_avail); | ||
1584 | + if (!kvm_is_error_hva(ghc->hva) && nr_pages_avail >= nr_pages_needed) { | ||
1585 | ghc->hva += offset; | ||
1586 | - else | ||
1587 | - return -EFAULT; | ||
1588 | - | ||
1589 | + } else { | ||
1590 | + /* | ||
1591 | + * If the requested region crosses two memslots, we still | ||
1592 | + * verify that the entire region is valid here. | ||
1593 | + */ | ||
1594 | + while (start_gfn <= end_gfn) { | ||
1595 | + ghc->memslot = gfn_to_memslot(kvm, start_gfn); | ||
1596 | + ghc->hva = gfn_to_hva_many(ghc->memslot, start_gfn, | ||
1597 | + &nr_pages_avail); | ||
1598 | + if (kvm_is_error_hva(ghc->hva)) | ||
1599 | + return -EFAULT; | ||
1600 | + start_gfn += nr_pages_avail; | ||
1601 | + } | ||
1602 | + /* Use the slow path for cross page reads and writes. */ | ||
1603 | + ghc->memslot = NULL; | ||
1604 | + } | ||
1605 | return 0; | ||
1606 | } | ||
1607 | EXPORT_SYMBOL_GPL(kvm_gfn_to_hva_cache_init); | ||
1608 | @@ -1501,8 +1518,13 @@ int kvm_write_guest_cached(struct kvm *kvm, struct gfn_to_hva_cache *ghc, | ||
1609 | struct kvm_memslots *slots = kvm_memslots(kvm); | ||
1610 | int r; | ||
1611 | |||
1612 | + BUG_ON(len > ghc->len); | ||
1613 | + | ||
1614 | if (slots->generation != ghc->generation) | ||
1615 | - kvm_gfn_to_hva_cache_init(kvm, ghc, ghc->gpa); | ||
1616 | + kvm_gfn_to_hva_cache_init(kvm, ghc, ghc->gpa, ghc->len); | ||
1617 | + | ||
1618 | + if (unlikely(!ghc->memslot)) | ||
1619 | + return kvm_write_guest(kvm, ghc->gpa, data, len); | ||
1620 | |||
1621 | if (kvm_is_error_hva(ghc->hva)) | ||
1622 | return -EFAULT; | ||
1623 | @@ -1522,8 +1544,13 @@ int kvm_read_guest_cached(struct kvm *kvm, struct gfn_to_hva_cache *ghc, | ||
1624 | struct kvm_memslots *slots = kvm_memslots(kvm); | ||
1625 | int r; | ||
1626 | |||
1627 | + BUG_ON(len > ghc->len); | ||
1628 | + | ||
1629 | if (slots->generation != ghc->generation) | ||
1630 | - kvm_gfn_to_hva_cache_init(kvm, ghc, ghc->gpa); | ||
1631 | + kvm_gfn_to_hva_cache_init(kvm, ghc, ghc->gpa, ghc->len); | ||
1632 | + | ||
1633 | + if (unlikely(!ghc->memslot)) | ||
1634 | + return kvm_read_guest(kvm, ghc->gpa, data, len); | ||
1635 | |||
1636 | if (kvm_is_error_hva(ghc->hva)) | ||
1637 | return -EFAULT; |