Contents of /trunk/kernel-magellan/patches-3.8/0108-3.8.9-all-fixes.patch
Parent Directory | Revision Log
Revision 2160 -
(show annotations)
(download)
Tue Apr 30 12:25:39 2013 UTC (11 years, 5 months ago) by niro
File size: 57030 byte(s)
Tue Apr 30 12:25:39 2013 UTC (11 years, 5 months ago) by niro
File size: 57030 byte(s)
-linux-3.8.9
1 | 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; |