Contents of /trunk/kernel-magellan/patches-3.11/0101-3.11.2-all-fixes.patch
Parent Directory | Revision Log
Revision 2294 -
(show annotations)
(download)
Mon Oct 7 12:06:56 2013 UTC (10 years, 11 months ago) by niro
File size: 145284 byte(s)
Mon Oct 7 12:06:56 2013 UTC (10 years, 11 months ago) by niro
File size: 145284 byte(s)
-linux-3.11.2
1 | diff --git a/Makefile b/Makefile |
2 | index efd23961..aede3194 100644 |
3 | --- a/Makefile |
4 | +++ b/Makefile |
5 | @@ -1,6 +1,6 @@ |
6 | VERSION = 3 |
7 | PATCHLEVEL = 11 |
8 | -SUBLEVEL = 1 |
9 | +SUBLEVEL = 2 |
10 | EXTRAVERSION = |
11 | NAME = Linux for Workgroups |
12 | |
13 | diff --git a/arch/arc/include/asm/sections.h b/arch/arc/include/asm/sections.h |
14 | index 6fc1159d..764f1e3b 100644 |
15 | --- a/arch/arc/include/asm/sections.h |
16 | +++ b/arch/arc/include/asm/sections.h |
17 | @@ -11,7 +11,6 @@ |
18 | |
19 | #include <asm-generic/sections.h> |
20 | |
21 | -extern char _int_vec_base_lds[]; |
22 | extern char __arc_dccm_base[]; |
23 | extern char __dtb_start[]; |
24 | |
25 | diff --git a/arch/arc/kernel/head.S b/arch/arc/kernel/head.S |
26 | index 2a913f85..0f944f02 100644 |
27 | --- a/arch/arc/kernel/head.S |
28 | +++ b/arch/arc/kernel/head.S |
29 | @@ -34,6 +34,9 @@ stext: |
30 | ; IDENTITY Reg [ 3 2 1 0 ] |
31 | ; (cpu-id) ^^^ => Zero for UP ARC700 |
32 | ; => #Core-ID if SMP (Master 0) |
33 | + ; Note that non-boot CPUs might not land here if halt-on-reset and |
34 | + ; instead breath life from @first_lines_of_secondary, but we still |
35 | + ; need to make sure only boot cpu takes this path. |
36 | GET_CPU_ID r5 |
37 | cmp r5, 0 |
38 | jnz arc_platform_smp_wait_to_boot |
39 | @@ -98,6 +101,8 @@ stext: |
40 | |
41 | first_lines_of_secondary: |
42 | |
43 | + sr @_int_vec_base_lds, [AUX_INTR_VEC_BASE] |
44 | + |
45 | ; setup per-cpu idle task as "current" on this CPU |
46 | ld r0, [@secondary_idle_tsk] |
47 | SET_CURR_TASK_ON_CPU r0, r1 |
48 | diff --git a/arch/arc/kernel/irq.c b/arch/arc/kernel/irq.c |
49 | index 305b3f86..5fc92455 100644 |
50 | --- a/arch/arc/kernel/irq.c |
51 | +++ b/arch/arc/kernel/irq.c |
52 | @@ -24,7 +24,6 @@ |
53 | * -Needed for each CPU (hence not foldable into init_IRQ) |
54 | * |
55 | * what it does ? |
56 | - * -setup Vector Table Base Reg - in case Linux not linked at 0x8000_0000 |
57 | * -Disable all IRQs (on CPU side) |
58 | * -Optionally, setup the High priority Interrupts as Level 2 IRQs |
59 | */ |
60 | diff --git a/arch/arc/kernel/setup.c b/arch/arc/kernel/setup.c |
61 | index 6b083454..e8185631 100644 |
62 | --- a/arch/arc/kernel/setup.c |
63 | +++ b/arch/arc/kernel/setup.c |
64 | @@ -47,10 +47,7 @@ void read_arc_build_cfg_regs(void) |
65 | READ_BCR(AUX_IDENTITY, cpu->core); |
66 | |
67 | cpu->timers = read_aux_reg(ARC_REG_TIMERS_BCR); |
68 | - |
69 | cpu->vec_base = read_aux_reg(AUX_INTR_VEC_BASE); |
70 | - if (cpu->vec_base == 0) |
71 | - cpu->vec_base = (unsigned int)_int_vec_base_lds; |
72 | |
73 | READ_BCR(ARC_REG_D_UNCACH_BCR, uncached_space); |
74 | cpu->uncached_base = uncached_space.start << 24; |
75 | diff --git a/arch/arm/mach-versatile/include/mach/platform.h b/arch/arm/mach-versatile/include/mach/platform.h |
76 | index ec087407..6f938ccb 100644 |
77 | --- a/arch/arm/mach-versatile/include/mach/platform.h |
78 | +++ b/arch/arm/mach-versatile/include/mach/platform.h |
79 | @@ -231,12 +231,14 @@ |
80 | /* PCI space */ |
81 | #define VERSATILE_PCI_BASE 0x41000000 /* PCI Interface */ |
82 | #define VERSATILE_PCI_CFG_BASE 0x42000000 |
83 | +#define VERSATILE_PCI_IO_BASE 0x43000000 |
84 | #define VERSATILE_PCI_MEM_BASE0 0x44000000 |
85 | #define VERSATILE_PCI_MEM_BASE1 0x50000000 |
86 | #define VERSATILE_PCI_MEM_BASE2 0x60000000 |
87 | /* Sizes of above maps */ |
88 | #define VERSATILE_PCI_BASE_SIZE 0x01000000 |
89 | #define VERSATILE_PCI_CFG_BASE_SIZE 0x02000000 |
90 | +#define VERSATILE_PCI_IO_BASE_SIZE 0x01000000 |
91 | #define VERSATILE_PCI_MEM_BASE0_SIZE 0x0c000000 /* 32Mb */ |
92 | #define VERSATILE_PCI_MEM_BASE1_SIZE 0x10000000 /* 256Mb */ |
93 | #define VERSATILE_PCI_MEM_BASE2_SIZE 0x10000000 /* 256Mb */ |
94 | diff --git a/arch/arm/mach-versatile/pci.c b/arch/arm/mach-versatile/pci.c |
95 | index e92e5e07..c97be4ea 100644 |
96 | --- a/arch/arm/mach-versatile/pci.c |
97 | +++ b/arch/arm/mach-versatile/pci.c |
98 | @@ -43,9 +43,9 @@ |
99 | #define PCI_IMAP0 __IO_ADDRESS(VERSATILE_PCI_CORE_BASE+0x0) |
100 | #define PCI_IMAP1 __IO_ADDRESS(VERSATILE_PCI_CORE_BASE+0x4) |
101 | #define PCI_IMAP2 __IO_ADDRESS(VERSATILE_PCI_CORE_BASE+0x8) |
102 | -#define PCI_SMAP0 __IO_ADDRESS(VERSATILE_PCI_CORE_BASE+0x10) |
103 | -#define PCI_SMAP1 __IO_ADDRESS(VERSATILE_PCI_CORE_BASE+0x14) |
104 | -#define PCI_SMAP2 __IO_ADDRESS(VERSATILE_PCI_CORE_BASE+0x18) |
105 | +#define PCI_SMAP0 __IO_ADDRESS(VERSATILE_PCI_CORE_BASE+0x14) |
106 | +#define PCI_SMAP1 __IO_ADDRESS(VERSATILE_PCI_CORE_BASE+0x18) |
107 | +#define PCI_SMAP2 __IO_ADDRESS(VERSATILE_PCI_CORE_BASE+0x1c) |
108 | #define PCI_SELFID __IO_ADDRESS(VERSATILE_PCI_CORE_BASE+0xc) |
109 | |
110 | #define DEVICE_ID_OFFSET 0x00 |
111 | @@ -170,8 +170,8 @@ static struct pci_ops pci_versatile_ops = { |
112 | .write = versatile_write_config, |
113 | }; |
114 | |
115 | -static struct resource io_mem = { |
116 | - .name = "PCI I/O space", |
117 | +static struct resource unused_mem = { |
118 | + .name = "PCI unused", |
119 | .start = VERSATILE_PCI_MEM_BASE0, |
120 | .end = VERSATILE_PCI_MEM_BASE0+VERSATILE_PCI_MEM_BASE0_SIZE-1, |
121 | .flags = IORESOURCE_MEM, |
122 | @@ -195,9 +195,9 @@ static int __init pci_versatile_setup_resources(struct pci_sys_data *sys) |
123 | { |
124 | int ret = 0; |
125 | |
126 | - ret = request_resource(&iomem_resource, &io_mem); |
127 | + ret = request_resource(&iomem_resource, &unused_mem); |
128 | if (ret) { |
129 | - printk(KERN_ERR "PCI: unable to allocate I/O " |
130 | + printk(KERN_ERR "PCI: unable to allocate unused " |
131 | "memory region (%d)\n", ret); |
132 | goto out; |
133 | } |
134 | @@ -205,7 +205,7 @@ static int __init pci_versatile_setup_resources(struct pci_sys_data *sys) |
135 | if (ret) { |
136 | printk(KERN_ERR "PCI: unable to allocate non-prefetchable " |
137 | "memory region (%d)\n", ret); |
138 | - goto release_io_mem; |
139 | + goto release_unused_mem; |
140 | } |
141 | ret = request_resource(&iomem_resource, &pre_mem); |
142 | if (ret) { |
143 | @@ -225,8 +225,8 @@ static int __init pci_versatile_setup_resources(struct pci_sys_data *sys) |
144 | |
145 | release_non_mem: |
146 | release_resource(&non_mem); |
147 | - release_io_mem: |
148 | - release_resource(&io_mem); |
149 | + release_unused_mem: |
150 | + release_resource(&unused_mem); |
151 | out: |
152 | return ret; |
153 | } |
154 | @@ -246,7 +246,7 @@ int __init pci_versatile_setup(int nr, struct pci_sys_data *sys) |
155 | goto out; |
156 | } |
157 | |
158 | - ret = pci_ioremap_io(0, VERSATILE_PCI_MEM_BASE0); |
159 | + ret = pci_ioremap_io(0, VERSATILE_PCI_IO_BASE); |
160 | if (ret) |
161 | goto out; |
162 | |
163 | @@ -295,6 +295,19 @@ int __init pci_versatile_setup(int nr, struct pci_sys_data *sys) |
164 | __raw_writel(PHYS_OFFSET, local_pci_cfg_base + PCI_BASE_ADDRESS_2); |
165 | |
166 | /* |
167 | + * For many years the kernel and QEMU were symbiotically buggy |
168 | + * in that they both assumed the same broken IRQ mapping. |
169 | + * QEMU therefore attempts to auto-detect old broken kernels |
170 | + * so that they still work on newer QEMU as they did on old |
171 | + * QEMU. Since we now use the correct (ie matching-hardware) |
172 | + * IRQ mapping we write a definitely different value to a |
173 | + * PCI_INTERRUPT_LINE register to tell QEMU that we expect |
174 | + * real hardware behaviour and it need not be backwards |
175 | + * compatible for us. This write is harmless on real hardware. |
176 | + */ |
177 | + __raw_writel(0, VERSATILE_PCI_VIRT_BASE+PCI_INTERRUPT_LINE); |
178 | + |
179 | + /* |
180 | * Do not to map Versatile FPGA PCI device into memory space |
181 | */ |
182 | pci_slot_ignore |= (1 << myslot); |
183 | @@ -327,13 +340,13 @@ static int __init versatile_map_irq(const struct pci_dev *dev, u8 slot, u8 pin) |
184 | { |
185 | int irq; |
186 | |
187 | - /* slot, pin, irq |
188 | - * 24 1 IRQ_SIC_PCI0 |
189 | - * 25 1 IRQ_SIC_PCI1 |
190 | - * 26 1 IRQ_SIC_PCI2 |
191 | - * 27 1 IRQ_SIC_PCI3 |
192 | + /* |
193 | + * Slot INTA INTB INTC INTD |
194 | + * 31 PCI1 PCI2 PCI3 PCI0 |
195 | + * 30 PCI0 PCI1 PCI2 PCI3 |
196 | + * 29 PCI3 PCI0 PCI1 PCI2 |
197 | */ |
198 | - irq = IRQ_SIC_PCI0 + ((slot - 24 + pin - 1) & 3); |
199 | + irq = IRQ_SIC_PCI0 + ((slot + 2 + pin - 1) & 3); |
200 | |
201 | return irq; |
202 | } |
203 | diff --git a/arch/arm/xen/enlighten.c b/arch/arm/xen/enlighten.c |
204 | index 8a6295c8..7071fcac 100644 |
205 | --- a/arch/arm/xen/enlighten.c |
206 | +++ b/arch/arm/xen/enlighten.c |
207 | @@ -273,12 +273,15 @@ core_initcall(xen_guest_init); |
208 | |
209 | static int __init xen_pm_init(void) |
210 | { |
211 | + if (!xen_domain()) |
212 | + return -ENODEV; |
213 | + |
214 | pm_power_off = xen_power_off; |
215 | arm_pm_restart = xen_restart; |
216 | |
217 | return 0; |
218 | } |
219 | -subsys_initcall(xen_pm_init); |
220 | +late_initcall(xen_pm_init); |
221 | |
222 | static irqreturn_t xen_arm_callback(int irq, void *arg) |
223 | { |
224 | diff --git a/arch/arm64/kernel/perf_event.c b/arch/arm64/kernel/perf_event.c |
225 | index 12e6ccb8..cea1594f 100644 |
226 | --- a/arch/arm64/kernel/perf_event.c |
227 | +++ b/arch/arm64/kernel/perf_event.c |
228 | @@ -325,7 +325,10 @@ validate_event(struct pmu_hw_events *hw_events, |
229 | if (is_software_event(event)) |
230 | return 1; |
231 | |
232 | - if (event->pmu != leader_pmu || event->state <= PERF_EVENT_STATE_OFF) |
233 | + if (event->pmu != leader_pmu || event->state < PERF_EVENT_STATE_OFF) |
234 | + return 1; |
235 | + |
236 | + if (event->state == PERF_EVENT_STATE_OFF && !event->attr.enable_on_exec) |
237 | return 1; |
238 | |
239 | return armpmu->get_event_idx(hw_events, &fake_event) >= 0; |
240 | @@ -781,7 +784,7 @@ static const unsigned armv8_pmuv3_perf_cache_map[PERF_COUNT_HW_CACHE_MAX] |
241 | /* |
242 | * PMXEVTYPER: Event selection reg |
243 | */ |
244 | -#define ARMV8_EVTYPE_MASK 0xc00000ff /* Mask for writable bits */ |
245 | +#define ARMV8_EVTYPE_MASK 0xc80000ff /* Mask for writable bits */ |
246 | #define ARMV8_EVTYPE_EVENT 0xff /* Mask for EVENT bits */ |
247 | |
248 | /* |
249 | diff --git a/arch/mips/ath79/clock.c b/arch/mips/ath79/clock.c |
250 | index 765ef30e..733017b3 100644 |
251 | --- a/arch/mips/ath79/clock.c |
252 | +++ b/arch/mips/ath79/clock.c |
253 | @@ -164,7 +164,7 @@ static void __init ar933x_clocks_init(void) |
254 | ath79_ahb_clk.rate = freq / t; |
255 | } |
256 | |
257 | - ath79_wdt_clk.rate = ath79_ref_clk.rate; |
258 | + ath79_wdt_clk.rate = ath79_ahb_clk.rate; |
259 | ath79_uart_clk.rate = ath79_ref_clk.rate; |
260 | } |
261 | |
262 | diff --git a/arch/powerpc/kernel/align.c b/arch/powerpc/kernel/align.c |
263 | index ee5b690a..52e5758e 100644 |
264 | --- a/arch/powerpc/kernel/align.c |
265 | +++ b/arch/powerpc/kernel/align.c |
266 | @@ -764,6 +764,16 @@ int fix_alignment(struct pt_regs *regs) |
267 | nb = aligninfo[instr].len; |
268 | flags = aligninfo[instr].flags; |
269 | |
270 | + /* ldbrx/stdbrx overlap lfs/stfs in the DSISR unfortunately */ |
271 | + if (IS_XFORM(instruction) && ((instruction >> 1) & 0x3ff) == 532) { |
272 | + nb = 8; |
273 | + flags = LD+SW; |
274 | + } else if (IS_XFORM(instruction) && |
275 | + ((instruction >> 1) & 0x3ff) == 660) { |
276 | + nb = 8; |
277 | + flags = ST+SW; |
278 | + } |
279 | + |
280 | /* Byteswap little endian loads and stores */ |
281 | swiz = 0; |
282 | if (regs->msr & MSR_LE) { |
283 | diff --git a/arch/powerpc/kvm/book3s_xics.c b/arch/powerpc/kvm/book3s_xics.c |
284 | index 94c1dd46..a3a5cb8e 100644 |
285 | --- a/arch/powerpc/kvm/book3s_xics.c |
286 | +++ b/arch/powerpc/kvm/book3s_xics.c |
287 | @@ -19,6 +19,7 @@ |
288 | #include <asm/hvcall.h> |
289 | #include <asm/xics.h> |
290 | #include <asm/debug.h> |
291 | +#include <asm/time.h> |
292 | |
293 | #include <linux/debugfs.h> |
294 | #include <linux/seq_file.h> |
295 | diff --git a/arch/powerpc/platforms/pseries/setup.c b/arch/powerpc/platforms/pseries/setup.c |
296 | index c11c8238..54b998f2 100644 |
297 | --- a/arch/powerpc/platforms/pseries/setup.c |
298 | +++ b/arch/powerpc/platforms/pseries/setup.c |
299 | @@ -354,7 +354,7 @@ static int alloc_dispatch_log_kmem_cache(void) |
300 | } |
301 | early_initcall(alloc_dispatch_log_kmem_cache); |
302 | |
303 | -static void pSeries_idle(void) |
304 | +static void pseries_lpar_idle(void) |
305 | { |
306 | /* This would call on the cpuidle framework, and the back-end pseries |
307 | * driver to go to idle states |
308 | @@ -362,10 +362,22 @@ static void pSeries_idle(void) |
309 | if (cpuidle_idle_call()) { |
310 | /* On error, execute default handler |
311 | * to go into low thread priority and possibly |
312 | - * low power mode. |
313 | + * low power mode by cedeing processor to hypervisor |
314 | */ |
315 | - HMT_low(); |
316 | - HMT_very_low(); |
317 | + |
318 | + /* Indicate to hypervisor that we are idle. */ |
319 | + get_lppaca()->idle = 1; |
320 | + |
321 | + /* |
322 | + * Yield the processor to the hypervisor. We return if |
323 | + * an external interrupt occurs (which are driven prior |
324 | + * to returning here) or if a prod occurs from another |
325 | + * processor. When returning here, external interrupts |
326 | + * are enabled. |
327 | + */ |
328 | + cede_processor(); |
329 | + |
330 | + get_lppaca()->idle = 0; |
331 | } |
332 | } |
333 | |
334 | @@ -456,15 +468,14 @@ static void __init pSeries_setup_arch(void) |
335 | |
336 | pSeries_nvram_init(); |
337 | |
338 | - if (firmware_has_feature(FW_FEATURE_SPLPAR)) { |
339 | + if (firmware_has_feature(FW_FEATURE_LPAR)) { |
340 | vpa_init(boot_cpuid); |
341 | - ppc_md.power_save = pSeries_idle; |
342 | - } |
343 | - |
344 | - if (firmware_has_feature(FW_FEATURE_LPAR)) |
345 | + ppc_md.power_save = pseries_lpar_idle; |
346 | ppc_md.enable_pmcs = pseries_lpar_enable_pmcs; |
347 | - else |
348 | + } else { |
349 | + /* No special idle routine */ |
350 | ppc_md.enable_pmcs = power4_enable_pmcs; |
351 | + } |
352 | |
353 | ppc_md.pcibios_root_bridge_prepare = pseries_root_bridge_prepare; |
354 | |
355 | diff --git a/arch/s390/net/bpf_jit_comp.c b/arch/s390/net/bpf_jit_comp.c |
356 | index d5f10a43..70923928 100644 |
357 | --- a/arch/s390/net/bpf_jit_comp.c |
358 | +++ b/arch/s390/net/bpf_jit_comp.c |
359 | @@ -805,7 +805,7 @@ static struct bpf_binary_header *bpf_alloc_binary(unsigned int bpfsize, |
360 | return NULL; |
361 | memset(header, 0, sz); |
362 | header->pages = sz / PAGE_SIZE; |
363 | - hole = sz - bpfsize + sizeof(*header); |
364 | + hole = sz - (bpfsize + sizeof(*header)); |
365 | /* Insert random number of illegal instructions before BPF code |
366 | * and make sure the first instruction starts at an even address. |
367 | */ |
368 | diff --git a/arch/um/include/shared/os.h b/arch/um/include/shared/os.h |
369 | index 95feaa47..c70a234a 100644 |
370 | --- a/arch/um/include/shared/os.h |
371 | +++ b/arch/um/include/shared/os.h |
372 | @@ -200,6 +200,7 @@ extern int os_unmap_memory(void *addr, int len); |
373 | extern int os_drop_memory(void *addr, int length); |
374 | extern int can_drop_memory(void); |
375 | extern void os_flush_stdout(void); |
376 | +extern int os_mincore(void *addr, unsigned long len); |
377 | |
378 | /* execvp.c */ |
379 | extern int execvp_noalloc(char *buf, const char *file, char *const argv[]); |
380 | diff --git a/arch/um/kernel/Makefile b/arch/um/kernel/Makefile |
381 | index babe2182..d8b78a03 100644 |
382 | --- a/arch/um/kernel/Makefile |
383 | +++ b/arch/um/kernel/Makefile |
384 | @@ -13,7 +13,7 @@ clean-files := |
385 | obj-y = config.o exec.o exitcode.o irq.o ksyms.o mem.o \ |
386 | physmem.o process.o ptrace.o reboot.o sigio.o \ |
387 | signal.o smp.o syscall.o sysrq.o time.o tlb.o trap.o \ |
388 | - um_arch.o umid.o skas/ |
389 | + um_arch.o umid.o maccess.o skas/ |
390 | |
391 | obj-$(CONFIG_BLK_DEV_INITRD) += initrd.o |
392 | obj-$(CONFIG_GPROF) += gprof_syms.o |
393 | diff --git a/arch/um/kernel/maccess.c b/arch/um/kernel/maccess.c |
394 | new file mode 100644 |
395 | index 00000000..1f3d5c49 |
396 | --- /dev/null |
397 | +++ b/arch/um/kernel/maccess.c |
398 | @@ -0,0 +1,24 @@ |
399 | +/* |
400 | + * Copyright (C) 2013 Richard Weinberger <richrd@nod.at> |
401 | + * |
402 | + * This program is free software; you can redistribute it and/or modify |
403 | + * it under the terms of the GNU General Public License version 2 as |
404 | + * published by the Free Software Foundation. |
405 | + */ |
406 | + |
407 | +#include <linux/uaccess.h> |
408 | +#include <linux/kernel.h> |
409 | +#include <os.h> |
410 | + |
411 | +long probe_kernel_read(void *dst, const void *src, size_t size) |
412 | +{ |
413 | + void *psrc = (void *)rounddown((unsigned long)src, PAGE_SIZE); |
414 | + |
415 | + if ((unsigned long)src < PAGE_SIZE || size <= 0) |
416 | + return -EFAULT; |
417 | + |
418 | + if (os_mincore(psrc, size + src - psrc) <= 0) |
419 | + return -EFAULT; |
420 | + |
421 | + return __probe_kernel_read(dst, src, size); |
422 | +} |
423 | diff --git a/arch/um/os-Linux/process.c b/arch/um/os-Linux/process.c |
424 | index b8f34c9e..67b9c8f5 100644 |
425 | --- a/arch/um/os-Linux/process.c |
426 | +++ b/arch/um/os-Linux/process.c |
427 | @@ -4,6 +4,7 @@ |
428 | */ |
429 | |
430 | #include <stdio.h> |
431 | +#include <stdlib.h> |
432 | #include <unistd.h> |
433 | #include <errno.h> |
434 | #include <signal.h> |
435 | @@ -232,6 +233,57 @@ out: |
436 | return ok; |
437 | } |
438 | |
439 | +static int os_page_mincore(void *addr) |
440 | +{ |
441 | + char vec[2]; |
442 | + int ret; |
443 | + |
444 | + ret = mincore(addr, UM_KERN_PAGE_SIZE, vec); |
445 | + if (ret < 0) { |
446 | + if (errno == ENOMEM || errno == EINVAL) |
447 | + return 0; |
448 | + else |
449 | + return -errno; |
450 | + } |
451 | + |
452 | + return vec[0] & 1; |
453 | +} |
454 | + |
455 | +int os_mincore(void *addr, unsigned long len) |
456 | +{ |
457 | + char *vec; |
458 | + int ret, i; |
459 | + |
460 | + if (len <= UM_KERN_PAGE_SIZE) |
461 | + return os_page_mincore(addr); |
462 | + |
463 | + vec = calloc(1, (len + UM_KERN_PAGE_SIZE - 1) / UM_KERN_PAGE_SIZE); |
464 | + if (!vec) |
465 | + return -ENOMEM; |
466 | + |
467 | + ret = mincore(addr, UM_KERN_PAGE_SIZE, vec); |
468 | + if (ret < 0) { |
469 | + if (errno == ENOMEM || errno == EINVAL) |
470 | + ret = 0; |
471 | + else |
472 | + ret = -errno; |
473 | + |
474 | + goto out; |
475 | + } |
476 | + |
477 | + for (i = 0; i < ((len + UM_KERN_PAGE_SIZE - 1) / UM_KERN_PAGE_SIZE); i++) { |
478 | + if (!(vec[i] & 1)) { |
479 | + ret = 0; |
480 | + goto out; |
481 | + } |
482 | + } |
483 | + |
484 | + ret = 1; |
485 | +out: |
486 | + free(vec); |
487 | + return ret; |
488 | +} |
489 | + |
490 | void init_new_thread_signals(void) |
491 | { |
492 | set_handler(SIGSEGV); |
493 | diff --git a/arch/x86/ia32/ia32_signal.c b/arch/x86/ia32/ia32_signal.c |
494 | index bccfca68..665a7303 100644 |
495 | --- a/arch/x86/ia32/ia32_signal.c |
496 | +++ b/arch/x86/ia32/ia32_signal.c |
497 | @@ -457,7 +457,7 @@ int ia32_setup_rt_frame(int sig, struct ksignal *ksig, |
498 | else |
499 | put_user_ex(0, &frame->uc.uc_flags); |
500 | put_user_ex(0, &frame->uc.uc_link); |
501 | - err |= __compat_save_altstack(&frame->uc.uc_stack, regs->sp); |
502 | + compat_save_altstack_ex(&frame->uc.uc_stack, regs->sp); |
503 | |
504 | if (ksig->ka.sa.sa_flags & SA_RESTORER) |
505 | restorer = ksig->ka.sa.sa_restorer; |
506 | diff --git a/arch/x86/include/asm/checksum_32.h b/arch/x86/include/asm/checksum_32.h |
507 | index 46fc474f..f50de695 100644 |
508 | --- a/arch/x86/include/asm/checksum_32.h |
509 | +++ b/arch/x86/include/asm/checksum_32.h |
510 | @@ -49,9 +49,15 @@ static inline __wsum csum_partial_copy_from_user(const void __user *src, |
511 | int len, __wsum sum, |
512 | int *err_ptr) |
513 | { |
514 | + __wsum ret; |
515 | + |
516 | might_sleep(); |
517 | - return csum_partial_copy_generic((__force void *)src, dst, |
518 | - len, sum, err_ptr, NULL); |
519 | + stac(); |
520 | + ret = csum_partial_copy_generic((__force void *)src, dst, |
521 | + len, sum, err_ptr, NULL); |
522 | + clac(); |
523 | + |
524 | + return ret; |
525 | } |
526 | |
527 | /* |
528 | @@ -176,10 +182,16 @@ static inline __wsum csum_and_copy_to_user(const void *src, |
529 | int len, __wsum sum, |
530 | int *err_ptr) |
531 | { |
532 | + __wsum ret; |
533 | + |
534 | might_sleep(); |
535 | - if (access_ok(VERIFY_WRITE, dst, len)) |
536 | - return csum_partial_copy_generic(src, (__force void *)dst, |
537 | - len, sum, NULL, err_ptr); |
538 | + if (access_ok(VERIFY_WRITE, dst, len)) { |
539 | + stac(); |
540 | + ret = csum_partial_copy_generic(src, (__force void *)dst, |
541 | + len, sum, NULL, err_ptr); |
542 | + clac(); |
543 | + return ret; |
544 | + } |
545 | |
546 | if (len) |
547 | *err_ptr = -EFAULT; |
548 | diff --git a/arch/x86/include/asm/mce.h b/arch/x86/include/asm/mce.h |
549 | index 29e3093b..aa97342e 100644 |
550 | --- a/arch/x86/include/asm/mce.h |
551 | +++ b/arch/x86/include/asm/mce.h |
552 | @@ -32,11 +32,20 @@ |
553 | #define MCI_STATUS_PCC (1ULL<<57) /* processor context corrupt */ |
554 | #define MCI_STATUS_S (1ULL<<56) /* Signaled machine check */ |
555 | #define MCI_STATUS_AR (1ULL<<55) /* Action required */ |
556 | -#define MCACOD 0xffff /* MCA Error Code */ |
557 | + |
558 | +/* |
559 | + * Note that the full MCACOD field of IA32_MCi_STATUS MSR is |
560 | + * bits 15:0. But bit 12 is the 'F' bit, defined for corrected |
561 | + * errors to indicate that errors are being filtered by hardware. |
562 | + * We should mask out bit 12 when looking for specific signatures |
563 | + * of uncorrected errors - so the F bit is deliberately skipped |
564 | + * in this #define. |
565 | + */ |
566 | +#define MCACOD 0xefff /* MCA Error Code */ |
567 | |
568 | /* Architecturally defined codes from SDM Vol. 3B Chapter 15 */ |
569 | #define MCACOD_SCRUB 0x00C0 /* 0xC0-0xCF Memory Scrubbing */ |
570 | -#define MCACOD_SCRUBMSK 0xfff0 |
571 | +#define MCACOD_SCRUBMSK 0xeff0 /* Skip bit 12 ('F' bit) */ |
572 | #define MCACOD_L3WB 0x017A /* L3 Explicit Writeback */ |
573 | #define MCACOD_DATA 0x0134 /* Data Load */ |
574 | #define MCACOD_INSTR 0x0150 /* Instruction Fetch */ |
575 | diff --git a/arch/x86/include/asm/mmu_context.h b/arch/x86/include/asm/mmu_context.h |
576 | index cdbf3677..be12c534 100644 |
577 | --- a/arch/x86/include/asm/mmu_context.h |
578 | +++ b/arch/x86/include/asm/mmu_context.h |
579 | @@ -45,22 +45,28 @@ static inline void switch_mm(struct mm_struct *prev, struct mm_struct *next, |
580 | /* Re-load page tables */ |
581 | load_cr3(next->pgd); |
582 | |
583 | - /* stop flush ipis for the previous mm */ |
584 | + /* Stop flush ipis for the previous mm */ |
585 | cpumask_clear_cpu(cpu, mm_cpumask(prev)); |
586 | |
587 | - /* |
588 | - * load the LDT, if the LDT is different: |
589 | - */ |
590 | + /* Load the LDT, if the LDT is different: */ |
591 | if (unlikely(prev->context.ldt != next->context.ldt)) |
592 | load_LDT_nolock(&next->context); |
593 | } |
594 | #ifdef CONFIG_SMP |
595 | - else { |
596 | + else { |
597 | this_cpu_write(cpu_tlbstate.state, TLBSTATE_OK); |
598 | BUG_ON(this_cpu_read(cpu_tlbstate.active_mm) != next); |
599 | |
600 | - if (!cpumask_test_and_set_cpu(cpu, mm_cpumask(next))) { |
601 | - /* We were in lazy tlb mode and leave_mm disabled |
602 | + if (!cpumask_test_cpu(cpu, mm_cpumask(next))) { |
603 | + /* |
604 | + * On established mms, the mm_cpumask is only changed |
605 | + * from irq context, from ptep_clear_flush() while in |
606 | + * lazy tlb mode, and here. Irqs are blocked during |
607 | + * schedule, protecting us from simultaneous changes. |
608 | + */ |
609 | + cpumask_set_cpu(cpu, mm_cpumask(next)); |
610 | + /* |
611 | + * We were in lazy tlb mode and leave_mm disabled |
612 | * tlb flush IPI delivery. We must reload CR3 |
613 | * to make sure to use no freed page tables. |
614 | */ |
615 | diff --git a/arch/x86/kernel/amd_nb.c b/arch/x86/kernel/amd_nb.c |
616 | index 3048ded1..59554dca 100644 |
617 | --- a/arch/x86/kernel/amd_nb.c |
618 | +++ b/arch/x86/kernel/amd_nb.c |
619 | @@ -20,6 +20,7 @@ const struct pci_device_id amd_nb_misc_ids[] = { |
620 | { PCI_DEVICE(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_10H_NB_MISC) }, |
621 | { PCI_DEVICE(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_15H_NB_F3) }, |
622 | { PCI_DEVICE(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_15H_M10H_F3) }, |
623 | + { PCI_DEVICE(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_15H_M30H_NB_F3) }, |
624 | { PCI_DEVICE(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_16H_NB_F3) }, |
625 | {} |
626 | }; |
627 | @@ -27,6 +28,7 @@ EXPORT_SYMBOL(amd_nb_misc_ids); |
628 | |
629 | static const struct pci_device_id amd_nb_link_ids[] = { |
630 | { PCI_DEVICE(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_15H_NB_F4) }, |
631 | + { PCI_DEVICE(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_15H_M30H_NB_F4) }, |
632 | { PCI_DEVICE(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_16H_NB_F4) }, |
633 | {} |
634 | }; |
635 | @@ -81,13 +83,20 @@ int amd_cache_northbridges(void) |
636 | next_northbridge(misc, amd_nb_misc_ids); |
637 | node_to_amd_nb(i)->link = link = |
638 | next_northbridge(link, amd_nb_link_ids); |
639 | - } |
640 | + } |
641 | |
642 | + /* GART present only on Fam15h upto model 0fh */ |
643 | if (boot_cpu_data.x86 == 0xf || boot_cpu_data.x86 == 0x10 || |
644 | - boot_cpu_data.x86 == 0x15) |
645 | + (boot_cpu_data.x86 == 0x15 && boot_cpu_data.x86_model < 0x10)) |
646 | amd_northbridges.flags |= AMD_NB_GART; |
647 | |
648 | /* |
649 | + * Check for L3 cache presence. |
650 | + */ |
651 | + if (!cpuid_edx(0x80000006)) |
652 | + return 0; |
653 | + |
654 | + /* |
655 | * Some CPU families support L3 Cache Index Disable. There are some |
656 | * limitations because of E382 and E388 on family 0x10. |
657 | */ |
658 | diff --git a/arch/x86/kernel/signal.c b/arch/x86/kernel/signal.c |
659 | index cf913587..d859eea0 100644 |
660 | --- a/arch/x86/kernel/signal.c |
661 | +++ b/arch/x86/kernel/signal.c |
662 | @@ -358,7 +358,7 @@ static int __setup_rt_frame(int sig, struct ksignal *ksig, |
663 | else |
664 | put_user_ex(0, &frame->uc.uc_flags); |
665 | put_user_ex(0, &frame->uc.uc_link); |
666 | - err |= __save_altstack(&frame->uc.uc_stack, regs->sp); |
667 | + save_altstack_ex(&frame->uc.uc_stack, regs->sp); |
668 | |
669 | /* Set up to return from userspace. */ |
670 | restorer = VDSO32_SYMBOL(current->mm->context.vdso, rt_sigreturn); |
671 | @@ -423,7 +423,7 @@ static int __setup_rt_frame(int sig, struct ksignal *ksig, |
672 | else |
673 | put_user_ex(0, &frame->uc.uc_flags); |
674 | put_user_ex(0, &frame->uc.uc_link); |
675 | - err |= __save_altstack(&frame->uc.uc_stack, regs->sp); |
676 | + save_altstack_ex(&frame->uc.uc_stack, regs->sp); |
677 | |
678 | /* Set up to return from userspace. If provided, use a stub |
679 | already in userspace. */ |
680 | @@ -490,7 +490,7 @@ static int x32_setup_rt_frame(struct ksignal *ksig, |
681 | else |
682 | put_user_ex(0, &frame->uc.uc_flags); |
683 | put_user_ex(0, &frame->uc.uc_link); |
684 | - err |= __compat_save_altstack(&frame->uc.uc_stack, regs->sp); |
685 | + compat_save_altstack_ex(&frame->uc.uc_stack, regs->sp); |
686 | put_user_ex(0, &frame->uc.uc__pad0); |
687 | |
688 | if (ksig->ka.sa.sa_flags & SA_RESTORER) { |
689 | diff --git a/arch/x86/lib/csum-wrappers_64.c b/arch/x86/lib/csum-wrappers_64.c |
690 | index 25b7ae8d..7609e0e4 100644 |
691 | --- a/arch/x86/lib/csum-wrappers_64.c |
692 | +++ b/arch/x86/lib/csum-wrappers_64.c |
693 | @@ -6,6 +6,7 @@ |
694 | */ |
695 | #include <asm/checksum.h> |
696 | #include <linux/module.h> |
697 | +#include <asm/smap.h> |
698 | |
699 | /** |
700 | * csum_partial_copy_from_user - Copy and checksum from user space. |
701 | @@ -52,8 +53,10 @@ csum_partial_copy_from_user(const void __user *src, void *dst, |
702 | len -= 2; |
703 | } |
704 | } |
705 | + stac(); |
706 | isum = csum_partial_copy_generic((__force const void *)src, |
707 | dst, len, isum, errp, NULL); |
708 | + clac(); |
709 | if (unlikely(*errp)) |
710 | goto out_err; |
711 | |
712 | @@ -82,6 +85,8 @@ __wsum |
713 | csum_partial_copy_to_user(const void *src, void __user *dst, |
714 | int len, __wsum isum, int *errp) |
715 | { |
716 | + __wsum ret; |
717 | + |
718 | might_sleep(); |
719 | |
720 | if (unlikely(!access_ok(VERIFY_WRITE, dst, len))) { |
721 | @@ -105,8 +110,11 @@ csum_partial_copy_to_user(const void *src, void __user *dst, |
722 | } |
723 | |
724 | *errp = 0; |
725 | - return csum_partial_copy_generic(src, (void __force *)dst, |
726 | - len, isum, NULL, errp); |
727 | + stac(); |
728 | + ret = csum_partial_copy_generic(src, (void __force *)dst, |
729 | + len, isum, NULL, errp); |
730 | + clac(); |
731 | + return ret; |
732 | } |
733 | EXPORT_SYMBOL(csum_partial_copy_to_user); |
734 | |
735 | diff --git a/arch/xtensa/kernel/xtensa_ksyms.c b/arch/xtensa/kernel/xtensa_ksyms.c |
736 | index d8507f81..74a60c7e 100644 |
737 | --- a/arch/xtensa/kernel/xtensa_ksyms.c |
738 | +++ b/arch/xtensa/kernel/xtensa_ksyms.c |
739 | @@ -25,6 +25,7 @@ |
740 | #include <asm/io.h> |
741 | #include <asm/page.h> |
742 | #include <asm/pgalloc.h> |
743 | +#include <asm/ftrace.h> |
744 | #ifdef CONFIG_BLK_DEV_FD |
745 | #include <asm/floppy.h> |
746 | #endif |
747 | diff --git a/crypto/api.c b/crypto/api.c |
748 | index 3b618033..37c4c721 100644 |
749 | --- a/crypto/api.c |
750 | +++ b/crypto/api.c |
751 | @@ -34,6 +34,8 @@ EXPORT_SYMBOL_GPL(crypto_alg_sem); |
752 | BLOCKING_NOTIFIER_HEAD(crypto_chain); |
753 | EXPORT_SYMBOL_GPL(crypto_chain); |
754 | |
755 | +static struct crypto_alg *crypto_larval_wait(struct crypto_alg *alg); |
756 | + |
757 | struct crypto_alg *crypto_mod_get(struct crypto_alg *alg) |
758 | { |
759 | return try_module_get(alg->cra_module) ? crypto_alg_get(alg) : NULL; |
760 | @@ -144,8 +146,11 @@ static struct crypto_alg *crypto_larval_add(const char *name, u32 type, |
761 | } |
762 | up_write(&crypto_alg_sem); |
763 | |
764 | - if (alg != &larval->alg) |
765 | + if (alg != &larval->alg) { |
766 | kfree(larval); |
767 | + if (crypto_is_larval(alg)) |
768 | + alg = crypto_larval_wait(alg); |
769 | + } |
770 | |
771 | return alg; |
772 | } |
773 | diff --git a/drivers/acpi/acpi_lpss.c b/drivers/acpi/acpi_lpss.c |
774 | index 6a382188..fb78bb9a 100644 |
775 | --- a/drivers/acpi/acpi_lpss.c |
776 | +++ b/drivers/acpi/acpi_lpss.c |
777 | @@ -257,12 +257,13 @@ static int acpi_lpss_create_device(struct acpi_device *adev, |
778 | pdata->mmio_size = resource_size(&rentry->res); |
779 | pdata->mmio_base = ioremap(rentry->res.start, |
780 | pdata->mmio_size); |
781 | - pdata->dev_desc = dev_desc; |
782 | break; |
783 | } |
784 | |
785 | acpi_dev_free_resource_list(&resource_list); |
786 | |
787 | + pdata->dev_desc = dev_desc; |
788 | + |
789 | if (dev_desc->clk_required) { |
790 | ret = register_device_clock(adev, pdata); |
791 | if (ret) { |
792 | diff --git a/drivers/acpi/pci_root.c b/drivers/acpi/pci_root.c |
793 | index 59178393..a67853e3 100644 |
794 | --- a/drivers/acpi/pci_root.c |
795 | +++ b/drivers/acpi/pci_root.c |
796 | @@ -378,6 +378,7 @@ static int acpi_pci_root_add(struct acpi_device *device, |
797 | struct acpi_pci_root *root; |
798 | u32 flags, base_flags; |
799 | acpi_handle handle = device->handle; |
800 | + bool no_aspm = false, clear_aspm = false; |
801 | |
802 | root = kzalloc(sizeof(struct acpi_pci_root), GFP_KERNEL); |
803 | if (!root) |
804 | @@ -437,27 +438,6 @@ static int acpi_pci_root_add(struct acpi_device *device, |
805 | flags = base_flags = OSC_PCI_SEGMENT_GROUPS_SUPPORT; |
806 | acpi_pci_osc_support(root, flags); |
807 | |
808 | - /* |
809 | - * TBD: Need PCI interface for enumeration/configuration of roots. |
810 | - */ |
811 | - |
812 | - /* |
813 | - * Scan the Root Bridge |
814 | - * -------------------- |
815 | - * Must do this prior to any attempt to bind the root device, as the |
816 | - * PCI namespace does not get created until this call is made (and |
817 | - * thus the root bridge's pci_dev does not exist). |
818 | - */ |
819 | - root->bus = pci_acpi_scan_root(root); |
820 | - if (!root->bus) { |
821 | - dev_err(&device->dev, |
822 | - "Bus %04x:%02x not present in PCI namespace\n", |
823 | - root->segment, (unsigned int)root->secondary.start); |
824 | - result = -ENODEV; |
825 | - goto end; |
826 | - } |
827 | - |
828 | - /* Indicate support for various _OSC capabilities. */ |
829 | if (pci_ext_cfg_avail()) |
830 | flags |= OSC_EXT_PCI_CONFIG_SUPPORT; |
831 | if (pcie_aspm_support_enabled()) { |
832 | @@ -471,7 +451,7 @@ static int acpi_pci_root_add(struct acpi_device *device, |
833 | if (ACPI_FAILURE(status)) { |
834 | dev_info(&device->dev, "ACPI _OSC support " |
835 | "notification failed, disabling PCIe ASPM\n"); |
836 | - pcie_no_aspm(); |
837 | + no_aspm = true; |
838 | flags = base_flags; |
839 | } |
840 | } |
841 | @@ -503,7 +483,7 @@ static int acpi_pci_root_add(struct acpi_device *device, |
842 | * We have ASPM control, but the FADT indicates |
843 | * that it's unsupported. Clear it. |
844 | */ |
845 | - pcie_clear_aspm(root->bus); |
846 | + clear_aspm = true; |
847 | } |
848 | } else { |
849 | dev_info(&device->dev, |
850 | @@ -512,7 +492,14 @@ static int acpi_pci_root_add(struct acpi_device *device, |
851 | acpi_format_exception(status), flags); |
852 | dev_info(&device->dev, |
853 | "ACPI _OSC control for PCIe not granted, disabling ASPM\n"); |
854 | - pcie_no_aspm(); |
855 | + /* |
856 | + * We want to disable ASPM here, but aspm_disabled |
857 | + * needs to remain in its state from boot so that we |
858 | + * properly handle PCIe 1.1 devices. So we set this |
859 | + * flag here, to defer the action until after the ACPI |
860 | + * root scan. |
861 | + */ |
862 | + no_aspm = true; |
863 | } |
864 | } else { |
865 | dev_info(&device->dev, |
866 | @@ -520,6 +507,33 @@ static int acpi_pci_root_add(struct acpi_device *device, |
867 | "(_OSC support mask: 0x%02x)\n", flags); |
868 | } |
869 | |
870 | + /* |
871 | + * TBD: Need PCI interface for enumeration/configuration of roots. |
872 | + */ |
873 | + |
874 | + /* |
875 | + * Scan the Root Bridge |
876 | + * -------------------- |
877 | + * Must do this prior to any attempt to bind the root device, as the |
878 | + * PCI namespace does not get created until this call is made (and |
879 | + * thus the root bridge's pci_dev does not exist). |
880 | + */ |
881 | + root->bus = pci_acpi_scan_root(root); |
882 | + if (!root->bus) { |
883 | + dev_err(&device->dev, |
884 | + "Bus %04x:%02x not present in PCI namespace\n", |
885 | + root->segment, (unsigned int)root->secondary.start); |
886 | + result = -ENODEV; |
887 | + goto end; |
888 | + } |
889 | + |
890 | + if (clear_aspm) { |
891 | + dev_info(&device->dev, "Disabling ASPM (FADT indicates it is unsupported)\n"); |
892 | + pcie_clear_aspm(root->bus); |
893 | + } |
894 | + if (no_aspm) |
895 | + pcie_no_aspm(); |
896 | + |
897 | pci_acpi_add_bus_pm_notifier(device, root->bus); |
898 | if (device->wakeup.flags.run_wake) |
899 | device_set_run_wake(root->bus->bridge, true); |
900 | diff --git a/drivers/base/firmware_class.c b/drivers/base/firmware_class.c |
901 | index a439602e..c8dac745 100644 |
902 | --- a/drivers/base/firmware_class.c |
903 | +++ b/drivers/base/firmware_class.c |
904 | @@ -868,8 +868,15 @@ static int _request_firmware_load(struct firmware_priv *fw_priv, bool uevent, |
905 | goto err_del_dev; |
906 | } |
907 | |
908 | + mutex_lock(&fw_lock); |
909 | + list_add(&buf->pending_list, &pending_fw_head); |
910 | + mutex_unlock(&fw_lock); |
911 | + |
912 | retval = device_create_file(f_dev, &dev_attr_loading); |
913 | if (retval) { |
914 | + mutex_lock(&fw_lock); |
915 | + list_del_init(&buf->pending_list); |
916 | + mutex_unlock(&fw_lock); |
917 | dev_err(f_dev, "%s: device_create_file failed\n", __func__); |
918 | goto err_del_bin_attr; |
919 | } |
920 | @@ -884,10 +891,6 @@ static int _request_firmware_load(struct firmware_priv *fw_priv, bool uevent, |
921 | kobject_uevent(&fw_priv->dev.kobj, KOBJ_ADD); |
922 | } |
923 | |
924 | - mutex_lock(&fw_lock); |
925 | - list_add(&buf->pending_list, &pending_fw_head); |
926 | - mutex_unlock(&fw_lock); |
927 | - |
928 | wait_for_completion(&buf->completion); |
929 | |
930 | cancel_delayed_work_sync(&fw_priv->timeout_work); |
931 | diff --git a/drivers/base/regmap/regmap-debugfs.c b/drivers/base/regmap/regmap-debugfs.c |
932 | index 53495753..6c2652a8 100644 |
933 | --- a/drivers/base/regmap/regmap-debugfs.c |
934 | +++ b/drivers/base/regmap/regmap-debugfs.c |
935 | @@ -85,8 +85,8 @@ static unsigned int regmap_debugfs_get_dump_start(struct regmap *map, |
936 | unsigned int reg_offset; |
937 | |
938 | /* Suppress the cache if we're using a subrange */ |
939 | - if (from) |
940 | - return from; |
941 | + if (base) |
942 | + return base; |
943 | |
944 | /* |
945 | * If we don't have a cache build one so we don't have to do a |
946 | diff --git a/drivers/block/rbd.c b/drivers/block/rbd.c |
947 | index 4ad2ad9a..45aa20aa 100644 |
948 | --- a/drivers/block/rbd.c |
949 | +++ b/drivers/block/rbd.c |
950 | @@ -1557,11 +1557,12 @@ rbd_img_obj_request_read_callback(struct rbd_obj_request *obj_request) |
951 | obj_request, obj_request->img_request, obj_request->result, |
952 | xferred, length); |
953 | /* |
954 | - * ENOENT means a hole in the image. We zero-fill the |
955 | - * entire length of the request. A short read also implies |
956 | - * zero-fill to the end of the request. Either way we |
957 | - * update the xferred count to indicate the whole request |
958 | - * was satisfied. |
959 | + * ENOENT means a hole in the image. We zero-fill the entire |
960 | + * length of the request. A short read also implies zero-fill |
961 | + * to the end of the request. An error requires the whole |
962 | + * length of the request to be reported finished with an error |
963 | + * to the block layer. In each case we update the xferred |
964 | + * count to indicate the whole request was satisfied. |
965 | */ |
966 | rbd_assert(obj_request->type != OBJ_REQUEST_NODATA); |
967 | if (obj_request->result == -ENOENT) { |
968 | @@ -1570,14 +1571,13 @@ rbd_img_obj_request_read_callback(struct rbd_obj_request *obj_request) |
969 | else |
970 | zero_pages(obj_request->pages, 0, length); |
971 | obj_request->result = 0; |
972 | - obj_request->xferred = length; |
973 | } else if (xferred < length && !obj_request->result) { |
974 | if (obj_request->type == OBJ_REQUEST_BIO) |
975 | zero_bio_chain(obj_request->bio_list, xferred); |
976 | else |
977 | zero_pages(obj_request->pages, xferred, length); |
978 | - obj_request->xferred = length; |
979 | } |
980 | + obj_request->xferred = length; |
981 | obj_request_done_set(obj_request); |
982 | } |
983 | |
984 | diff --git a/drivers/clk/clk-wm831x.c b/drivers/clk/clk-wm831x.c |
985 | index 1b3f8c9b..1d5af3f7 100644 |
986 | --- a/drivers/clk/clk-wm831x.c |
987 | +++ b/drivers/clk/clk-wm831x.c |
988 | @@ -360,6 +360,8 @@ static int wm831x_clk_probe(struct platform_device *pdev) |
989 | if (!clkdata) |
990 | return -ENOMEM; |
991 | |
992 | + clkdata->wm831x = wm831x; |
993 | + |
994 | /* XTAL_ENA can only be set via OTP/InstantConfig so just read once */ |
995 | ret = wm831x_reg_read(wm831x, WM831X_CLOCK_CONTROL_2); |
996 | if (ret < 0) { |
997 | diff --git a/drivers/cpuidle/coupled.c b/drivers/cpuidle/coupled.c |
998 | index 2a297f86..fe853903 100644 |
999 | --- a/drivers/cpuidle/coupled.c |
1000 | +++ b/drivers/cpuidle/coupled.c |
1001 | @@ -106,6 +106,7 @@ struct cpuidle_coupled { |
1002 | cpumask_t coupled_cpus; |
1003 | int requested_state[NR_CPUS]; |
1004 | atomic_t ready_waiting_counts; |
1005 | + atomic_t abort_barrier; |
1006 | int online_count; |
1007 | int refcnt; |
1008 | int prevent; |
1009 | @@ -122,12 +123,19 @@ static DEFINE_MUTEX(cpuidle_coupled_lock); |
1010 | static DEFINE_PER_CPU(struct call_single_data, cpuidle_coupled_poke_cb); |
1011 | |
1012 | /* |
1013 | - * The cpuidle_coupled_poked_mask mask is used to avoid calling |
1014 | + * The cpuidle_coupled_poke_pending mask is used to avoid calling |
1015 | * __smp_call_function_single with the per cpu call_single_data struct already |
1016 | * in use. This prevents a deadlock where two cpus are waiting for each others |
1017 | * call_single_data struct to be available |
1018 | */ |
1019 | -static cpumask_t cpuidle_coupled_poked_mask; |
1020 | +static cpumask_t cpuidle_coupled_poke_pending; |
1021 | + |
1022 | +/* |
1023 | + * The cpuidle_coupled_poked mask is used to ensure that each cpu has been poked |
1024 | + * once to minimize entering the ready loop with a poke pending, which would |
1025 | + * require aborting and retrying. |
1026 | + */ |
1027 | +static cpumask_t cpuidle_coupled_poked; |
1028 | |
1029 | /** |
1030 | * cpuidle_coupled_parallel_barrier - synchronize all online coupled cpus |
1031 | @@ -291,10 +299,11 @@ static inline int cpuidle_coupled_get_state(struct cpuidle_device *dev, |
1032 | return state; |
1033 | } |
1034 | |
1035 | -static void cpuidle_coupled_poked(void *info) |
1036 | +static void cpuidle_coupled_handle_poke(void *info) |
1037 | { |
1038 | int cpu = (unsigned long)info; |
1039 | - cpumask_clear_cpu(cpu, &cpuidle_coupled_poked_mask); |
1040 | + cpumask_set_cpu(cpu, &cpuidle_coupled_poked); |
1041 | + cpumask_clear_cpu(cpu, &cpuidle_coupled_poke_pending); |
1042 | } |
1043 | |
1044 | /** |
1045 | @@ -313,7 +322,7 @@ static void cpuidle_coupled_poke(int cpu) |
1046 | { |
1047 | struct call_single_data *csd = &per_cpu(cpuidle_coupled_poke_cb, cpu); |
1048 | |
1049 | - if (!cpumask_test_and_set_cpu(cpu, &cpuidle_coupled_poked_mask)) |
1050 | + if (!cpumask_test_and_set_cpu(cpu, &cpuidle_coupled_poke_pending)) |
1051 | __smp_call_function_single(cpu, csd, 0); |
1052 | } |
1053 | |
1054 | @@ -340,30 +349,19 @@ static void cpuidle_coupled_poke_others(int this_cpu, |
1055 | * @coupled: the struct coupled that contains the current cpu |
1056 | * @next_state: the index in drv->states of the requested state for this cpu |
1057 | * |
1058 | - * Updates the requested idle state for the specified cpuidle device, |
1059 | - * poking all coupled cpus out of idle if necessary to let them see the new |
1060 | - * state. |
1061 | + * Updates the requested idle state for the specified cpuidle device. |
1062 | + * Returns the number of waiting cpus. |
1063 | */ |
1064 | -static void cpuidle_coupled_set_waiting(int cpu, |
1065 | +static int cpuidle_coupled_set_waiting(int cpu, |
1066 | struct cpuidle_coupled *coupled, int next_state) |
1067 | { |
1068 | - int w; |
1069 | - |
1070 | coupled->requested_state[cpu] = next_state; |
1071 | |
1072 | /* |
1073 | - * If this is the last cpu to enter the waiting state, poke |
1074 | - * all the other cpus out of their waiting state so they can |
1075 | - * enter a deeper state. This can race with one of the cpus |
1076 | - * exiting the waiting state due to an interrupt and |
1077 | - * decrementing waiting_count, see comment below. |
1078 | - * |
1079 | * The atomic_inc_return provides a write barrier to order the write |
1080 | * to requested_state with the later write that increments ready_count. |
1081 | */ |
1082 | - w = atomic_inc_return(&coupled->ready_waiting_counts) & WAITING_MASK; |
1083 | - if (w == coupled->online_count) |
1084 | - cpuidle_coupled_poke_others(cpu, coupled); |
1085 | + return atomic_inc_return(&coupled->ready_waiting_counts) & WAITING_MASK; |
1086 | } |
1087 | |
1088 | /** |
1089 | @@ -410,19 +408,33 @@ static void cpuidle_coupled_set_done(int cpu, struct cpuidle_coupled *coupled) |
1090 | * been processed and the poke bit has been cleared. |
1091 | * |
1092 | * Other interrupts may also be processed while interrupts are enabled, so |
1093 | - * need_resched() must be tested after turning interrupts off again to make sure |
1094 | + * need_resched() must be tested after this function returns to make sure |
1095 | * the interrupt didn't schedule work that should take the cpu out of idle. |
1096 | * |
1097 | - * Returns 0 if need_resched was false, -EINTR if need_resched was true. |
1098 | + * Returns 0 if no poke was pending, 1 if a poke was cleared. |
1099 | */ |
1100 | static int cpuidle_coupled_clear_pokes(int cpu) |
1101 | { |
1102 | + if (!cpumask_test_cpu(cpu, &cpuidle_coupled_poke_pending)) |
1103 | + return 0; |
1104 | + |
1105 | local_irq_enable(); |
1106 | - while (cpumask_test_cpu(cpu, &cpuidle_coupled_poked_mask)) |
1107 | + while (cpumask_test_cpu(cpu, &cpuidle_coupled_poke_pending)) |
1108 | cpu_relax(); |
1109 | local_irq_disable(); |
1110 | |
1111 | - return need_resched() ? -EINTR : 0; |
1112 | + return 1; |
1113 | +} |
1114 | + |
1115 | +static bool cpuidle_coupled_any_pokes_pending(struct cpuidle_coupled *coupled) |
1116 | +{ |
1117 | + cpumask_t cpus; |
1118 | + int ret; |
1119 | + |
1120 | + cpumask_and(&cpus, cpu_online_mask, &coupled->coupled_cpus); |
1121 | + ret = cpumask_and(&cpus, &cpuidle_coupled_poke_pending, &cpus); |
1122 | + |
1123 | + return ret; |
1124 | } |
1125 | |
1126 | /** |
1127 | @@ -449,12 +461,14 @@ int cpuidle_enter_state_coupled(struct cpuidle_device *dev, |
1128 | { |
1129 | int entered_state = -1; |
1130 | struct cpuidle_coupled *coupled = dev->coupled; |
1131 | + int w; |
1132 | |
1133 | if (!coupled) |
1134 | return -EINVAL; |
1135 | |
1136 | while (coupled->prevent) { |
1137 | - if (cpuidle_coupled_clear_pokes(dev->cpu)) { |
1138 | + cpuidle_coupled_clear_pokes(dev->cpu); |
1139 | + if (need_resched()) { |
1140 | local_irq_enable(); |
1141 | return entered_state; |
1142 | } |
1143 | @@ -465,15 +479,37 @@ int cpuidle_enter_state_coupled(struct cpuidle_device *dev, |
1144 | /* Read barrier ensures online_count is read after prevent is cleared */ |
1145 | smp_rmb(); |
1146 | |
1147 | - cpuidle_coupled_set_waiting(dev->cpu, coupled, next_state); |
1148 | +reset: |
1149 | + cpumask_clear_cpu(dev->cpu, &cpuidle_coupled_poked); |
1150 | + |
1151 | + w = cpuidle_coupled_set_waiting(dev->cpu, coupled, next_state); |
1152 | + /* |
1153 | + * If this is the last cpu to enter the waiting state, poke |
1154 | + * all the other cpus out of their waiting state so they can |
1155 | + * enter a deeper state. This can race with one of the cpus |
1156 | + * exiting the waiting state due to an interrupt and |
1157 | + * decrementing waiting_count, see comment below. |
1158 | + */ |
1159 | + if (w == coupled->online_count) { |
1160 | + cpumask_set_cpu(dev->cpu, &cpuidle_coupled_poked); |
1161 | + cpuidle_coupled_poke_others(dev->cpu, coupled); |
1162 | + } |
1163 | |
1164 | retry: |
1165 | /* |
1166 | * Wait for all coupled cpus to be idle, using the deepest state |
1167 | - * allowed for a single cpu. |
1168 | + * allowed for a single cpu. If this was not the poking cpu, wait |
1169 | + * for at least one poke before leaving to avoid a race where |
1170 | + * two cpus could arrive at the waiting loop at the same time, |
1171 | + * but the first of the two to arrive could skip the loop without |
1172 | + * processing the pokes from the last to arrive. |
1173 | */ |
1174 | - while (!cpuidle_coupled_cpus_waiting(coupled)) { |
1175 | - if (cpuidle_coupled_clear_pokes(dev->cpu)) { |
1176 | + while (!cpuidle_coupled_cpus_waiting(coupled) || |
1177 | + !cpumask_test_cpu(dev->cpu, &cpuidle_coupled_poked)) { |
1178 | + if (cpuidle_coupled_clear_pokes(dev->cpu)) |
1179 | + continue; |
1180 | + |
1181 | + if (need_resched()) { |
1182 | cpuidle_coupled_set_not_waiting(dev->cpu, coupled); |
1183 | goto out; |
1184 | } |
1185 | @@ -487,12 +523,19 @@ retry: |
1186 | dev->safe_state_index); |
1187 | } |
1188 | |
1189 | - if (cpuidle_coupled_clear_pokes(dev->cpu)) { |
1190 | + cpuidle_coupled_clear_pokes(dev->cpu); |
1191 | + if (need_resched()) { |
1192 | cpuidle_coupled_set_not_waiting(dev->cpu, coupled); |
1193 | goto out; |
1194 | } |
1195 | |
1196 | /* |
1197 | + * Make sure final poke status for this cpu is visible before setting |
1198 | + * cpu as ready. |
1199 | + */ |
1200 | + smp_wmb(); |
1201 | + |
1202 | + /* |
1203 | * All coupled cpus are probably idle. There is a small chance that |
1204 | * one of the other cpus just became active. Increment the ready count, |
1205 | * and spin until all coupled cpus have incremented the counter. Once a |
1206 | @@ -511,6 +554,28 @@ retry: |
1207 | cpu_relax(); |
1208 | } |
1209 | |
1210 | + /* |
1211 | + * Make sure read of all cpus ready is done before reading pending pokes |
1212 | + */ |
1213 | + smp_rmb(); |
1214 | + |
1215 | + /* |
1216 | + * There is a small chance that a cpu left and reentered idle after this |
1217 | + * cpu saw that all cpus were waiting. The cpu that reentered idle will |
1218 | + * have sent this cpu a poke, which will still be pending after the |
1219 | + * ready loop. The pending interrupt may be lost by the interrupt |
1220 | + * controller when entering the deep idle state. It's not possible to |
1221 | + * clear a pending interrupt without turning interrupts on and handling |
1222 | + * it, and it's too late to turn on interrupts here, so reset the |
1223 | + * coupled idle state of all cpus and retry. |
1224 | + */ |
1225 | + if (cpuidle_coupled_any_pokes_pending(coupled)) { |
1226 | + cpuidle_coupled_set_done(dev->cpu, coupled); |
1227 | + /* Wait for all cpus to see the pending pokes */ |
1228 | + cpuidle_coupled_parallel_barrier(dev, &coupled->abort_barrier); |
1229 | + goto reset; |
1230 | + } |
1231 | + |
1232 | /* all cpus have acked the coupled state */ |
1233 | next_state = cpuidle_coupled_get_state(dev, coupled); |
1234 | |
1235 | @@ -596,7 +661,7 @@ have_coupled: |
1236 | coupled->refcnt++; |
1237 | |
1238 | csd = &per_cpu(cpuidle_coupled_poke_cb, dev->cpu); |
1239 | - csd->func = cpuidle_coupled_poked; |
1240 | + csd->func = cpuidle_coupled_handle_poke; |
1241 | csd->info = (void *)(unsigned long)dev->cpu; |
1242 | |
1243 | return 0; |
1244 | diff --git a/drivers/edac/amd64_edac.c b/drivers/edac/amd64_edac.c |
1245 | index 8b6a0343..8b3d9014 100644 |
1246 | --- a/drivers/edac/amd64_edac.c |
1247 | +++ b/drivers/edac/amd64_edac.c |
1248 | @@ -2470,8 +2470,15 @@ static int amd64_init_one_instance(struct pci_dev *F2) |
1249 | layers[0].size = pvt->csels[0].b_cnt; |
1250 | layers[0].is_virt_csrow = true; |
1251 | layers[1].type = EDAC_MC_LAYER_CHANNEL; |
1252 | - layers[1].size = pvt->channel_count; |
1253 | + |
1254 | + /* |
1255 | + * Always allocate two channels since we can have setups with DIMMs on |
1256 | + * only one channel. Also, this simplifies handling later for the price |
1257 | + * of a couple of KBs tops. |
1258 | + */ |
1259 | + layers[1].size = 2; |
1260 | layers[1].is_virt_csrow = false; |
1261 | + |
1262 | mci = edac_mc_alloc(nid, ARRAY_SIZE(layers), layers, 0); |
1263 | if (!mci) |
1264 | goto err_siblings; |
1265 | diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c |
1266 | index 95d6f4b6..70fc1335 100644 |
1267 | --- a/drivers/gpu/drm/drm_edid.c |
1268 | +++ b/drivers/gpu/drm/drm_edid.c |
1269 | @@ -125,6 +125,9 @@ static struct edid_quirk { |
1270 | |
1271 | /* ViewSonic VA2026w */ |
1272 | { "VSC", 5020, EDID_QUIRK_FORCE_REDUCED_BLANKING }, |
1273 | + |
1274 | + /* Medion MD 30217 PG */ |
1275 | + { "MED", 0x7b8, EDID_QUIRK_PREFER_LARGE_75 }, |
1276 | }; |
1277 | |
1278 | /* |
1279 | diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c |
1280 | index be79f477..ca40d1b1 100644 |
1281 | --- a/drivers/gpu/drm/i915/intel_display.c |
1282 | +++ b/drivers/gpu/drm/i915/intel_display.c |
1283 | @@ -7809,6 +7809,19 @@ intel_modeset_pipe_config(struct drm_crtc *crtc, |
1284 | pipe_config->cpu_transcoder = to_intel_crtc(crtc)->pipe; |
1285 | pipe_config->shared_dpll = DPLL_ID_PRIVATE; |
1286 | |
1287 | + /* |
1288 | + * Sanitize sync polarity flags based on requested ones. If neither |
1289 | + * positive or negative polarity is requested, treat this as meaning |
1290 | + * negative polarity. |
1291 | + */ |
1292 | + if (!(pipe_config->adjusted_mode.flags & |
1293 | + (DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_NHSYNC))) |
1294 | + pipe_config->adjusted_mode.flags |= DRM_MODE_FLAG_NHSYNC; |
1295 | + |
1296 | + if (!(pipe_config->adjusted_mode.flags & |
1297 | + (DRM_MODE_FLAG_PVSYNC | DRM_MODE_FLAG_NVSYNC))) |
1298 | + pipe_config->adjusted_mode.flags |= DRM_MODE_FLAG_NVSYNC; |
1299 | + |
1300 | /* Compute a starting value for pipe_config->pipe_bpp taking the source |
1301 | * plane pixel format and any sink constraints into account. Returns the |
1302 | * source plane bpp so that dithering can be selected on mismatches |
1303 | diff --git a/drivers/hid/hid-core.c b/drivers/hid/hid-core.c |
1304 | index 36668d1a..5956445d 100644 |
1305 | --- a/drivers/hid/hid-core.c |
1306 | +++ b/drivers/hid/hid-core.c |
1307 | @@ -63,6 +63,8 @@ struct hid_report *hid_register_report(struct hid_device *device, unsigned type, |
1308 | struct hid_report_enum *report_enum = device->report_enum + type; |
1309 | struct hid_report *report; |
1310 | |
1311 | + if (id >= HID_MAX_IDS) |
1312 | + return NULL; |
1313 | if (report_enum->report_id_hash[id]) |
1314 | return report_enum->report_id_hash[id]; |
1315 | |
1316 | @@ -404,8 +406,10 @@ static int hid_parser_global(struct hid_parser *parser, struct hid_item *item) |
1317 | |
1318 | case HID_GLOBAL_ITEM_TAG_REPORT_ID: |
1319 | parser->global.report_id = item_udata(item); |
1320 | - if (parser->global.report_id == 0) { |
1321 | - hid_err(parser->device, "report_id 0 is invalid\n"); |
1322 | + if (parser->global.report_id == 0 || |
1323 | + parser->global.report_id >= HID_MAX_IDS) { |
1324 | + hid_err(parser->device, "report_id %u is invalid\n", |
1325 | + parser->global.report_id); |
1326 | return -1; |
1327 | } |
1328 | return 0; |
1329 | @@ -575,7 +579,7 @@ static void hid_close_report(struct hid_device *device) |
1330 | for (i = 0; i < HID_REPORT_TYPES; i++) { |
1331 | struct hid_report_enum *report_enum = device->report_enum + i; |
1332 | |
1333 | - for (j = 0; j < 256; j++) { |
1334 | + for (j = 0; j < HID_MAX_IDS; j++) { |
1335 | struct hid_report *report = report_enum->report_id_hash[j]; |
1336 | if (report) |
1337 | hid_free_report(report); |
1338 | @@ -1152,7 +1156,12 @@ EXPORT_SYMBOL_GPL(hid_output_report); |
1339 | |
1340 | int hid_set_field(struct hid_field *field, unsigned offset, __s32 value) |
1341 | { |
1342 | - unsigned size = field->report_size; |
1343 | + unsigned size; |
1344 | + |
1345 | + if (!field) |
1346 | + return -1; |
1347 | + |
1348 | + size = field->report_size; |
1349 | |
1350 | hid_dump_input(field->report->device, field->usage + offset, value); |
1351 | |
1352 | @@ -1597,6 +1606,7 @@ static const struct hid_device_id hid_have_special_driver[] = { |
1353 | { HID_USB_DEVICE(USB_VENDOR_ID_KENSINGTON, USB_DEVICE_ID_KS_SLIMBLADE) }, |
1354 | { HID_USB_DEVICE(USB_VENDOR_ID_KEYTOUCH, USB_DEVICE_ID_KEYTOUCH_IEC) }, |
1355 | { HID_USB_DEVICE(USB_VENDOR_ID_KYE, USB_DEVICE_ID_GENIUS_GILA_GAMING_MOUSE) }, |
1356 | + { HID_USB_DEVICE(USB_VENDOR_ID_KYE, USB_DEVICE_ID_GENIUS_GX_IMPERATOR) }, |
1357 | { HID_USB_DEVICE(USB_VENDOR_ID_KYE, USB_DEVICE_ID_KYE_ERGO_525V) }, |
1358 | { HID_USB_DEVICE(USB_VENDOR_ID_KYE, USB_DEVICE_ID_KYE_EASYPEN_I405X) }, |
1359 | { HID_USB_DEVICE(USB_VENDOR_ID_KYE, USB_DEVICE_ID_KYE_MOUSEPEN_I608X) }, |
1360 | diff --git a/drivers/hid/hid-ids.h b/drivers/hid/hid-ids.h |
1361 | index ffe4c7ae..22134d4b 100644 |
1362 | --- a/drivers/hid/hid-ids.h |
1363 | +++ b/drivers/hid/hid-ids.h |
1364 | @@ -135,9 +135,9 @@ |
1365 | #define USB_DEVICE_ID_APPLE_ALU_WIRELESS_2009_JIS 0x023b |
1366 | #define USB_DEVICE_ID_APPLE_ALU_WIRELESS_2011_ANSI 0x0255 |
1367 | #define USB_DEVICE_ID_APPLE_ALU_WIRELESS_2011_ISO 0x0256 |
1368 | -#define USB_DEVICE_ID_APPLE_WELLSPRING8_ANSI 0x0291 |
1369 | -#define USB_DEVICE_ID_APPLE_WELLSPRING8_ISO 0x0292 |
1370 | -#define USB_DEVICE_ID_APPLE_WELLSPRING8_JIS 0x0293 |
1371 | +#define USB_DEVICE_ID_APPLE_WELLSPRING8_ANSI 0x0290 |
1372 | +#define USB_DEVICE_ID_APPLE_WELLSPRING8_ISO 0x0291 |
1373 | +#define USB_DEVICE_ID_APPLE_WELLSPRING8_JIS 0x0292 |
1374 | #define USB_DEVICE_ID_APPLE_FOUNTAIN_TP_ONLY 0x030a |
1375 | #define USB_DEVICE_ID_APPLE_GEYSER1_TP_ONLY 0x030b |
1376 | #define USB_DEVICE_ID_APPLE_IRCONTROL 0x8240 |
1377 | @@ -482,6 +482,7 @@ |
1378 | #define USB_VENDOR_ID_KYE 0x0458 |
1379 | #define USB_DEVICE_ID_KYE_ERGO_525V 0x0087 |
1380 | #define USB_DEVICE_ID_GENIUS_GILA_GAMING_MOUSE 0x0138 |
1381 | +#define USB_DEVICE_ID_GENIUS_GX_IMPERATOR 0x4018 |
1382 | #define USB_DEVICE_ID_KYE_GPEN_560 0x5003 |
1383 | #define USB_DEVICE_ID_KYE_EASYPEN_I405X 0x5010 |
1384 | #define USB_DEVICE_ID_KYE_MOUSEPEN_I608X 0x5011 |
1385 | @@ -658,6 +659,7 @@ |
1386 | #define USB_DEVICE_ID_NTRIG_TOUCH_SCREEN_16 0x0012 |
1387 | #define USB_DEVICE_ID_NTRIG_TOUCH_SCREEN_17 0x0013 |
1388 | #define USB_DEVICE_ID_NTRIG_TOUCH_SCREEN_18 0x0014 |
1389 | +#define USB_DEVICE_ID_NTRIG_DUOSENSE 0x1500 |
1390 | |
1391 | #define USB_VENDOR_ID_ONTRAK 0x0a07 |
1392 | #define USB_DEVICE_ID_ONTRAK_ADU100 0x0064 |
1393 | diff --git a/drivers/hid/hid-input.c b/drivers/hid/hid-input.c |
1394 | index 7480799e..3fc4034a 100644 |
1395 | --- a/drivers/hid/hid-input.c |
1396 | +++ b/drivers/hid/hid-input.c |
1397 | @@ -340,7 +340,7 @@ static int hidinput_get_battery_property(struct power_supply *psy, |
1398 | { |
1399 | struct hid_device *dev = container_of(psy, struct hid_device, battery); |
1400 | int ret = 0; |
1401 | - __u8 buf[2] = {}; |
1402 | + __u8 *buf; |
1403 | |
1404 | switch (prop) { |
1405 | case POWER_SUPPLY_PROP_PRESENT: |
1406 | @@ -349,12 +349,19 @@ static int hidinput_get_battery_property(struct power_supply *psy, |
1407 | break; |
1408 | |
1409 | case POWER_SUPPLY_PROP_CAPACITY: |
1410 | + |
1411 | + buf = kmalloc(2 * sizeof(__u8), GFP_KERNEL); |
1412 | + if (!buf) { |
1413 | + ret = -ENOMEM; |
1414 | + break; |
1415 | + } |
1416 | ret = dev->hid_get_raw_report(dev, dev->battery_report_id, |
1417 | - buf, sizeof(buf), |
1418 | + buf, 2, |
1419 | dev->battery_report_type); |
1420 | |
1421 | if (ret != 2) { |
1422 | ret = -ENODATA; |
1423 | + kfree(buf); |
1424 | break; |
1425 | } |
1426 | ret = 0; |
1427 | @@ -364,6 +371,7 @@ static int hidinput_get_battery_property(struct power_supply *psy, |
1428 | buf[1] <= dev->battery_max) |
1429 | val->intval = (100 * (buf[1] - dev->battery_min)) / |
1430 | (dev->battery_max - dev->battery_min); |
1431 | + kfree(buf); |
1432 | break; |
1433 | |
1434 | case POWER_SUPPLY_PROP_MODEL_NAME: |
1435 | diff --git a/drivers/hid/hid-kye.c b/drivers/hid/hid-kye.c |
1436 | index 1e2ee2aa..73845120 100644 |
1437 | --- a/drivers/hid/hid-kye.c |
1438 | +++ b/drivers/hid/hid-kye.c |
1439 | @@ -268,6 +268,26 @@ static __u8 easypen_m610x_rdesc_fixed[] = { |
1440 | 0xC0 /* End Collection */ |
1441 | }; |
1442 | |
1443 | +static __u8 *kye_consumer_control_fixup(struct hid_device *hdev, __u8 *rdesc, |
1444 | + unsigned int *rsize, int offset, const char *device_name) { |
1445 | + /* |
1446 | + * the fixup that need to be done: |
1447 | + * - change Usage Maximum in the Comsumer Control |
1448 | + * (report ID 3) to a reasonable value |
1449 | + */ |
1450 | + if (*rsize >= offset + 31 && |
1451 | + /* Usage Page (Consumer Devices) */ |
1452 | + rdesc[offset] == 0x05 && rdesc[offset + 1] == 0x0c && |
1453 | + /* Usage (Consumer Control) */ |
1454 | + rdesc[offset + 2] == 0x09 && rdesc[offset + 3] == 0x01 && |
1455 | + /* Usage Maximum > 12287 */ |
1456 | + rdesc[offset + 10] == 0x2a && rdesc[offset + 12] > 0x2f) { |
1457 | + hid_info(hdev, "fixing up %s report descriptor\n", device_name); |
1458 | + rdesc[offset + 12] = 0x2f; |
1459 | + } |
1460 | + return rdesc; |
1461 | +} |
1462 | + |
1463 | static __u8 *kye_report_fixup(struct hid_device *hdev, __u8 *rdesc, |
1464 | unsigned int *rsize) |
1465 | { |
1466 | @@ -315,23 +335,12 @@ static __u8 *kye_report_fixup(struct hid_device *hdev, __u8 *rdesc, |
1467 | } |
1468 | break; |
1469 | case USB_DEVICE_ID_GENIUS_GILA_GAMING_MOUSE: |
1470 | - /* |
1471 | - * the fixup that need to be done: |
1472 | - * - change Usage Maximum in the Comsumer Control |
1473 | - * (report ID 3) to a reasonable value |
1474 | - */ |
1475 | - if (*rsize >= 135 && |
1476 | - /* Usage Page (Consumer Devices) */ |
1477 | - rdesc[104] == 0x05 && rdesc[105] == 0x0c && |
1478 | - /* Usage (Consumer Control) */ |
1479 | - rdesc[106] == 0x09 && rdesc[107] == 0x01 && |
1480 | - /* Usage Maximum > 12287 */ |
1481 | - rdesc[114] == 0x2a && rdesc[116] > 0x2f) { |
1482 | - hid_info(hdev, |
1483 | - "fixing up Genius Gila Gaming Mouse " |
1484 | - "report descriptor\n"); |
1485 | - rdesc[116] = 0x2f; |
1486 | - } |
1487 | + rdesc = kye_consumer_control_fixup(hdev, rdesc, rsize, 104, |
1488 | + "Genius Gila Gaming Mouse"); |
1489 | + break; |
1490 | + case USB_DEVICE_ID_GENIUS_GX_IMPERATOR: |
1491 | + rdesc = kye_consumer_control_fixup(hdev, rdesc, rsize, 83, |
1492 | + "Genius Gx Imperator Keyboard"); |
1493 | break; |
1494 | } |
1495 | return rdesc; |
1496 | @@ -428,6 +437,8 @@ static const struct hid_device_id kye_devices[] = { |
1497 | USB_DEVICE_ID_KYE_EASYPEN_M610X) }, |
1498 | { HID_USB_DEVICE(USB_VENDOR_ID_KYE, |
1499 | USB_DEVICE_ID_GENIUS_GILA_GAMING_MOUSE) }, |
1500 | + { HID_USB_DEVICE(USB_VENDOR_ID_KYE, |
1501 | + USB_DEVICE_ID_GENIUS_GX_IMPERATOR) }, |
1502 | { } |
1503 | }; |
1504 | MODULE_DEVICE_TABLE(hid, kye_devices); |
1505 | diff --git a/drivers/hid/hid-ntrig.c b/drivers/hid/hid-ntrig.c |
1506 | index ef951025..5482156a 100644 |
1507 | --- a/drivers/hid/hid-ntrig.c |
1508 | +++ b/drivers/hid/hid-ntrig.c |
1509 | @@ -115,7 +115,8 @@ static inline int ntrig_get_mode(struct hid_device *hdev) |
1510 | struct hid_report *report = hdev->report_enum[HID_FEATURE_REPORT]. |
1511 | report_id_hash[0x0d]; |
1512 | |
1513 | - if (!report) |
1514 | + if (!report || report->maxfield < 1 || |
1515 | + report->field[0]->report_count < 1) |
1516 | return -EINVAL; |
1517 | |
1518 | hid_hw_request(hdev, report, HID_REQ_GET_REPORT); |
1519 | diff --git a/drivers/hid/hid-picolcd_cir.c b/drivers/hid/hid-picolcd_cir.c |
1520 | index e346038f..59d5eb1e 100644 |
1521 | --- a/drivers/hid/hid-picolcd_cir.c |
1522 | +++ b/drivers/hid/hid-picolcd_cir.c |
1523 | @@ -145,6 +145,7 @@ void picolcd_exit_cir(struct picolcd_data *data) |
1524 | struct rc_dev *rdev = data->rc_dev; |
1525 | |
1526 | data->rc_dev = NULL; |
1527 | - rc_unregister_device(rdev); |
1528 | + if (rdev) |
1529 | + rc_unregister_device(rdev); |
1530 | } |
1531 | |
1532 | diff --git a/drivers/hid/hid-picolcd_core.c b/drivers/hid/hid-picolcd_core.c |
1533 | index b48092d0..acbb0210 100644 |
1534 | --- a/drivers/hid/hid-picolcd_core.c |
1535 | +++ b/drivers/hid/hid-picolcd_core.c |
1536 | @@ -290,7 +290,7 @@ static ssize_t picolcd_operation_mode_store(struct device *dev, |
1537 | buf += 10; |
1538 | cnt -= 10; |
1539 | } |
1540 | - if (!report) |
1541 | + if (!report || report->maxfield != 1) |
1542 | return -EINVAL; |
1543 | |
1544 | while (cnt > 0 && (buf[cnt-1] == '\n' || buf[cnt-1] == '\r')) |
1545 | diff --git a/drivers/hid/hid-picolcd_fb.c b/drivers/hid/hid-picolcd_fb.c |
1546 | index 591f6b22..c930ab85 100644 |
1547 | --- a/drivers/hid/hid-picolcd_fb.c |
1548 | +++ b/drivers/hid/hid-picolcd_fb.c |
1549 | @@ -593,10 +593,14 @@ err_nomem: |
1550 | void picolcd_exit_framebuffer(struct picolcd_data *data) |
1551 | { |
1552 | struct fb_info *info = data->fb_info; |
1553 | - struct picolcd_fb_data *fbdata = info->par; |
1554 | + struct picolcd_fb_data *fbdata; |
1555 | unsigned long flags; |
1556 | |
1557 | + if (!info) |
1558 | + return; |
1559 | + |
1560 | device_remove_file(&data->hdev->dev, &dev_attr_fb_update_rate); |
1561 | + fbdata = info->par; |
1562 | |
1563 | /* disconnect framebuffer from HID dev */ |
1564 | spin_lock_irqsave(&fbdata->lock, flags); |
1565 | diff --git a/drivers/hid/hid-pl.c b/drivers/hid/hid-pl.c |
1566 | index d29112fa..2dcd7d98 100644 |
1567 | --- a/drivers/hid/hid-pl.c |
1568 | +++ b/drivers/hid/hid-pl.c |
1569 | @@ -132,8 +132,14 @@ static int plff_init(struct hid_device *hid) |
1570 | strong = &report->field[0]->value[2]; |
1571 | weak = &report->field[0]->value[3]; |
1572 | debug("detected single-field device"); |
1573 | - } else if (report->maxfield >= 4 && report->field[0]->maxusage == 1 && |
1574 | - report->field[0]->usage[0].hid == (HID_UP_LED | 0x43)) { |
1575 | + } else if (report->field[0]->maxusage == 1 && |
1576 | + report->field[0]->usage[0].hid == |
1577 | + (HID_UP_LED | 0x43) && |
1578 | + report->maxfield >= 4 && |
1579 | + report->field[0]->report_count >= 1 && |
1580 | + report->field[1]->report_count >= 1 && |
1581 | + report->field[2]->report_count >= 1 && |
1582 | + report->field[3]->report_count >= 1) { |
1583 | report->field[0]->value[0] = 0x00; |
1584 | report->field[1]->value[0] = 0x00; |
1585 | strong = &report->field[2]->value[0]; |
1586 | diff --git a/drivers/hid/hid-sensor-hub.c b/drivers/hid/hid-sensor-hub.c |
1587 | index ca749810..aa34755c 100644 |
1588 | --- a/drivers/hid/hid-sensor-hub.c |
1589 | +++ b/drivers/hid/hid-sensor-hub.c |
1590 | @@ -221,7 +221,8 @@ int sensor_hub_get_feature(struct hid_sensor_hub_device *hsdev, u32 report_id, |
1591 | |
1592 | mutex_lock(&data->mutex); |
1593 | report = sensor_hub_report(report_id, hsdev->hdev, HID_FEATURE_REPORT); |
1594 | - if (!report || (field_index >= report->maxfield)) { |
1595 | + if (!report || (field_index >= report->maxfield) || |
1596 | + report->field[field_index]->report_count < 1) { |
1597 | ret = -EINVAL; |
1598 | goto done_proc; |
1599 | } |
1600 | diff --git a/drivers/hid/hid-speedlink.c b/drivers/hid/hid-speedlink.c |
1601 | index a2f587d0..7112f3e8 100644 |
1602 | --- a/drivers/hid/hid-speedlink.c |
1603 | +++ b/drivers/hid/hid-speedlink.c |
1604 | @@ -3,7 +3,7 @@ |
1605 | * Fixes "jumpy" cursor and removes nonexistent keyboard LEDS from |
1606 | * the HID descriptor. |
1607 | * |
1608 | - * Copyright (c) 2011 Stefan Kriwanek <mail@stefankriwanek.de> |
1609 | + * Copyright (c) 2011, 2013 Stefan Kriwanek <dev@stefankriwanek.de> |
1610 | */ |
1611 | |
1612 | /* |
1613 | @@ -46,8 +46,13 @@ static int speedlink_event(struct hid_device *hdev, struct hid_field *field, |
1614 | struct hid_usage *usage, __s32 value) |
1615 | { |
1616 | /* No other conditions due to usage_table. */ |
1617 | - /* Fix "jumpy" cursor (invalid events sent by device). */ |
1618 | - if (value == 256) |
1619 | + |
1620 | + /* This fixes the "jumpy" cursor occuring due to invalid events sent |
1621 | + * by the device. Some devices only send them with value==+256, others |
1622 | + * don't. However, catching abs(value)>=256 is restrictive enough not |
1623 | + * to interfere with devices that were bug-free (has been tested). |
1624 | + */ |
1625 | + if (abs(value) >= 256) |
1626 | return 1; |
1627 | /* Drop useless distance 0 events (on button clicks etc.) as well */ |
1628 | if (value == 0) |
1629 | diff --git a/drivers/hid/hid-wiimote-core.c b/drivers/hid/hid-wiimote-core.c |
1630 | index 0c06054c..66020982 100644 |
1631 | --- a/drivers/hid/hid-wiimote-core.c |
1632 | +++ b/drivers/hid/hid-wiimote-core.c |
1633 | @@ -212,10 +212,12 @@ static __u8 select_drm(struct wiimote_data *wdata) |
1634 | |
1635 | if (ir == WIIPROTO_FLAG_IR_BASIC) { |
1636 | if (wdata->state.flags & WIIPROTO_FLAG_ACCEL) { |
1637 | - if (ext) |
1638 | - return WIIPROTO_REQ_DRM_KAIE; |
1639 | - else |
1640 | - return WIIPROTO_REQ_DRM_KAI; |
1641 | + /* GEN10 and ealier devices bind IR formats to DRMs. |
1642 | + * Hence, we cannot use DRM_KAI here as it might be |
1643 | + * bound to IR_EXT. Use DRM_KAIE unconditionally so we |
1644 | + * work with all devices and our parsers can use the |
1645 | + * fixed formats, too. */ |
1646 | + return WIIPROTO_REQ_DRM_KAIE; |
1647 | } else { |
1648 | return WIIPROTO_REQ_DRM_KIE; |
1649 | } |
1650 | diff --git a/drivers/hid/hidraw.c b/drivers/hid/hidraw.c |
1651 | index 6f1feb2c..dbfe3007 100644 |
1652 | --- a/drivers/hid/hidraw.c |
1653 | +++ b/drivers/hid/hidraw.c |
1654 | @@ -113,7 +113,7 @@ static ssize_t hidraw_send_report(struct file *file, const char __user *buffer, |
1655 | __u8 *buf; |
1656 | int ret = 0; |
1657 | |
1658 | - if (!hidraw_table[minor]) { |
1659 | + if (!hidraw_table[minor] || !hidraw_table[minor]->exist) { |
1660 | ret = -ENODEV; |
1661 | goto out; |
1662 | } |
1663 | @@ -261,7 +261,7 @@ static int hidraw_open(struct inode *inode, struct file *file) |
1664 | } |
1665 | |
1666 | mutex_lock(&minors_lock); |
1667 | - if (!hidraw_table[minor]) { |
1668 | + if (!hidraw_table[minor] || !hidraw_table[minor]->exist) { |
1669 | err = -ENODEV; |
1670 | goto out_unlock; |
1671 | } |
1672 | @@ -302,39 +302,38 @@ static int hidraw_fasync(int fd, struct file *file, int on) |
1673 | return fasync_helper(fd, file, on, &list->fasync); |
1674 | } |
1675 | |
1676 | +static void drop_ref(struct hidraw *hidraw, int exists_bit) |
1677 | +{ |
1678 | + if (exists_bit) { |
1679 | + hid_hw_close(hidraw->hid); |
1680 | + hidraw->exist = 0; |
1681 | + if (hidraw->open) |
1682 | + wake_up_interruptible(&hidraw->wait); |
1683 | + } else { |
1684 | + --hidraw->open; |
1685 | + } |
1686 | + |
1687 | + if (!hidraw->open && !hidraw->exist) { |
1688 | + device_destroy(hidraw_class, MKDEV(hidraw_major, hidraw->minor)); |
1689 | + hidraw_table[hidraw->minor] = NULL; |
1690 | + kfree(hidraw); |
1691 | + } |
1692 | +} |
1693 | + |
1694 | static int hidraw_release(struct inode * inode, struct file * file) |
1695 | { |
1696 | unsigned int minor = iminor(inode); |
1697 | - struct hidraw *dev; |
1698 | struct hidraw_list *list = file->private_data; |
1699 | - int ret; |
1700 | - int i; |
1701 | |
1702 | mutex_lock(&minors_lock); |
1703 | - if (!hidraw_table[minor]) { |
1704 | - ret = -ENODEV; |
1705 | - goto unlock; |
1706 | - } |
1707 | |
1708 | list_del(&list->node); |
1709 | - dev = hidraw_table[minor]; |
1710 | - if (!--dev->open) { |
1711 | - if (list->hidraw->exist) { |
1712 | - hid_hw_power(dev->hid, PM_HINT_NORMAL); |
1713 | - hid_hw_close(dev->hid); |
1714 | - } else { |
1715 | - kfree(list->hidraw); |
1716 | - } |
1717 | - } |
1718 | - |
1719 | - for (i = 0; i < HIDRAW_BUFFER_SIZE; ++i) |
1720 | - kfree(list->buffer[i].value); |
1721 | kfree(list); |
1722 | - ret = 0; |
1723 | -unlock: |
1724 | - mutex_unlock(&minors_lock); |
1725 | |
1726 | - return ret; |
1727 | + drop_ref(hidraw_table[minor], 0); |
1728 | + |
1729 | + mutex_unlock(&minors_lock); |
1730 | + return 0; |
1731 | } |
1732 | |
1733 | static long hidraw_ioctl(struct file *file, unsigned int cmd, |
1734 | @@ -539,18 +538,9 @@ void hidraw_disconnect(struct hid_device *hid) |
1735 | struct hidraw *hidraw = hid->hidraw; |
1736 | |
1737 | mutex_lock(&minors_lock); |
1738 | - hidraw->exist = 0; |
1739 | - |
1740 | - device_destroy(hidraw_class, MKDEV(hidraw_major, hidraw->minor)); |
1741 | |
1742 | - hidraw_table[hidraw->minor] = NULL; |
1743 | + drop_ref(hidraw, 1); |
1744 | |
1745 | - if (hidraw->open) { |
1746 | - hid_hw_close(hid); |
1747 | - wake_up_interruptible(&hidraw->wait); |
1748 | - } else { |
1749 | - kfree(hidraw); |
1750 | - } |
1751 | mutex_unlock(&minors_lock); |
1752 | } |
1753 | EXPORT_SYMBOL_GPL(hidraw_disconnect); |
1754 | diff --git a/drivers/hid/usbhid/hid-quirks.c b/drivers/hid/usbhid/hid-quirks.c |
1755 | index 19b8360f..07345521 100644 |
1756 | --- a/drivers/hid/usbhid/hid-quirks.c |
1757 | +++ b/drivers/hid/usbhid/hid-quirks.c |
1758 | @@ -109,6 +109,8 @@ static const struct hid_blacklist { |
1759 | { USB_VENDOR_ID_SIGMA_MICRO, USB_DEVICE_ID_SIGMA_MICRO_KEYBOARD, HID_QUIRK_NO_INIT_REPORTS }, |
1760 | { USB_VENDOR_ID_KYE, USB_DEVICE_ID_KYE_MOUSEPEN_I608X, HID_QUIRK_MULTI_INPUT }, |
1761 | { USB_VENDOR_ID_KYE, USB_DEVICE_ID_KYE_EASYPEN_M610X, HID_QUIRK_MULTI_INPUT }, |
1762 | + { USB_VENDOR_ID_NTRIG, USB_DEVICE_ID_NTRIG_DUOSENSE, HID_QUIRK_NO_INIT_REPORTS }, |
1763 | + |
1764 | { 0, 0 } |
1765 | }; |
1766 | |
1767 | diff --git a/drivers/input/mouse/bcm5974.c b/drivers/input/mouse/bcm5974.c |
1768 | index 4ef4d5e1..a73f9618 100644 |
1769 | --- a/drivers/input/mouse/bcm5974.c |
1770 | +++ b/drivers/input/mouse/bcm5974.c |
1771 | @@ -89,9 +89,9 @@ |
1772 | #define USB_DEVICE_ID_APPLE_WELLSPRING7A_ISO 0x025a |
1773 | #define USB_DEVICE_ID_APPLE_WELLSPRING7A_JIS 0x025b |
1774 | /* MacbookAir6,2 (unibody, June 2013) */ |
1775 | -#define USB_DEVICE_ID_APPLE_WELLSPRING8_ANSI 0x0291 |
1776 | -#define USB_DEVICE_ID_APPLE_WELLSPRING8_ISO 0x0292 |
1777 | -#define USB_DEVICE_ID_APPLE_WELLSPRING8_JIS 0x0293 |
1778 | +#define USB_DEVICE_ID_APPLE_WELLSPRING8_ANSI 0x0290 |
1779 | +#define USB_DEVICE_ID_APPLE_WELLSPRING8_ISO 0x0291 |
1780 | +#define USB_DEVICE_ID_APPLE_WELLSPRING8_JIS 0x0292 |
1781 | |
1782 | #define BCM5974_DEVICE(prod) { \ |
1783 | .match_flags = (USB_DEVICE_ID_MATCH_DEVICE | \ |
1784 | diff --git a/drivers/iommu/intel-iommu.c b/drivers/iommu/intel-iommu.c |
1785 | index eec0d3e0..15e9b57e 100644 |
1786 | --- a/drivers/iommu/intel-iommu.c |
1787 | +++ b/drivers/iommu/intel-iommu.c |
1788 | @@ -890,56 +890,54 @@ static int dma_pte_clear_range(struct dmar_domain *domain, |
1789 | return order; |
1790 | } |
1791 | |
1792 | +static void dma_pte_free_level(struct dmar_domain *domain, int level, |
1793 | + struct dma_pte *pte, unsigned long pfn, |
1794 | + unsigned long start_pfn, unsigned long last_pfn) |
1795 | +{ |
1796 | + pfn = max(start_pfn, pfn); |
1797 | + pte = &pte[pfn_level_offset(pfn, level)]; |
1798 | + |
1799 | + do { |
1800 | + unsigned long level_pfn; |
1801 | + struct dma_pte *level_pte; |
1802 | + |
1803 | + if (!dma_pte_present(pte) || dma_pte_superpage(pte)) |
1804 | + goto next; |
1805 | + |
1806 | + level_pfn = pfn & level_mask(level - 1); |
1807 | + level_pte = phys_to_virt(dma_pte_addr(pte)); |
1808 | + |
1809 | + if (level > 2) |
1810 | + dma_pte_free_level(domain, level - 1, level_pte, |
1811 | + level_pfn, start_pfn, last_pfn); |
1812 | + |
1813 | + /* If range covers entire pagetable, free it */ |
1814 | + if (!(start_pfn > level_pfn || |
1815 | + last_pfn < level_pfn + level_size(level))) { |
1816 | + dma_clear_pte(pte); |
1817 | + domain_flush_cache(domain, pte, sizeof(*pte)); |
1818 | + free_pgtable_page(level_pte); |
1819 | + } |
1820 | +next: |
1821 | + pfn += level_size(level); |
1822 | + } while (!first_pte_in_page(++pte) && pfn <= last_pfn); |
1823 | +} |
1824 | + |
1825 | /* free page table pages. last level pte should already be cleared */ |
1826 | static void dma_pte_free_pagetable(struct dmar_domain *domain, |
1827 | unsigned long start_pfn, |
1828 | unsigned long last_pfn) |
1829 | { |
1830 | int addr_width = agaw_to_width(domain->agaw) - VTD_PAGE_SHIFT; |
1831 | - struct dma_pte *first_pte, *pte; |
1832 | - int total = agaw_to_level(domain->agaw); |
1833 | - int level; |
1834 | - unsigned long tmp; |
1835 | - int large_page = 2; |
1836 | |
1837 | BUG_ON(addr_width < BITS_PER_LONG && start_pfn >> addr_width); |
1838 | BUG_ON(addr_width < BITS_PER_LONG && last_pfn >> addr_width); |
1839 | BUG_ON(start_pfn > last_pfn); |
1840 | |
1841 | /* We don't need lock here; nobody else touches the iova range */ |
1842 | - level = 2; |
1843 | - while (level <= total) { |
1844 | - tmp = align_to_level(start_pfn, level); |
1845 | - |
1846 | - /* If we can't even clear one PTE at this level, we're done */ |
1847 | - if (tmp + level_size(level) - 1 > last_pfn) |
1848 | - return; |
1849 | - |
1850 | - do { |
1851 | - large_page = level; |
1852 | - first_pte = pte = dma_pfn_level_pte(domain, tmp, level, &large_page); |
1853 | - if (large_page > level) |
1854 | - level = large_page + 1; |
1855 | - if (!pte) { |
1856 | - tmp = align_to_level(tmp + 1, level + 1); |
1857 | - continue; |
1858 | - } |
1859 | - do { |
1860 | - if (dma_pte_present(pte)) { |
1861 | - free_pgtable_page(phys_to_virt(dma_pte_addr(pte))); |
1862 | - dma_clear_pte(pte); |
1863 | - } |
1864 | - pte++; |
1865 | - tmp += level_size(level); |
1866 | - } while (!first_pte_in_page(pte) && |
1867 | - tmp + level_size(level) - 1 <= last_pfn); |
1868 | + dma_pte_free_level(domain, agaw_to_level(domain->agaw), |
1869 | + domain->pgd, 0, start_pfn, last_pfn); |
1870 | |
1871 | - domain_flush_cache(domain, first_pte, |
1872 | - (void *)pte - (void *)first_pte); |
1873 | - |
1874 | - } while (tmp && tmp + level_size(level) - 1 <= last_pfn); |
1875 | - level++; |
1876 | - } |
1877 | /* free pgd */ |
1878 | if (start_pfn == 0 && last_pfn == DOMAIN_MAX_PFN(domain->gaw)) { |
1879 | free_pgtable_page(domain->pgd); |
1880 | diff --git a/drivers/leds/leds-wm831x-status.c b/drivers/leds/leds-wm831x-status.c |
1881 | index 120815a4..5a19abde 100644 |
1882 | --- a/drivers/leds/leds-wm831x-status.c |
1883 | +++ b/drivers/leds/leds-wm831x-status.c |
1884 | @@ -230,9 +230,9 @@ static int wm831x_status_probe(struct platform_device *pdev) |
1885 | int id = pdev->id % ARRAY_SIZE(chip_pdata->status); |
1886 | int ret; |
1887 | |
1888 | - res = platform_get_resource(pdev, IORESOURCE_IO, 0); |
1889 | + res = platform_get_resource(pdev, IORESOURCE_REG, 0); |
1890 | if (res == NULL) { |
1891 | - dev_err(&pdev->dev, "No I/O resource\n"); |
1892 | + dev_err(&pdev->dev, "No register resource\n"); |
1893 | ret = -EINVAL; |
1894 | goto err; |
1895 | } |
1896 | diff --git a/drivers/media/common/siano/smsdvb-main.c b/drivers/media/common/siano/smsdvb-main.c |
1897 | index 08626225..63676a8b 100644 |
1898 | --- a/drivers/media/common/siano/smsdvb-main.c |
1899 | +++ b/drivers/media/common/siano/smsdvb-main.c |
1900 | @@ -276,7 +276,8 @@ static void smsdvb_update_per_slices(struct smsdvb_client_t *client, |
1901 | |
1902 | /* Legacy PER/BER */ |
1903 | tmp = p->ets_packets * 65535; |
1904 | - do_div(tmp, p->ts_packets + p->ets_packets); |
1905 | + if (p->ts_packets + p->ets_packets) |
1906 | + do_div(tmp, p->ts_packets + p->ets_packets); |
1907 | client->legacy_per = tmp; |
1908 | } |
1909 | |
1910 | diff --git a/drivers/media/dvb-frontends/mb86a20s.c b/drivers/media/dvb-frontends/mb86a20s.c |
1911 | index 856374bd..2c7217fb 100644 |
1912 | --- a/drivers/media/dvb-frontends/mb86a20s.c |
1913 | +++ b/drivers/media/dvb-frontends/mb86a20s.c |
1914 | @@ -157,7 +157,6 @@ static struct regdata mb86a20s_init2[] = { |
1915 | { 0x45, 0x04 }, /* CN symbol 4 */ |
1916 | { 0x48, 0x04 }, /* CN manual mode */ |
1917 | |
1918 | - { 0x50, 0xd5 }, { 0x51, 0x01 }, /* Serial */ |
1919 | { 0x50, 0xd6 }, { 0x51, 0x1f }, |
1920 | { 0x50, 0xd2 }, { 0x51, 0x03 }, |
1921 | { 0x50, 0xd7 }, { 0x51, 0xbf }, |
1922 | @@ -1860,16 +1859,15 @@ static int mb86a20s_initfe(struct dvb_frontend *fe) |
1923 | dev_dbg(&state->i2c->dev, "%s: IF=%d, IF reg=0x%06llx\n", |
1924 | __func__, state->if_freq, (long long)pll); |
1925 | |
1926 | - if (!state->config->is_serial) { |
1927 | + if (!state->config->is_serial) |
1928 | regD5 &= ~1; |
1929 | |
1930 | - rc = mb86a20s_writereg(state, 0x50, 0xd5); |
1931 | - if (rc < 0) |
1932 | - goto err; |
1933 | - rc = mb86a20s_writereg(state, 0x51, regD5); |
1934 | - if (rc < 0) |
1935 | - goto err; |
1936 | - } |
1937 | + rc = mb86a20s_writereg(state, 0x50, 0xd5); |
1938 | + if (rc < 0) |
1939 | + goto err; |
1940 | + rc = mb86a20s_writereg(state, 0x51, regD5); |
1941 | + if (rc < 0) |
1942 | + goto err; |
1943 | |
1944 | rc = mb86a20s_writeregdata(state, mb86a20s_init2); |
1945 | if (rc < 0) |
1946 | diff --git a/drivers/media/pci/cx88/cx88.h b/drivers/media/pci/cx88/cx88.h |
1947 | index afe0eaea..28893a6b 100644 |
1948 | --- a/drivers/media/pci/cx88/cx88.h |
1949 | +++ b/drivers/media/pci/cx88/cx88.h |
1950 | @@ -259,7 +259,7 @@ struct cx88_input { |
1951 | }; |
1952 | |
1953 | enum cx88_audio_chip { |
1954 | - CX88_AUDIO_WM8775, |
1955 | + CX88_AUDIO_WM8775 = 1, |
1956 | CX88_AUDIO_TVAUDIO, |
1957 | }; |
1958 | |
1959 | diff --git a/drivers/media/platform/exynos-gsc/gsc-core.c b/drivers/media/platform/exynos-gsc/gsc-core.c |
1960 | index 559fab2a..1ec60264 100644 |
1961 | --- a/drivers/media/platform/exynos-gsc/gsc-core.c |
1962 | +++ b/drivers/media/platform/exynos-gsc/gsc-core.c |
1963 | @@ -1122,10 +1122,14 @@ static int gsc_probe(struct platform_device *pdev) |
1964 | goto err_clk; |
1965 | } |
1966 | |
1967 | - ret = gsc_register_m2m_device(gsc); |
1968 | + ret = v4l2_device_register(dev, &gsc->v4l2_dev); |
1969 | if (ret) |
1970 | goto err_clk; |
1971 | |
1972 | + ret = gsc_register_m2m_device(gsc); |
1973 | + if (ret) |
1974 | + goto err_v4l2; |
1975 | + |
1976 | platform_set_drvdata(pdev, gsc); |
1977 | pm_runtime_enable(dev); |
1978 | ret = pm_runtime_get_sync(&pdev->dev); |
1979 | @@ -1147,6 +1151,8 @@ err_pm: |
1980 | pm_runtime_put(dev); |
1981 | err_m2m: |
1982 | gsc_unregister_m2m_device(gsc); |
1983 | +err_v4l2: |
1984 | + v4l2_device_unregister(&gsc->v4l2_dev); |
1985 | err_clk: |
1986 | gsc_clk_put(gsc); |
1987 | return ret; |
1988 | @@ -1157,6 +1163,7 @@ static int gsc_remove(struct platform_device *pdev) |
1989 | struct gsc_dev *gsc = platform_get_drvdata(pdev); |
1990 | |
1991 | gsc_unregister_m2m_device(gsc); |
1992 | + v4l2_device_unregister(&gsc->v4l2_dev); |
1993 | |
1994 | vb2_dma_contig_cleanup_ctx(gsc->alloc_ctx); |
1995 | pm_runtime_disable(&pdev->dev); |
1996 | diff --git a/drivers/media/platform/exynos-gsc/gsc-core.h b/drivers/media/platform/exynos-gsc/gsc-core.h |
1997 | index cc19bba0..76435d3b 100644 |
1998 | --- a/drivers/media/platform/exynos-gsc/gsc-core.h |
1999 | +++ b/drivers/media/platform/exynos-gsc/gsc-core.h |
2000 | @@ -343,6 +343,7 @@ struct gsc_dev { |
2001 | unsigned long state; |
2002 | struct vb2_alloc_ctx *alloc_ctx; |
2003 | struct video_device vdev; |
2004 | + struct v4l2_device v4l2_dev; |
2005 | }; |
2006 | |
2007 | /** |
2008 | diff --git a/drivers/media/platform/exynos-gsc/gsc-m2m.c b/drivers/media/platform/exynos-gsc/gsc-m2m.c |
2009 | index 40a73f7d..e576ff2d 100644 |
2010 | --- a/drivers/media/platform/exynos-gsc/gsc-m2m.c |
2011 | +++ b/drivers/media/platform/exynos-gsc/gsc-m2m.c |
2012 | @@ -751,6 +751,7 @@ int gsc_register_m2m_device(struct gsc_dev *gsc) |
2013 | gsc->vdev.release = video_device_release_empty; |
2014 | gsc->vdev.lock = &gsc->lock; |
2015 | gsc->vdev.vfl_dir = VFL_DIR_M2M; |
2016 | + gsc->vdev.v4l2_dev = &gsc->v4l2_dev; |
2017 | snprintf(gsc->vdev.name, sizeof(gsc->vdev.name), "%s.%d:m2m", |
2018 | GSC_MODULE_NAME, gsc->id); |
2019 | |
2020 | diff --git a/drivers/media/platform/exynos4-is/fimc-lite.c b/drivers/media/platform/exynos4-is/fimc-lite.c |
2021 | index 08fbfede..e85dc4f2 100644 |
2022 | --- a/drivers/media/platform/exynos4-is/fimc-lite.c |
2023 | +++ b/drivers/media/platform/exynos4-is/fimc-lite.c |
2024 | @@ -90,7 +90,7 @@ static const struct fimc_fmt fimc_lite_formats[] = { |
2025 | .name = "RAW10 (GRBG)", |
2026 | .fourcc = V4L2_PIX_FMT_SGRBG10, |
2027 | .colorspace = V4L2_COLORSPACE_SRGB, |
2028 | - .depth = { 10 }, |
2029 | + .depth = { 16 }, |
2030 | .color = FIMC_FMT_RAW10, |
2031 | .memplanes = 1, |
2032 | .mbus_code = V4L2_MBUS_FMT_SGRBG10_1X10, |
2033 | @@ -99,7 +99,7 @@ static const struct fimc_fmt fimc_lite_formats[] = { |
2034 | .name = "RAW12 (GRBG)", |
2035 | .fourcc = V4L2_PIX_FMT_SGRBG12, |
2036 | .colorspace = V4L2_COLORSPACE_SRGB, |
2037 | - .depth = { 12 }, |
2038 | + .depth = { 16 }, |
2039 | .color = FIMC_FMT_RAW12, |
2040 | .memplanes = 1, |
2041 | .mbus_code = V4L2_MBUS_FMT_SGRBG12_1X12, |
2042 | diff --git a/drivers/media/platform/exynos4-is/media-dev.c b/drivers/media/platform/exynos4-is/media-dev.c |
2043 | index 19f556c5..91f21e27 100644 |
2044 | --- a/drivers/media/platform/exynos4-is/media-dev.c |
2045 | +++ b/drivers/media/platform/exynos4-is/media-dev.c |
2046 | @@ -1530,9 +1530,9 @@ static int fimc_md_probe(struct platform_device *pdev) |
2047 | err_unlock: |
2048 | mutex_unlock(&fmd->media_dev.graph_mutex); |
2049 | err_clk: |
2050 | - media_device_unregister(&fmd->media_dev); |
2051 | fimc_md_put_clocks(fmd); |
2052 | fimc_md_unregister_entities(fmd); |
2053 | + media_device_unregister(&fmd->media_dev); |
2054 | err_md: |
2055 | v4l2_device_unregister(&fmd->v4l2_dev); |
2056 | return ret; |
2057 | diff --git a/drivers/mmc/host/tmio_mmc_dma.c b/drivers/mmc/host/tmio_mmc_dma.c |
2058 | index 47bdb8fa..65edb4a6 100644 |
2059 | --- a/drivers/mmc/host/tmio_mmc_dma.c |
2060 | +++ b/drivers/mmc/host/tmio_mmc_dma.c |
2061 | @@ -104,6 +104,7 @@ static void tmio_mmc_start_dma_rx(struct tmio_mmc_host *host) |
2062 | pio: |
2063 | if (!desc) { |
2064 | /* DMA failed, fall back to PIO */ |
2065 | + tmio_mmc_enable_dma(host, false); |
2066 | if (ret >= 0) |
2067 | ret = -EIO; |
2068 | host->chan_rx = NULL; |
2069 | @@ -116,7 +117,6 @@ pio: |
2070 | } |
2071 | dev_warn(&host->pdev->dev, |
2072 | "DMA failed: %d, falling back to PIO\n", ret); |
2073 | - tmio_mmc_enable_dma(host, false); |
2074 | } |
2075 | |
2076 | dev_dbg(&host->pdev->dev, "%s(): desc %p, cookie %d, sg[%d]\n", __func__, |
2077 | @@ -185,6 +185,7 @@ static void tmio_mmc_start_dma_tx(struct tmio_mmc_host *host) |
2078 | pio: |
2079 | if (!desc) { |
2080 | /* DMA failed, fall back to PIO */ |
2081 | + tmio_mmc_enable_dma(host, false); |
2082 | if (ret >= 0) |
2083 | ret = -EIO; |
2084 | host->chan_tx = NULL; |
2085 | @@ -197,7 +198,6 @@ pio: |
2086 | } |
2087 | dev_warn(&host->pdev->dev, |
2088 | "DMA failed: %d, falling back to PIO\n", ret); |
2089 | - tmio_mmc_enable_dma(host, false); |
2090 | } |
2091 | |
2092 | dev_dbg(&host->pdev->dev, "%s(): desc %p, cookie %d\n", __func__, |
2093 | diff --git a/drivers/mtd/nand/nand_base.c b/drivers/mtd/nand/nand_base.c |
2094 | index dfcd0a56..fb8c4dea 100644 |
2095 | --- a/drivers/mtd/nand/nand_base.c |
2096 | +++ b/drivers/mtd/nand/nand_base.c |
2097 | @@ -2793,7 +2793,9 @@ static void nand_set_defaults(struct nand_chip *chip, int busw) |
2098 | |
2099 | if (!chip->select_chip) |
2100 | chip->select_chip = nand_select_chip; |
2101 | - if (!chip->read_byte) |
2102 | + |
2103 | + /* If called twice, pointers that depend on busw may need to be reset */ |
2104 | + if (!chip->read_byte || chip->read_byte == nand_read_byte) |
2105 | chip->read_byte = busw ? nand_read_byte16 : nand_read_byte; |
2106 | if (!chip->read_word) |
2107 | chip->read_word = nand_read_word; |
2108 | @@ -2801,9 +2803,9 @@ static void nand_set_defaults(struct nand_chip *chip, int busw) |
2109 | chip->block_bad = nand_block_bad; |
2110 | if (!chip->block_markbad) |
2111 | chip->block_markbad = nand_default_block_markbad; |
2112 | - if (!chip->write_buf) |
2113 | + if (!chip->write_buf || chip->write_buf == nand_write_buf) |
2114 | chip->write_buf = busw ? nand_write_buf16 : nand_write_buf; |
2115 | - if (!chip->read_buf) |
2116 | + if (!chip->read_buf || chip->read_buf == nand_read_buf) |
2117 | chip->read_buf = busw ? nand_read_buf16 : nand_read_buf; |
2118 | if (!chip->scan_bbt) |
2119 | chip->scan_bbt = nand_default_bbt; |
2120 | diff --git a/drivers/mtd/ubi/wl.c b/drivers/mtd/ubi/wl.c |
2121 | index 5df49d3c..c95bfb18 100644 |
2122 | --- a/drivers/mtd/ubi/wl.c |
2123 | +++ b/drivers/mtd/ubi/wl.c |
2124 | @@ -1069,6 +1069,9 @@ static int wear_leveling_worker(struct ubi_device *ubi, struct ubi_work *wrk, |
2125 | if (!(e2->ec - e1->ec >= UBI_WL_THRESHOLD)) { |
2126 | dbg_wl("no WL needed: min used EC %d, max free EC %d", |
2127 | e1->ec, e2->ec); |
2128 | + |
2129 | + /* Give the unused PEB back */ |
2130 | + wl_tree_add(e2, &ubi->free); |
2131 | goto out_cancel; |
2132 | } |
2133 | self_check_in_wl_tree(ubi, e1, &ubi->used); |
2134 | diff --git a/drivers/net/ethernet/marvell/mvneta.c b/drivers/net/ethernet/marvell/mvneta.c |
2135 | index b017818b..90ab2928 100644 |
2136 | --- a/drivers/net/ethernet/marvell/mvneta.c |
2137 | +++ b/drivers/net/ethernet/marvell/mvneta.c |
2138 | @@ -138,7 +138,9 @@ |
2139 | #define MVNETA_GMAC_FORCE_LINK_PASS BIT(1) |
2140 | #define MVNETA_GMAC_CONFIG_MII_SPEED BIT(5) |
2141 | #define MVNETA_GMAC_CONFIG_GMII_SPEED BIT(6) |
2142 | +#define MVNETA_GMAC_AN_SPEED_EN BIT(7) |
2143 | #define MVNETA_GMAC_CONFIG_FULL_DUPLEX BIT(12) |
2144 | +#define MVNETA_GMAC_AN_DUPLEX_EN BIT(13) |
2145 | #define MVNETA_MIB_COUNTERS_BASE 0x3080 |
2146 | #define MVNETA_MIB_LATE_COLLISION 0x7c |
2147 | #define MVNETA_DA_FILT_SPEC_MCAST 0x3400 |
2148 | @@ -915,6 +917,13 @@ static void mvneta_defaults_set(struct mvneta_port *pp) |
2149 | /* Assign port SDMA configuration */ |
2150 | mvreg_write(pp, MVNETA_SDMA_CONFIG, val); |
2151 | |
2152 | + /* Disable PHY polling in hardware, since we're using the |
2153 | + * kernel phylib to do this. |
2154 | + */ |
2155 | + val = mvreg_read(pp, MVNETA_UNIT_CONTROL); |
2156 | + val &= ~MVNETA_PHY_POLLING_ENABLE; |
2157 | + mvreg_write(pp, MVNETA_UNIT_CONTROL, val); |
2158 | + |
2159 | mvneta_set_ucast_table(pp, -1); |
2160 | mvneta_set_special_mcast_table(pp, -1); |
2161 | mvneta_set_other_mcast_table(pp, -1); |
2162 | @@ -2307,7 +2316,9 @@ static void mvneta_adjust_link(struct net_device *ndev) |
2163 | val = mvreg_read(pp, MVNETA_GMAC_AUTONEG_CONFIG); |
2164 | val &= ~(MVNETA_GMAC_CONFIG_MII_SPEED | |
2165 | MVNETA_GMAC_CONFIG_GMII_SPEED | |
2166 | - MVNETA_GMAC_CONFIG_FULL_DUPLEX); |
2167 | + MVNETA_GMAC_CONFIG_FULL_DUPLEX | |
2168 | + MVNETA_GMAC_AN_SPEED_EN | |
2169 | + MVNETA_GMAC_AN_DUPLEX_EN); |
2170 | |
2171 | if (phydev->duplex) |
2172 | val |= MVNETA_GMAC_CONFIG_FULL_DUPLEX; |
2173 | diff --git a/drivers/net/wireless/ath/ath9k/ar9003_phy.c b/drivers/net/wireless/ath/ath9k/ar9003_phy.c |
2174 | index 1f694ab3..77d3a705 100644 |
2175 | --- a/drivers/net/wireless/ath/ath9k/ar9003_phy.c |
2176 | +++ b/drivers/net/wireless/ath/ath9k/ar9003_phy.c |
2177 | @@ -1173,6 +1173,10 @@ skip_ws_det: |
2178 | * is_on == 0 means MRC CCK is OFF (more noise imm) |
2179 | */ |
2180 | bool is_on = param ? 1 : 0; |
2181 | + |
2182 | + if (ah->caps.rx_chainmask == 1) |
2183 | + break; |
2184 | + |
2185 | REG_RMW_FIELD(ah, AR_PHY_MRC_CCK_CTRL, |
2186 | AR_PHY_MRC_CCK_ENABLE, is_on); |
2187 | REG_RMW_FIELD(ah, AR_PHY_MRC_CCK_CTRL, |
2188 | diff --git a/drivers/net/wireless/ath/ath9k/ath9k.h b/drivers/net/wireless/ath/ath9k/ath9k.h |
2189 | index c1224b5a..020b9b37 100644 |
2190 | --- a/drivers/net/wireless/ath/ath9k/ath9k.h |
2191 | +++ b/drivers/net/wireless/ath/ath9k/ath9k.h |
2192 | @@ -79,10 +79,6 @@ struct ath_config { |
2193 | sizeof(struct ath_buf_state)); \ |
2194 | } while (0) |
2195 | |
2196 | -#define ATH_RXBUF_RESET(_bf) do { \ |
2197 | - (_bf)->bf_stale = false; \ |
2198 | - } while (0) |
2199 | - |
2200 | /** |
2201 | * enum buffer_type - Buffer type flags |
2202 | * |
2203 | @@ -317,6 +313,7 @@ struct ath_rx { |
2204 | struct ath_descdma rxdma; |
2205 | struct ath_rx_edma rx_edma[ATH9K_RX_QUEUE_MAX]; |
2206 | |
2207 | + struct ath_buf *buf_hold; |
2208 | struct sk_buff *frag; |
2209 | |
2210 | u32 ampdu_ref; |
2211 | diff --git a/drivers/net/wireless/ath/ath9k/recv.c b/drivers/net/wireless/ath/ath9k/recv.c |
2212 | index 865e043e..b4902b34 100644 |
2213 | --- a/drivers/net/wireless/ath/ath9k/recv.c |
2214 | +++ b/drivers/net/wireless/ath/ath9k/recv.c |
2215 | @@ -42,8 +42,6 @@ static void ath_rx_buf_link(struct ath_softc *sc, struct ath_buf *bf) |
2216 | struct ath_desc *ds; |
2217 | struct sk_buff *skb; |
2218 | |
2219 | - ATH_RXBUF_RESET(bf); |
2220 | - |
2221 | ds = bf->bf_desc; |
2222 | ds->ds_link = 0; /* link to null */ |
2223 | ds->ds_data = bf->bf_buf_addr; |
2224 | @@ -70,6 +68,14 @@ static void ath_rx_buf_link(struct ath_softc *sc, struct ath_buf *bf) |
2225 | sc->rx.rxlink = &ds->ds_link; |
2226 | } |
2227 | |
2228 | +static void ath_rx_buf_relink(struct ath_softc *sc, struct ath_buf *bf) |
2229 | +{ |
2230 | + if (sc->rx.buf_hold) |
2231 | + ath_rx_buf_link(sc, sc->rx.buf_hold); |
2232 | + |
2233 | + sc->rx.buf_hold = bf; |
2234 | +} |
2235 | + |
2236 | static void ath_setdefantenna(struct ath_softc *sc, u32 antenna) |
2237 | { |
2238 | /* XXX block beacon interrupts */ |
2239 | @@ -117,7 +123,6 @@ static bool ath_rx_edma_buf_link(struct ath_softc *sc, |
2240 | |
2241 | skb = bf->bf_mpdu; |
2242 | |
2243 | - ATH_RXBUF_RESET(bf); |
2244 | memset(skb->data, 0, ah->caps.rx_status_len); |
2245 | dma_sync_single_for_device(sc->dev, bf->bf_buf_addr, |
2246 | ah->caps.rx_status_len, DMA_TO_DEVICE); |
2247 | @@ -432,6 +437,7 @@ int ath_startrecv(struct ath_softc *sc) |
2248 | if (list_empty(&sc->rx.rxbuf)) |
2249 | goto start_recv; |
2250 | |
2251 | + sc->rx.buf_hold = NULL; |
2252 | sc->rx.rxlink = NULL; |
2253 | list_for_each_entry_safe(bf, tbf, &sc->rx.rxbuf, list) { |
2254 | ath_rx_buf_link(sc, bf); |
2255 | @@ -677,6 +683,9 @@ static struct ath_buf *ath_get_next_rx_buf(struct ath_softc *sc, |
2256 | } |
2257 | |
2258 | bf = list_first_entry(&sc->rx.rxbuf, struct ath_buf, list); |
2259 | + if (bf == sc->rx.buf_hold) |
2260 | + return NULL; |
2261 | + |
2262 | ds = bf->bf_desc; |
2263 | |
2264 | /* |
2265 | @@ -1375,7 +1384,7 @@ requeue: |
2266 | if (edma) { |
2267 | ath_rx_edma_buf_link(sc, qtype); |
2268 | } else { |
2269 | - ath_rx_buf_link(sc, bf); |
2270 | + ath_rx_buf_relink(sc, bf); |
2271 | ath9k_hw_rxena(ah); |
2272 | } |
2273 | } while (1); |
2274 | diff --git a/drivers/net/wireless/ath/ath9k/xmit.c b/drivers/net/wireless/ath/ath9k/xmit.c |
2275 | index 92799273..ab646838 100644 |
2276 | --- a/drivers/net/wireless/ath/ath9k/xmit.c |
2277 | +++ b/drivers/net/wireless/ath/ath9k/xmit.c |
2278 | @@ -2602,6 +2602,7 @@ void ath_tx_node_init(struct ath_softc *sc, struct ath_node *an) |
2279 | for (acno = 0, ac = &an->ac[acno]; |
2280 | acno < IEEE80211_NUM_ACS; acno++, ac++) { |
2281 | ac->sched = false; |
2282 | + ac->clear_ps_filter = true; |
2283 | ac->txq = sc->tx.txq_map[acno]; |
2284 | INIT_LIST_HEAD(&ac->tid_q); |
2285 | } |
2286 | diff --git a/drivers/net/wireless/brcm80211/brcmsmac/dma.c b/drivers/net/wireless/brcm80211/brcmsmac/dma.c |
2287 | index 1860c572..4fb9635d 100644 |
2288 | --- a/drivers/net/wireless/brcm80211/brcmsmac/dma.c |
2289 | +++ b/drivers/net/wireless/brcm80211/brcmsmac/dma.c |
2290 | @@ -1015,9 +1015,10 @@ static bool dma64_txidle(struct dma_info *di) |
2291 | |
2292 | /* |
2293 | * post receive buffers |
2294 | - * return false is refill failed completely and ring is empty this will stall |
2295 | - * the rx dma and user might want to call rxfill again asap. This unlikely |
2296 | - * happens on memory-rich NIC, but often on memory-constrained dongle |
2297 | + * Return false if refill failed completely or dma mapping failed. The ring |
2298 | + * is empty, which will stall the rx dma and user might want to call rxfill |
2299 | + * again asap. This is unlikely to happen on a memory-rich NIC, but often on |
2300 | + * memory-constrained dongle. |
2301 | */ |
2302 | bool dma_rxfill(struct dma_pub *pub) |
2303 | { |
2304 | @@ -1078,6 +1079,8 @@ bool dma_rxfill(struct dma_pub *pub) |
2305 | |
2306 | pa = dma_map_single(di->dmadev, p->data, di->rxbufsize, |
2307 | DMA_FROM_DEVICE); |
2308 | + if (dma_mapping_error(di->dmadev, pa)) |
2309 | + return false; |
2310 | |
2311 | /* save the free packet pointer */ |
2312 | di->rxp[rxout] = p; |
2313 | @@ -1284,7 +1287,11 @@ static void dma_txenq(struct dma_info *di, struct sk_buff *p) |
2314 | |
2315 | /* get physical address of buffer start */ |
2316 | pa = dma_map_single(di->dmadev, data, len, DMA_TO_DEVICE); |
2317 | - |
2318 | + /* if mapping failed, free skb */ |
2319 | + if (dma_mapping_error(di->dmadev, pa)) { |
2320 | + brcmu_pkt_buf_free_skb(p); |
2321 | + return; |
2322 | + } |
2323 | /* With a DMA segment list, Descriptor table is filled |
2324 | * using the segment list instead of looping over |
2325 | * buffers in multi-chain DMA. Therefore, EOF for SGLIST |
2326 | diff --git a/drivers/of/base.c b/drivers/of/base.c |
2327 | index 5c542791..bf8432f5 100644 |
2328 | --- a/drivers/of/base.c |
2329 | +++ b/drivers/of/base.c |
2330 | @@ -1629,6 +1629,7 @@ void of_alias_scan(void * (*dt_alloc)(u64 size, u64 align)) |
2331 | ap = dt_alloc(sizeof(*ap) + len + 1, 4); |
2332 | if (!ap) |
2333 | continue; |
2334 | + memset(ap, 0, sizeof(*ap) + len + 1); |
2335 | ap->alias = start; |
2336 | of_alias_add(ap, np, id, start, len); |
2337 | } |
2338 | diff --git a/drivers/pinctrl/pinctrl-at91.c b/drivers/pinctrl/pinctrl-at91.c |
2339 | index b90a3a0a..19afb9a7 100644 |
2340 | --- a/drivers/pinctrl/pinctrl-at91.c |
2341 | +++ b/drivers/pinctrl/pinctrl-at91.c |
2342 | @@ -325,7 +325,7 @@ static void at91_mux_disable_interrupt(void __iomem *pio, unsigned mask) |
2343 | |
2344 | static unsigned at91_mux_get_pullup(void __iomem *pio, unsigned pin) |
2345 | { |
2346 | - return (readl_relaxed(pio + PIO_PUSR) >> pin) & 0x1; |
2347 | + return !((readl_relaxed(pio + PIO_PUSR) >> pin) & 0x1); |
2348 | } |
2349 | |
2350 | static void at91_mux_set_pullup(void __iomem *pio, unsigned mask, bool on) |
2351 | @@ -445,7 +445,7 @@ static void at91_mux_pio3_set_debounce(void __iomem *pio, unsigned mask, |
2352 | |
2353 | static bool at91_mux_pio3_get_pulldown(void __iomem *pio, unsigned pin) |
2354 | { |
2355 | - return (__raw_readl(pio + PIO_PPDSR) >> pin) & 0x1; |
2356 | + return !((__raw_readl(pio + PIO_PPDSR) >> pin) & 0x1); |
2357 | } |
2358 | |
2359 | static void at91_mux_pio3_set_pulldown(void __iomem *pio, unsigned mask, bool is_on) |
2360 | diff --git a/drivers/scsi/mpt3sas/Makefile b/drivers/scsi/mpt3sas/Makefile |
2361 | index 4c1d2e7a..efb0c4c2 100644 |
2362 | --- a/drivers/scsi/mpt3sas/Makefile |
2363 | +++ b/drivers/scsi/mpt3sas/Makefile |
2364 | @@ -1,5 +1,5 @@ |
2365 | # mpt3sas makefile |
2366 | -obj-m += mpt3sas.o |
2367 | +obj-$(CONFIG_SCSI_MPT3SAS) += mpt3sas.o |
2368 | mpt3sas-y += mpt3sas_base.o \ |
2369 | mpt3sas_config.o \ |
2370 | mpt3sas_scsih.o \ |
2371 | diff --git a/drivers/scsi/sd.c b/drivers/scsi/sd.c |
2372 | index 86fcf2c3..2783dd70 100644 |
2373 | --- a/drivers/scsi/sd.c |
2374 | +++ b/drivers/scsi/sd.c |
2375 | @@ -2419,14 +2419,9 @@ sd_read_cache_type(struct scsi_disk *sdkp, unsigned char *buffer) |
2376 | } |
2377 | } |
2378 | |
2379 | - if (modepage == 0x3F) { |
2380 | - sd_printk(KERN_ERR, sdkp, "No Caching mode page " |
2381 | - "present\n"); |
2382 | - goto defaults; |
2383 | - } else if ((buffer[offset] & 0x3f) != modepage) { |
2384 | - sd_printk(KERN_ERR, sdkp, "Got wrong page\n"); |
2385 | - goto defaults; |
2386 | - } |
2387 | + sd_printk(KERN_ERR, sdkp, "No Caching mode page found\n"); |
2388 | + goto defaults; |
2389 | + |
2390 | Page_found: |
2391 | if (modepage == 8) { |
2392 | sdkp->WCE = ((buffer[offset + 2] & 0x04) != 0); |
2393 | diff --git a/drivers/staging/comedi/drivers/dt282x.c b/drivers/staging/comedi/drivers/dt282x.c |
2394 | index c1950e3b..674b236f 100644 |
2395 | --- a/drivers/staging/comedi/drivers/dt282x.c |
2396 | +++ b/drivers/staging/comedi/drivers/dt282x.c |
2397 | @@ -264,8 +264,9 @@ struct dt282x_private { |
2398 | } \ |
2399 | udelay(5); \ |
2400 | } \ |
2401 | - if (_i) \ |
2402 | + if (_i) { \ |
2403 | b \ |
2404 | + } \ |
2405 | } while (0) |
2406 | |
2407 | static int prep_ai_dma(struct comedi_device *dev, int chan, int size); |
2408 | diff --git a/drivers/staging/zram/zram_drv.c b/drivers/staging/zram/zram_drv.c |
2409 | index e77fb6ea..8f54c503 100644 |
2410 | --- a/drivers/staging/zram/zram_drv.c |
2411 | +++ b/drivers/staging/zram/zram_drv.c |
2412 | @@ -445,6 +445,14 @@ static int zram_bvec_write(struct zram *zram, struct bio_vec *bvec, u32 index, |
2413 | goto out; |
2414 | } |
2415 | |
2416 | + /* |
2417 | + * zram_slot_free_notify could miss free so that let's |
2418 | + * double check. |
2419 | + */ |
2420 | + if (unlikely(meta->table[index].handle || |
2421 | + zram_test_flag(meta, index, ZRAM_ZERO))) |
2422 | + zram_free_page(zram, index); |
2423 | + |
2424 | ret = lzo1x_1_compress(uncmem, PAGE_SIZE, src, &clen, |
2425 | meta->compress_workmem); |
2426 | |
2427 | @@ -504,6 +512,20 @@ out: |
2428 | return ret; |
2429 | } |
2430 | |
2431 | +static void handle_pending_slot_free(struct zram *zram) |
2432 | +{ |
2433 | + struct zram_slot_free *free_rq; |
2434 | + |
2435 | + spin_lock(&zram->slot_free_lock); |
2436 | + while (zram->slot_free_rq) { |
2437 | + free_rq = zram->slot_free_rq; |
2438 | + zram->slot_free_rq = free_rq->next; |
2439 | + zram_free_page(zram, free_rq->index); |
2440 | + kfree(free_rq); |
2441 | + } |
2442 | + spin_unlock(&zram->slot_free_lock); |
2443 | +} |
2444 | + |
2445 | static int zram_bvec_rw(struct zram *zram, struct bio_vec *bvec, u32 index, |
2446 | int offset, struct bio *bio, int rw) |
2447 | { |
2448 | @@ -511,10 +533,12 @@ static int zram_bvec_rw(struct zram *zram, struct bio_vec *bvec, u32 index, |
2449 | |
2450 | if (rw == READ) { |
2451 | down_read(&zram->lock); |
2452 | + handle_pending_slot_free(zram); |
2453 | ret = zram_bvec_read(zram, bvec, index, offset, bio); |
2454 | up_read(&zram->lock); |
2455 | } else { |
2456 | down_write(&zram->lock); |
2457 | + handle_pending_slot_free(zram); |
2458 | ret = zram_bvec_write(zram, bvec, index, offset); |
2459 | up_write(&zram->lock); |
2460 | } |
2461 | @@ -522,11 +546,13 @@ static int zram_bvec_rw(struct zram *zram, struct bio_vec *bvec, u32 index, |
2462 | return ret; |
2463 | } |
2464 | |
2465 | -static void zram_reset_device(struct zram *zram) |
2466 | +static void zram_reset_device(struct zram *zram, bool reset_capacity) |
2467 | { |
2468 | size_t index; |
2469 | struct zram_meta *meta; |
2470 | |
2471 | + flush_work(&zram->free_work); |
2472 | + |
2473 | down_write(&zram->init_lock); |
2474 | if (!zram->init_done) { |
2475 | up_write(&zram->init_lock); |
2476 | @@ -551,7 +577,8 @@ static void zram_reset_device(struct zram *zram) |
2477 | memset(&zram->stats, 0, sizeof(zram->stats)); |
2478 | |
2479 | zram->disksize = 0; |
2480 | - set_capacity(zram->disk, 0); |
2481 | + if (reset_capacity) |
2482 | + set_capacity(zram->disk, 0); |
2483 | up_write(&zram->init_lock); |
2484 | } |
2485 | |
2486 | @@ -635,7 +662,7 @@ static ssize_t reset_store(struct device *dev, |
2487 | if (bdev) |
2488 | fsync_bdev(bdev); |
2489 | |
2490 | - zram_reset_device(zram); |
2491 | + zram_reset_device(zram, true); |
2492 | return len; |
2493 | } |
2494 | |
2495 | @@ -720,16 +747,40 @@ error: |
2496 | bio_io_error(bio); |
2497 | } |
2498 | |
2499 | +static void zram_slot_free(struct work_struct *work) |
2500 | +{ |
2501 | + struct zram *zram; |
2502 | + |
2503 | + zram = container_of(work, struct zram, free_work); |
2504 | + down_write(&zram->lock); |
2505 | + handle_pending_slot_free(zram); |
2506 | + up_write(&zram->lock); |
2507 | +} |
2508 | + |
2509 | +static void add_slot_free(struct zram *zram, struct zram_slot_free *free_rq) |
2510 | +{ |
2511 | + spin_lock(&zram->slot_free_lock); |
2512 | + free_rq->next = zram->slot_free_rq; |
2513 | + zram->slot_free_rq = free_rq; |
2514 | + spin_unlock(&zram->slot_free_lock); |
2515 | +} |
2516 | + |
2517 | static void zram_slot_free_notify(struct block_device *bdev, |
2518 | unsigned long index) |
2519 | { |
2520 | struct zram *zram; |
2521 | + struct zram_slot_free *free_rq; |
2522 | |
2523 | zram = bdev->bd_disk->private_data; |
2524 | - down_write(&zram->lock); |
2525 | - zram_free_page(zram, index); |
2526 | - up_write(&zram->lock); |
2527 | atomic64_inc(&zram->stats.notify_free); |
2528 | + |
2529 | + free_rq = kmalloc(sizeof(struct zram_slot_free), GFP_ATOMIC); |
2530 | + if (!free_rq) |
2531 | + return; |
2532 | + |
2533 | + free_rq->index = index; |
2534 | + add_slot_free(zram, free_rq); |
2535 | + schedule_work(&zram->free_work); |
2536 | } |
2537 | |
2538 | static const struct block_device_operations zram_devops = { |
2539 | @@ -776,6 +827,10 @@ static int create_device(struct zram *zram, int device_id) |
2540 | init_rwsem(&zram->lock); |
2541 | init_rwsem(&zram->init_lock); |
2542 | |
2543 | + INIT_WORK(&zram->free_work, zram_slot_free); |
2544 | + spin_lock_init(&zram->slot_free_lock); |
2545 | + zram->slot_free_rq = NULL; |
2546 | + |
2547 | zram->queue = blk_alloc_queue(GFP_KERNEL); |
2548 | if (!zram->queue) { |
2549 | pr_err("Error allocating disk queue for device %d\n", |
2550 | @@ -902,10 +957,12 @@ static void __exit zram_exit(void) |
2551 | for (i = 0; i < num_devices; i++) { |
2552 | zram = &zram_devices[i]; |
2553 | |
2554 | - get_disk(zram->disk); |
2555 | destroy_device(zram); |
2556 | - zram_reset_device(zram); |
2557 | - put_disk(zram->disk); |
2558 | + /* |
2559 | + * Shouldn't access zram->disk after destroy_device |
2560 | + * because destroy_device already released zram->disk. |
2561 | + */ |
2562 | + zram_reset_device(zram, false); |
2563 | } |
2564 | |
2565 | unregister_blkdev(zram_major, "zram"); |
2566 | diff --git a/drivers/staging/zram/zram_drv.h b/drivers/staging/zram/zram_drv.h |
2567 | index 9e57bfb2..97a3acf6 100644 |
2568 | --- a/drivers/staging/zram/zram_drv.h |
2569 | +++ b/drivers/staging/zram/zram_drv.h |
2570 | @@ -94,11 +94,20 @@ struct zram_meta { |
2571 | struct zs_pool *mem_pool; |
2572 | }; |
2573 | |
2574 | +struct zram_slot_free { |
2575 | + unsigned long index; |
2576 | + struct zram_slot_free *next; |
2577 | +}; |
2578 | + |
2579 | struct zram { |
2580 | struct zram_meta *meta; |
2581 | struct rw_semaphore lock; /* protect compression buffers, table, |
2582 | * 32bit stat counters against concurrent |
2583 | * notifications, reads and writes */ |
2584 | + |
2585 | + struct work_struct free_work; /* handle pending free request */ |
2586 | + struct zram_slot_free *slot_free_rq; /* list head of free request */ |
2587 | + |
2588 | struct request_queue *queue; |
2589 | struct gendisk *disk; |
2590 | int init_done; |
2591 | @@ -109,6 +118,7 @@ struct zram { |
2592 | * we can store in a disk. |
2593 | */ |
2594 | u64 disksize; /* bytes */ |
2595 | + spinlock_t slot_free_lock; |
2596 | |
2597 | struct zram_stats stats; |
2598 | }; |
2599 | diff --git a/drivers/target/target_core_alua.c b/drivers/target/target_core_alua.c |
2600 | index cbe48ab4..f608fbc1 100644 |
2601 | --- a/drivers/target/target_core_alua.c |
2602 | +++ b/drivers/target/target_core_alua.c |
2603 | @@ -730,7 +730,7 @@ static int core_alua_write_tpg_metadata( |
2604 | if (ret < 0) |
2605 | pr_err("Error writing ALUA metadata file: %s\n", path); |
2606 | fput(file); |
2607 | - return ret ? -EIO : 0; |
2608 | + return (ret < 0) ? -EIO : 0; |
2609 | } |
2610 | |
2611 | /* |
2612 | diff --git a/drivers/target/target_core_pr.c b/drivers/target/target_core_pr.c |
2613 | index bd78faf6..adec5a82 100644 |
2614 | --- a/drivers/target/target_core_pr.c |
2615 | +++ b/drivers/target/target_core_pr.c |
2616 | @@ -1949,7 +1949,7 @@ static int __core_scsi3_write_aptpl_to_file( |
2617 | pr_debug("Error writing APTPL metadata file: %s\n", path); |
2618 | fput(file); |
2619 | |
2620 | - return ret ? -EIO : 0; |
2621 | + return (ret < 0) ? -EIO : 0; |
2622 | } |
2623 | |
2624 | /* |
2625 | diff --git a/drivers/tty/tty_io.c b/drivers/tty/tty_io.c |
2626 | index 366af832..20689b95 100644 |
2627 | --- a/drivers/tty/tty_io.c |
2628 | +++ b/drivers/tty/tty_io.c |
2629 | @@ -850,7 +850,8 @@ void disassociate_ctty(int on_exit) |
2630 | struct pid *tty_pgrp = tty_get_pgrp(tty); |
2631 | if (tty_pgrp) { |
2632 | kill_pgrp(tty_pgrp, SIGHUP, on_exit); |
2633 | - kill_pgrp(tty_pgrp, SIGCONT, on_exit); |
2634 | + if (!on_exit) |
2635 | + kill_pgrp(tty_pgrp, SIGCONT, on_exit); |
2636 | put_pid(tty_pgrp); |
2637 | } |
2638 | } |
2639 | diff --git a/drivers/usb/class/cdc-wdm.c b/drivers/usb/class/cdc-wdm.c |
2640 | index 8a230f0e..d3318a0d 100644 |
2641 | --- a/drivers/usb/class/cdc-wdm.c |
2642 | +++ b/drivers/usb/class/cdc-wdm.c |
2643 | @@ -209,6 +209,7 @@ skip_error: |
2644 | static void wdm_int_callback(struct urb *urb) |
2645 | { |
2646 | int rv = 0; |
2647 | + int responding; |
2648 | int status = urb->status; |
2649 | struct wdm_device *desc; |
2650 | struct usb_cdc_notification *dr; |
2651 | @@ -262,8 +263,8 @@ static void wdm_int_callback(struct urb *urb) |
2652 | |
2653 | spin_lock(&desc->iuspin); |
2654 | clear_bit(WDM_READ, &desc->flags); |
2655 | - set_bit(WDM_RESPONDING, &desc->flags); |
2656 | - if (!test_bit(WDM_DISCONNECTING, &desc->flags) |
2657 | + responding = test_and_set_bit(WDM_RESPONDING, &desc->flags); |
2658 | + if (!responding && !test_bit(WDM_DISCONNECTING, &desc->flags) |
2659 | && !test_bit(WDM_SUSPENDING, &desc->flags)) { |
2660 | rv = usb_submit_urb(desc->response, GFP_ATOMIC); |
2661 | dev_dbg(&desc->intf->dev, "%s: usb_submit_urb %d", |
2662 | @@ -685,16 +686,20 @@ static void wdm_rxwork(struct work_struct *work) |
2663 | { |
2664 | struct wdm_device *desc = container_of(work, struct wdm_device, rxwork); |
2665 | unsigned long flags; |
2666 | - int rv; |
2667 | + int rv = 0; |
2668 | + int responding; |
2669 | |
2670 | spin_lock_irqsave(&desc->iuspin, flags); |
2671 | if (test_bit(WDM_DISCONNECTING, &desc->flags)) { |
2672 | spin_unlock_irqrestore(&desc->iuspin, flags); |
2673 | } else { |
2674 | + responding = test_and_set_bit(WDM_RESPONDING, &desc->flags); |
2675 | spin_unlock_irqrestore(&desc->iuspin, flags); |
2676 | - rv = usb_submit_urb(desc->response, GFP_KERNEL); |
2677 | + if (!responding) |
2678 | + rv = usb_submit_urb(desc->response, GFP_KERNEL); |
2679 | if (rv < 0 && rv != -EPERM) { |
2680 | spin_lock_irqsave(&desc->iuspin, flags); |
2681 | + clear_bit(WDM_RESPONDING, &desc->flags); |
2682 | if (!test_bit(WDM_DISCONNECTING, &desc->flags)) |
2683 | schedule_work(&desc->rxwork); |
2684 | spin_unlock_irqrestore(&desc->iuspin, flags); |
2685 | diff --git a/drivers/usb/core/config.c b/drivers/usb/core/config.c |
2686 | index 7199adcc..a6b2cabe 100644 |
2687 | --- a/drivers/usb/core/config.c |
2688 | +++ b/drivers/usb/core/config.c |
2689 | @@ -424,7 +424,8 @@ static int usb_parse_configuration(struct usb_device *dev, int cfgidx, |
2690 | |
2691 | memcpy(&config->desc, buffer, USB_DT_CONFIG_SIZE); |
2692 | if (config->desc.bDescriptorType != USB_DT_CONFIG || |
2693 | - config->desc.bLength < USB_DT_CONFIG_SIZE) { |
2694 | + config->desc.bLength < USB_DT_CONFIG_SIZE || |
2695 | + config->desc.bLength > size) { |
2696 | dev_err(ddev, "invalid descriptor for config index %d: " |
2697 | "type = 0x%X, length = %d\n", cfgidx, |
2698 | config->desc.bDescriptorType, config->desc.bLength); |
2699 | diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c |
2700 | index 558313de..17c37852 100644 |
2701 | --- a/drivers/usb/core/hub.c |
2702 | +++ b/drivers/usb/core/hub.c |
2703 | @@ -2918,7 +2918,6 @@ int usb_port_suspend(struct usb_device *udev, pm_message_t msg) |
2704 | { |
2705 | struct usb_hub *hub = usb_hub_to_struct_hub(udev->parent); |
2706 | struct usb_port *port_dev = hub->ports[udev->portnum - 1]; |
2707 | - enum pm_qos_flags_status pm_qos_stat; |
2708 | int port1 = udev->portnum; |
2709 | int status; |
2710 | bool really_suspend = true; |
2711 | @@ -2956,7 +2955,7 @@ int usb_port_suspend(struct usb_device *udev, pm_message_t msg) |
2712 | status); |
2713 | /* bail if autosuspend is requested */ |
2714 | if (PMSG_IS_AUTO(msg)) |
2715 | - return status; |
2716 | + goto err_wakeup; |
2717 | } |
2718 | } |
2719 | |
2720 | @@ -2965,14 +2964,16 @@ int usb_port_suspend(struct usb_device *udev, pm_message_t msg) |
2721 | usb_set_usb2_hardware_lpm(udev, 0); |
2722 | |
2723 | if (usb_disable_ltm(udev)) { |
2724 | - dev_err(&udev->dev, "%s Failed to disable LTM before suspend\n.", |
2725 | - __func__); |
2726 | - return -ENOMEM; |
2727 | + dev_err(&udev->dev, "Failed to disable LTM before suspend\n."); |
2728 | + status = -ENOMEM; |
2729 | + if (PMSG_IS_AUTO(msg)) |
2730 | + goto err_ltm; |
2731 | } |
2732 | if (usb_unlocked_disable_lpm(udev)) { |
2733 | - dev_err(&udev->dev, "%s Failed to disable LPM before suspend\n.", |
2734 | - __func__); |
2735 | - return -ENOMEM; |
2736 | + dev_err(&udev->dev, "Failed to disable LPM before suspend\n."); |
2737 | + status = -ENOMEM; |
2738 | + if (PMSG_IS_AUTO(msg)) |
2739 | + goto err_lpm3; |
2740 | } |
2741 | |
2742 | /* see 7.1.7.6 */ |
2743 | @@ -3000,28 +3001,31 @@ int usb_port_suspend(struct usb_device *udev, pm_message_t msg) |
2744 | if (status) { |
2745 | dev_dbg(hub->intfdev, "can't suspend port %d, status %d\n", |
2746 | port1, status); |
2747 | - /* paranoia: "should not happen" */ |
2748 | - if (udev->do_remote_wakeup) { |
2749 | - if (!hub_is_superspeed(hub->hdev)) { |
2750 | - (void) usb_control_msg(udev, |
2751 | - usb_sndctrlpipe(udev, 0), |
2752 | - USB_REQ_CLEAR_FEATURE, |
2753 | - USB_RECIP_DEVICE, |
2754 | - USB_DEVICE_REMOTE_WAKEUP, 0, |
2755 | - NULL, 0, |
2756 | - USB_CTRL_SET_TIMEOUT); |
2757 | - } else |
2758 | - (void) usb_disable_function_remotewakeup(udev); |
2759 | - |
2760 | - } |
2761 | |
2762 | + /* Try to enable USB3 LPM and LTM again */ |
2763 | + usb_unlocked_enable_lpm(udev); |
2764 | + err_lpm3: |
2765 | + usb_enable_ltm(udev); |
2766 | + err_ltm: |
2767 | /* Try to enable USB2 hardware LPM again */ |
2768 | if (udev->usb2_hw_lpm_capable == 1) |
2769 | usb_set_usb2_hardware_lpm(udev, 1); |
2770 | |
2771 | - /* Try to enable USB3 LTM and LPM again */ |
2772 | - usb_enable_ltm(udev); |
2773 | - usb_unlocked_enable_lpm(udev); |
2774 | + if (udev->do_remote_wakeup) { |
2775 | + if (udev->speed < USB_SPEED_SUPER) |
2776 | + usb_control_msg(udev, usb_sndctrlpipe(udev, 0), |
2777 | + USB_REQ_CLEAR_FEATURE, |
2778 | + USB_RECIP_DEVICE, |
2779 | + USB_DEVICE_REMOTE_WAKEUP, 0, |
2780 | + NULL, 0, USB_CTRL_SET_TIMEOUT); |
2781 | + else |
2782 | + usb_control_msg(udev, usb_sndctrlpipe(udev, 0), |
2783 | + USB_REQ_CLEAR_FEATURE, |
2784 | + USB_RECIP_INTERFACE, |
2785 | + USB_INTRF_FUNC_SUSPEND, 0, |
2786 | + NULL, 0, USB_CTRL_SET_TIMEOUT); |
2787 | + } |
2788 | + err_wakeup: |
2789 | |
2790 | /* System sleep transitions should never fail */ |
2791 | if (!PMSG_IS_AUTO(msg)) |
2792 | @@ -3039,16 +3043,7 @@ int usb_port_suspend(struct usb_device *udev, pm_message_t msg) |
2793 | usb_set_device_state(udev, USB_STATE_SUSPENDED); |
2794 | } |
2795 | |
2796 | - /* |
2797 | - * Check whether current status meets the requirement of |
2798 | - * usb port power off mechanism |
2799 | - */ |
2800 | - pm_qos_stat = dev_pm_qos_flags(&port_dev->dev, |
2801 | - PM_QOS_FLAG_NO_POWER_OFF); |
2802 | - if (!udev->do_remote_wakeup |
2803 | - && pm_qos_stat != PM_QOS_FLAGS_ALL |
2804 | - && udev->persist_enabled |
2805 | - && !status) { |
2806 | + if (status == 0 && !udev->do_remote_wakeup && udev->persist_enabled) { |
2807 | pm_runtime_put_sync(&port_dev->dev); |
2808 | port_dev->did_runtime_put = true; |
2809 | } |
2810 | diff --git a/drivers/usb/core/port.c b/drivers/usb/core/port.c |
2811 | index d6b0fadf..99099116 100644 |
2812 | --- a/drivers/usb/core/port.c |
2813 | +++ b/drivers/usb/core/port.c |
2814 | @@ -89,22 +89,19 @@ static int usb_port_runtime_resume(struct device *dev) |
2815 | retval = usb_hub_set_port_power(hdev, hub, port1, true); |
2816 | if (port_dev->child && !retval) { |
2817 | /* |
2818 | - * Wait for usb hub port to be reconnected in order to make |
2819 | - * the resume procedure successful. |
2820 | + * Attempt to wait for usb hub port to be reconnected in order |
2821 | + * to make the resume procedure successful. The device may have |
2822 | + * disconnected while the port was powered off, so ignore the |
2823 | + * return status. |
2824 | */ |
2825 | retval = hub_port_debounce_be_connected(hub, port1); |
2826 | - if (retval < 0) { |
2827 | + if (retval < 0) |
2828 | dev_dbg(&port_dev->dev, "can't get reconnection after setting port power on, status %d\n", |
2829 | retval); |
2830 | - goto out; |
2831 | - } |
2832 | usb_clear_port_feature(hdev, port1, USB_PORT_FEAT_C_ENABLE); |
2833 | - |
2834 | - /* Set return value to 0 if debounce successful */ |
2835 | retval = 0; |
2836 | } |
2837 | |
2838 | -out: |
2839 | clear_bit(port1, hub->busy_bits); |
2840 | usb_autopm_put_interface(intf); |
2841 | return retval; |
2842 | diff --git a/drivers/usb/dwc3/gadget.c b/drivers/usb/dwc3/gadget.c |
2843 | index f77083fe..14d28d61 100644 |
2844 | --- a/drivers/usb/dwc3/gadget.c |
2845 | +++ b/drivers/usb/dwc3/gadget.c |
2846 | @@ -1508,6 +1508,15 @@ static int dwc3_gadget_start(struct usb_gadget *g, |
2847 | int irq; |
2848 | u32 reg; |
2849 | |
2850 | + irq = platform_get_irq(to_platform_device(dwc->dev), 0); |
2851 | + ret = request_threaded_irq(irq, dwc3_interrupt, dwc3_thread_interrupt, |
2852 | + IRQF_SHARED | IRQF_ONESHOT, "dwc3", dwc); |
2853 | + if (ret) { |
2854 | + dev_err(dwc->dev, "failed to request irq #%d --> %d\n", |
2855 | + irq, ret); |
2856 | + goto err0; |
2857 | + } |
2858 | + |
2859 | spin_lock_irqsave(&dwc->lock, flags); |
2860 | |
2861 | if (dwc->gadget_driver) { |
2862 | @@ -1515,7 +1524,7 @@ static int dwc3_gadget_start(struct usb_gadget *g, |
2863 | dwc->gadget.name, |
2864 | dwc->gadget_driver->driver.name); |
2865 | ret = -EBUSY; |
2866 | - goto err0; |
2867 | + goto err1; |
2868 | } |
2869 | |
2870 | dwc->gadget_driver = driver; |
2871 | @@ -1551,42 +1560,38 @@ static int dwc3_gadget_start(struct usb_gadget *g, |
2872 | ret = __dwc3_gadget_ep_enable(dep, &dwc3_gadget_ep0_desc, NULL, false); |
2873 | if (ret) { |
2874 | dev_err(dwc->dev, "failed to enable %s\n", dep->name); |
2875 | - goto err0; |
2876 | + goto err2; |
2877 | } |
2878 | |
2879 | dep = dwc->eps[1]; |
2880 | ret = __dwc3_gadget_ep_enable(dep, &dwc3_gadget_ep0_desc, NULL, false); |
2881 | if (ret) { |
2882 | dev_err(dwc->dev, "failed to enable %s\n", dep->name); |
2883 | - goto err1; |
2884 | + goto err3; |
2885 | } |
2886 | |
2887 | /* begin to receive SETUP packets */ |
2888 | dwc->ep0state = EP0_SETUP_PHASE; |
2889 | dwc3_ep0_out_start(dwc); |
2890 | |
2891 | - irq = platform_get_irq(to_platform_device(dwc->dev), 0); |
2892 | - ret = request_threaded_irq(irq, dwc3_interrupt, dwc3_thread_interrupt, |
2893 | - IRQF_SHARED | IRQF_ONESHOT, "dwc3", dwc); |
2894 | - if (ret) { |
2895 | - dev_err(dwc->dev, "failed to request irq #%d --> %d\n", |
2896 | - irq, ret); |
2897 | - goto err1; |
2898 | - } |
2899 | - |
2900 | dwc3_gadget_enable_irq(dwc); |
2901 | |
2902 | spin_unlock_irqrestore(&dwc->lock, flags); |
2903 | |
2904 | return 0; |
2905 | |
2906 | -err1: |
2907 | +err3: |
2908 | __dwc3_gadget_ep_disable(dwc->eps[0]); |
2909 | |
2910 | -err0: |
2911 | +err2: |
2912 | dwc->gadget_driver = NULL; |
2913 | + |
2914 | +err1: |
2915 | spin_unlock_irqrestore(&dwc->lock, flags); |
2916 | |
2917 | + free_irq(irq, dwc); |
2918 | + |
2919 | +err0: |
2920 | return ret; |
2921 | } |
2922 | |
2923 | @@ -1600,9 +1605,6 @@ static int dwc3_gadget_stop(struct usb_gadget *g, |
2924 | spin_lock_irqsave(&dwc->lock, flags); |
2925 | |
2926 | dwc3_gadget_disable_irq(dwc); |
2927 | - irq = platform_get_irq(to_platform_device(dwc->dev), 0); |
2928 | - free_irq(irq, dwc); |
2929 | - |
2930 | __dwc3_gadget_ep_disable(dwc->eps[0]); |
2931 | __dwc3_gadget_ep_disable(dwc->eps[1]); |
2932 | |
2933 | @@ -1610,6 +1612,9 @@ static int dwc3_gadget_stop(struct usb_gadget *g, |
2934 | |
2935 | spin_unlock_irqrestore(&dwc->lock, flags); |
2936 | |
2937 | + irq = platform_get_irq(to_platform_device(dwc->dev), 0); |
2938 | + free_irq(irq, dwc); |
2939 | + |
2940 | return 0; |
2941 | } |
2942 | |
2943 | diff --git a/drivers/usb/gadget/uvc_queue.c b/drivers/usb/gadget/uvc_queue.c |
2944 | index e6170478..0bb5d500 100644 |
2945 | --- a/drivers/usb/gadget/uvc_queue.c |
2946 | +++ b/drivers/usb/gadget/uvc_queue.c |
2947 | @@ -193,12 +193,16 @@ static int uvc_queue_buffer(struct uvc_video_queue *queue, |
2948 | |
2949 | mutex_lock(&queue->mutex); |
2950 | ret = vb2_qbuf(&queue->queue, buf); |
2951 | + if (ret < 0) |
2952 | + goto done; |
2953 | + |
2954 | spin_lock_irqsave(&queue->irqlock, flags); |
2955 | ret = (queue->flags & UVC_QUEUE_PAUSED) != 0; |
2956 | queue->flags &= ~UVC_QUEUE_PAUSED; |
2957 | spin_unlock_irqrestore(&queue->irqlock, flags); |
2958 | - mutex_unlock(&queue->mutex); |
2959 | |
2960 | +done: |
2961 | + mutex_unlock(&queue->mutex); |
2962 | return ret; |
2963 | } |
2964 | |
2965 | diff --git a/drivers/usb/host/ehci-mxc.c b/drivers/usb/host/ehci-mxc.c |
2966 | index e4c34ac3..4c166e1e 100644 |
2967 | --- a/drivers/usb/host/ehci-mxc.c |
2968 | +++ b/drivers/usb/host/ehci-mxc.c |
2969 | @@ -184,7 +184,7 @@ static int ehci_mxc_drv_remove(struct platform_device *pdev) |
2970 | if (pdata && pdata->exit) |
2971 | pdata->exit(pdev); |
2972 | |
2973 | - if (pdata->otg) |
2974 | + if (pdata && pdata->otg) |
2975 | usb_phy_shutdown(pdata->otg); |
2976 | |
2977 | clk_disable_unprepare(priv->usbclk); |
2978 | diff --git a/drivers/usb/host/ohci-pci.c b/drivers/usb/host/ohci-pci.c |
2979 | index 279b0491..ec337c2b 100644 |
2980 | --- a/drivers/usb/host/ohci-pci.c |
2981 | +++ b/drivers/usb/host/ohci-pci.c |
2982 | @@ -289,7 +289,7 @@ static struct pci_driver ohci_pci_driver = { |
2983 | .remove = usb_hcd_pci_remove, |
2984 | .shutdown = usb_hcd_pci_shutdown, |
2985 | |
2986 | -#ifdef CONFIG_PM_SLEEP |
2987 | +#ifdef CONFIG_PM |
2988 | .driver = { |
2989 | .pm = &usb_hcd_pci_pm_ops |
2990 | }, |
2991 | diff --git a/drivers/usb/host/xhci-ext-caps.h b/drivers/usb/host/xhci-ext-caps.h |
2992 | index 8d7a1324..9fe3225e 100644 |
2993 | --- a/drivers/usb/host/xhci-ext-caps.h |
2994 | +++ b/drivers/usb/host/xhci-ext-caps.h |
2995 | @@ -71,7 +71,7 @@ |
2996 | |
2997 | /* USB 2.0 xHCI 1.0 hardware LMP capability - section 7.2.2.1.3.2 */ |
2998 | #define XHCI_HLC (1 << 19) |
2999 | -#define XHCI_BLC (1 << 19) |
3000 | +#define XHCI_BLC (1 << 20) |
3001 | |
3002 | /* command register values to disable interrupts and halt the HC */ |
3003 | /* start/stop HC execution - do not write unless HC is halted*/ |
3004 | diff --git a/drivers/usb/host/xhci-plat.c b/drivers/usb/host/xhci-plat.c |
3005 | index 51e22bf8..6eca5a53 100644 |
3006 | --- a/drivers/usb/host/xhci-plat.c |
3007 | +++ b/drivers/usb/host/xhci-plat.c |
3008 | @@ -24,7 +24,7 @@ static void xhci_plat_quirks(struct device *dev, struct xhci_hcd *xhci) |
3009 | * here that the generic code does not try to make a pci_dev from our |
3010 | * dev struct in order to setup MSI |
3011 | */ |
3012 | - xhci->quirks |= XHCI_BROKEN_MSI; |
3013 | + xhci->quirks |= XHCI_PLAT; |
3014 | } |
3015 | |
3016 | /* called during probe() after chip reset completes */ |
3017 | diff --git a/drivers/usb/host/xhci.c b/drivers/usb/host/xhci.c |
3018 | index 9478caa2..b3c4162c 100644 |
3019 | --- a/drivers/usb/host/xhci.c |
3020 | +++ b/drivers/usb/host/xhci.c |
3021 | @@ -343,9 +343,14 @@ static void __maybe_unused xhci_msix_sync_irqs(struct xhci_hcd *xhci) |
3022 | static int xhci_try_enable_msi(struct usb_hcd *hcd) |
3023 | { |
3024 | struct xhci_hcd *xhci = hcd_to_xhci(hcd); |
3025 | - struct pci_dev *pdev = to_pci_dev(xhci_to_hcd(xhci)->self.controller); |
3026 | + struct pci_dev *pdev; |
3027 | int ret; |
3028 | |
3029 | + /* The xhci platform device has set up IRQs through usb_add_hcd. */ |
3030 | + if (xhci->quirks & XHCI_PLAT) |
3031 | + return 0; |
3032 | + |
3033 | + pdev = to_pci_dev(xhci_to_hcd(xhci)->self.controller); |
3034 | /* |
3035 | * Some Fresco Logic host controllers advertise MSI, but fail to |
3036 | * generate interrupts. Don't even try to enable MSI. |
3037 | @@ -3581,10 +3586,21 @@ void xhci_free_dev(struct usb_hcd *hcd, struct usb_device *udev) |
3038 | { |
3039 | struct xhci_hcd *xhci = hcd_to_xhci(hcd); |
3040 | struct xhci_virt_device *virt_dev; |
3041 | + struct device *dev = hcd->self.controller; |
3042 | unsigned long flags; |
3043 | u32 state; |
3044 | int i, ret; |
3045 | |
3046 | +#ifndef CONFIG_USB_DEFAULT_PERSIST |
3047 | + /* |
3048 | + * We called pm_runtime_get_noresume when the device was attached. |
3049 | + * Decrement the counter here to allow controller to runtime suspend |
3050 | + * if no devices remain. |
3051 | + */ |
3052 | + if (xhci->quirks & XHCI_RESET_ON_RESUME) |
3053 | + pm_runtime_put_noidle(dev); |
3054 | +#endif |
3055 | + |
3056 | ret = xhci_check_args(hcd, udev, NULL, 0, true, __func__); |
3057 | /* If the host is halted due to driver unload, we still need to free the |
3058 | * device. |
3059 | @@ -3656,6 +3672,7 @@ static int xhci_reserve_host_control_ep_resources(struct xhci_hcd *xhci) |
3060 | int xhci_alloc_dev(struct usb_hcd *hcd, struct usb_device *udev) |
3061 | { |
3062 | struct xhci_hcd *xhci = hcd_to_xhci(hcd); |
3063 | + struct device *dev = hcd->self.controller; |
3064 | unsigned long flags; |
3065 | int timeleft; |
3066 | int ret; |
3067 | @@ -3708,6 +3725,16 @@ int xhci_alloc_dev(struct usb_hcd *hcd, struct usb_device *udev) |
3068 | goto disable_slot; |
3069 | } |
3070 | udev->slot_id = xhci->slot_id; |
3071 | + |
3072 | +#ifndef CONFIG_USB_DEFAULT_PERSIST |
3073 | + /* |
3074 | + * If resetting upon resume, we can't put the controller into runtime |
3075 | + * suspend if there is a device attached. |
3076 | + */ |
3077 | + if (xhci->quirks & XHCI_RESET_ON_RESUME) |
3078 | + pm_runtime_get_noresume(dev); |
3079 | +#endif |
3080 | + |
3081 | /* Is this a LS or FS device under a HS hub? */ |
3082 | /* Hub or peripherial? */ |
3083 | return 1; |
3084 | diff --git a/drivers/usb/host/xhci.h b/drivers/usb/host/xhci.h |
3085 | index c338741a..6ab1e600 100644 |
3086 | --- a/drivers/usb/host/xhci.h |
3087 | +++ b/drivers/usb/host/xhci.h |
3088 | @@ -1542,6 +1542,7 @@ struct xhci_hcd { |
3089 | #define XHCI_SPURIOUS_REBOOT (1 << 13) |
3090 | #define XHCI_COMP_MODE_QUIRK (1 << 14) |
3091 | #define XHCI_AVOID_BEI (1 << 15) |
3092 | +#define XHCI_PLAT (1 << 16) |
3093 | unsigned int num_active_eps; |
3094 | unsigned int limit_active_eps; |
3095 | /* There are two roothubs to keep track of bus suspend info for */ |
3096 | diff --git a/drivers/usb/serial/mos7720.c b/drivers/usb/serial/mos7720.c |
3097 | index b0130016..84657e07 100644 |
3098 | --- a/drivers/usb/serial/mos7720.c |
3099 | +++ b/drivers/usb/serial/mos7720.c |
3100 | @@ -374,7 +374,7 @@ static int write_parport_reg_nonblock(struct mos7715_parport *mos_parport, |
3101 | kfree(urbtrack); |
3102 | return -ENOMEM; |
3103 | } |
3104 | - urbtrack->setup = kmalloc(sizeof(*urbtrack->setup), GFP_KERNEL); |
3105 | + urbtrack->setup = kmalloc(sizeof(*urbtrack->setup), GFP_ATOMIC); |
3106 | if (!urbtrack->setup) { |
3107 | usb_free_urb(urbtrack->urb); |
3108 | kfree(urbtrack); |
3109 | @@ -382,8 +382,8 @@ static int write_parport_reg_nonblock(struct mos7715_parport *mos_parport, |
3110 | } |
3111 | urbtrack->setup->bRequestType = (__u8)0x40; |
3112 | urbtrack->setup->bRequest = (__u8)0x0e; |
3113 | - urbtrack->setup->wValue = get_reg_value(reg, dummy); |
3114 | - urbtrack->setup->wIndex = get_reg_index(reg); |
3115 | + urbtrack->setup->wValue = cpu_to_le16(get_reg_value(reg, dummy)); |
3116 | + urbtrack->setup->wIndex = cpu_to_le16(get_reg_index(reg)); |
3117 | urbtrack->setup->wLength = 0; |
3118 | usb_fill_control_urb(urbtrack->urb, usbdev, |
3119 | usb_sndctrlpipe(usbdev, 0), |
3120 | diff --git a/drivers/xen/grant-table.c b/drivers/xen/grant-table.c |
3121 | index 04cdeb8e..c4d22988 100644 |
3122 | --- a/drivers/xen/grant-table.c |
3123 | +++ b/drivers/xen/grant-table.c |
3124 | @@ -730,9 +730,18 @@ void gnttab_request_free_callback(struct gnttab_free_callback *callback, |
3125 | void (*fn)(void *), void *arg, u16 count) |
3126 | { |
3127 | unsigned long flags; |
3128 | + struct gnttab_free_callback *cb; |
3129 | + |
3130 | spin_lock_irqsave(&gnttab_list_lock, flags); |
3131 | - if (callback->next) |
3132 | - goto out; |
3133 | + |
3134 | + /* Check if the callback is already on the list */ |
3135 | + cb = gnttab_free_callback_list; |
3136 | + while (cb) { |
3137 | + if (cb == callback) |
3138 | + goto out; |
3139 | + cb = cb->next; |
3140 | + } |
3141 | + |
3142 | callback->fn = fn; |
3143 | callback->arg = arg; |
3144 | callback->count = count; |
3145 | diff --git a/fs/btrfs/ioctl.c b/fs/btrfs/ioctl.c |
3146 | index 238a0554..9877a2a2 100644 |
3147 | --- a/fs/btrfs/ioctl.c |
3148 | +++ b/fs/btrfs/ioctl.c |
3149 | @@ -3312,6 +3312,9 @@ static long btrfs_ioctl_dev_replace(struct btrfs_root *root, void __user *arg) |
3150 | |
3151 | switch (p->cmd) { |
3152 | case BTRFS_IOCTL_DEV_REPLACE_CMD_START: |
3153 | + if (root->fs_info->sb->s_flags & MS_RDONLY) |
3154 | + return -EROFS; |
3155 | + |
3156 | if (atomic_xchg( |
3157 | &root->fs_info->mutually_exclusive_operation_running, |
3158 | 1)) { |
3159 | diff --git a/fs/ceph/ioctl.c b/fs/ceph/ioctl.c |
3160 | index e0b4ef31..a5ce62eb 100644 |
3161 | --- a/fs/ceph/ioctl.c |
3162 | +++ b/fs/ceph/ioctl.c |
3163 | @@ -196,8 +196,10 @@ static long ceph_ioctl_get_dataloc(struct file *file, void __user *arg) |
3164 | r = ceph_calc_file_object_mapping(&ci->i_layout, dl.file_offset, len, |
3165 | &dl.object_no, &dl.object_offset, |
3166 | &olen); |
3167 | - if (r < 0) |
3168 | + if (r < 0) { |
3169 | + up_read(&osdc->map_sem); |
3170 | return -EIO; |
3171 | + } |
3172 | dl.file_offset -= dl.object_offset; |
3173 | dl.object_size = ceph_file_layout_object_size(ci->i_layout); |
3174 | dl.block_size = ceph_file_layout_su(ci->i_layout); |
3175 | diff --git a/fs/cifs/connect.c b/fs/cifs/connect.c |
3176 | index d67c550c..37950c65 100644 |
3177 | --- a/fs/cifs/connect.c |
3178 | +++ b/fs/cifs/connect.c |
3179 | @@ -379,6 +379,7 @@ cifs_reconnect(struct TCP_Server_Info *server) |
3180 | try_to_freeze(); |
3181 | |
3182 | /* we should try only the port we connected to before */ |
3183 | + mutex_lock(&server->srv_mutex); |
3184 | rc = generic_ip_connect(server); |
3185 | if (rc) { |
3186 | cifs_dbg(FYI, "reconnect error %d\n", rc); |
3187 | @@ -390,6 +391,7 @@ cifs_reconnect(struct TCP_Server_Info *server) |
3188 | server->tcpStatus = CifsNeedNegotiate; |
3189 | spin_unlock(&GlobalMid_Lock); |
3190 | } |
3191 | + mutex_unlock(&server->srv_mutex); |
3192 | } while (server->tcpStatus == CifsNeedReconnect); |
3193 | |
3194 | return rc; |
3195 | diff --git a/fs/cifs/smb2misc.c b/fs/cifs/smb2misc.c |
3196 | index b0c43345..f851d03f 100644 |
3197 | --- a/fs/cifs/smb2misc.c |
3198 | +++ b/fs/cifs/smb2misc.c |
3199 | @@ -417,96 +417,108 @@ cifs_ses_oplock_break(struct work_struct *work) |
3200 | } |
3201 | |
3202 | static bool |
3203 | -smb2_is_valid_lease_break(char *buffer, struct TCP_Server_Info *server) |
3204 | +smb2_tcon_has_lease(struct cifs_tcon *tcon, struct smb2_lease_break *rsp, |
3205 | + struct smb2_lease_break_work *lw) |
3206 | { |
3207 | - struct smb2_lease_break *rsp = (struct smb2_lease_break *)buffer; |
3208 | - struct list_head *tmp, *tmp1, *tmp2; |
3209 | - struct cifs_ses *ses; |
3210 | - struct cifs_tcon *tcon; |
3211 | - struct cifsInodeInfo *cinode; |
3212 | + bool found; |
3213 | + __u8 lease_state; |
3214 | + struct list_head *tmp; |
3215 | struct cifsFileInfo *cfile; |
3216 | struct cifs_pending_open *open; |
3217 | - struct smb2_lease_break_work *lw; |
3218 | - bool found; |
3219 | + struct cifsInodeInfo *cinode; |
3220 | int ack_req = le32_to_cpu(rsp->Flags & |
3221 | SMB2_NOTIFY_BREAK_LEASE_FLAG_ACK_REQUIRED); |
3222 | |
3223 | - lw = kmalloc(sizeof(struct smb2_lease_break_work), GFP_KERNEL); |
3224 | - if (!lw) |
3225 | - return false; |
3226 | + lease_state = smb2_map_lease_to_oplock(rsp->NewLeaseState); |
3227 | |
3228 | - INIT_WORK(&lw->lease_break, cifs_ses_oplock_break); |
3229 | - lw->lease_state = rsp->NewLeaseState; |
3230 | + list_for_each(tmp, &tcon->openFileList) { |
3231 | + cfile = list_entry(tmp, struct cifsFileInfo, tlist); |
3232 | + cinode = CIFS_I(cfile->dentry->d_inode); |
3233 | |
3234 | - cifs_dbg(FYI, "Checking for lease break\n"); |
3235 | + if (memcmp(cinode->lease_key, rsp->LeaseKey, |
3236 | + SMB2_LEASE_KEY_SIZE)) |
3237 | + continue; |
3238 | |
3239 | - /* look up tcon based on tid & uid */ |
3240 | - spin_lock(&cifs_tcp_ses_lock); |
3241 | - list_for_each(tmp, &server->smb_ses_list) { |
3242 | - ses = list_entry(tmp, struct cifs_ses, smb_ses_list); |
3243 | + cifs_dbg(FYI, "found in the open list\n"); |
3244 | + cifs_dbg(FYI, "lease key match, lease break 0x%d\n", |
3245 | + le32_to_cpu(rsp->NewLeaseState)); |
3246 | |
3247 | - spin_lock(&cifs_file_list_lock); |
3248 | - list_for_each(tmp1, &ses->tcon_list) { |
3249 | - tcon = list_entry(tmp1, struct cifs_tcon, tcon_list); |
3250 | + smb2_set_oplock_level(cinode, lease_state); |
3251 | |
3252 | - cifs_stats_inc(&tcon->stats.cifs_stats.num_oplock_brks); |
3253 | - list_for_each(tmp2, &tcon->openFileList) { |
3254 | - cfile = list_entry(tmp2, struct cifsFileInfo, |
3255 | - tlist); |
3256 | - cinode = CIFS_I(cfile->dentry->d_inode); |
3257 | + if (ack_req) |
3258 | + cfile->oplock_break_cancelled = false; |
3259 | + else |
3260 | + cfile->oplock_break_cancelled = true; |
3261 | |
3262 | - if (memcmp(cinode->lease_key, rsp->LeaseKey, |
3263 | - SMB2_LEASE_KEY_SIZE)) |
3264 | - continue; |
3265 | + queue_work(cifsiod_wq, &cfile->oplock_break); |
3266 | + kfree(lw); |
3267 | + return true; |
3268 | + } |
3269 | |
3270 | - cifs_dbg(FYI, "found in the open list\n"); |
3271 | - cifs_dbg(FYI, "lease key match, lease break 0x%d\n", |
3272 | - le32_to_cpu(rsp->NewLeaseState)); |
3273 | + found = false; |
3274 | + list_for_each_entry(open, &tcon->pending_opens, olist) { |
3275 | + if (memcmp(open->lease_key, rsp->LeaseKey, |
3276 | + SMB2_LEASE_KEY_SIZE)) |
3277 | + continue; |
3278 | + |
3279 | + if (!found && ack_req) { |
3280 | + found = true; |
3281 | + memcpy(lw->lease_key, open->lease_key, |
3282 | + SMB2_LEASE_KEY_SIZE); |
3283 | + lw->tlink = cifs_get_tlink(open->tlink); |
3284 | + queue_work(cifsiod_wq, &lw->lease_break); |
3285 | + } |
3286 | |
3287 | - smb2_set_oplock_level(cinode, |
3288 | - smb2_map_lease_to_oplock(rsp->NewLeaseState)); |
3289 | + cifs_dbg(FYI, "found in the pending open list\n"); |
3290 | + cifs_dbg(FYI, "lease key match, lease break 0x%d\n", |
3291 | + le32_to_cpu(rsp->NewLeaseState)); |
3292 | |
3293 | - if (ack_req) |
3294 | - cfile->oplock_break_cancelled = false; |
3295 | - else |
3296 | - cfile->oplock_break_cancelled = true; |
3297 | + open->oplock = lease_state; |
3298 | + } |
3299 | + return found; |
3300 | +} |
3301 | |
3302 | - queue_work(cifsiod_wq, &cfile->oplock_break); |
3303 | +static bool |
3304 | +smb2_is_valid_lease_break(char *buffer) |
3305 | +{ |
3306 | + struct smb2_lease_break *rsp = (struct smb2_lease_break *)buffer; |
3307 | + struct list_head *tmp, *tmp1, *tmp2; |
3308 | + struct TCP_Server_Info *server; |
3309 | + struct cifs_ses *ses; |
3310 | + struct cifs_tcon *tcon; |
3311 | + struct smb2_lease_break_work *lw; |
3312 | |
3313 | - spin_unlock(&cifs_file_list_lock); |
3314 | - spin_unlock(&cifs_tcp_ses_lock); |
3315 | - return true; |
3316 | - } |
3317 | + lw = kmalloc(sizeof(struct smb2_lease_break_work), GFP_KERNEL); |
3318 | + if (!lw) |
3319 | + return false; |
3320 | |
3321 | - found = false; |
3322 | - list_for_each_entry(open, &tcon->pending_opens, olist) { |
3323 | - if (memcmp(open->lease_key, rsp->LeaseKey, |
3324 | - SMB2_LEASE_KEY_SIZE)) |
3325 | - continue; |
3326 | + INIT_WORK(&lw->lease_break, cifs_ses_oplock_break); |
3327 | + lw->lease_state = rsp->NewLeaseState; |
3328 | |
3329 | - if (!found && ack_req) { |
3330 | - found = true; |
3331 | - memcpy(lw->lease_key, open->lease_key, |
3332 | - SMB2_LEASE_KEY_SIZE); |
3333 | - lw->tlink = cifs_get_tlink(open->tlink); |
3334 | - queue_work(cifsiod_wq, |
3335 | - &lw->lease_break); |
3336 | - } |
3337 | + cifs_dbg(FYI, "Checking for lease break\n"); |
3338 | + |
3339 | + /* look up tcon based on tid & uid */ |
3340 | + spin_lock(&cifs_tcp_ses_lock); |
3341 | + list_for_each(tmp, &cifs_tcp_ses_list) { |
3342 | + server = list_entry(tmp, struct TCP_Server_Info, tcp_ses_list); |
3343 | |
3344 | - cifs_dbg(FYI, "found in the pending open list\n"); |
3345 | - cifs_dbg(FYI, "lease key match, lease break 0x%d\n", |
3346 | - le32_to_cpu(rsp->NewLeaseState)); |
3347 | + list_for_each(tmp1, &server->smb_ses_list) { |
3348 | + ses = list_entry(tmp1, struct cifs_ses, smb_ses_list); |
3349 | |
3350 | - open->oplock = |
3351 | - smb2_map_lease_to_oplock(rsp->NewLeaseState); |
3352 | - } |
3353 | - if (found) { |
3354 | - spin_unlock(&cifs_file_list_lock); |
3355 | - spin_unlock(&cifs_tcp_ses_lock); |
3356 | - return true; |
3357 | + spin_lock(&cifs_file_list_lock); |
3358 | + list_for_each(tmp2, &ses->tcon_list) { |
3359 | + tcon = list_entry(tmp2, struct cifs_tcon, |
3360 | + tcon_list); |
3361 | + cifs_stats_inc( |
3362 | + &tcon->stats.cifs_stats.num_oplock_brks); |
3363 | + if (smb2_tcon_has_lease(tcon, rsp, lw)) { |
3364 | + spin_unlock(&cifs_file_list_lock); |
3365 | + spin_unlock(&cifs_tcp_ses_lock); |
3366 | + return true; |
3367 | + } |
3368 | } |
3369 | + spin_unlock(&cifs_file_list_lock); |
3370 | } |
3371 | - spin_unlock(&cifs_file_list_lock); |
3372 | } |
3373 | spin_unlock(&cifs_tcp_ses_lock); |
3374 | kfree(lw); |
3375 | @@ -532,7 +544,7 @@ smb2_is_valid_oplock_break(char *buffer, struct TCP_Server_Info *server) |
3376 | if (rsp->StructureSize != |
3377 | smb2_rsp_struct_sizes[SMB2_OPLOCK_BREAK_HE]) { |
3378 | if (le16_to_cpu(rsp->StructureSize) == 44) |
3379 | - return smb2_is_valid_lease_break(buffer, server); |
3380 | + return smb2_is_valid_lease_break(buffer); |
3381 | else |
3382 | return false; |
3383 | } |
3384 | diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c |
3385 | index c2ca04e6..ea4d1884 100644 |
3386 | --- a/fs/ext4/inode.c |
3387 | +++ b/fs/ext4/inode.c |
3388 | @@ -1890,6 +1890,26 @@ static int ext4_writepage(struct page *page, |
3389 | return ret; |
3390 | } |
3391 | |
3392 | +static int mpage_submit_page(struct mpage_da_data *mpd, struct page *page) |
3393 | +{ |
3394 | + int len; |
3395 | + loff_t size = i_size_read(mpd->inode); |
3396 | + int err; |
3397 | + |
3398 | + BUG_ON(page->index != mpd->first_page); |
3399 | + if (page->index == size >> PAGE_CACHE_SHIFT) |
3400 | + len = size & ~PAGE_CACHE_MASK; |
3401 | + else |
3402 | + len = PAGE_CACHE_SIZE; |
3403 | + clear_page_dirty_for_io(page); |
3404 | + err = ext4_bio_write_page(&mpd->io_submit, page, len, mpd->wbc); |
3405 | + if (!err) |
3406 | + mpd->wbc->nr_to_write--; |
3407 | + mpd->first_page++; |
3408 | + |
3409 | + return err; |
3410 | +} |
3411 | + |
3412 | #define BH_FLAGS ((1 << BH_Unwritten) | (1 << BH_Delay)) |
3413 | |
3414 | /* |
3415 | @@ -1904,82 +1924,94 @@ static int ext4_writepage(struct page *page, |
3416 | * |
3417 | * @mpd - extent of blocks |
3418 | * @lblk - logical number of the block in the file |
3419 | - * @b_state - b_state of the buffer head added |
3420 | + * @bh - buffer head we want to add to the extent |
3421 | * |
3422 | - * the function is used to collect contig. blocks in same state |
3423 | + * The function is used to collect contig. blocks in the same state. If the |
3424 | + * buffer doesn't require mapping for writeback and we haven't started the |
3425 | + * extent of buffers to map yet, the function returns 'true' immediately - the |
3426 | + * caller can write the buffer right away. Otherwise the function returns true |
3427 | + * if the block has been added to the extent, false if the block couldn't be |
3428 | + * added. |
3429 | */ |
3430 | -static int mpage_add_bh_to_extent(struct mpage_da_data *mpd, ext4_lblk_t lblk, |
3431 | - unsigned long b_state) |
3432 | +static bool mpage_add_bh_to_extent(struct mpage_da_data *mpd, ext4_lblk_t lblk, |
3433 | + struct buffer_head *bh) |
3434 | { |
3435 | struct ext4_map_blocks *map = &mpd->map; |
3436 | |
3437 | - /* Don't go larger than mballoc is willing to allocate */ |
3438 | - if (map->m_len >= MAX_WRITEPAGES_EXTENT_LEN) |
3439 | - return 0; |
3440 | + /* Buffer that doesn't need mapping for writeback? */ |
3441 | + if (!buffer_dirty(bh) || !buffer_mapped(bh) || |
3442 | + (!buffer_delay(bh) && !buffer_unwritten(bh))) { |
3443 | + /* So far no extent to map => we write the buffer right away */ |
3444 | + if (map->m_len == 0) |
3445 | + return true; |
3446 | + return false; |
3447 | + } |
3448 | |
3449 | /* First block in the extent? */ |
3450 | if (map->m_len == 0) { |
3451 | map->m_lblk = lblk; |
3452 | map->m_len = 1; |
3453 | - map->m_flags = b_state & BH_FLAGS; |
3454 | - return 1; |
3455 | + map->m_flags = bh->b_state & BH_FLAGS; |
3456 | + return true; |
3457 | } |
3458 | |
3459 | + /* Don't go larger than mballoc is willing to allocate */ |
3460 | + if (map->m_len >= MAX_WRITEPAGES_EXTENT_LEN) |
3461 | + return false; |
3462 | + |
3463 | /* Can we merge the block to our big extent? */ |
3464 | if (lblk == map->m_lblk + map->m_len && |
3465 | - (b_state & BH_FLAGS) == map->m_flags) { |
3466 | + (bh->b_state & BH_FLAGS) == map->m_flags) { |
3467 | map->m_len++; |
3468 | - return 1; |
3469 | + return true; |
3470 | } |
3471 | - return 0; |
3472 | + return false; |
3473 | } |
3474 | |
3475 | -static bool add_page_bufs_to_extent(struct mpage_da_data *mpd, |
3476 | - struct buffer_head *head, |
3477 | - struct buffer_head *bh, |
3478 | - ext4_lblk_t lblk) |
3479 | +/* |
3480 | + * mpage_process_page_bufs - submit page buffers for IO or add them to extent |
3481 | + * |
3482 | + * @mpd - extent of blocks for mapping |
3483 | + * @head - the first buffer in the page |
3484 | + * @bh - buffer we should start processing from |
3485 | + * @lblk - logical number of the block in the file corresponding to @bh |
3486 | + * |
3487 | + * Walk through page buffers from @bh upto @head (exclusive) and either submit |
3488 | + * the page for IO if all buffers in this page were mapped and there's no |
3489 | + * accumulated extent of buffers to map or add buffers in the page to the |
3490 | + * extent of buffers to map. The function returns 1 if the caller can continue |
3491 | + * by processing the next page, 0 if it should stop adding buffers to the |
3492 | + * extent to map because we cannot extend it anymore. It can also return value |
3493 | + * < 0 in case of error during IO submission. |
3494 | + */ |
3495 | +static int mpage_process_page_bufs(struct mpage_da_data *mpd, |
3496 | + struct buffer_head *head, |
3497 | + struct buffer_head *bh, |
3498 | + ext4_lblk_t lblk) |
3499 | { |
3500 | struct inode *inode = mpd->inode; |
3501 | + int err; |
3502 | ext4_lblk_t blocks = (i_size_read(inode) + (1 << inode->i_blkbits) - 1) |
3503 | >> inode->i_blkbits; |
3504 | |
3505 | do { |
3506 | BUG_ON(buffer_locked(bh)); |
3507 | |
3508 | - if (!buffer_dirty(bh) || !buffer_mapped(bh) || |
3509 | - (!buffer_delay(bh) && !buffer_unwritten(bh)) || |
3510 | - lblk >= blocks) { |
3511 | + if (lblk >= blocks || !mpage_add_bh_to_extent(mpd, lblk, bh)) { |
3512 | /* Found extent to map? */ |
3513 | if (mpd->map.m_len) |
3514 | - return false; |
3515 | - if (lblk >= blocks) |
3516 | - return true; |
3517 | - continue; |
3518 | + return 0; |
3519 | + /* Everything mapped so far and we hit EOF */ |
3520 | + break; |
3521 | } |
3522 | - if (!mpage_add_bh_to_extent(mpd, lblk, bh->b_state)) |
3523 | - return false; |
3524 | } while (lblk++, (bh = bh->b_this_page) != head); |
3525 | - return true; |
3526 | -} |
3527 | - |
3528 | -static int mpage_submit_page(struct mpage_da_data *mpd, struct page *page) |
3529 | -{ |
3530 | - int len; |
3531 | - loff_t size = i_size_read(mpd->inode); |
3532 | - int err; |
3533 | - |
3534 | - BUG_ON(page->index != mpd->first_page); |
3535 | - if (page->index == size >> PAGE_CACHE_SHIFT) |
3536 | - len = size & ~PAGE_CACHE_MASK; |
3537 | - else |
3538 | - len = PAGE_CACHE_SIZE; |
3539 | - clear_page_dirty_for_io(page); |
3540 | - err = ext4_bio_write_page(&mpd->io_submit, page, len, mpd->wbc); |
3541 | - if (!err) |
3542 | - mpd->wbc->nr_to_write--; |
3543 | - mpd->first_page++; |
3544 | - |
3545 | - return err; |
3546 | + /* So far everything mapped? Submit the page for IO. */ |
3547 | + if (mpd->map.m_len == 0) { |
3548 | + err = mpage_submit_page(mpd, head->b_page); |
3549 | + if (err < 0) |
3550 | + return err; |
3551 | + } |
3552 | + return lblk < blocks; |
3553 | } |
3554 | |
3555 | /* |
3556 | @@ -2003,8 +2035,6 @@ static int mpage_map_and_submit_buffers(struct mpage_da_data *mpd) |
3557 | struct inode *inode = mpd->inode; |
3558 | struct buffer_head *head, *bh; |
3559 | int bpp_bits = PAGE_CACHE_SHIFT - inode->i_blkbits; |
3560 | - ext4_lblk_t blocks = (i_size_read(inode) + (1 << inode->i_blkbits) - 1) |
3561 | - >> inode->i_blkbits; |
3562 | pgoff_t start, end; |
3563 | ext4_lblk_t lblk; |
3564 | sector_t pblock; |
3565 | @@ -2039,18 +2069,26 @@ static int mpage_map_and_submit_buffers(struct mpage_da_data *mpd) |
3566 | */ |
3567 | mpd->map.m_len = 0; |
3568 | mpd->map.m_flags = 0; |
3569 | - add_page_bufs_to_extent(mpd, head, bh, |
3570 | - lblk); |
3571 | + /* |
3572 | + * FIXME: If dioread_nolock supports |
3573 | + * blocksize < pagesize, we need to make |
3574 | + * sure we add size mapped so far to |
3575 | + * io_end->size as the following call |
3576 | + * can submit the page for IO. |
3577 | + */ |
3578 | + err = mpage_process_page_bufs(mpd, head, |
3579 | + bh, lblk); |
3580 | pagevec_release(&pvec); |
3581 | - return 0; |
3582 | + if (err > 0) |
3583 | + err = 0; |
3584 | + return err; |
3585 | } |
3586 | if (buffer_delay(bh)) { |
3587 | clear_buffer_delay(bh); |
3588 | bh->b_blocknr = pblock++; |
3589 | } |
3590 | clear_buffer_unwritten(bh); |
3591 | - } while (++lblk < blocks && |
3592 | - (bh = bh->b_this_page) != head); |
3593 | + } while (lblk++, (bh = bh->b_this_page) != head); |
3594 | |
3595 | /* |
3596 | * FIXME: This is going to break if dioread_nolock |
3597 | @@ -2319,14 +2357,10 @@ static int mpage_prepare_extent_to_map(struct mpage_da_data *mpd) |
3598 | lblk = ((ext4_lblk_t)page->index) << |
3599 | (PAGE_CACHE_SHIFT - blkbits); |
3600 | head = page_buffers(page); |
3601 | - if (!add_page_bufs_to_extent(mpd, head, head, lblk)) |
3602 | + err = mpage_process_page_bufs(mpd, head, head, lblk); |
3603 | + if (err <= 0) |
3604 | goto out; |
3605 | - /* So far everything mapped? Submit the page for IO. */ |
3606 | - if (mpd->map.m_len == 0) { |
3607 | - err = mpage_submit_page(mpd, page); |
3608 | - if (err < 0) |
3609 | - goto out; |
3610 | - } |
3611 | + err = 0; |
3612 | |
3613 | /* |
3614 | * Accumulated enough dirty pages? This doesn't apply |
3615 | @@ -4566,7 +4600,9 @@ int ext4_setattr(struct dentry *dentry, struct iattr *attr) |
3616 | ext4_journal_stop(handle); |
3617 | } |
3618 | |
3619 | - if (attr->ia_valid & ATTR_SIZE) { |
3620 | + if (attr->ia_valid & ATTR_SIZE && attr->ia_size != inode->i_size) { |
3621 | + handle_t *handle; |
3622 | + loff_t oldsize = inode->i_size; |
3623 | |
3624 | if (!(ext4_test_inode_flag(inode, EXT4_INODE_EXTENTS))) { |
3625 | struct ext4_sb_info *sbi = EXT4_SB(inode->i_sb); |
3626 | @@ -4574,73 +4610,60 @@ int ext4_setattr(struct dentry *dentry, struct iattr *attr) |
3627 | if (attr->ia_size > sbi->s_bitmap_maxbytes) |
3628 | return -EFBIG; |
3629 | } |
3630 | - } |
3631 | - |
3632 | - if (S_ISREG(inode->i_mode) && |
3633 | - attr->ia_valid & ATTR_SIZE && |
3634 | - (attr->ia_size < inode->i_size)) { |
3635 | - handle_t *handle; |
3636 | - |
3637 | - handle = ext4_journal_start(inode, EXT4_HT_INODE, 3); |
3638 | - if (IS_ERR(handle)) { |
3639 | - error = PTR_ERR(handle); |
3640 | - goto err_out; |
3641 | - } |
3642 | - if (ext4_handle_valid(handle)) { |
3643 | - error = ext4_orphan_add(handle, inode); |
3644 | - orphan = 1; |
3645 | - } |
3646 | - EXT4_I(inode)->i_disksize = attr->ia_size; |
3647 | - rc = ext4_mark_inode_dirty(handle, inode); |
3648 | - if (!error) |
3649 | - error = rc; |
3650 | - ext4_journal_stop(handle); |
3651 | - |
3652 | - if (ext4_should_order_data(inode)) { |
3653 | - error = ext4_begin_ordered_truncate(inode, |
3654 | + if (S_ISREG(inode->i_mode) && |
3655 | + (attr->ia_size < inode->i_size)) { |
3656 | + if (ext4_should_order_data(inode)) { |
3657 | + error = ext4_begin_ordered_truncate(inode, |
3658 | attr->ia_size); |
3659 | - if (error) { |
3660 | - /* Do as much error cleanup as possible */ |
3661 | - handle = ext4_journal_start(inode, |
3662 | - EXT4_HT_INODE, 3); |
3663 | - if (IS_ERR(handle)) { |
3664 | - ext4_orphan_del(NULL, inode); |
3665 | + if (error) |
3666 | goto err_out; |
3667 | - } |
3668 | - ext4_orphan_del(handle, inode); |
3669 | - orphan = 0; |
3670 | - ext4_journal_stop(handle); |
3671 | + } |
3672 | + handle = ext4_journal_start(inode, EXT4_HT_INODE, 3); |
3673 | + if (IS_ERR(handle)) { |
3674 | + error = PTR_ERR(handle); |
3675 | + goto err_out; |
3676 | + } |
3677 | + if (ext4_handle_valid(handle)) { |
3678 | + error = ext4_orphan_add(handle, inode); |
3679 | + orphan = 1; |
3680 | + } |
3681 | + EXT4_I(inode)->i_disksize = attr->ia_size; |
3682 | + rc = ext4_mark_inode_dirty(handle, inode); |
3683 | + if (!error) |
3684 | + error = rc; |
3685 | + ext4_journal_stop(handle); |
3686 | + if (error) { |
3687 | + ext4_orphan_del(NULL, inode); |
3688 | goto err_out; |
3689 | } |
3690 | } |
3691 | - } |
3692 | - |
3693 | - if (attr->ia_valid & ATTR_SIZE) { |
3694 | - if (attr->ia_size != inode->i_size) { |
3695 | - loff_t oldsize = inode->i_size; |
3696 | |
3697 | - i_size_write(inode, attr->ia_size); |
3698 | - /* |
3699 | - * Blocks are going to be removed from the inode. Wait |
3700 | - * for dio in flight. Temporarily disable |
3701 | - * dioread_nolock to prevent livelock. |
3702 | - */ |
3703 | - if (orphan) { |
3704 | - if (!ext4_should_journal_data(inode)) { |
3705 | - ext4_inode_block_unlocked_dio(inode); |
3706 | - inode_dio_wait(inode); |
3707 | - ext4_inode_resume_unlocked_dio(inode); |
3708 | - } else |
3709 | - ext4_wait_for_tail_page_commit(inode); |
3710 | - } |
3711 | - /* |
3712 | - * Truncate pagecache after we've waited for commit |
3713 | - * in data=journal mode to make pages freeable. |
3714 | - */ |
3715 | - truncate_pagecache(inode, oldsize, inode->i_size); |
3716 | + i_size_write(inode, attr->ia_size); |
3717 | + /* |
3718 | + * Blocks are going to be removed from the inode. Wait |
3719 | + * for dio in flight. Temporarily disable |
3720 | + * dioread_nolock to prevent livelock. |
3721 | + */ |
3722 | + if (orphan) { |
3723 | + if (!ext4_should_journal_data(inode)) { |
3724 | + ext4_inode_block_unlocked_dio(inode); |
3725 | + inode_dio_wait(inode); |
3726 | + ext4_inode_resume_unlocked_dio(inode); |
3727 | + } else |
3728 | + ext4_wait_for_tail_page_commit(inode); |
3729 | } |
3730 | - ext4_truncate(inode); |
3731 | + /* |
3732 | + * Truncate pagecache after we've waited for commit |
3733 | + * in data=journal mode to make pages freeable. |
3734 | + */ |
3735 | + truncate_pagecache(inode, oldsize, inode->i_size); |
3736 | } |
3737 | + /* |
3738 | + * We want to call ext4_truncate() even if attr->ia_size == |
3739 | + * inode->i_size for cases like truncation of fallocated space |
3740 | + */ |
3741 | + if (attr->ia_valid & ATTR_SIZE) |
3742 | + ext4_truncate(inode); |
3743 | |
3744 | if (!rc) { |
3745 | setattr_copy(inode, attr); |
3746 | diff --git a/fs/fuse/dir.c b/fs/fuse/dir.c |
3747 | index 72a5d5b0..8fec28ff 100644 |
3748 | --- a/fs/fuse/dir.c |
3749 | +++ b/fs/fuse/dir.c |
3750 | @@ -1174,6 +1174,8 @@ static int parse_dirfile(char *buf, size_t nbytes, struct file *file, |
3751 | return -EIO; |
3752 | if (reclen > nbytes) |
3753 | break; |
3754 | + if (memchr(dirent->name, '/', dirent->namelen) != NULL) |
3755 | + return -EIO; |
3756 | |
3757 | if (!dir_emit(ctx, dirent->name, dirent->namelen, |
3758 | dirent->ino, dirent->type)) |
3759 | @@ -1320,6 +1322,8 @@ static int parse_dirplusfile(char *buf, size_t nbytes, struct file *file, |
3760 | return -EIO; |
3761 | if (reclen > nbytes) |
3762 | break; |
3763 | + if (memchr(dirent->name, '/', dirent->namelen) != NULL) |
3764 | + return -EIO; |
3765 | |
3766 | if (!over) { |
3767 | /* We fill entries into dstbuf only as much as |
3768 | @@ -1590,6 +1594,7 @@ int fuse_do_setattr(struct inode *inode, struct iattr *attr, |
3769 | struct file *file) |
3770 | { |
3771 | struct fuse_conn *fc = get_fuse_conn(inode); |
3772 | + struct fuse_inode *fi = get_fuse_inode(inode); |
3773 | struct fuse_req *req; |
3774 | struct fuse_setattr_in inarg; |
3775 | struct fuse_attr_out outarg; |
3776 | @@ -1617,8 +1622,10 @@ int fuse_do_setattr(struct inode *inode, struct iattr *attr, |
3777 | if (IS_ERR(req)) |
3778 | return PTR_ERR(req); |
3779 | |
3780 | - if (is_truncate) |
3781 | + if (is_truncate) { |
3782 | fuse_set_nowrite(inode); |
3783 | + set_bit(FUSE_I_SIZE_UNSTABLE, &fi->state); |
3784 | + } |
3785 | |
3786 | memset(&inarg, 0, sizeof(inarg)); |
3787 | memset(&outarg, 0, sizeof(outarg)); |
3788 | @@ -1680,12 +1687,14 @@ int fuse_do_setattr(struct inode *inode, struct iattr *attr, |
3789 | invalidate_inode_pages2(inode->i_mapping); |
3790 | } |
3791 | |
3792 | + clear_bit(FUSE_I_SIZE_UNSTABLE, &fi->state); |
3793 | return 0; |
3794 | |
3795 | error: |
3796 | if (is_truncate) |
3797 | fuse_release_nowrite(inode); |
3798 | |
3799 | + clear_bit(FUSE_I_SIZE_UNSTABLE, &fi->state); |
3800 | return err; |
3801 | } |
3802 | |
3803 | @@ -1749,6 +1758,8 @@ static int fuse_setxattr(struct dentry *entry, const char *name, |
3804 | fc->no_setxattr = 1; |
3805 | err = -EOPNOTSUPP; |
3806 | } |
3807 | + if (!err) |
3808 | + fuse_invalidate_attr(inode); |
3809 | return err; |
3810 | } |
3811 | |
3812 | @@ -1878,6 +1889,8 @@ static int fuse_removexattr(struct dentry *entry, const char *name) |
3813 | fc->no_removexattr = 1; |
3814 | err = -EOPNOTSUPP; |
3815 | } |
3816 | + if (!err) |
3817 | + fuse_invalidate_attr(inode); |
3818 | return err; |
3819 | } |
3820 | |
3821 | diff --git a/fs/fuse/file.c b/fs/fuse/file.c |
3822 | index 5c121fe1..d409deaf 100644 |
3823 | --- a/fs/fuse/file.c |
3824 | +++ b/fs/fuse/file.c |
3825 | @@ -629,7 +629,8 @@ static void fuse_read_update_size(struct inode *inode, loff_t size, |
3826 | struct fuse_inode *fi = get_fuse_inode(inode); |
3827 | |
3828 | spin_lock(&fc->lock); |
3829 | - if (attr_ver == fi->attr_version && size < inode->i_size) { |
3830 | + if (attr_ver == fi->attr_version && size < inode->i_size && |
3831 | + !test_bit(FUSE_I_SIZE_UNSTABLE, &fi->state)) { |
3832 | fi->attr_version = ++fc->attr_version; |
3833 | i_size_write(inode, size); |
3834 | } |
3835 | @@ -1032,12 +1033,16 @@ static ssize_t fuse_perform_write(struct file *file, |
3836 | { |
3837 | struct inode *inode = mapping->host; |
3838 | struct fuse_conn *fc = get_fuse_conn(inode); |
3839 | + struct fuse_inode *fi = get_fuse_inode(inode); |
3840 | int err = 0; |
3841 | ssize_t res = 0; |
3842 | |
3843 | if (is_bad_inode(inode)) |
3844 | return -EIO; |
3845 | |
3846 | + if (inode->i_size < pos + iov_iter_count(ii)) |
3847 | + set_bit(FUSE_I_SIZE_UNSTABLE, &fi->state); |
3848 | + |
3849 | do { |
3850 | struct fuse_req *req; |
3851 | ssize_t count; |
3852 | @@ -1073,6 +1078,7 @@ static ssize_t fuse_perform_write(struct file *file, |
3853 | if (res > 0) |
3854 | fuse_write_update_size(inode, pos); |
3855 | |
3856 | + clear_bit(FUSE_I_SIZE_UNSTABLE, &fi->state); |
3857 | fuse_invalidate_attr(inode); |
3858 | |
3859 | return res > 0 ? res : err; |
3860 | @@ -1529,7 +1535,6 @@ static int fuse_writepage_locked(struct page *page) |
3861 | |
3862 | inc_bdi_stat(mapping->backing_dev_info, BDI_WRITEBACK); |
3863 | inc_zone_page_state(tmp_page, NR_WRITEBACK_TEMP); |
3864 | - end_page_writeback(page); |
3865 | |
3866 | spin_lock(&fc->lock); |
3867 | list_add(&req->writepages_entry, &fi->writepages); |
3868 | @@ -1537,6 +1542,8 @@ static int fuse_writepage_locked(struct page *page) |
3869 | fuse_flush_writepages(inode); |
3870 | spin_unlock(&fc->lock); |
3871 | |
3872 | + end_page_writeback(page); |
3873 | + |
3874 | return 0; |
3875 | |
3876 | err_free: |
3877 | diff --git a/fs/fuse/fuse_i.h b/fs/fuse/fuse_i.h |
3878 | index fde7249a..5ced199b 100644 |
3879 | --- a/fs/fuse/fuse_i.h |
3880 | +++ b/fs/fuse/fuse_i.h |
3881 | @@ -115,6 +115,8 @@ struct fuse_inode { |
3882 | enum { |
3883 | /** Advise readdirplus */ |
3884 | FUSE_I_ADVISE_RDPLUS, |
3885 | + /** An operation changing file size is in progress */ |
3886 | + FUSE_I_SIZE_UNSTABLE, |
3887 | }; |
3888 | |
3889 | struct fuse_conn; |
3890 | diff --git a/fs/fuse/inode.c b/fs/fuse/inode.c |
3891 | index 0b578598..e0fe703e 100644 |
3892 | --- a/fs/fuse/inode.c |
3893 | +++ b/fs/fuse/inode.c |
3894 | @@ -201,7 +201,8 @@ void fuse_change_attributes(struct inode *inode, struct fuse_attr *attr, |
3895 | struct timespec old_mtime; |
3896 | |
3897 | spin_lock(&fc->lock); |
3898 | - if (attr_version != 0 && fi->attr_version > attr_version) { |
3899 | + if ((attr_version != 0 && fi->attr_version > attr_version) || |
3900 | + test_bit(FUSE_I_SIZE_UNSTABLE, &fi->state)) { |
3901 | spin_unlock(&fc->lock); |
3902 | return; |
3903 | } |
3904 | diff --git a/fs/isofs/inode.c b/fs/isofs/inode.c |
3905 | index c348d6d8..e5d408a7 100644 |
3906 | --- a/fs/isofs/inode.c |
3907 | +++ b/fs/isofs/inode.c |
3908 | @@ -117,8 +117,8 @@ static void destroy_inodecache(void) |
3909 | |
3910 | static int isofs_remount(struct super_block *sb, int *flags, char *data) |
3911 | { |
3912 | - /* we probably want a lot more here */ |
3913 | - *flags |= MS_RDONLY; |
3914 | + if (!(*flags & MS_RDONLY)) |
3915 | + return -EROFS; |
3916 | return 0; |
3917 | } |
3918 | |
3919 | @@ -763,15 +763,6 @@ root_found: |
3920 | */ |
3921 | s->s_maxbytes = 0x80000000000LL; |
3922 | |
3923 | - /* |
3924 | - * The CDROM is read-only, has no nodes (devices) on it, and since |
3925 | - * all of the files appear to be owned by root, we really do not want |
3926 | - * to allow suid. (suid or devices will not show up unless we have |
3927 | - * Rock Ridge extensions) |
3928 | - */ |
3929 | - |
3930 | - s->s_flags |= MS_RDONLY /* | MS_NODEV | MS_NOSUID */; |
3931 | - |
3932 | /* Set this for reference. Its not currently used except on write |
3933 | which we don't have .. */ |
3934 | |
3935 | @@ -1530,6 +1521,9 @@ struct inode *isofs_iget(struct super_block *sb, |
3936 | static struct dentry *isofs_mount(struct file_system_type *fs_type, |
3937 | int flags, const char *dev_name, void *data) |
3938 | { |
3939 | + /* We don't support read-write mounts */ |
3940 | + if (!(flags & MS_RDONLY)) |
3941 | + return ERR_PTR(-EACCES); |
3942 | return mount_bdev(fs_type, flags, dev_name, data, isofs_fill_super); |
3943 | } |
3944 | |
3945 | diff --git a/fs/ocfs2/extent_map.c b/fs/ocfs2/extent_map.c |
3946 | index 2487116d..84606472 100644 |
3947 | --- a/fs/ocfs2/extent_map.c |
3948 | +++ b/fs/ocfs2/extent_map.c |
3949 | @@ -781,7 +781,6 @@ int ocfs2_fiemap(struct inode *inode, struct fiemap_extent_info *fieinfo, |
3950 | cpos = map_start >> osb->s_clustersize_bits; |
3951 | mapping_end = ocfs2_clusters_for_bytes(inode->i_sb, |
3952 | map_start + map_len); |
3953 | - mapping_end -= cpos; |
3954 | is_last = 0; |
3955 | while (cpos < mapping_end && !is_last) { |
3956 | u32 fe_flags; |
3957 | diff --git a/fs/proc/root.c b/fs/proc/root.c |
3958 | index e0a790da..0e0e83c4 100644 |
3959 | --- a/fs/proc/root.c |
3960 | +++ b/fs/proc/root.c |
3961 | @@ -110,7 +110,8 @@ static struct dentry *proc_mount(struct file_system_type *fs_type, |
3962 | ns = task_active_pid_ns(current); |
3963 | options = data; |
3964 | |
3965 | - if (!current_user_ns()->may_mount_proc) |
3966 | + if (!current_user_ns()->may_mount_proc || |
3967 | + !ns_capable(ns->user_ns, CAP_SYS_ADMIN)) |
3968 | return ERR_PTR(-EPERM); |
3969 | } |
3970 | |
3971 | diff --git a/include/linux/compat.h b/include/linux/compat.h |
3972 | index 7f0c1dd0..ec1aee4a 100644 |
3973 | --- a/include/linux/compat.h |
3974 | +++ b/include/linux/compat.h |
3975 | @@ -669,6 +669,13 @@ asmlinkage long compat_sys_sigaltstack(const compat_stack_t __user *uss_ptr, |
3976 | |
3977 | int compat_restore_altstack(const compat_stack_t __user *uss); |
3978 | int __compat_save_altstack(compat_stack_t __user *, unsigned long); |
3979 | +#define compat_save_altstack_ex(uss, sp) do { \ |
3980 | + compat_stack_t __user *__uss = uss; \ |
3981 | + struct task_struct *t = current; \ |
3982 | + put_user_ex(ptr_to_compat((void __user *)t->sas_ss_sp), &__uss->ss_sp); \ |
3983 | + put_user_ex(sas_ss_flags(sp), &__uss->ss_flags); \ |
3984 | + put_user_ex(t->sas_ss_size, &__uss->ss_size); \ |
3985 | +} while (0); |
3986 | |
3987 | asmlinkage long compat_sys_sched_rr_get_interval(compat_pid_t pid, |
3988 | struct compat_timespec __user *interval); |
3989 | diff --git a/include/linux/hid.h b/include/linux/hid.h |
3990 | index 0c48991b..ff545cc3 100644 |
3991 | --- a/include/linux/hid.h |
3992 | +++ b/include/linux/hid.h |
3993 | @@ -393,10 +393,12 @@ struct hid_report { |
3994 | struct hid_device *device; /* associated device */ |
3995 | }; |
3996 | |
3997 | +#define HID_MAX_IDS 256 |
3998 | + |
3999 | struct hid_report_enum { |
4000 | unsigned numbered; |
4001 | struct list_head report_list; |
4002 | - struct hid_report *report_id_hash[256]; |
4003 | + struct hid_report *report_id_hash[HID_MAX_IDS]; |
4004 | }; |
4005 | |
4006 | #define HID_REPORT_TYPES 3 |
4007 | diff --git a/include/linux/pci_ids.h b/include/linux/pci_ids.h |
4008 | index 3bed2e89..d1fe5d00 100644 |
4009 | --- a/include/linux/pci_ids.h |
4010 | +++ b/include/linux/pci_ids.h |
4011 | @@ -518,6 +518,8 @@ |
4012 | #define PCI_DEVICE_ID_AMD_11H_NB_MISC 0x1303 |
4013 | #define PCI_DEVICE_ID_AMD_11H_NB_LINK 0x1304 |
4014 | #define PCI_DEVICE_ID_AMD_15H_M10H_F3 0x1403 |
4015 | +#define PCI_DEVICE_ID_AMD_15H_M30H_NB_F3 0x141d |
4016 | +#define PCI_DEVICE_ID_AMD_15H_M30H_NB_F4 0x141e |
4017 | #define PCI_DEVICE_ID_AMD_15H_NB_F0 0x1600 |
4018 | #define PCI_DEVICE_ID_AMD_15H_NB_F1 0x1601 |
4019 | #define PCI_DEVICE_ID_AMD_15H_NB_F2 0x1602 |
4020 | diff --git a/include/linux/rculist.h b/include/linux/rculist.h |
4021 | index f4b1001a..4106721c 100644 |
4022 | --- a/include/linux/rculist.h |
4023 | +++ b/include/linux/rculist.h |
4024 | @@ -267,8 +267,9 @@ static inline void list_splice_init_rcu(struct list_head *list, |
4025 | */ |
4026 | #define list_first_or_null_rcu(ptr, type, member) \ |
4027 | ({struct list_head *__ptr = (ptr); \ |
4028 | - struct list_head __rcu *__next = list_next_rcu(__ptr); \ |
4029 | - likely(__ptr != __next) ? container_of(__next, type, member) : NULL; \ |
4030 | + struct list_head *__next = ACCESS_ONCE(__ptr->next); \ |
4031 | + likely(__ptr != __next) ? \ |
4032 | + list_entry_rcu(__next, type, member) : NULL; \ |
4033 | }) |
4034 | |
4035 | /** |
4036 | diff --git a/include/linux/signal.h b/include/linux/signal.h |
4037 | index d8974847..2ac423bd 100644 |
4038 | --- a/include/linux/signal.h |
4039 | +++ b/include/linux/signal.h |
4040 | @@ -434,6 +434,14 @@ void signals_init(void); |
4041 | int restore_altstack(const stack_t __user *); |
4042 | int __save_altstack(stack_t __user *, unsigned long); |
4043 | |
4044 | +#define save_altstack_ex(uss, sp) do { \ |
4045 | + stack_t __user *__uss = uss; \ |
4046 | + struct task_struct *t = current; \ |
4047 | + put_user_ex((void __user *)t->sas_ss_sp, &__uss->ss_sp); \ |
4048 | + put_user_ex(sas_ss_flags(sp), &__uss->ss_flags); \ |
4049 | + put_user_ex(t->sas_ss_size, &__uss->ss_size); \ |
4050 | +} while (0); |
4051 | + |
4052 | #ifdef CONFIG_PROC_FS |
4053 | struct seq_file; |
4054 | extern void render_sigset_t(struct seq_file *, const char *, sigset_t *); |
4055 | diff --git a/include/linux/usb/hcd.h b/include/linux/usb/hcd.h |
4056 | index 1e88377e..3e541e63 100644 |
4057 | --- a/include/linux/usb/hcd.h |
4058 | +++ b/include/linux/usb/hcd.h |
4059 | @@ -411,7 +411,7 @@ extern int usb_hcd_pci_probe(struct pci_dev *dev, |
4060 | extern void usb_hcd_pci_remove(struct pci_dev *dev); |
4061 | extern void usb_hcd_pci_shutdown(struct pci_dev *dev); |
4062 | |
4063 | -#ifdef CONFIG_PM_SLEEP |
4064 | +#ifdef CONFIG_PM |
4065 | extern const struct dev_pm_ops usb_hcd_pci_pm_ops; |
4066 | #endif |
4067 | #endif /* CONFIG_PCI */ |
4068 | diff --git a/ipc/msg.c b/ipc/msg.c |
4069 | index 9f29d9e8..b65fdf1a 100644 |
4070 | --- a/ipc/msg.c |
4071 | +++ b/ipc/msg.c |
4072 | @@ -680,16 +680,18 @@ long do_msgsnd(int msqid, long mtype, void __user *mtext, |
4073 | goto out_unlock1; |
4074 | } |
4075 | |
4076 | + ipc_lock_object(&msq->q_perm); |
4077 | + |
4078 | for (;;) { |
4079 | struct msg_sender s; |
4080 | |
4081 | err = -EACCES; |
4082 | if (ipcperms(ns, &msq->q_perm, S_IWUGO)) |
4083 | - goto out_unlock1; |
4084 | + goto out_unlock0; |
4085 | |
4086 | err = security_msg_queue_msgsnd(msq, msg, msgflg); |
4087 | if (err) |
4088 | - goto out_unlock1; |
4089 | + goto out_unlock0; |
4090 | |
4091 | if (msgsz + msq->q_cbytes <= msq->q_qbytes && |
4092 | 1 + msq->q_qnum <= msq->q_qbytes) { |
4093 | @@ -699,10 +701,9 @@ long do_msgsnd(int msqid, long mtype, void __user *mtext, |
4094 | /* queue full, wait: */ |
4095 | if (msgflg & IPC_NOWAIT) { |
4096 | err = -EAGAIN; |
4097 | - goto out_unlock1; |
4098 | + goto out_unlock0; |
4099 | } |
4100 | |
4101 | - ipc_lock_object(&msq->q_perm); |
4102 | ss_add(msq, &s); |
4103 | |
4104 | if (!ipc_rcu_getref(msq)) { |
4105 | @@ -730,10 +731,7 @@ long do_msgsnd(int msqid, long mtype, void __user *mtext, |
4106 | goto out_unlock0; |
4107 | } |
4108 | |
4109 | - ipc_unlock_object(&msq->q_perm); |
4110 | } |
4111 | - |
4112 | - ipc_lock_object(&msq->q_perm); |
4113 | msq->q_lspid = task_tgid_vnr(current); |
4114 | msq->q_stime = get_seconds(); |
4115 | |
4116 | diff --git a/kernel/events/uprobes.c b/kernel/events/uprobes.c |
4117 | index f3569747..ad8e1bdc 100644 |
4118 | --- a/kernel/events/uprobes.c |
4119 | +++ b/kernel/events/uprobes.c |
4120 | @@ -1682,12 +1682,10 @@ static bool handle_trampoline(struct pt_regs *regs) |
4121 | tmp = ri; |
4122 | ri = ri->next; |
4123 | kfree(tmp); |
4124 | + utask->depth--; |
4125 | |
4126 | if (!chained) |
4127 | break; |
4128 | - |
4129 | - utask->depth--; |
4130 | - |
4131 | BUG_ON(!ri); |
4132 | } |
4133 | |
4134 | diff --git a/kernel/fork.c b/kernel/fork.c |
4135 | index bf46287c..200a7a29 100644 |
4136 | --- a/kernel/fork.c |
4137 | +++ b/kernel/fork.c |
4138 | @@ -1173,10 +1173,11 @@ static struct task_struct *copy_process(unsigned long clone_flags, |
4139 | return ERR_PTR(-EINVAL); |
4140 | |
4141 | /* |
4142 | - * If the new process will be in a different pid namespace |
4143 | - * don't allow the creation of threads. |
4144 | + * If the new process will be in a different pid namespace don't |
4145 | + * allow it to share a thread group or signal handlers with the |
4146 | + * forking task. |
4147 | */ |
4148 | - if ((clone_flags & (CLONE_VM|CLONE_NEWPID)) && |
4149 | + if ((clone_flags & (CLONE_SIGHAND | CLONE_NEWPID)) && |
4150 | (task_active_pid_ns(current) != |
4151 | current->nsproxy->pid_ns_for_children)) |
4152 | return ERR_PTR(-EINVAL); |
4153 | diff --git a/kernel/pid.c b/kernel/pid.c |
4154 | index 66505c1d..ebe5e80b 100644 |
4155 | --- a/kernel/pid.c |
4156 | +++ b/kernel/pid.c |
4157 | @@ -265,6 +265,7 @@ void free_pid(struct pid *pid) |
4158 | struct pid_namespace *ns = upid->ns; |
4159 | hlist_del_rcu(&upid->pid_chain); |
4160 | switch(--ns->nr_hashed) { |
4161 | + case 2: |
4162 | case 1: |
4163 | /* When all that is left in the pid namespace |
4164 | * is the reaper wake up the reaper. The reaper |
4165 | diff --git a/mm/huge_memory.c b/mm/huge_memory.c |
4166 | index a92012a7..f2820fbf 100644 |
4167 | --- a/mm/huge_memory.c |
4168 | +++ b/mm/huge_memory.c |
4169 | @@ -2296,6 +2296,8 @@ static void collapse_huge_page(struct mm_struct *mm, |
4170 | goto out; |
4171 | |
4172 | vma = find_vma(mm, address); |
4173 | + if (!vma) |
4174 | + goto out; |
4175 | hstart = (vma->vm_start + ~HPAGE_PMD_MASK) & HPAGE_PMD_MASK; |
4176 | hend = vma->vm_end & HPAGE_PMD_MASK; |
4177 | if (address < hstart || address + HPAGE_PMD_SIZE > hend) |
4178 | diff --git a/mm/memcontrol.c b/mm/memcontrol.c |
4179 | index 0878ff7c..aa44621e 100644 |
4180 | --- a/mm/memcontrol.c |
4181 | +++ b/mm/memcontrol.c |
4182 | @@ -5616,7 +5616,13 @@ static int compare_thresholds(const void *a, const void *b) |
4183 | const struct mem_cgroup_threshold *_a = a; |
4184 | const struct mem_cgroup_threshold *_b = b; |
4185 | |
4186 | - return _a->threshold - _b->threshold; |
4187 | + if (_a->threshold > _b->threshold) |
4188 | + return 1; |
4189 | + |
4190 | + if (_a->threshold < _b->threshold) |
4191 | + return -1; |
4192 | + |
4193 | + return 0; |
4194 | } |
4195 | |
4196 | static int mem_cgroup_oom_notify_cb(struct mem_cgroup *memcg) |
4197 | diff --git a/net/ceph/osd_client.c b/net/ceph/osd_client.c |
4198 | index dd47889a..dbc0a739 100644 |
4199 | --- a/net/ceph/osd_client.c |
4200 | +++ b/net/ceph/osd_client.c |
4201 | @@ -2129,6 +2129,8 @@ int ceph_osdc_start_request(struct ceph_osd_client *osdc, |
4202 | dout("osdc_start_request failed map, " |
4203 | " will retry %lld\n", req->r_tid); |
4204 | rc = 0; |
4205 | + } else { |
4206 | + __unregister_request(osdc, req); |
4207 | } |
4208 | goto out_unlock; |
4209 | } |
4210 | diff --git a/net/ceph/osdmap.c b/net/ceph/osdmap.c |
4211 | index 603ddd92..dbd9a479 100644 |
4212 | --- a/net/ceph/osdmap.c |
4213 | +++ b/net/ceph/osdmap.c |
4214 | @@ -1129,7 +1129,7 @@ static int *calc_pg_raw(struct ceph_osdmap *osdmap, struct ceph_pg pgid, |
4215 | |
4216 | /* pg_temp? */ |
4217 | pgid.seed = ceph_stable_mod(pgid.seed, pool->pg_num, |
4218 | - pool->pgp_num_mask); |
4219 | + pool->pg_num_mask); |
4220 | pg = __lookup_pg_mapping(&osdmap->pg_temp, pgid); |
4221 | if (pg) { |
4222 | *num = pg->len; |
4223 | diff --git a/net/mac80211/mlme.c b/net/mac80211/mlme.c |
4224 | index cc9e02d7..7a98d524 100644 |
4225 | --- a/net/mac80211/mlme.c |
4226 | +++ b/net/mac80211/mlme.c |
4227 | @@ -2851,14 +2851,6 @@ static void ieee80211_rx_bss_info(struct ieee80211_sub_if_data *sdata, |
4228 | ieee80211_rx_bss_put(local, bss); |
4229 | sdata->vif.bss_conf.beacon_rate = bss->beacon_rate; |
4230 | } |
4231 | - |
4232 | - if (!sdata->u.mgd.associated || |
4233 | - !ether_addr_equal(mgmt->bssid, sdata->u.mgd.associated->bssid)) |
4234 | - return; |
4235 | - |
4236 | - ieee80211_sta_process_chanswitch(sdata, rx_status->mactime, |
4237 | - elems, true); |
4238 | - |
4239 | } |
4240 | |
4241 | |
4242 | @@ -3147,6 +3139,9 @@ static void ieee80211_rx_mgmt_beacon(struct ieee80211_sub_if_data *sdata, |
4243 | |
4244 | ieee80211_rx_bss_info(sdata, mgmt, len, rx_status, &elems); |
4245 | |
4246 | + ieee80211_sta_process_chanswitch(sdata, rx_status->mactime, |
4247 | + &elems, true); |
4248 | + |
4249 | if (ieee80211_sta_wmm_params(local, sdata, elems.wmm_param, |
4250 | elems.wmm_param_len)) |
4251 | changed |= BSS_CHANGED_QOS; |
4252 | diff --git a/sound/pci/hda/hda_intel.c b/sound/pci/hda/hda_intel.c |
4253 | index 8860dd52..9552da23 100644 |
4254 | --- a/sound/pci/hda/hda_intel.c |
4255 | +++ b/sound/pci/hda/hda_intel.c |
4256 | @@ -3376,6 +3376,7 @@ static struct snd_pci_quirk msi_black_list[] = { |
4257 | SND_PCI_QUIRK(0x1043, 0x81f2, "ASUS", 0), /* Athlon64 X2 + nvidia */ |
4258 | SND_PCI_QUIRK(0x1043, 0x81f6, "ASUS", 0), /* nvidia */ |
4259 | SND_PCI_QUIRK(0x1043, 0x822d, "ASUS", 0), /* Athlon64 X2 + nvidia MCP55 */ |
4260 | + SND_PCI_QUIRK(0x1179, 0xfb44, "Toshiba Satellite C870", 0), /* AMD Hudson */ |
4261 | SND_PCI_QUIRK(0x1849, 0x0888, "ASRock", 0), /* Athlon64 X2 + nvidia */ |
4262 | SND_PCI_QUIRK(0xa0a0, 0x0575, "Aopen MZ915-M", 0), /* ICH6 */ |
4263 | {} |
4264 | diff --git a/sound/pci/hda/patch_hdmi.c b/sound/pci/hda/patch_hdmi.c |
4265 | index 9f358627..45850f67 100644 |
4266 | --- a/sound/pci/hda/patch_hdmi.c |
4267 | +++ b/sound/pci/hda/patch_hdmi.c |
4268 | @@ -67,6 +67,8 @@ struct hdmi_spec_per_pin { |
4269 | struct delayed_work work; |
4270 | struct snd_kcontrol *eld_ctl; |
4271 | int repoll_count; |
4272 | + bool setup; /* the stream has been set up by prepare callback */ |
4273 | + int channels; /* current number of channels */ |
4274 | bool non_pcm; |
4275 | bool chmap_set; /* channel-map override by ALSA API? */ |
4276 | unsigned char chmap[8]; /* ALSA API channel-map */ |
4277 | @@ -551,6 +553,17 @@ static int hdmi_channel_allocation(struct hdmi_eld *eld, int channels) |
4278 | } |
4279 | } |
4280 | |
4281 | + if (!ca) { |
4282 | + /* if there was no match, select the regular ALSA channel |
4283 | + * allocation with the matching number of channels */ |
4284 | + for (i = 0; i < ARRAY_SIZE(channel_allocations); i++) { |
4285 | + if (channels == channel_allocations[i].channels) { |
4286 | + ca = channel_allocations[i].ca_index; |
4287 | + break; |
4288 | + } |
4289 | + } |
4290 | + } |
4291 | + |
4292 | snd_print_channel_allocation(eld->info.spk_alloc, buf, sizeof(buf)); |
4293 | snd_printdd("HDMI: select CA 0x%x for %d-channel allocation: %s\n", |
4294 | ca, channels, buf); |
4295 | @@ -868,18 +881,19 @@ static bool hdmi_infoframe_uptodate(struct hda_codec *codec, hda_nid_t pin_nid, |
4296 | return true; |
4297 | } |
4298 | |
4299 | -static void hdmi_setup_audio_infoframe(struct hda_codec *codec, int pin_idx, |
4300 | - bool non_pcm, |
4301 | - struct snd_pcm_substream *substream) |
4302 | +static void hdmi_setup_audio_infoframe(struct hda_codec *codec, |
4303 | + struct hdmi_spec_per_pin *per_pin, |
4304 | + bool non_pcm) |
4305 | { |
4306 | - struct hdmi_spec *spec = codec->spec; |
4307 | - struct hdmi_spec_per_pin *per_pin = get_pin(spec, pin_idx); |
4308 | hda_nid_t pin_nid = per_pin->pin_nid; |
4309 | - int channels = substream->runtime->channels; |
4310 | + int channels = per_pin->channels; |
4311 | struct hdmi_eld *eld; |
4312 | int ca; |
4313 | union audio_infoframe ai; |
4314 | |
4315 | + if (!channels) |
4316 | + return; |
4317 | + |
4318 | eld = &per_pin->sink_eld; |
4319 | if (!eld->monitor_present) |
4320 | return; |
4321 | @@ -1329,6 +1343,7 @@ static void hdmi_present_sense(struct hdmi_spec_per_pin *per_pin, int repoll) |
4322 | eld_changed = true; |
4323 | } |
4324 | if (update_eld) { |
4325 | + bool old_eld_valid = pin_eld->eld_valid; |
4326 | pin_eld->eld_valid = eld->eld_valid; |
4327 | eld_changed = pin_eld->eld_size != eld->eld_size || |
4328 | memcmp(pin_eld->eld_buffer, eld->eld_buffer, |
4329 | @@ -1338,6 +1353,18 @@ static void hdmi_present_sense(struct hdmi_spec_per_pin *per_pin, int repoll) |
4330 | eld->eld_size); |
4331 | pin_eld->eld_size = eld->eld_size; |
4332 | pin_eld->info = eld->info; |
4333 | + |
4334 | + /* Haswell-specific workaround: re-setup when the transcoder is |
4335 | + * changed during the stream playback |
4336 | + */ |
4337 | + if (codec->vendor_id == 0x80862807 && |
4338 | + eld->eld_valid && !old_eld_valid && per_pin->setup) { |
4339 | + snd_hda_codec_write(codec, pin_nid, 0, |
4340 | + AC_VERB_SET_AMP_GAIN_MUTE, |
4341 | + AMP_OUT_UNMUTE); |
4342 | + hdmi_setup_audio_infoframe(codec, per_pin, |
4343 | + per_pin->non_pcm); |
4344 | + } |
4345 | } |
4346 | mutex_unlock(&pin_eld->lock); |
4347 | |
4348 | @@ -1510,14 +1537,17 @@ static int generic_hdmi_playback_pcm_prepare(struct hda_pcm_stream *hinfo, |
4349 | hda_nid_t cvt_nid = hinfo->nid; |
4350 | struct hdmi_spec *spec = codec->spec; |
4351 | int pin_idx = hinfo_to_pin_index(spec, hinfo); |
4352 | - hda_nid_t pin_nid = get_pin(spec, pin_idx)->pin_nid; |
4353 | + struct hdmi_spec_per_pin *per_pin = get_pin(spec, pin_idx); |
4354 | + hda_nid_t pin_nid = per_pin->pin_nid; |
4355 | bool non_pcm; |
4356 | |
4357 | non_pcm = check_non_pcm_per_cvt(codec, cvt_nid); |
4358 | + per_pin->channels = substream->runtime->channels; |
4359 | + per_pin->setup = true; |
4360 | |
4361 | hdmi_set_channel_count(codec, cvt_nid, substream->runtime->channels); |
4362 | |
4363 | - hdmi_setup_audio_infoframe(codec, pin_idx, non_pcm, substream); |
4364 | + hdmi_setup_audio_infoframe(codec, per_pin, non_pcm); |
4365 | |
4366 | return hdmi_setup_stream(codec, cvt_nid, pin_nid, stream_tag, format); |
4367 | } |
4368 | @@ -1557,6 +1587,9 @@ static int hdmi_pcm_close(struct hda_pcm_stream *hinfo, |
4369 | snd_hda_spdif_ctls_unassign(codec, pin_idx); |
4370 | per_pin->chmap_set = false; |
4371 | memset(per_pin->chmap, 0, sizeof(per_pin->chmap)); |
4372 | + |
4373 | + per_pin->setup = false; |
4374 | + per_pin->channels = 0; |
4375 | } |
4376 | |
4377 | return 0; |
4378 | @@ -1692,8 +1725,7 @@ static int hdmi_chmap_ctl_put(struct snd_kcontrol *kcontrol, |
4379 | per_pin->chmap_set = true; |
4380 | memcpy(per_pin->chmap, chmap, sizeof(chmap)); |
4381 | if (prepared) |
4382 | - hdmi_setup_audio_infoframe(codec, pin_idx, per_pin->non_pcm, |
4383 | - substream); |
4384 | + hdmi_setup_audio_infoframe(codec, per_pin, per_pin->non_pcm); |
4385 | |
4386 | return 0; |
4387 | } |
4388 | diff --git a/sound/soc/codecs/mc13783.c b/sound/soc/codecs/mc13783.c |
4389 | index 5402dfbb..8a8d9364 100644 |
4390 | --- a/sound/soc/codecs/mc13783.c |
4391 | +++ b/sound/soc/codecs/mc13783.c |
4392 | @@ -126,6 +126,10 @@ static int mc13783_write(struct snd_soc_codec *codec, |
4393 | |
4394 | ret = mc13xxx_reg_write(priv->mc13xxx, reg, value); |
4395 | |
4396 | + /* include errata fix for spi audio problems */ |
4397 | + if (reg == MC13783_AUDIO_CODEC || reg == MC13783_AUDIO_DAC) |
4398 | + ret = mc13xxx_reg_write(priv->mc13xxx, reg, value); |
4399 | + |
4400 | mc13xxx_unlock(priv->mc13xxx); |
4401 | |
4402 | return ret; |
4403 | diff --git a/sound/soc/codecs/wm8960.c b/sound/soc/codecs/wm8960.c |
4404 | index 0a4ffdd1..5e5af898 100644 |
4405 | --- a/sound/soc/codecs/wm8960.c |
4406 | +++ b/sound/soc/codecs/wm8960.c |
4407 | @@ -857,9 +857,9 @@ static int wm8960_set_dai_pll(struct snd_soc_dai *codec_dai, int pll_id, |
4408 | if (pll_div.k) { |
4409 | reg |= 0x20; |
4410 | |
4411 | - snd_soc_write(codec, WM8960_PLL2, (pll_div.k >> 18) & 0x3f); |
4412 | - snd_soc_write(codec, WM8960_PLL3, (pll_div.k >> 9) & 0x1ff); |
4413 | - snd_soc_write(codec, WM8960_PLL4, pll_div.k & 0x1ff); |
4414 | + snd_soc_write(codec, WM8960_PLL2, (pll_div.k >> 16) & 0xff); |
4415 | + snd_soc_write(codec, WM8960_PLL3, (pll_div.k >> 8) & 0xff); |
4416 | + snd_soc_write(codec, WM8960_PLL4, pll_div.k & 0xff); |
4417 | } |
4418 | snd_soc_write(codec, WM8960_PLL1, reg); |
4419 |