Contents of /trunk/kernel-lts/patches-3.4/0141-3.4.42-all-fixes.patch
Parent Directory | Revision Log
Revision 2201 -
(show annotations)
(download)
Thu Jun 13 10:35:06 2013 UTC (11 years, 3 months ago) by niro
File size: 38265 byte(s)
Thu Jun 13 10:35:06 2013 UTC (11 years, 3 months ago) by niro
File size: 38265 byte(s)
-linux-3.4.42
1 | diff --git a/arch/arm/kernel/perf_event.c b/arch/arm/kernel/perf_event.c |
2 | index 186c8cb..85d6332 100644 |
3 | --- a/arch/arm/kernel/perf_event.c |
4 | +++ b/arch/arm/kernel/perf_event.c |
5 | @@ -319,7 +319,10 @@ validate_event(struct pmu_hw_events *hw_events, |
6 | struct hw_perf_event fake_event = event->hw; |
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, &fake_event) >= 0; |
17 | diff --git a/arch/arm/mm/cache-feroceon-l2.c b/arch/arm/mm/cache-feroceon-l2.c |
18 | index dd3d591..48bc3c0 100644 |
19 | --- a/arch/arm/mm/cache-feroceon-l2.c |
20 | +++ b/arch/arm/mm/cache-feroceon-l2.c |
21 | @@ -343,6 +343,7 @@ void __init feroceon_l2_init(int __l2_wt_override) |
22 | outer_cache.inv_range = feroceon_l2_inv_range; |
23 | outer_cache.clean_range = feroceon_l2_clean_range; |
24 | outer_cache.flush_range = feroceon_l2_flush_range; |
25 | + outer_cache.inv_all = l2_inv_all; |
26 | |
27 | enable_l2(); |
28 | |
29 | diff --git a/arch/arm/mm/proc-arm920.S b/arch/arm/mm/proc-arm920.S |
30 | index cb941ae..aeeb126 100644 |
31 | --- a/arch/arm/mm/proc-arm920.S |
32 | +++ b/arch/arm/mm/proc-arm920.S |
33 | @@ -383,7 +383,7 @@ ENTRY(cpu_arm920_set_pte_ext) |
34 | /* Suspend/resume support: taken from arch/arm/plat-s3c24xx/sleep.S */ |
35 | .globl cpu_arm920_suspend_size |
36 | .equ cpu_arm920_suspend_size, 4 * 3 |
37 | -#ifdef CONFIG_PM_SLEEP |
38 | +#ifdef CONFIG_ARM_CPU_SUSPEND |
39 | ENTRY(cpu_arm920_do_suspend) |
40 | stmfd sp!, {r4 - r6, lr} |
41 | mrc p15, 0, r4, c13, c0, 0 @ PID |
42 | diff --git a/arch/arm/mm/proc-arm926.S b/arch/arm/mm/proc-arm926.S |
43 | index 820259b..ee29dc4 100644 |
44 | --- a/arch/arm/mm/proc-arm926.S |
45 | +++ b/arch/arm/mm/proc-arm926.S |
46 | @@ -398,7 +398,7 @@ ENTRY(cpu_arm926_set_pte_ext) |
47 | /* Suspend/resume support: taken from arch/arm/plat-s3c24xx/sleep.S */ |
48 | .globl cpu_arm926_suspend_size |
49 | .equ cpu_arm926_suspend_size, 4 * 3 |
50 | -#ifdef CONFIG_PM_SLEEP |
51 | +#ifdef CONFIG_ARM_CPU_SUSPEND |
52 | ENTRY(cpu_arm926_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-sa1100.S b/arch/arm/mm/proc-sa1100.S |
56 | index 3aa0da1..d92dfd0 100644 |
57 | --- a/arch/arm/mm/proc-sa1100.S |
58 | +++ b/arch/arm/mm/proc-sa1100.S |
59 | @@ -172,7 +172,7 @@ ENTRY(cpu_sa1100_set_pte_ext) |
60 | |
61 | .globl cpu_sa1100_suspend_size |
62 | .equ cpu_sa1100_suspend_size, 4 * 3 |
63 | -#ifdef CONFIG_PM_SLEEP |
64 | +#ifdef CONFIG_ARM_CPU_SUSPEND |
65 | ENTRY(cpu_sa1100_do_suspend) |
66 | stmfd sp!, {r4 - r6, lr} |
67 | mrc p15, 0, r4, c3, c0, 0 @ domain ID |
68 | diff --git a/arch/arm/mm/proc-v6.S b/arch/arm/mm/proc-v6.S |
69 | index 5900cd5..897486c 100644 |
70 | --- a/arch/arm/mm/proc-v6.S |
71 | +++ b/arch/arm/mm/proc-v6.S |
72 | @@ -132,7 +132,7 @@ ENTRY(cpu_v6_set_pte_ext) |
73 | /* Suspend/resume support: taken from arch/arm/mach-s3c64xx/sleep.S */ |
74 | .globl cpu_v6_suspend_size |
75 | .equ cpu_v6_suspend_size, 4 * 6 |
76 | -#ifdef CONFIG_PM_SLEEP |
77 | +#ifdef CONFIG_ARM_CPU_SUSPEND |
78 | ENTRY(cpu_v6_do_suspend) |
79 | stmfd sp!, {r4 - r9, lr} |
80 | mrc p15, 0, r4, c13, c0, 0 @ FCSE/PID |
81 | diff --git a/arch/arm/mm/proc-xsc3.S b/arch/arm/mm/proc-xsc3.S |
82 | index b0d5786..a2d1e86 100644 |
83 | --- a/arch/arm/mm/proc-xsc3.S |
84 | +++ b/arch/arm/mm/proc-xsc3.S |
85 | @@ -410,7 +410,7 @@ ENTRY(cpu_xsc3_set_pte_ext) |
86 | |
87 | .globl cpu_xsc3_suspend_size |
88 | .equ cpu_xsc3_suspend_size, 4 * 6 |
89 | -#ifdef CONFIG_PM_SLEEP |
90 | +#ifdef CONFIG_ARM_CPU_SUSPEND |
91 | ENTRY(cpu_xsc3_do_suspend) |
92 | stmfd sp!, {r4 - r9, lr} |
93 | mrc p14, 0, r4, c6, c0, 0 @ clock configuration, for turbo mode |
94 | diff --git a/arch/arm/mm/proc-xscale.S b/arch/arm/mm/proc-xscale.S |
95 | index 4ffebaa..9882153 100644 |
96 | --- a/arch/arm/mm/proc-xscale.S |
97 | +++ b/arch/arm/mm/proc-xscale.S |
98 | @@ -524,7 +524,7 @@ ENTRY(cpu_xscale_set_pte_ext) |
99 | |
100 | .globl cpu_xscale_suspend_size |
101 | .equ cpu_xscale_suspend_size, 4 * 6 |
102 | -#ifdef CONFIG_PM_SLEEP |
103 | +#ifdef CONFIG_ARM_CPU_SUSPEND |
104 | ENTRY(cpu_xscale_do_suspend) |
105 | stmfd sp!, {r4 - r9, lr} |
106 | mrc p14, 0, r4, c6, c0, 0 @ clock configuration, for turbo mode |
107 | diff --git a/arch/x86/include/asm/kvm_host.h b/arch/x86/include/asm/kvm_host.h |
108 | index e216ba0..d57eacb 100644 |
109 | --- a/arch/x86/include/asm/kvm_host.h |
110 | +++ b/arch/x86/include/asm/kvm_host.h |
111 | @@ -407,8 +407,8 @@ struct kvm_vcpu_arch { |
112 | gpa_t time; |
113 | struct pvclock_vcpu_time_info hv_clock; |
114 | unsigned int hw_tsc_khz; |
115 | - unsigned int time_offset; |
116 | - struct page *time_page; |
117 | + struct gfn_to_hva_cache pv_time; |
118 | + bool pv_time_enabled; |
119 | |
120 | struct { |
121 | u64 msr_val; |
122 | diff --git a/arch/x86/kernel/cpu/perf_event_intel.c b/arch/x86/kernel/cpu/perf_event_intel.c |
123 | index 26b3e2f..268b245 100644 |
124 | --- a/arch/x86/kernel/cpu/perf_event_intel.c |
125 | +++ b/arch/x86/kernel/cpu/perf_event_intel.c |
126 | @@ -126,8 +126,14 @@ static struct event_constraint intel_gen_event_constraints[] __read_mostly = |
127 | }; |
128 | |
129 | static struct extra_reg intel_snb_extra_regs[] __read_mostly = { |
130 | - INTEL_EVENT_EXTRA_REG(0xb7, MSR_OFFCORE_RSP_0, 0x3fffffffffull, RSP_0), |
131 | - INTEL_EVENT_EXTRA_REG(0xbb, MSR_OFFCORE_RSP_1, 0x3fffffffffull, RSP_1), |
132 | + INTEL_EVENT_EXTRA_REG(0xb7, MSR_OFFCORE_RSP_0, 0x3f807f8fffull, RSP_0), |
133 | + INTEL_EVENT_EXTRA_REG(0xbb, MSR_OFFCORE_RSP_1, 0x3f807f8fffull, RSP_1), |
134 | + EVENT_EXTRA_END |
135 | +}; |
136 | + |
137 | +static struct extra_reg intel_snbep_extra_regs[] __read_mostly = { |
138 | + INTEL_EVENT_EXTRA_REG(0xb7, MSR_OFFCORE_RSP_0, 0x3fffff8fffull, RSP_0), |
139 | + INTEL_EVENT_EXTRA_REG(0xbb, MSR_OFFCORE_RSP_1, 0x3fffff8fffull, RSP_1), |
140 | EVENT_EXTRA_END |
141 | }; |
142 | |
143 | @@ -1851,7 +1857,10 @@ __init int intel_pmu_init(void) |
144 | |
145 | x86_pmu.event_constraints = intel_snb_event_constraints; |
146 | x86_pmu.pebs_constraints = intel_snb_pebs_event_constraints; |
147 | - x86_pmu.extra_regs = intel_snb_extra_regs; |
148 | + if (boot_cpu_data.x86_model == 45) |
149 | + x86_pmu.extra_regs = intel_snbep_extra_regs; |
150 | + else |
151 | + x86_pmu.extra_regs = intel_snb_extra_regs; |
152 | /* all extra regs are per-cpu when HT is on */ |
153 | x86_pmu.er_flags |= ERF_HAS_RSP_1; |
154 | x86_pmu.er_flags |= ERF_NO_HT_SHARING; |
155 | diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c |
156 | index e28fb97..b27b452 100644 |
157 | --- a/arch/x86/kvm/x86.c |
158 | +++ b/arch/x86/kvm/x86.c |
159 | @@ -1114,7 +1114,6 @@ static int kvm_guest_time_update(struct kvm_vcpu *v) |
160 | { |
161 | unsigned long flags; |
162 | struct kvm_vcpu_arch *vcpu = &v->arch; |
163 | - void *shared_kaddr; |
164 | unsigned long this_tsc_khz; |
165 | s64 kernel_ns, max_kernel_ns; |
166 | u64 tsc_timestamp; |
167 | @@ -1150,7 +1149,7 @@ static int kvm_guest_time_update(struct kvm_vcpu *v) |
168 | |
169 | local_irq_restore(flags); |
170 | |
171 | - if (!vcpu->time_page) |
172 | + if (!vcpu->pv_time_enabled) |
173 | return 0; |
174 | |
175 | /* |
176 | @@ -1208,14 +1207,9 @@ static int kvm_guest_time_update(struct kvm_vcpu *v) |
177 | */ |
178 | vcpu->hv_clock.version += 2; |
179 | |
180 | - shared_kaddr = kmap_atomic(vcpu->time_page); |
181 | - |
182 | - memcpy(shared_kaddr + vcpu->time_offset, &vcpu->hv_clock, |
183 | - sizeof(vcpu->hv_clock)); |
184 | - |
185 | - kunmap_atomic(shared_kaddr); |
186 | - |
187 | - mark_page_dirty(v->kvm, vcpu->time >> PAGE_SHIFT); |
188 | + kvm_write_guest_cached(v->kvm, &vcpu->pv_time, |
189 | + &vcpu->hv_clock, |
190 | + sizeof(vcpu->hv_clock)); |
191 | return 0; |
192 | } |
193 | |
194 | @@ -1494,7 +1488,8 @@ static int kvm_pv_enable_async_pf(struct kvm_vcpu *vcpu, u64 data) |
195 | return 0; |
196 | } |
197 | |
198 | - if (kvm_gfn_to_hva_cache_init(vcpu->kvm, &vcpu->arch.apf.data, gpa)) |
199 | + if (kvm_gfn_to_hva_cache_init(vcpu->kvm, &vcpu->arch.apf.data, gpa, |
200 | + sizeof(u32))) |
201 | return 1; |
202 | |
203 | vcpu->arch.apf.send_user_only = !(data & KVM_ASYNC_PF_SEND_ALWAYS); |
204 | @@ -1504,10 +1499,7 @@ static int kvm_pv_enable_async_pf(struct kvm_vcpu *vcpu, u64 data) |
205 | |
206 | static void kvmclock_reset(struct kvm_vcpu *vcpu) |
207 | { |
208 | - if (vcpu->arch.time_page) { |
209 | - kvm_release_page_dirty(vcpu->arch.time_page); |
210 | - vcpu->arch.time_page = NULL; |
211 | - } |
212 | + vcpu->arch.pv_time_enabled = false; |
213 | } |
214 | |
215 | static void accumulate_steal_time(struct kvm_vcpu *vcpu) |
216 | @@ -1602,6 +1594,7 @@ int kvm_set_msr_common(struct kvm_vcpu *vcpu, u32 msr, u64 data) |
217 | break; |
218 | case MSR_KVM_SYSTEM_TIME_NEW: |
219 | case MSR_KVM_SYSTEM_TIME: { |
220 | + u64 gpa_offset; |
221 | kvmclock_reset(vcpu); |
222 | |
223 | vcpu->arch.time = data; |
224 | @@ -1611,16 +1604,14 @@ int kvm_set_msr_common(struct kvm_vcpu *vcpu, u32 msr, u64 data) |
225 | if (!(data & 1)) |
226 | break; |
227 | |
228 | - /* ...but clean it before doing the actual write */ |
229 | - vcpu->arch.time_offset = data & ~(PAGE_MASK | 1); |
230 | + gpa_offset = data & ~(PAGE_MASK | 1); |
231 | |
232 | - vcpu->arch.time_page = |
233 | - gfn_to_page(vcpu->kvm, data >> PAGE_SHIFT); |
234 | - |
235 | - if (is_error_page(vcpu->arch.time_page)) { |
236 | - kvm_release_page_clean(vcpu->arch.time_page); |
237 | - vcpu->arch.time_page = NULL; |
238 | - } |
239 | + if (kvm_gfn_to_hva_cache_init(vcpu->kvm, |
240 | + &vcpu->arch.pv_time, data & ~1ULL, |
241 | + sizeof(struct pvclock_vcpu_time_info))) |
242 | + vcpu->arch.pv_time_enabled = false; |
243 | + else |
244 | + vcpu->arch.pv_time_enabled = true; |
245 | break; |
246 | } |
247 | case MSR_KVM_ASYNC_PF_EN: |
248 | @@ -1636,7 +1627,8 @@ int kvm_set_msr_common(struct kvm_vcpu *vcpu, u32 msr, u64 data) |
249 | return 1; |
250 | |
251 | if (kvm_gfn_to_hva_cache_init(vcpu->kvm, &vcpu->arch.st.stime, |
252 | - data & KVM_STEAL_VALID_BITS)) |
253 | + data & KVM_STEAL_VALID_BITS, |
254 | + sizeof(struct kvm_steal_time))) |
255 | return 1; |
256 | |
257 | vcpu->arch.st.msr_val = data; |
258 | @@ -6167,6 +6159,7 @@ int kvm_arch_vcpu_init(struct kvm_vcpu *vcpu) |
259 | if (!zalloc_cpumask_var(&vcpu->arch.wbinvd_dirty_mask, GFP_KERNEL)) |
260 | goto fail_free_mce_banks; |
261 | |
262 | + vcpu->arch.pv_time_enabled = false; |
263 | kvm_async_pf_hash_reset(vcpu); |
264 | kvm_pmu_init(vcpu); |
265 | |
266 | diff --git a/crypto/algif_hash.c b/crypto/algif_hash.c |
267 | index ef5356c..0262210 100644 |
268 | --- a/crypto/algif_hash.c |
269 | +++ b/crypto/algif_hash.c |
270 | @@ -161,6 +161,8 @@ static int hash_recvmsg(struct kiocb *unused, struct socket *sock, |
271 | else if (len < ds) |
272 | msg->msg_flags |= MSG_TRUNC; |
273 | |
274 | + msg->msg_namelen = 0; |
275 | + |
276 | lock_sock(sk); |
277 | if (ctx->more) { |
278 | ctx->more = 0; |
279 | diff --git a/crypto/algif_skcipher.c b/crypto/algif_skcipher.c |
280 | index 6a6dfc0..a1c4f0a 100644 |
281 | --- a/crypto/algif_skcipher.c |
282 | +++ b/crypto/algif_skcipher.c |
283 | @@ -432,6 +432,7 @@ static int skcipher_recvmsg(struct kiocb *unused, struct socket *sock, |
284 | long copied = 0; |
285 | |
286 | lock_sock(sk); |
287 | + msg->msg_namelen = 0; |
288 | for (iov = msg->msg_iov, iovlen = msg->msg_iovlen; iovlen > 0; |
289 | iovlen--, iov++) { |
290 | unsigned long seglen = iov->iov_len; |
291 | diff --git a/drivers/char/hpet.c b/drivers/char/hpet.c |
292 | index dfd7876..0ff5c2e 100644 |
293 | --- a/drivers/char/hpet.c |
294 | +++ b/drivers/char/hpet.c |
295 | @@ -373,26 +373,14 @@ static int hpet_mmap(struct file *file, struct vm_area_struct *vma) |
296 | struct hpet_dev *devp; |
297 | unsigned long addr; |
298 | |
299 | - if (((vma->vm_end - vma->vm_start) != PAGE_SIZE) || vma->vm_pgoff) |
300 | - return -EINVAL; |
301 | - |
302 | devp = file->private_data; |
303 | addr = devp->hd_hpets->hp_hpet_phys; |
304 | |
305 | if (addr & (PAGE_SIZE - 1)) |
306 | return -ENOSYS; |
307 | |
308 | - vma->vm_flags |= VM_IO; |
309 | vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot); |
310 | - |
311 | - if (io_remap_pfn_range(vma, vma->vm_start, addr >> PAGE_SHIFT, |
312 | - PAGE_SIZE, vma->vm_page_prot)) { |
313 | - printk(KERN_ERR "%s: io_remap_pfn_range failed\n", |
314 | - __func__); |
315 | - return -EAGAIN; |
316 | - } |
317 | - |
318 | - return 0; |
319 | + return vm_iomap_memory(vma, addr, PAGE_SIZE); |
320 | #else |
321 | return -ENOSYS; |
322 | #endif |
323 | diff --git a/drivers/gpu/vga/vga_switcheroo.c b/drivers/gpu/vga/vga_switcheroo.c |
324 | index 58434e8..37fe246 100644 |
325 | --- a/drivers/gpu/vga/vga_switcheroo.c |
326 | +++ b/drivers/gpu/vga/vga_switcheroo.c |
327 | @@ -26,6 +26,7 @@ |
328 | #include <linux/fb.h> |
329 | |
330 | #include <linux/pci.h> |
331 | +#include <linux/console.h> |
332 | #include <linux/vga_switcheroo.h> |
333 | |
334 | struct vga_switcheroo_client { |
335 | @@ -256,8 +257,10 @@ static int vga_switchto_stage2(struct vga_switcheroo_client *new_client) |
336 | |
337 | if (new_client->fb_info) { |
338 | struct fb_event event; |
339 | + console_lock(); |
340 | event.info = new_client->fb_info; |
341 | fb_notifier_call_chain(FB_EVENT_REMAP_ALL_CONSOLE, &event); |
342 | + console_unlock(); |
343 | } |
344 | |
345 | ret = vgasr_priv.handler->switchto(new_client->id); |
346 | diff --git a/drivers/mtd/mtdchar.c b/drivers/mtd/mtdchar.c |
347 | index 76afcb4..6e3d6dc 100644 |
348 | --- a/drivers/mtd/mtdchar.c |
349 | +++ b/drivers/mtd/mtdchar.c |
350 | @@ -1159,45 +1159,17 @@ static int mtdchar_mmap(struct file *file, struct vm_area_struct *vma) |
351 | struct mtd_file_info *mfi = file->private_data; |
352 | struct mtd_info *mtd = mfi->mtd; |
353 | struct map_info *map = mtd->priv; |
354 | - resource_size_t start, off; |
355 | - unsigned long len, vma_len; |
356 | |
357 | /* This is broken because it assumes the MTD device is map-based |
358 | and that mtd->priv is a valid struct map_info. It should be |
359 | replaced with something that uses the mtd_get_unmapped_area() |
360 | operation properly. */ |
361 | if (0 /*mtd->type == MTD_RAM || mtd->type == MTD_ROM*/) { |
362 | - off = get_vm_offset(vma); |
363 | - start = map->phys; |
364 | - len = PAGE_ALIGN((start & ~PAGE_MASK) + map->size); |
365 | - start &= PAGE_MASK; |
366 | - vma_len = get_vm_size(vma); |
367 | - |
368 | - /* Overflow in off+len? */ |
369 | - if (vma_len + off < off) |
370 | - return -EINVAL; |
371 | - /* Does it fit in the mapping? */ |
372 | - if (vma_len + off > len) |
373 | - return -EINVAL; |
374 | - |
375 | - off += start; |
376 | - /* Did that overflow? */ |
377 | - if (off < start) |
378 | - return -EINVAL; |
379 | - if (set_vm_offset(vma, off) < 0) |
380 | - return -EINVAL; |
381 | - vma->vm_flags |= VM_IO | VM_RESERVED; |
382 | - |
383 | #ifdef pgprot_noncached |
384 | - if (file->f_flags & O_DSYNC || off >= __pa(high_memory)) |
385 | + if (file->f_flags & O_DSYNC || map->phys >= __pa(high_memory)) |
386 | vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot); |
387 | #endif |
388 | - if (io_remap_pfn_range(vma, vma->vm_start, off >> PAGE_SHIFT, |
389 | - vma->vm_end - vma->vm_start, |
390 | - vma->vm_page_prot)) |
391 | - return -EAGAIN; |
392 | - |
393 | - return 0; |
394 | + return vm_iomap_memory(vma, map->phys, map->size); |
395 | } |
396 | return -ENOSYS; |
397 | #else |
398 | diff --git a/drivers/net/can/sja1000/sja1000_of_platform.c b/drivers/net/can/sja1000/sja1000_of_platform.c |
399 | index f2683eb..c505b55 100644 |
400 | --- a/drivers/net/can/sja1000/sja1000_of_platform.c |
401 | +++ b/drivers/net/can/sja1000/sja1000_of_platform.c |
402 | @@ -94,8 +94,8 @@ static int __devinit sja1000_ofp_probe(struct platform_device *ofdev) |
403 | struct net_device *dev; |
404 | struct sja1000_priv *priv; |
405 | struct resource res; |
406 | - const u32 *prop; |
407 | - int err, irq, res_size, prop_size; |
408 | + u32 prop; |
409 | + int err, irq, res_size; |
410 | void __iomem *base; |
411 | |
412 | err = of_address_to_resource(np, 0, &res); |
413 | @@ -136,27 +136,27 @@ static int __devinit sja1000_ofp_probe(struct platform_device *ofdev) |
414 | priv->read_reg = sja1000_ofp_read_reg; |
415 | priv->write_reg = sja1000_ofp_write_reg; |
416 | |
417 | - prop = of_get_property(np, "nxp,external-clock-frequency", &prop_size); |
418 | - if (prop && (prop_size == sizeof(u32))) |
419 | - priv->can.clock.freq = *prop / 2; |
420 | + err = of_property_read_u32(np, "nxp,external-clock-frequency", &prop); |
421 | + if (!err) |
422 | + priv->can.clock.freq = prop / 2; |
423 | else |
424 | priv->can.clock.freq = SJA1000_OFP_CAN_CLOCK; /* default */ |
425 | |
426 | - prop = of_get_property(np, "nxp,tx-output-mode", &prop_size); |
427 | - if (prop && (prop_size == sizeof(u32))) |
428 | - priv->ocr |= *prop & OCR_MODE_MASK; |
429 | + err = of_property_read_u32(np, "nxp,tx-output-mode", &prop); |
430 | + if (!err) |
431 | + priv->ocr |= prop & OCR_MODE_MASK; |
432 | else |
433 | priv->ocr |= OCR_MODE_NORMAL; /* default */ |
434 | |
435 | - prop = of_get_property(np, "nxp,tx-output-config", &prop_size); |
436 | - if (prop && (prop_size == sizeof(u32))) |
437 | - priv->ocr |= (*prop << OCR_TX_SHIFT) & OCR_TX_MASK; |
438 | + err = of_property_read_u32(np, "nxp,tx-output-config", &prop); |
439 | + if (!err) |
440 | + priv->ocr |= (prop << OCR_TX_SHIFT) & OCR_TX_MASK; |
441 | else |
442 | priv->ocr |= OCR_TX0_PULLDOWN; /* default */ |
443 | |
444 | - prop = of_get_property(np, "nxp,clock-out-frequency", &prop_size); |
445 | - if (prop && (prop_size == sizeof(u32)) && *prop) { |
446 | - u32 divider = priv->can.clock.freq * 2 / *prop; |
447 | + err = of_property_read_u32(np, "nxp,clock-out-frequency", &prop); |
448 | + if (!err && prop) { |
449 | + u32 divider = priv->can.clock.freq * 2 / prop; |
450 | |
451 | if (divider > 1) |
452 | priv->cdr |= divider / 2 - 1; |
453 | @@ -166,8 +166,7 @@ static int __devinit sja1000_ofp_probe(struct platform_device *ofdev) |
454 | priv->cdr |= CDR_CLK_OFF; /* default */ |
455 | } |
456 | |
457 | - prop = of_get_property(np, "nxp,no-comparator-bypass", NULL); |
458 | - if (!prop) |
459 | + if (!of_property_read_bool(np, "nxp,no-comparator-bypass")) |
460 | priv->cdr |= CDR_CBP; /* default */ |
461 | |
462 | priv->irq_flags = IRQF_SHARED; |
463 | diff --git a/drivers/net/wireless/ath/ath9k/ar9580_1p0_initvals.h b/drivers/net/wireless/ath/ath9k/ar9580_1p0_initvals.h |
464 | index 06b3f0d..c16bea4 100644 |
465 | --- a/drivers/net/wireless/ath/ath9k/ar9580_1p0_initvals.h |
466 | +++ b/drivers/net/wireless/ath/ath9k/ar9580_1p0_initvals.h |
467 | @@ -648,7 +648,7 @@ static const u32 ar9580_1p0_mac_core[][2] = { |
468 | {0x00008258, 0x00000000}, |
469 | {0x0000825c, 0x40000000}, |
470 | {0x00008260, 0x00080922}, |
471 | - {0x00008264, 0x9bc00010}, |
472 | + {0x00008264, 0x9d400010}, |
473 | {0x00008268, 0xffffffff}, |
474 | {0x0000826c, 0x0000ffff}, |
475 | {0x00008270, 0x00000000}, |
476 | diff --git a/drivers/net/wireless/ath/ath9k/htc_drv_init.c b/drivers/net/wireless/ath/ath9k/htc_drv_init.c |
477 | index de5ee15..41c5237 100644 |
478 | --- a/drivers/net/wireless/ath/ath9k/htc_drv_init.c |
479 | +++ b/drivers/net/wireless/ath/ath9k/htc_drv_init.c |
480 | @@ -771,7 +771,7 @@ static int ath9k_init_firmware_version(struct ath9k_htc_priv *priv) |
481 | * required version. |
482 | */ |
483 | if (priv->fw_version_major != MAJOR_VERSION_REQ || |
484 | - priv->fw_version_minor != MINOR_VERSION_REQ) { |
485 | + priv->fw_version_minor < MINOR_VERSION_REQ) { |
486 | dev_err(priv->dev, "ath9k_htc: Please upgrade to FW version %d.%d\n", |
487 | MAJOR_VERSION_REQ, MINOR_VERSION_REQ); |
488 | return -EINVAL; |
489 | diff --git a/drivers/net/wireless/b43/phy_n.c b/drivers/net/wireless/b43/phy_n.c |
490 | index 6be2f73..4ce3e1f 100644 |
491 | --- a/drivers/net/wireless/b43/phy_n.c |
492 | +++ b/drivers/net/wireless/b43/phy_n.c |
493 | @@ -4582,7 +4582,8 @@ static void b43_nphy_pmu_spur_avoid(struct b43_wldev *dev, bool avoid) |
494 | #endif |
495 | #ifdef CONFIG_B43_SSB |
496 | case B43_BUS_SSB: |
497 | - /* FIXME */ |
498 | + ssb_pmu_spuravoid_pllupdate(&dev->dev->sdev->bus->chipco, |
499 | + avoid); |
500 | break; |
501 | #endif |
502 | } |
503 | diff --git a/drivers/ssb/driver_chipcommon_pmu.c b/drivers/ssb/driver_chipcommon_pmu.c |
504 | index b58fef7..1fb9b22 100644 |
505 | --- a/drivers/ssb/driver_chipcommon_pmu.c |
506 | +++ b/drivers/ssb/driver_chipcommon_pmu.c |
507 | @@ -645,3 +645,32 @@ u32 ssb_pmu_get_controlclock(struct ssb_chipcommon *cc) |
508 | return 0; |
509 | } |
510 | } |
511 | + |
512 | +void ssb_pmu_spuravoid_pllupdate(struct ssb_chipcommon *cc, int spuravoid) |
513 | +{ |
514 | + u32 pmu_ctl = 0; |
515 | + |
516 | + switch (cc->dev->bus->chip_id) { |
517 | + case 0x4322: |
518 | + ssb_chipco_pll_write(cc, SSB_PMU1_PLLCTL0, 0x11100070); |
519 | + ssb_chipco_pll_write(cc, SSB_PMU1_PLLCTL1, 0x1014140a); |
520 | + ssb_chipco_pll_write(cc, SSB_PMU1_PLLCTL5, 0x88888854); |
521 | + if (spuravoid == 1) |
522 | + ssb_chipco_pll_write(cc, SSB_PMU1_PLLCTL2, 0x05201828); |
523 | + else |
524 | + ssb_chipco_pll_write(cc, SSB_PMU1_PLLCTL2, 0x05001828); |
525 | + pmu_ctl = SSB_CHIPCO_PMU_CTL_PLL_UPD; |
526 | + break; |
527 | + case 43222: |
528 | + /* TODO: BCM43222 requires updating PLLs too */ |
529 | + return; |
530 | + default: |
531 | + ssb_printk(KERN_ERR PFX |
532 | + "Unknown spuravoidance settings for chip 0x%04X, not changing PLL\n", |
533 | + cc->dev->bus->chip_id); |
534 | + return; |
535 | + } |
536 | + |
537 | + chipco_set32(cc, SSB_CHIPCO_PMU_CTL, pmu_ctl); |
538 | +} |
539 | +EXPORT_SYMBOL_GPL(ssb_pmu_spuravoid_pllupdate); |
540 | diff --git a/drivers/video/console/fbcon.c b/drivers/video/console/fbcon.c |
541 | index 5bf163e..18ded2d 100644 |
542 | --- a/drivers/video/console/fbcon.c |
543 | +++ b/drivers/video/console/fbcon.c |
544 | @@ -842,6 +842,8 @@ static void con2fb_init_display(struct vc_data *vc, struct fb_info *info, |
545 | * |
546 | * Maps a virtual console @unit to a frame buffer device |
547 | * @newidx. |
548 | + * |
549 | + * This should be called with the console lock held. |
550 | */ |
551 | static int set_con2fb_map(int unit, int newidx, int user) |
552 | { |
553 | @@ -859,7 +861,7 @@ static int set_con2fb_map(int unit, int newidx, int user) |
554 | |
555 | if (!search_for_mapped_con() || !con_is_bound(&fb_con)) { |
556 | info_idx = newidx; |
557 | - return fbcon_takeover(0); |
558 | + return do_fbcon_takeover(0); |
559 | } |
560 | |
561 | if (oldidx != -1) |
562 | @@ -867,7 +869,6 @@ static int set_con2fb_map(int unit, int newidx, int user) |
563 | |
564 | found = search_fb_in_map(newidx); |
565 | |
566 | - console_lock(); |
567 | con2fb_map[unit] = newidx; |
568 | if (!err && !found) |
569 | err = con2fb_acquire_newinfo(vc, info, unit, oldidx); |
570 | @@ -894,7 +895,6 @@ static int set_con2fb_map(int unit, int newidx, int user) |
571 | if (!search_fb_in_map(info_idx)) |
572 | info_idx = newidx; |
573 | |
574 | - console_unlock(); |
575 | return err; |
576 | } |
577 | |
578 | @@ -3025,6 +3025,7 @@ static inline int fbcon_unbind(void) |
579 | } |
580 | #endif /* CONFIG_VT_HW_CONSOLE_BINDING */ |
581 | |
582 | +/* called with console_lock held */ |
583 | static int fbcon_fb_unbind(int idx) |
584 | { |
585 | int i, new_idx = -1, ret = 0; |
586 | @@ -3051,6 +3052,7 @@ static int fbcon_fb_unbind(int idx) |
587 | return ret; |
588 | } |
589 | |
590 | +/* called with console_lock held */ |
591 | static int fbcon_fb_unregistered(struct fb_info *info) |
592 | { |
593 | int i, idx; |
594 | @@ -3088,6 +3090,7 @@ static int fbcon_fb_unregistered(struct fb_info *info) |
595 | return 0; |
596 | } |
597 | |
598 | +/* called with console_lock held */ |
599 | static void fbcon_remap_all(int idx) |
600 | { |
601 | int i; |
602 | @@ -3132,6 +3135,7 @@ static inline void fbcon_select_primary(struct fb_info *info) |
603 | } |
604 | #endif /* CONFIG_FRAMEBUFFER_DETECT_PRIMARY */ |
605 | |
606 | +/* called with console_lock held */ |
607 | static int fbcon_fb_registered(struct fb_info *info) |
608 | { |
609 | int ret = 0, i, idx; |
610 | @@ -3284,6 +3288,7 @@ static int fbcon_event_notify(struct notifier_block *self, |
611 | ret = fbcon_fb_unregistered(info); |
612 | break; |
613 | case FB_EVENT_SET_CONSOLE_MAP: |
614 | + /* called with console lock held */ |
615 | con2fb = event->data; |
616 | ret = set_con2fb_map(con2fb->console - 1, |
617 | con2fb->framebuffer, 1); |
618 | diff --git a/drivers/video/fbmem.c b/drivers/video/fbmem.c |
619 | index 90f1315..5641a22 100644 |
620 | --- a/drivers/video/fbmem.c |
621 | +++ b/drivers/video/fbmem.c |
622 | @@ -1168,8 +1168,10 @@ static long do_fb_ioctl(struct fb_info *info, unsigned int cmd, |
623 | event.data = &con2fb; |
624 | if (!lock_fb_info(info)) |
625 | return -ENODEV; |
626 | + console_lock(); |
627 | event.info = info; |
628 | ret = fb_notifier_call_chain(FB_EVENT_SET_CONSOLE_MAP, &event); |
629 | + console_unlock(); |
630 | unlock_fb_info(info); |
631 | break; |
632 | case FBIOBLANK: |
633 | @@ -1362,15 +1364,12 @@ fb_mmap(struct file *file, struct vm_area_struct * vma) |
634 | { |
635 | struct fb_info *info = file_fb_info(file); |
636 | struct fb_ops *fb; |
637 | - unsigned long off; |
638 | + unsigned long mmio_pgoff; |
639 | unsigned long start; |
640 | u32 len; |
641 | |
642 | if (!info) |
643 | return -ENODEV; |
644 | - if (vma->vm_pgoff > (~0UL >> PAGE_SHIFT)) |
645 | - return -EINVAL; |
646 | - off = vma->vm_pgoff << PAGE_SHIFT; |
647 | fb = info->fbops; |
648 | if (!fb) |
649 | return -ENODEV; |
650 | @@ -1382,33 +1381,24 @@ fb_mmap(struct file *file, struct vm_area_struct * vma) |
651 | return res; |
652 | } |
653 | |
654 | - /* frame buffer memory */ |
655 | + /* |
656 | + * Ugh. This can be either the frame buffer mapping, or |
657 | + * if pgoff points past it, the mmio mapping. |
658 | + */ |
659 | start = info->fix.smem_start; |
660 | - len = PAGE_ALIGN((start & ~PAGE_MASK) + info->fix.smem_len); |
661 | - if (off >= len) { |
662 | - /* memory mapped io */ |
663 | - off -= len; |
664 | - if (info->var.accel_flags) { |
665 | - mutex_unlock(&info->mm_lock); |
666 | - return -EINVAL; |
667 | - } |
668 | + len = info->fix.smem_len; |
669 | + mmio_pgoff = PAGE_ALIGN((start & ~PAGE_MASK) + len) >> PAGE_SHIFT; |
670 | + if (vma->vm_pgoff >= mmio_pgoff) { |
671 | + vma->vm_pgoff -= mmio_pgoff; |
672 | start = info->fix.mmio_start; |
673 | - len = PAGE_ALIGN((start & ~PAGE_MASK) + info->fix.mmio_len); |
674 | + len = info->fix.mmio_len; |
675 | } |
676 | mutex_unlock(&info->mm_lock); |
677 | - start &= PAGE_MASK; |
678 | - if ((vma->vm_end - vma->vm_start + off) > len) |
679 | - return -EINVAL; |
680 | - off += start; |
681 | - vma->vm_pgoff = off >> PAGE_SHIFT; |
682 | - /* This is an IO map - tell maydump to skip this VMA */ |
683 | - vma->vm_flags |= VM_IO | VM_RESERVED; |
684 | + |
685 | vma->vm_page_prot = vm_get_page_prot(vma->vm_flags); |
686 | - fb_pgprotect(file, vma, off); |
687 | - if (io_remap_pfn_range(vma, vma->vm_start, off >> PAGE_SHIFT, |
688 | - vma->vm_end - vma->vm_start, vma->vm_page_prot)) |
689 | - return -EAGAIN; |
690 | - return 0; |
691 | + fb_pgprotect(file, vma, start); |
692 | + |
693 | + return vm_iomap_memory(vma, start, len); |
694 | } |
695 | |
696 | static int |
697 | diff --git a/fs/btrfs/tree-log.c b/fs/btrfs/tree-log.c |
698 | index dce89da..3ef7f38 100644 |
699 | --- a/fs/btrfs/tree-log.c |
700 | +++ b/fs/btrfs/tree-log.c |
701 | @@ -315,6 +315,7 @@ static noinline int overwrite_item(struct btrfs_trans_handle *trans, |
702 | unsigned long src_ptr; |
703 | unsigned long dst_ptr; |
704 | int overwrite_root = 0; |
705 | + bool inode_item = key->type == BTRFS_INODE_ITEM_KEY; |
706 | |
707 | if (root->root_key.objectid != BTRFS_TREE_LOG_OBJECTID) |
708 | overwrite_root = 1; |
709 | @@ -324,6 +325,9 @@ static noinline int overwrite_item(struct btrfs_trans_handle *trans, |
710 | |
711 | /* look for the key in the destination tree */ |
712 | ret = btrfs_search_slot(NULL, root, key, path, 0, 0); |
713 | + if (ret < 0) |
714 | + return ret; |
715 | + |
716 | if (ret == 0) { |
717 | char *src_copy; |
718 | char *dst_copy; |
719 | @@ -365,6 +369,30 @@ static noinline int overwrite_item(struct btrfs_trans_handle *trans, |
720 | return 0; |
721 | } |
722 | |
723 | + /* |
724 | + * We need to load the old nbytes into the inode so when we |
725 | + * replay the extents we've logged we get the right nbytes. |
726 | + */ |
727 | + if (inode_item) { |
728 | + struct btrfs_inode_item *item; |
729 | + u64 nbytes; |
730 | + |
731 | + item = btrfs_item_ptr(path->nodes[0], path->slots[0], |
732 | + struct btrfs_inode_item); |
733 | + nbytes = btrfs_inode_nbytes(path->nodes[0], item); |
734 | + item = btrfs_item_ptr(eb, slot, |
735 | + struct btrfs_inode_item); |
736 | + btrfs_set_inode_nbytes(eb, item, nbytes); |
737 | + } |
738 | + } else if (inode_item) { |
739 | + struct btrfs_inode_item *item; |
740 | + |
741 | + /* |
742 | + * New inode, set nbytes to 0 so that the nbytes comes out |
743 | + * properly when we replay the extents. |
744 | + */ |
745 | + item = btrfs_item_ptr(eb, slot, struct btrfs_inode_item); |
746 | + btrfs_set_inode_nbytes(eb, item, 0); |
747 | } |
748 | insert: |
749 | btrfs_release_path(path); |
750 | @@ -486,7 +514,7 @@ static noinline int replay_one_extent(struct btrfs_trans_handle *trans, |
751 | u64 extent_end; |
752 | u64 alloc_hint; |
753 | u64 start = key->offset; |
754 | - u64 saved_nbytes; |
755 | + u64 nbytes = 0; |
756 | struct btrfs_file_extent_item *item; |
757 | struct inode *inode = NULL; |
758 | unsigned long size; |
759 | @@ -496,10 +524,19 @@ static noinline int replay_one_extent(struct btrfs_trans_handle *trans, |
760 | found_type = btrfs_file_extent_type(eb, item); |
761 | |
762 | if (found_type == BTRFS_FILE_EXTENT_REG || |
763 | - found_type == BTRFS_FILE_EXTENT_PREALLOC) |
764 | - extent_end = start + btrfs_file_extent_num_bytes(eb, item); |
765 | - else if (found_type == BTRFS_FILE_EXTENT_INLINE) { |
766 | + found_type == BTRFS_FILE_EXTENT_PREALLOC) { |
767 | + nbytes = btrfs_file_extent_num_bytes(eb, item); |
768 | + extent_end = start + nbytes; |
769 | + |
770 | + /* |
771 | + * We don't add to the inodes nbytes if we are prealloc or a |
772 | + * hole. |
773 | + */ |
774 | + if (btrfs_file_extent_disk_bytenr(eb, item) == 0) |
775 | + nbytes = 0; |
776 | + } else if (found_type == BTRFS_FILE_EXTENT_INLINE) { |
777 | size = btrfs_file_extent_inline_len(eb, item); |
778 | + nbytes = btrfs_file_extent_ram_bytes(eb, item); |
779 | extent_end = (start + size + mask) & ~mask; |
780 | } else { |
781 | ret = 0; |
782 | @@ -548,7 +585,6 @@ static noinline int replay_one_extent(struct btrfs_trans_handle *trans, |
783 | } |
784 | btrfs_release_path(path); |
785 | |
786 | - saved_nbytes = inode_get_bytes(inode); |
787 | /* drop any overlapping extents */ |
788 | ret = btrfs_drop_extents(trans, inode, start, extent_end, |
789 | &alloc_hint, 1); |
790 | @@ -636,7 +672,7 @@ static noinline int replay_one_extent(struct btrfs_trans_handle *trans, |
791 | BUG_ON(ret); |
792 | } |
793 | |
794 | - inode_set_bytes(inode, saved_nbytes); |
795 | + inode_add_bytes(inode, nbytes); |
796 | btrfs_update_inode(trans, root, inode); |
797 | out: |
798 | if (inode) |
799 | diff --git a/fs/hfsplus/extents.c b/fs/hfsplus/extents.c |
800 | index 5849e3e..32b12e5 100644 |
801 | --- a/fs/hfsplus/extents.c |
802 | +++ b/fs/hfsplus/extents.c |
803 | @@ -517,7 +517,7 @@ void hfsplus_file_truncate(struct inode *inode) |
804 | struct address_space *mapping = inode->i_mapping; |
805 | struct page *page; |
806 | void *fsdata; |
807 | - u32 size = inode->i_size; |
808 | + loff_t size = inode->i_size; |
809 | |
810 | res = pagecache_write_begin(NULL, mapping, size, 0, |
811 | AOP_FLAG_UNINTERRUPTIBLE, |
812 | diff --git a/include/linux/kvm_host.h b/include/linux/kvm_host.h |
813 | index 72cbf08..c6fb815 100644 |
814 | --- a/include/linux/kvm_host.h |
815 | +++ b/include/linux/kvm_host.h |
816 | @@ -427,7 +427,7 @@ int kvm_write_guest(struct kvm *kvm, gpa_t gpa, const void *data, |
817 | int kvm_write_guest_cached(struct kvm *kvm, struct gfn_to_hva_cache *ghc, |
818 | void *data, unsigned long len); |
819 | int kvm_gfn_to_hva_cache_init(struct kvm *kvm, struct gfn_to_hva_cache *ghc, |
820 | - gpa_t gpa); |
821 | + gpa_t gpa, unsigned long len); |
822 | int kvm_clear_guest_page(struct kvm *kvm, gfn_t gfn, int offset, int len); |
823 | int kvm_clear_guest(struct kvm *kvm, gpa_t gpa, unsigned long len); |
824 | struct kvm_memory_slot *gfn_to_memslot(struct kvm *kvm, gfn_t gfn); |
825 | diff --git a/include/linux/kvm_types.h b/include/linux/kvm_types.h |
826 | index fa7cc72..b0bcce0 100644 |
827 | --- a/include/linux/kvm_types.h |
828 | +++ b/include/linux/kvm_types.h |
829 | @@ -71,6 +71,7 @@ struct gfn_to_hva_cache { |
830 | u64 generation; |
831 | gpa_t gpa; |
832 | unsigned long hva; |
833 | + unsigned long len; |
834 | struct kvm_memory_slot *memslot; |
835 | }; |
836 | |
837 | diff --git a/include/linux/mm.h b/include/linux/mm.h |
838 | index 441a564..ece5ff4 100644 |
839 | --- a/include/linux/mm.h |
840 | +++ b/include/linux/mm.h |
841 | @@ -1507,6 +1507,8 @@ int vm_insert_pfn(struct vm_area_struct *vma, unsigned long addr, |
842 | unsigned long pfn); |
843 | int vm_insert_mixed(struct vm_area_struct *vma, unsigned long addr, |
844 | unsigned long pfn); |
845 | +int vm_iomap_memory(struct vm_area_struct *vma, phys_addr_t start, unsigned long len); |
846 | + |
847 | |
848 | struct page *follow_page(struct vm_area_struct *, unsigned long address, |
849 | unsigned int foll_flags); |
850 | diff --git a/include/linux/ssb/ssb_driver_chipcommon.h b/include/linux/ssb/ssb_driver_chipcommon.h |
851 | index 1a6b004..29ce7e4 100644 |
852 | --- a/include/linux/ssb/ssb_driver_chipcommon.h |
853 | +++ b/include/linux/ssb/ssb_driver_chipcommon.h |
854 | @@ -219,6 +219,7 @@ |
855 | #define SSB_CHIPCO_PMU_CTL 0x0600 /* PMU control */ |
856 | #define SSB_CHIPCO_PMU_CTL_ILP_DIV 0xFFFF0000 /* ILP div mask */ |
857 | #define SSB_CHIPCO_PMU_CTL_ILP_DIV_SHIFT 16 |
858 | +#define SSB_CHIPCO_PMU_CTL_PLL_UPD 0x00000400 |
859 | #define SSB_CHIPCO_PMU_CTL_NOILPONW 0x00000200 /* No ILP on wait */ |
860 | #define SSB_CHIPCO_PMU_CTL_HTREQEN 0x00000100 /* HT req enable */ |
861 | #define SSB_CHIPCO_PMU_CTL_ALPREQEN 0x00000080 /* ALP req enable */ |
862 | @@ -661,5 +662,6 @@ enum ssb_pmu_ldo_volt_id { |
863 | void ssb_pmu_set_ldo_voltage(struct ssb_chipcommon *cc, |
864 | enum ssb_pmu_ldo_volt_id id, u32 voltage); |
865 | void ssb_pmu_set_ldo_paref(struct ssb_chipcommon *cc, bool on); |
866 | +void ssb_pmu_spuravoid_pllupdate(struct ssb_chipcommon *cc, int spuravoid); |
867 | |
868 | #endif /* LINUX_SSB_CHIPCO_H_ */ |
869 | diff --git a/kernel/events/core.c b/kernel/events/core.c |
870 | index 228fdb0..839a24f 100644 |
871 | --- a/kernel/events/core.c |
872 | +++ b/kernel/events/core.c |
873 | @@ -5126,7 +5126,7 @@ static void sw_perf_event_destroy(struct perf_event *event) |
874 | |
875 | static int perf_swevent_init(struct perf_event *event) |
876 | { |
877 | - int event_id = event->attr.config; |
878 | + u64 event_id = event->attr.config; |
879 | |
880 | if (event->attr.type != PERF_TYPE_SOFTWARE) |
881 | return -ENOENT; |
882 | diff --git a/kernel/hrtimer.c b/kernel/hrtimer.c |
883 | index cdd5607..e4cee8d 100644 |
884 | --- a/kernel/hrtimer.c |
885 | +++ b/kernel/hrtimer.c |
886 | @@ -61,6 +61,7 @@ |
887 | DEFINE_PER_CPU(struct hrtimer_cpu_base, hrtimer_bases) = |
888 | { |
889 | |
890 | + .lock = __RAW_SPIN_LOCK_UNLOCKED(hrtimer_bases.lock), |
891 | .clock_base = |
892 | { |
893 | { |
894 | @@ -1640,8 +1641,6 @@ static void __cpuinit init_hrtimers_cpu(int cpu) |
895 | struct hrtimer_cpu_base *cpu_base = &per_cpu(hrtimer_bases, cpu); |
896 | int i; |
897 | |
898 | - raw_spin_lock_init(&cpu_base->lock); |
899 | - |
900 | for (i = 0; i < HRTIMER_MAX_CLOCK_BASES; i++) { |
901 | cpu_base->clock_base[i].cpu_base = cpu_base; |
902 | timerqueue_init_head(&cpu_base->clock_base[i].active); |
903 | diff --git a/kernel/sched/core.c b/kernel/sched/core.c |
904 | index e1718bc..4b6c546 100644 |
905 | --- a/kernel/sched/core.c |
906 | +++ b/kernel/sched/core.c |
907 | @@ -1653,8 +1653,10 @@ static void try_to_wake_up_local(struct task_struct *p) |
908 | { |
909 | struct rq *rq = task_rq(p); |
910 | |
911 | - BUG_ON(rq != this_rq()); |
912 | - BUG_ON(p == current); |
913 | + if (WARN_ON_ONCE(rq != this_rq()) || |
914 | + WARN_ON_ONCE(p == current)) |
915 | + return; |
916 | + |
917 | lockdep_assert_held(&rq->lock); |
918 | |
919 | if (!raw_spin_trylock(&p->pi_lock)) { |
920 | diff --git a/kernel/signal.c b/kernel/signal.c |
921 | index 32b10d4..959df4f 100644 |
922 | --- a/kernel/signal.c |
923 | +++ b/kernel/signal.c |
924 | @@ -2867,7 +2867,7 @@ do_send_specific(pid_t tgid, pid_t pid, int sig, struct siginfo *info) |
925 | |
926 | static int do_tkill(pid_t tgid, pid_t pid, int sig) |
927 | { |
928 | - struct siginfo info; |
929 | + struct siginfo info = {}; |
930 | |
931 | info.si_signo = sig; |
932 | info.si_errno = 0; |
933 | diff --git a/mm/hugetlb.c b/mm/hugetlb.c |
934 | index e427969..69b21bb 100644 |
935 | --- a/mm/hugetlb.c |
936 | +++ b/mm/hugetlb.c |
937 | @@ -2906,7 +2906,17 @@ int follow_hugetlb_page(struct mm_struct *mm, struct vm_area_struct *vma, |
938 | break; |
939 | } |
940 | |
941 | - if (absent || |
942 | + /* |
943 | + * We need call hugetlb_fault for both hugepages under migration |
944 | + * (in which case hugetlb_fault waits for the migration,) and |
945 | + * hwpoisoned hugepages (in which case we need to prevent the |
946 | + * caller from accessing to them.) In order to do this, we use |
947 | + * here is_swap_pte instead of is_hugetlb_entry_migration and |
948 | + * is_hugetlb_entry_hwpoisoned. This is because it simply covers |
949 | + * both cases, and because we can't follow correct pages |
950 | + * directly from any kind of swap entries. |
951 | + */ |
952 | + if (absent || is_swap_pte(huge_ptep_get(pte)) || |
953 | ((flags & FOLL_WRITE) && !pte_write(huge_ptep_get(pte)))) { |
954 | int ret; |
955 | |
956 | diff --git a/mm/memory.c b/mm/memory.c |
957 | index 2f42aab..17d8661 100644 |
958 | --- a/mm/memory.c |
959 | +++ b/mm/memory.c |
960 | @@ -2329,6 +2329,53 @@ int remap_pfn_range(struct vm_area_struct *vma, unsigned long addr, |
961 | } |
962 | EXPORT_SYMBOL(remap_pfn_range); |
963 | |
964 | +/** |
965 | + * vm_iomap_memory - remap memory to userspace |
966 | + * @vma: user vma to map to |
967 | + * @start: start of area |
968 | + * @len: size of area |
969 | + * |
970 | + * This is a simplified io_remap_pfn_range() for common driver use. The |
971 | + * driver just needs to give us the physical memory range to be mapped, |
972 | + * we'll figure out the rest from the vma information. |
973 | + * |
974 | + * NOTE! Some drivers might want to tweak vma->vm_page_prot first to get |
975 | + * whatever write-combining details or similar. |
976 | + */ |
977 | +int vm_iomap_memory(struct vm_area_struct *vma, phys_addr_t start, unsigned long len) |
978 | +{ |
979 | + unsigned long vm_len, pfn, pages; |
980 | + |
981 | + /* Check that the physical memory area passed in looks valid */ |
982 | + if (start + len < start) |
983 | + return -EINVAL; |
984 | + /* |
985 | + * You *really* shouldn't map things that aren't page-aligned, |
986 | + * but we've historically allowed it because IO memory might |
987 | + * just have smaller alignment. |
988 | + */ |
989 | + len += start & ~PAGE_MASK; |
990 | + pfn = start >> PAGE_SHIFT; |
991 | + pages = (len + ~PAGE_MASK) >> PAGE_SHIFT; |
992 | + if (pfn + pages < pfn) |
993 | + return -EINVAL; |
994 | + |
995 | + /* We start the mapping 'vm_pgoff' pages into the area */ |
996 | + if (vma->vm_pgoff > pages) |
997 | + return -EINVAL; |
998 | + pfn += vma->vm_pgoff; |
999 | + pages -= vma->vm_pgoff; |
1000 | + |
1001 | + /* Can we fit all of the mapping? */ |
1002 | + vm_len = vma->vm_end - vma->vm_start; |
1003 | + if (vm_len >> PAGE_SHIFT > pages) |
1004 | + return -EINVAL; |
1005 | + |
1006 | + /* Ok, let it rip */ |
1007 | + return io_remap_pfn_range(vma, vma->vm_start, pfn, vm_len, vma->vm_page_prot); |
1008 | +} |
1009 | +EXPORT_SYMBOL(vm_iomap_memory); |
1010 | + |
1011 | static int apply_to_pte_range(struct mm_struct *mm, pmd_t *pmd, |
1012 | unsigned long addr, unsigned long end, |
1013 | pte_fn_t fn, void *data) |
1014 | diff --git a/sound/core/pcm_native.c b/sound/core/pcm_native.c |
1015 | index d535b34..d776291 100644 |
1016 | --- a/sound/core/pcm_native.c |
1017 | +++ b/sound/core/pcm_native.c |
1018 | @@ -3209,18 +3209,10 @@ EXPORT_SYMBOL_GPL(snd_pcm_lib_default_mmap); |
1019 | int snd_pcm_lib_mmap_iomem(struct snd_pcm_substream *substream, |
1020 | struct vm_area_struct *area) |
1021 | { |
1022 | - long size; |
1023 | - unsigned long offset; |
1024 | + struct snd_pcm_runtime *runtime = substream->runtime;; |
1025 | |
1026 | area->vm_page_prot = pgprot_noncached(area->vm_page_prot); |
1027 | - area->vm_flags |= VM_IO; |
1028 | - size = area->vm_end - area->vm_start; |
1029 | - offset = area->vm_pgoff << PAGE_SHIFT; |
1030 | - if (io_remap_pfn_range(area, area->vm_start, |
1031 | - (substream->runtime->dma_addr + offset) >> PAGE_SHIFT, |
1032 | - size, area->vm_page_prot)) |
1033 | - return -EAGAIN; |
1034 | - return 0; |
1035 | + return vm_iomap_memory(area, runtime->dma_addr, runtime->dma_bytes); |
1036 | } |
1037 | |
1038 | EXPORT_SYMBOL(snd_pcm_lib_mmap_iomem); |
1039 | diff --git a/virt/kvm/ioapic.c b/virt/kvm/ioapic.c |
1040 | index dcaf272c26..9f477f6 100644 |
1041 | --- a/virt/kvm/ioapic.c |
1042 | +++ b/virt/kvm/ioapic.c |
1043 | @@ -73,9 +73,12 @@ static unsigned long ioapic_read_indirect(struct kvm_ioapic *ioapic, |
1044 | u32 redir_index = (ioapic->ioregsel - 0x10) >> 1; |
1045 | u64 redir_content; |
1046 | |
1047 | - ASSERT(redir_index < IOAPIC_NUM_PINS); |
1048 | + if (redir_index < IOAPIC_NUM_PINS) |
1049 | + redir_content = |
1050 | + ioapic->redirtbl[redir_index].bits; |
1051 | + else |
1052 | + redir_content = ~0ULL; |
1053 | |
1054 | - redir_content = ioapic->redirtbl[redir_index].bits; |
1055 | result = (ioapic->ioregsel & 0x1) ? |
1056 | (redir_content >> 32) & 0xffffffff : |
1057 | redir_content & 0xffffffff; |
1058 | diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c |
1059 | index 71b9036..bdfbc1b 100644 |
1060 | --- a/virt/kvm/kvm_main.c |
1061 | +++ b/virt/kvm/kvm_main.c |
1062 | @@ -1382,21 +1382,38 @@ int kvm_write_guest(struct kvm *kvm, gpa_t gpa, const void *data, |
1063 | } |
1064 | |
1065 | int kvm_gfn_to_hva_cache_init(struct kvm *kvm, struct gfn_to_hva_cache *ghc, |
1066 | - gpa_t gpa) |
1067 | + gpa_t gpa, unsigned long len) |
1068 | { |
1069 | struct kvm_memslots *slots = kvm_memslots(kvm); |
1070 | int offset = offset_in_page(gpa); |
1071 | - gfn_t gfn = gpa >> PAGE_SHIFT; |
1072 | + gfn_t start_gfn = gpa >> PAGE_SHIFT; |
1073 | + gfn_t end_gfn = (gpa + len - 1) >> PAGE_SHIFT; |
1074 | + gfn_t nr_pages_needed = end_gfn - start_gfn + 1; |
1075 | + gfn_t nr_pages_avail; |
1076 | |
1077 | ghc->gpa = gpa; |
1078 | ghc->generation = slots->generation; |
1079 | - ghc->memslot = gfn_to_memslot(kvm, gfn); |
1080 | - ghc->hva = gfn_to_hva_many(ghc->memslot, gfn, NULL); |
1081 | - if (!kvm_is_error_hva(ghc->hva)) |
1082 | + ghc->len = len; |
1083 | + ghc->memslot = gfn_to_memslot(kvm, start_gfn); |
1084 | + ghc->hva = gfn_to_hva_many(ghc->memslot, start_gfn, &nr_pages_avail); |
1085 | + if (!kvm_is_error_hva(ghc->hva) && nr_pages_avail >= nr_pages_needed) { |
1086 | ghc->hva += offset; |
1087 | - else |
1088 | - return -EFAULT; |
1089 | - |
1090 | + } else { |
1091 | + /* |
1092 | + * If the requested region crosses two memslots, we still |
1093 | + * verify that the entire region is valid here. |
1094 | + */ |
1095 | + while (start_gfn <= end_gfn) { |
1096 | + ghc->memslot = gfn_to_memslot(kvm, start_gfn); |
1097 | + ghc->hva = gfn_to_hva_many(ghc->memslot, start_gfn, |
1098 | + &nr_pages_avail); |
1099 | + if (kvm_is_error_hva(ghc->hva)) |
1100 | + return -EFAULT; |
1101 | + start_gfn += nr_pages_avail; |
1102 | + } |
1103 | + /* Use the slow path for cross page reads and writes. */ |
1104 | + ghc->memslot = NULL; |
1105 | + } |
1106 | return 0; |
1107 | } |
1108 | EXPORT_SYMBOL_GPL(kvm_gfn_to_hva_cache_init); |
1109 | @@ -1407,8 +1424,13 @@ int kvm_write_guest_cached(struct kvm *kvm, struct gfn_to_hva_cache *ghc, |
1110 | struct kvm_memslots *slots = kvm_memslots(kvm); |
1111 | int r; |
1112 | |
1113 | + BUG_ON(len > ghc->len); |
1114 | + |
1115 | if (slots->generation != ghc->generation) |
1116 | - kvm_gfn_to_hva_cache_init(kvm, ghc, ghc->gpa); |
1117 | + kvm_gfn_to_hva_cache_init(kvm, ghc, ghc->gpa, ghc->len); |
1118 | + |
1119 | + if (unlikely(!ghc->memslot)) |
1120 | + return kvm_write_guest(kvm, ghc->gpa, data, len); |
1121 | |
1122 | if (kvm_is_error_hva(ghc->hva)) |
1123 | return -EFAULT; |
1124 | @@ -1428,8 +1450,13 @@ int kvm_read_guest_cached(struct kvm *kvm, struct gfn_to_hva_cache *ghc, |
1125 | struct kvm_memslots *slots = kvm_memslots(kvm); |
1126 | int r; |
1127 | |
1128 | + BUG_ON(len > ghc->len); |
1129 | + |
1130 | if (slots->generation != ghc->generation) |
1131 | - kvm_gfn_to_hva_cache_init(kvm, ghc, ghc->gpa); |
1132 | + kvm_gfn_to_hva_cache_init(kvm, ghc, ghc->gpa, ghc->len); |
1133 | + |
1134 | + if (unlikely(!ghc->memslot)) |
1135 | + return kvm_read_guest(kvm, ghc->gpa, data, len); |
1136 | |
1137 | if (kvm_is_error_hva(ghc->hva)) |
1138 | return -EFAULT; |