Magellan Linux

Annotation of /trunk/kernel-lts/patches-3.4/0141-3.4.42-all-fixes.patch

Parent Directory Parent Directory | Revision Log Revision Log


Revision 2201 - (hide annotations) (download)
Thu Jun 13 10:35:06 2013 UTC (11 years ago) by niro
File size: 38265 byte(s)
-linux-3.4.42
1 niro 2201 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;