Contents of /trunk/kernel-magellan/patches-3.18/0106-3.18.7-all-fixes.patch
Parent Directory | Revision Log
Revision 2547 -
(show annotations)
(download)
Fri Feb 20 13:17:12 2015 UTC (9 years, 7 months ago) by niro
File size: 44258 byte(s)
Fri Feb 20 13:17:12 2015 UTC (9 years, 7 months ago) by niro
File size: 44258 byte(s)
-linux-3.18.7
1 | diff --git a/Makefile b/Makefile |
2 | index d2bff2d5ae25..0efae2279fbe 100644 |
3 | --- a/Makefile |
4 | +++ b/Makefile |
5 | @@ -1,6 +1,6 @@ |
6 | VERSION = 3 |
7 | PATCHLEVEL = 18 |
8 | -SUBLEVEL = 6 |
9 | +SUBLEVEL = 7 |
10 | EXTRAVERSION = |
11 | NAME = Diseased Newt |
12 | |
13 | diff --git a/arch/arm/boot/dts/exynos4.dtsi b/arch/arm/boot/dts/exynos4.dtsi |
14 | index e0278ecbc816..98960b7bc518 100644 |
15 | --- a/arch/arm/boot/dts/exynos4.dtsi |
16 | +++ b/arch/arm/boot/dts/exynos4.dtsi |
17 | @@ -368,7 +368,7 @@ |
18 | }; |
19 | |
20 | i2s1: i2s@13960000 { |
21 | - compatible = "samsung,s5pv210-i2s"; |
22 | + compatible = "samsung,s3c6410-i2s"; |
23 | reg = <0x13960000 0x100>; |
24 | clocks = <&clock CLK_I2S1>; |
25 | clock-names = "iis"; |
26 | @@ -378,7 +378,7 @@ |
27 | }; |
28 | |
29 | i2s2: i2s@13970000 { |
30 | - compatible = "samsung,s5pv210-i2s"; |
31 | + compatible = "samsung,s3c6410-i2s"; |
32 | reg = <0x13970000 0x100>; |
33 | clocks = <&clock CLK_I2S2>; |
34 | clock-names = "iis"; |
35 | diff --git a/arch/arm/mm/context.c b/arch/arm/mm/context.c |
36 | index 6eb97b3a7481..4370933f16cd 100644 |
37 | --- a/arch/arm/mm/context.c |
38 | +++ b/arch/arm/mm/context.c |
39 | @@ -144,21 +144,17 @@ static void flush_context(unsigned int cpu) |
40 | /* Update the list of reserved ASIDs and the ASID bitmap. */ |
41 | bitmap_clear(asid_map, 0, NUM_USER_ASIDS); |
42 | for_each_possible_cpu(i) { |
43 | - if (i == cpu) { |
44 | - asid = 0; |
45 | - } else { |
46 | - asid = atomic64_xchg(&per_cpu(active_asids, i), 0); |
47 | - /* |
48 | - * If this CPU has already been through a |
49 | - * rollover, but hasn't run another task in |
50 | - * the meantime, we must preserve its reserved |
51 | - * ASID, as this is the only trace we have of |
52 | - * the process it is still running. |
53 | - */ |
54 | - if (asid == 0) |
55 | - asid = per_cpu(reserved_asids, i); |
56 | - __set_bit(asid & ~ASID_MASK, asid_map); |
57 | - } |
58 | + asid = atomic64_xchg(&per_cpu(active_asids, i), 0); |
59 | + /* |
60 | + * If this CPU has already been through a |
61 | + * rollover, but hasn't run another task in |
62 | + * the meantime, we must preserve its reserved |
63 | + * ASID, as this is the only trace we have of |
64 | + * the process it is still running. |
65 | + */ |
66 | + if (asid == 0) |
67 | + asid = per_cpu(reserved_asids, i); |
68 | + __set_bit(asid & ~ASID_MASK, asid_map); |
69 | per_cpu(reserved_asids, i) = asid; |
70 | } |
71 | |
72 | diff --git a/arch/arm64/kernel/setup.c b/arch/arm64/kernel/setup.c |
73 | index 64c4f0800ee3..38eead12f35b 100644 |
74 | --- a/arch/arm64/kernel/setup.c |
75 | +++ b/arch/arm64/kernel/setup.c |
76 | @@ -43,6 +43,7 @@ |
77 | #include <linux/of_fdt.h> |
78 | #include <linux/of_platform.h> |
79 | #include <linux/efi.h> |
80 | +#include <linux/personality.h> |
81 | |
82 | #include <asm/fixmap.h> |
83 | #include <asm/cpu.h> |
84 | @@ -79,7 +80,6 @@ unsigned int compat_elf_hwcap2 __read_mostly; |
85 | #endif |
86 | |
87 | static const char *cpu_name; |
88 | -static const char *machine_name; |
89 | phys_addr_t __fdt_pointer __initdata; |
90 | |
91 | /* |
92 | @@ -311,8 +311,6 @@ static void __init setup_machine_fdt(phys_addr_t dt_phys) |
93 | while (true) |
94 | cpu_relax(); |
95 | } |
96 | - |
97 | - machine_name = of_flat_dt_get_machine_name(); |
98 | } |
99 | |
100 | /* |
101 | @@ -449,14 +447,50 @@ static const char *hwcap_str[] = { |
102 | NULL |
103 | }; |
104 | |
105 | +#ifdef CONFIG_COMPAT |
106 | +static const char *compat_hwcap_str[] = { |
107 | + "swp", |
108 | + "half", |
109 | + "thumb", |
110 | + "26bit", |
111 | + "fastmult", |
112 | + "fpa", |
113 | + "vfp", |
114 | + "edsp", |
115 | + "java", |
116 | + "iwmmxt", |
117 | + "crunch", |
118 | + "thumbee", |
119 | + "neon", |
120 | + "vfpv3", |
121 | + "vfpv3d16", |
122 | + "tls", |
123 | + "vfpv4", |
124 | + "idiva", |
125 | + "idivt", |
126 | + "vfpd32", |
127 | + "lpae", |
128 | + "evtstrm" |
129 | +}; |
130 | + |
131 | +static const char *compat_hwcap2_str[] = { |
132 | + "aes", |
133 | + "pmull", |
134 | + "sha1", |
135 | + "sha2", |
136 | + "crc32", |
137 | + NULL |
138 | +}; |
139 | +#endif /* CONFIG_COMPAT */ |
140 | + |
141 | static int c_show(struct seq_file *m, void *v) |
142 | { |
143 | - int i; |
144 | - |
145 | - seq_printf(m, "Processor\t: %s rev %d (%s)\n", |
146 | - cpu_name, read_cpuid_id() & 15, ELF_PLATFORM); |
147 | + int i, j; |
148 | |
149 | for_each_online_cpu(i) { |
150 | + struct cpuinfo_arm64 *cpuinfo = &per_cpu(cpu_data, i); |
151 | + u32 midr = cpuinfo->reg_midr; |
152 | + |
153 | /* |
154 | * glibc reads /proc/cpuinfo to determine the number of |
155 | * online processors, looking for lines beginning with |
156 | @@ -465,24 +499,38 @@ static int c_show(struct seq_file *m, void *v) |
157 | #ifdef CONFIG_SMP |
158 | seq_printf(m, "processor\t: %d\n", i); |
159 | #endif |
160 | - } |
161 | - |
162 | - /* dump out the processor features */ |
163 | - seq_puts(m, "Features\t: "); |
164 | - |
165 | - for (i = 0; hwcap_str[i]; i++) |
166 | - if (elf_hwcap & (1 << i)) |
167 | - seq_printf(m, "%s ", hwcap_str[i]); |
168 | - |
169 | - seq_printf(m, "\nCPU implementer\t: 0x%02x\n", read_cpuid_id() >> 24); |
170 | - seq_printf(m, "CPU architecture: AArch64\n"); |
171 | - seq_printf(m, "CPU variant\t: 0x%x\n", (read_cpuid_id() >> 20) & 15); |
172 | - seq_printf(m, "CPU part\t: 0x%03x\n", (read_cpuid_id() >> 4) & 0xfff); |
173 | - seq_printf(m, "CPU revision\t: %d\n", read_cpuid_id() & 15); |
174 | |
175 | - seq_puts(m, "\n"); |
176 | - |
177 | - seq_printf(m, "Hardware\t: %s\n", machine_name); |
178 | + /* |
179 | + * Dump out the common processor features in a single line. |
180 | + * Userspace should read the hwcaps with getauxval(AT_HWCAP) |
181 | + * rather than attempting to parse this, but there's a body of |
182 | + * software which does already (at least for 32-bit). |
183 | + */ |
184 | + seq_puts(m, "Features\t:"); |
185 | + if (personality(current->personality) == PER_LINUX32) { |
186 | +#ifdef CONFIG_COMPAT |
187 | + for (j = 0; compat_hwcap_str[j]; j++) |
188 | + if (compat_elf_hwcap & (1 << j)) |
189 | + seq_printf(m, " %s", compat_hwcap_str[j]); |
190 | + |
191 | + for (j = 0; compat_hwcap2_str[j]; j++) |
192 | + if (compat_elf_hwcap2 & (1 << j)) |
193 | + seq_printf(m, " %s", compat_hwcap2_str[j]); |
194 | +#endif /* CONFIG_COMPAT */ |
195 | + } else { |
196 | + for (j = 0; hwcap_str[j]; j++) |
197 | + if (elf_hwcap & (1 << j)) |
198 | + seq_printf(m, " %s", hwcap_str[j]); |
199 | + } |
200 | + seq_puts(m, "\n"); |
201 | + |
202 | + seq_printf(m, "CPU implementer\t: 0x%02x\n", |
203 | + MIDR_IMPLEMENTOR(midr)); |
204 | + seq_printf(m, "CPU architecture: 8\n"); |
205 | + seq_printf(m, "CPU variant\t: 0x%x\n", MIDR_VARIANT(midr)); |
206 | + seq_printf(m, "CPU part\t: 0x%03x\n", MIDR_PARTNUM(midr)); |
207 | + seq_printf(m, "CPU revision\t: %d\n\n", MIDR_REVISION(midr)); |
208 | + } |
209 | |
210 | return 0; |
211 | } |
212 | diff --git a/arch/mips/cavium-octeon/smp.c b/arch/mips/cavium-octeon/smp.c |
213 | index ecd903dd1c45..8b1eeffa12ed 100644 |
214 | --- a/arch/mips/cavium-octeon/smp.c |
215 | +++ b/arch/mips/cavium-octeon/smp.c |
216 | @@ -240,9 +240,7 @@ static int octeon_cpu_disable(void) |
217 | |
218 | set_cpu_online(cpu, false); |
219 | cpu_clear(cpu, cpu_callin_map); |
220 | - local_irq_disable(); |
221 | octeon_fixup_irqs(); |
222 | - local_irq_enable(); |
223 | |
224 | flush_cache_all(); |
225 | local_flush_tlb_all(); |
226 | diff --git a/arch/mips/include/asm/mipsregs.h b/arch/mips/include/asm/mipsregs.h |
227 | index 22a135ac91de..f38ca68285ea 100644 |
228 | --- a/arch/mips/include/asm/mipsregs.h |
229 | +++ b/arch/mips/include/asm/mipsregs.h |
230 | @@ -1343,12 +1343,27 @@ do { \ |
231 | __res; \ |
232 | }) |
233 | |
234 | +#define _write_32bit_cp1_register(dest, val, gas_hardfloat) \ |
235 | +do { \ |
236 | + __asm__ __volatile__( \ |
237 | + " .set push \n" \ |
238 | + " .set reorder \n" \ |
239 | + " "STR(gas_hardfloat)" \n" \ |
240 | + " ctc1 %0,"STR(dest)" \n" \ |
241 | + " .set pop \n" \ |
242 | + : : "r" (val)); \ |
243 | +} while (0) |
244 | + |
245 | #ifdef GAS_HAS_SET_HARDFLOAT |
246 | #define read_32bit_cp1_register(source) \ |
247 | _read_32bit_cp1_register(source, .set hardfloat) |
248 | +#define write_32bit_cp1_register(dest, val) \ |
249 | + _write_32bit_cp1_register(dest, val, .set hardfloat) |
250 | #else |
251 | #define read_32bit_cp1_register(source) \ |
252 | _read_32bit_cp1_register(source, ) |
253 | +#define write_32bit_cp1_register(dest, val) \ |
254 | + _write_32bit_cp1_register(dest, val, ) |
255 | #endif |
256 | |
257 | #ifdef HAVE_AS_DSP |
258 | diff --git a/arch/mips/kernel/irq_cpu.c b/arch/mips/kernel/irq_cpu.c |
259 | index e498f2b3646a..f5598e25e906 100644 |
260 | --- a/arch/mips/kernel/irq_cpu.c |
261 | +++ b/arch/mips/kernel/irq_cpu.c |
262 | @@ -56,6 +56,8 @@ static struct irq_chip mips_cpu_irq_controller = { |
263 | .irq_mask_ack = mask_mips_irq, |
264 | .irq_unmask = unmask_mips_irq, |
265 | .irq_eoi = unmask_mips_irq, |
266 | + .irq_disable = mask_mips_irq, |
267 | + .irq_enable = unmask_mips_irq, |
268 | }; |
269 | |
270 | /* |
271 | @@ -92,6 +94,8 @@ static struct irq_chip mips_mt_cpu_irq_controller = { |
272 | .irq_mask_ack = mips_mt_cpu_irq_ack, |
273 | .irq_unmask = unmask_mips_irq, |
274 | .irq_eoi = unmask_mips_irq, |
275 | + .irq_disable = mask_mips_irq, |
276 | + .irq_enable = unmask_mips_irq, |
277 | }; |
278 | |
279 | void __init mips_cpu_irq_init(void) |
280 | diff --git a/arch/mips/kernel/smp.c b/arch/mips/kernel/smp.c |
281 | index c94c4e92e17d..1c0d8c50b7e1 100644 |
282 | --- a/arch/mips/kernel/smp.c |
283 | +++ b/arch/mips/kernel/smp.c |
284 | @@ -123,10 +123,10 @@ asmlinkage void start_secondary(void) |
285 | unsigned int cpu; |
286 | |
287 | cpu_probe(); |
288 | - cpu_report(); |
289 | per_cpu_trap_init(false); |
290 | mips_clockevent_init(); |
291 | mp_ops->init_secondary(); |
292 | + cpu_report(); |
293 | |
294 | /* |
295 | * XXX parity protection should be folded in here when it's converted |
296 | diff --git a/arch/mips/kernel/traps.c b/arch/mips/kernel/traps.c |
297 | index 22b19c275044..d255a2a1837a 100644 |
298 | --- a/arch/mips/kernel/traps.c |
299 | +++ b/arch/mips/kernel/traps.c |
300 | @@ -1184,7 +1184,8 @@ static int enable_restore_fp_context(int msa) |
301 | |
302 | /* Restore the scalar FP control & status register */ |
303 | if (!was_fpu_owner) |
304 | - asm volatile("ctc1 %0, $31" : : "r"(current->thread.fpu.fcr31)); |
305 | + write_32bit_cp1_register(CP1_STATUS, |
306 | + current->thread.fpu.fcr31); |
307 | } |
308 | |
309 | out: |
310 | diff --git a/arch/mips/mm/tlb-r4k.c b/arch/mips/mm/tlb-r4k.c |
311 | index c3917e251f59..11688e50e3ee 100644 |
312 | --- a/arch/mips/mm/tlb-r4k.c |
313 | +++ b/arch/mips/mm/tlb-r4k.c |
314 | @@ -489,6 +489,8 @@ static void r4k_tlb_configure(void) |
315 | #ifdef CONFIG_64BIT |
316 | pg |= PG_ELPA; |
317 | #endif |
318 | + if (cpu_has_rixiex) |
319 | + pg |= PG_IEC; |
320 | write_c0_pagegrain(pg); |
321 | } |
322 | |
323 | diff --git a/arch/x86/kernel/cpu/microcode/core.c b/arch/x86/kernel/cpu/microcode/core.c |
324 | index 15c29096136b..36a83617eb21 100644 |
325 | --- a/arch/x86/kernel/cpu/microcode/core.c |
326 | +++ b/arch/x86/kernel/cpu/microcode/core.c |
327 | @@ -552,7 +552,7 @@ static int __init microcode_init(void) |
328 | int error; |
329 | |
330 | if (paravirt_enabled() || dis_ucode_ldr) |
331 | - return 0; |
332 | + return -EINVAL; |
333 | |
334 | if (c->x86_vendor == X86_VENDOR_INTEL) |
335 | microcode_ops = init_intel_microcode(); |
336 | diff --git a/arch/x86/mm/fault.c b/arch/x86/mm/fault.c |
337 | index a8612aafeca1..4d8ee827cb14 100644 |
338 | --- a/arch/x86/mm/fault.c |
339 | +++ b/arch/x86/mm/fault.c |
340 | @@ -844,11 +844,8 @@ do_sigbus(struct pt_regs *regs, unsigned long error_code, unsigned long address, |
341 | unsigned int fault) |
342 | { |
343 | struct task_struct *tsk = current; |
344 | - struct mm_struct *mm = tsk->mm; |
345 | int code = BUS_ADRERR; |
346 | |
347 | - up_read(&mm->mmap_sem); |
348 | - |
349 | /* Kernel mode? Handle exceptions or die: */ |
350 | if (!(error_code & PF_USER)) { |
351 | no_context(regs, error_code, address, SIGBUS, BUS_ADRERR); |
352 | @@ -879,7 +876,6 @@ mm_fault_error(struct pt_regs *regs, unsigned long error_code, |
353 | unsigned long address, unsigned int fault) |
354 | { |
355 | if (fatal_signal_pending(current) && !(error_code & PF_USER)) { |
356 | - up_read(¤t->mm->mmap_sem); |
357 | no_context(regs, error_code, address, 0, 0); |
358 | return; |
359 | } |
360 | @@ -887,14 +883,11 @@ mm_fault_error(struct pt_regs *regs, unsigned long error_code, |
361 | if (fault & VM_FAULT_OOM) { |
362 | /* Kernel mode? Handle exceptions or die: */ |
363 | if (!(error_code & PF_USER)) { |
364 | - up_read(¤t->mm->mmap_sem); |
365 | no_context(regs, error_code, address, |
366 | SIGSEGV, SEGV_MAPERR); |
367 | return; |
368 | } |
369 | |
370 | - up_read(¤t->mm->mmap_sem); |
371 | - |
372 | /* |
373 | * We ran out of memory, call the OOM killer, and return the |
374 | * userspace (which will retry the fault, or kill us if we got |
375 | @@ -1249,6 +1242,7 @@ good_area: |
376 | return; |
377 | |
378 | if (unlikely(fault & VM_FAULT_ERROR)) { |
379 | + up_read(&mm->mmap_sem); |
380 | mm_fault_error(regs, error_code, address, fault); |
381 | return; |
382 | } |
383 | diff --git a/arch/x86/pci/common.c b/arch/x86/pci/common.c |
384 | index 7b20bccf3648..2fb384724ebb 100644 |
385 | --- a/arch/x86/pci/common.c |
386 | +++ b/arch/x86/pci/common.c |
387 | @@ -448,6 +448,22 @@ static const struct dmi_system_id pciprobe_dmi_table[] __initconst = { |
388 | DMI_MATCH(DMI_PRODUCT_NAME, "ftServer"), |
389 | }, |
390 | }, |
391 | + { |
392 | + .callback = set_scan_all, |
393 | + .ident = "Stratus/NEC ftServer", |
394 | + .matches = { |
395 | + DMI_MATCH(DMI_SYS_VENDOR, "NEC"), |
396 | + DMI_MATCH(DMI_PRODUCT_NAME, "Express5800/R32"), |
397 | + }, |
398 | + }, |
399 | + { |
400 | + .callback = set_scan_all, |
401 | + .ident = "Stratus/NEC ftServer", |
402 | + .matches = { |
403 | + DMI_MATCH(DMI_SYS_VENDOR, "NEC"), |
404 | + DMI_MATCH(DMI_PRODUCT_NAME, "Express5800/R31"), |
405 | + }, |
406 | + }, |
407 | {} |
408 | }; |
409 | |
410 | diff --git a/drivers/gpio/gpio-mcp23s08.c b/drivers/gpio/gpio-mcp23s08.c |
411 | index 8488e2fd307c..36bc42942e89 100644 |
412 | --- a/drivers/gpio/gpio-mcp23s08.c |
413 | +++ b/drivers/gpio/gpio-mcp23s08.c |
414 | @@ -785,9 +785,11 @@ static int mcp230xx_probe(struct i2c_client *client, |
415 | client->irq = irq_of_parse_and_map(client->dev.of_node, 0); |
416 | } else { |
417 | pdata = dev_get_platdata(&client->dev); |
418 | - if (!pdata || !gpio_is_valid(pdata->base)) { |
419 | - dev_dbg(&client->dev, "invalid platform data\n"); |
420 | - return -EINVAL; |
421 | + if (!pdata) { |
422 | + pdata = devm_kzalloc(&client->dev, |
423 | + sizeof(struct mcp23s08_platform_data), |
424 | + GFP_KERNEL); |
425 | + pdata->base = -1; |
426 | } |
427 | } |
428 | |
429 | @@ -908,10 +910,11 @@ static int mcp23s08_probe(struct spi_device *spi) |
430 | } else { |
431 | type = spi_get_device_id(spi)->driver_data; |
432 | pdata = dev_get_platdata(&spi->dev); |
433 | - if (!pdata || !gpio_is_valid(pdata->base)) { |
434 | - dev_dbg(&spi->dev, |
435 | - "invalid or missing platform data\n"); |
436 | - return -EINVAL; |
437 | + if (!pdata) { |
438 | + pdata = devm_kzalloc(&spi->dev, |
439 | + sizeof(struct mcp23s08_platform_data), |
440 | + GFP_KERNEL); |
441 | + pdata->base = -1; |
442 | } |
443 | |
444 | for (addr = 0; addr < ARRAY_SIZE(pdata->chip); addr++) { |
445 | diff --git a/drivers/gpio/gpiolib-sysfs.c b/drivers/gpio/gpiolib-sysfs.c |
446 | index 0d21396f961d..aed7dd6e9dca 100644 |
447 | --- a/drivers/gpio/gpiolib-sysfs.c |
448 | +++ b/drivers/gpio/gpiolib-sysfs.c |
449 | @@ -630,6 +630,7 @@ int gpiod_export_link(struct device *dev, const char *name, |
450 | if (tdev != NULL) { |
451 | status = sysfs_create_link(&dev->kobj, &tdev->kobj, |
452 | name); |
453 | + put_device(tdev); |
454 | } else { |
455 | status = -ENODEV; |
456 | } |
457 | @@ -677,7 +678,7 @@ int gpiod_sysfs_set_active_low(struct gpio_desc *desc, int value) |
458 | } |
459 | |
460 | status = sysfs_set_active_low(desc, dev, value); |
461 | - |
462 | + put_device(dev); |
463 | unlock: |
464 | mutex_unlock(&sysfs_lock); |
465 | |
466 | diff --git a/drivers/gpu/drm/radeon/radeon_benchmark.c b/drivers/gpu/drm/radeon/radeon_benchmark.c |
467 | index 9e7f23dd14bd..87d5fb21cb61 100644 |
468 | --- a/drivers/gpu/drm/radeon/radeon_benchmark.c |
469 | +++ b/drivers/gpu/drm/radeon/radeon_benchmark.c |
470 | @@ -34,7 +34,8 @@ |
471 | |
472 | static int radeon_benchmark_do_move(struct radeon_device *rdev, unsigned size, |
473 | uint64_t saddr, uint64_t daddr, |
474 | - int flag, int n) |
475 | + int flag, int n, |
476 | + struct reservation_object *resv) |
477 | { |
478 | unsigned long start_jiffies; |
479 | unsigned long end_jiffies; |
480 | @@ -47,12 +48,12 @@ static int radeon_benchmark_do_move(struct radeon_device *rdev, unsigned size, |
481 | case RADEON_BENCHMARK_COPY_DMA: |
482 | fence = radeon_copy_dma(rdev, saddr, daddr, |
483 | size / RADEON_GPU_PAGE_SIZE, |
484 | - NULL); |
485 | + resv); |
486 | break; |
487 | case RADEON_BENCHMARK_COPY_BLIT: |
488 | fence = radeon_copy_blit(rdev, saddr, daddr, |
489 | size / RADEON_GPU_PAGE_SIZE, |
490 | - NULL); |
491 | + resv); |
492 | break; |
493 | default: |
494 | DRM_ERROR("Unknown copy method\n"); |
495 | @@ -120,7 +121,8 @@ static void radeon_benchmark_move(struct radeon_device *rdev, unsigned size, |
496 | |
497 | if (rdev->asic->copy.dma) { |
498 | time = radeon_benchmark_do_move(rdev, size, saddr, daddr, |
499 | - RADEON_BENCHMARK_COPY_DMA, n); |
500 | + RADEON_BENCHMARK_COPY_DMA, n, |
501 | + dobj->tbo.resv); |
502 | if (time < 0) |
503 | goto out_cleanup; |
504 | if (time > 0) |
505 | @@ -130,7 +132,8 @@ static void radeon_benchmark_move(struct radeon_device *rdev, unsigned size, |
506 | |
507 | if (rdev->asic->copy.blit) { |
508 | time = radeon_benchmark_do_move(rdev, size, saddr, daddr, |
509 | - RADEON_BENCHMARK_COPY_BLIT, n); |
510 | + RADEON_BENCHMARK_COPY_BLIT, n, |
511 | + dobj->tbo.resv); |
512 | if (time < 0) |
513 | goto out_cleanup; |
514 | if (time > 0) |
515 | diff --git a/drivers/gpu/drm/radeon/radeon_display.c b/drivers/gpu/drm/radeon/radeon_display.c |
516 | index 00ead8c2758a..2e1e9aa79cea 100644 |
517 | --- a/drivers/gpu/drm/radeon/radeon_display.c |
518 | +++ b/drivers/gpu/drm/radeon/radeon_display.c |
519 | @@ -959,6 +959,9 @@ void radeon_compute_pll_avivo(struct radeon_pll *pll, |
520 | if (pll->flags & RADEON_PLL_USE_FRAC_FB_DIV && |
521 | pll->flags & RADEON_PLL_USE_REF_DIV) |
522 | ref_div_max = pll->reference_div; |
523 | + else if (pll->flags & RADEON_PLL_PREFER_MINM_OVER_MAXP) |
524 | + /* fix for problems on RS880 */ |
525 | + ref_div_max = min(pll->max_ref_div, 7u); |
526 | else |
527 | ref_div_max = pll->max_ref_div; |
528 | |
529 | diff --git a/drivers/gpu/drm/radeon/radeon_gem.c b/drivers/gpu/drm/radeon/radeon_gem.c |
530 | index c194497aa586..b4abff67c63f 100644 |
531 | --- a/drivers/gpu/drm/radeon/radeon_gem.c |
532 | +++ b/drivers/gpu/drm/radeon/radeon_gem.c |
533 | @@ -146,7 +146,8 @@ int radeon_gem_object_open(struct drm_gem_object *obj, struct drm_file *file_pri |
534 | struct radeon_bo_va *bo_va; |
535 | int r; |
536 | |
537 | - if (rdev->family < CHIP_CAYMAN) { |
538 | + if ((rdev->family < CHIP_CAYMAN) || |
539 | + (!rdev->accel_working)) { |
540 | return 0; |
541 | } |
542 | |
543 | @@ -176,7 +177,8 @@ void radeon_gem_object_close(struct drm_gem_object *obj, |
544 | struct radeon_bo_va *bo_va; |
545 | int r; |
546 | |
547 | - if (rdev->family < CHIP_CAYMAN) { |
548 | + if ((rdev->family < CHIP_CAYMAN) || |
549 | + (!rdev->accel_working)) { |
550 | return; |
551 | } |
552 | |
553 | diff --git a/drivers/gpu/drm/radeon/radeon_kms.c b/drivers/gpu/drm/radeon/radeon_kms.c |
554 | index 03586763ee86..8ec652722e4f 100644 |
555 | --- a/drivers/gpu/drm/radeon/radeon_kms.c |
556 | +++ b/drivers/gpu/drm/radeon/radeon_kms.c |
557 | @@ -598,14 +598,14 @@ int radeon_driver_open_kms(struct drm_device *dev, struct drm_file *file_priv) |
558 | return -ENOMEM; |
559 | } |
560 | |
561 | - vm = &fpriv->vm; |
562 | - r = radeon_vm_init(rdev, vm); |
563 | - if (r) { |
564 | - kfree(fpriv); |
565 | - return r; |
566 | - } |
567 | - |
568 | if (rdev->accel_working) { |
569 | + vm = &fpriv->vm; |
570 | + r = radeon_vm_init(rdev, vm); |
571 | + if (r) { |
572 | + kfree(fpriv); |
573 | + return r; |
574 | + } |
575 | + |
576 | r = radeon_bo_reserve(rdev->ring_tmp_bo.bo, false); |
577 | if (r) { |
578 | radeon_vm_fini(rdev, vm); |
579 | @@ -663,9 +663,9 @@ void radeon_driver_postclose_kms(struct drm_device *dev, |
580 | radeon_vm_bo_rmv(rdev, vm->ib_bo_va); |
581 | radeon_bo_unreserve(rdev->ring_tmp_bo.bo); |
582 | } |
583 | + radeon_vm_fini(rdev, vm); |
584 | } |
585 | |
586 | - radeon_vm_fini(rdev, vm); |
587 | kfree(fpriv); |
588 | file_priv->driver_priv = NULL; |
589 | } |
590 | diff --git a/drivers/gpu/drm/radeon/radeon_test.c b/drivers/gpu/drm/radeon/radeon_test.c |
591 | index 07b506b41008..791818165c76 100644 |
592 | --- a/drivers/gpu/drm/radeon/radeon_test.c |
593 | +++ b/drivers/gpu/drm/radeon/radeon_test.c |
594 | @@ -119,11 +119,11 @@ static void radeon_do_test_moves(struct radeon_device *rdev, int flag) |
595 | if (ring == R600_RING_TYPE_DMA_INDEX) |
596 | fence = radeon_copy_dma(rdev, gtt_addr, vram_addr, |
597 | size / RADEON_GPU_PAGE_SIZE, |
598 | - NULL); |
599 | + vram_obj->tbo.resv); |
600 | else |
601 | fence = radeon_copy_blit(rdev, gtt_addr, vram_addr, |
602 | size / RADEON_GPU_PAGE_SIZE, |
603 | - NULL); |
604 | + vram_obj->tbo.resv); |
605 | if (IS_ERR(fence)) { |
606 | DRM_ERROR("Failed GTT->VRAM copy %d\n", i); |
607 | r = PTR_ERR(fence); |
608 | @@ -170,11 +170,11 @@ static void radeon_do_test_moves(struct radeon_device *rdev, int flag) |
609 | if (ring == R600_RING_TYPE_DMA_INDEX) |
610 | fence = radeon_copy_dma(rdev, vram_addr, gtt_addr, |
611 | size / RADEON_GPU_PAGE_SIZE, |
612 | - NULL); |
613 | + vram_obj->tbo.resv); |
614 | else |
615 | fence = radeon_copy_blit(rdev, vram_addr, gtt_addr, |
616 | size / RADEON_GPU_PAGE_SIZE, |
617 | - NULL); |
618 | + vram_obj->tbo.resv); |
619 | if (IS_ERR(fence)) { |
620 | DRM_ERROR("Failed VRAM->GTT copy %d\n", i); |
621 | r = PTR_ERR(fence); |
622 | diff --git a/drivers/gpu/drm/radeon/radeon_vm.c b/drivers/gpu/drm/radeon/radeon_vm.c |
623 | index dfde266529e2..afbdf9e685d1 100644 |
624 | --- a/drivers/gpu/drm/radeon/radeon_vm.c |
625 | +++ b/drivers/gpu/drm/radeon/radeon_vm.c |
626 | @@ -753,9 +753,11 @@ static void radeon_vm_frag_ptes(struct radeon_device *rdev, |
627 | */ |
628 | |
629 | /* NI is optimized for 256KB fragments, SI and newer for 64KB */ |
630 | - uint64_t frag_flags = rdev->family == CHIP_CAYMAN ? |
631 | + uint64_t frag_flags = ((rdev->family == CHIP_CAYMAN) || |
632 | + (rdev->family == CHIP_ARUBA)) ? |
633 | R600_PTE_FRAG_256KB : R600_PTE_FRAG_64KB; |
634 | - uint64_t frag_align = rdev->family == CHIP_CAYMAN ? 0x200 : 0x80; |
635 | + uint64_t frag_align = ((rdev->family == CHIP_CAYMAN) || |
636 | + (rdev->family == CHIP_ARUBA)) ? 0x200 : 0x80; |
637 | |
638 | uint64_t frag_start = ALIGN(pe_start, frag_align); |
639 | uint64_t frag_end = pe_end & ~(frag_align - 1); |
640 | diff --git a/drivers/md/raid5.c b/drivers/md/raid5.c |
641 | index c1b0d52bfcb0..b98765f6f77f 100644 |
642 | --- a/drivers/md/raid5.c |
643 | +++ b/drivers/md/raid5.c |
644 | @@ -3195,6 +3195,11 @@ static void handle_stripe_dirtying(struct r5conf *conf, |
645 | (unsigned long long)sh->sector, |
646 | rcw, qread, test_bit(STRIPE_DELAYED, &sh->state)); |
647 | } |
648 | + |
649 | + if (rcw > disks && rmw > disks && |
650 | + !test_bit(STRIPE_PREREAD_ACTIVE, &sh->state)) |
651 | + set_bit(STRIPE_DELAYED, &sh->state); |
652 | + |
653 | /* now if nothing is locked, and if we have enough data, |
654 | * we can start a write request |
655 | */ |
656 | diff --git a/drivers/pci/host/pcie-designware.c b/drivers/pci/host/pcie-designware.c |
657 | index dfed00aa3ac0..f0fcbceee209 100644 |
658 | --- a/drivers/pci/host/pcie-designware.c |
659 | +++ b/drivers/pci/host/pcie-designware.c |
660 | @@ -283,6 +283,9 @@ static int dw_msi_setup_irq(struct msi_chip *chip, struct pci_dev *pdev, |
661 | struct msi_msg msg; |
662 | struct pcie_port *pp = sys_to_pcie(pdev->bus->sysdata); |
663 | |
664 | + if (desc->msi_attrib.is_msix) |
665 | + return -EINVAL; |
666 | + |
667 | irq = assign_irq(1, desc, &pos); |
668 | if (irq < 0) |
669 | return irq; |
670 | diff --git a/drivers/pci/quirks.c b/drivers/pci/quirks.c |
671 | index b72e2cdfd59a..04ea682ab2aa 100644 |
672 | --- a/drivers/pci/quirks.c |
673 | +++ b/drivers/pci/quirks.c |
674 | @@ -324,18 +324,52 @@ static void quirk_s3_64M(struct pci_dev *dev) |
675 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_S3, PCI_DEVICE_ID_S3_868, quirk_s3_64M); |
676 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_S3, PCI_DEVICE_ID_S3_968, quirk_s3_64M); |
677 | |
678 | +static void quirk_io(struct pci_dev *dev, int pos, unsigned size, |
679 | + const char *name) |
680 | +{ |
681 | + u32 region; |
682 | + struct pci_bus_region bus_region; |
683 | + struct resource *res = dev->resource + pos; |
684 | + |
685 | + pci_read_config_dword(dev, PCI_BASE_ADDRESS_0 + (pos << 2), ®ion); |
686 | + |
687 | + if (!region) |
688 | + return; |
689 | + |
690 | + res->name = pci_name(dev); |
691 | + res->flags = region & ~PCI_BASE_ADDRESS_IO_MASK; |
692 | + res->flags |= |
693 | + (IORESOURCE_IO | IORESOURCE_PCI_FIXED | IORESOURCE_SIZEALIGN); |
694 | + region &= ~(size - 1); |
695 | + |
696 | + /* Convert from PCI bus to resource space */ |
697 | + bus_region.start = region; |
698 | + bus_region.end = region + size - 1; |
699 | + pcibios_bus_to_resource(dev->bus, res, &bus_region); |
700 | + |
701 | + dev_info(&dev->dev, FW_BUG "%s quirk: reg 0x%x: %pR\n", |
702 | + name, PCI_BASE_ADDRESS_0 + (pos << 2), res); |
703 | +} |
704 | + |
705 | /* |
706 | * Some CS5536 BIOSes (for example, the Soekris NET5501 board w/ comBIOS |
707 | * ver. 1.33 20070103) don't set the correct ISA PCI region header info. |
708 | * BAR0 should be 8 bytes; instead, it may be set to something like 8k |
709 | * (which conflicts w/ BAR1's memory range). |
710 | + * |
711 | + * CS553x's ISA PCI BARs may also be read-only (ref: |
712 | + * https://bugzilla.kernel.org/show_bug.cgi?id=85991 - Comment #4 forward). |
713 | */ |
714 | static void quirk_cs5536_vsa(struct pci_dev *dev) |
715 | { |
716 | + static char *name = "CS5536 ISA bridge"; |
717 | + |
718 | if (pci_resource_len(dev, 0) != 8) { |
719 | - struct resource *res = &dev->resource[0]; |
720 | - res->end = res->start + 8 - 1; |
721 | - dev_info(&dev->dev, "CS5536 ISA bridge bug detected (incorrect header); workaround applied\n"); |
722 | + quirk_io(dev, 0, 8, name); /* SMB */ |
723 | + quirk_io(dev, 1, 256, name); /* GPIO */ |
724 | + quirk_io(dev, 2, 64, name); /* MFGPT */ |
725 | + dev_info(&dev->dev, "%s bug detected (incorrect header); workaround applied\n", |
726 | + name); |
727 | } |
728 | } |
729 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_CS5536_ISA, quirk_cs5536_vsa); |
730 | diff --git a/drivers/scsi/sd.c b/drivers/scsi/sd.c |
731 | index cfba74cd8e8b..dd8c8d690763 100644 |
732 | --- a/drivers/scsi/sd.c |
733 | +++ b/drivers/scsi/sd.c |
734 | @@ -2818,9 +2818,11 @@ static int sd_revalidate_disk(struct gendisk *disk) |
735 | */ |
736 | sd_set_flush_flag(sdkp); |
737 | |
738 | - max_xfer = min_not_zero(queue_max_hw_sectors(sdkp->disk->queue), |
739 | - sdkp->max_xfer_blocks); |
740 | + max_xfer = sdkp->max_xfer_blocks; |
741 | max_xfer <<= ilog2(sdp->sector_size) - 9; |
742 | + |
743 | + max_xfer = min_not_zero(queue_max_hw_sectors(sdkp->disk->queue), |
744 | + max_xfer); |
745 | blk_queue_max_hw_sectors(sdkp->disk->queue, max_xfer); |
746 | set_capacity(disk, sdkp->capacity); |
747 | sd_config_write_same(sdkp); |
748 | diff --git a/drivers/spi/spi-fsl-dspi.c b/drivers/spi/spi-fsl-dspi.c |
749 | index 831ceb4a91f6..276a3cf864d7 100644 |
750 | --- a/drivers/spi/spi-fsl-dspi.c |
751 | +++ b/drivers/spi/spi-fsl-dspi.c |
752 | @@ -342,8 +342,7 @@ static int dspi_setup_transfer(struct spi_device *spi, struct spi_transfer *t) |
753 | /* Only alloc on first setup */ |
754 | chip = spi_get_ctldata(spi); |
755 | if (chip == NULL) { |
756 | - chip = devm_kzalloc(&spi->dev, sizeof(struct chip_data), |
757 | - GFP_KERNEL); |
758 | + chip = kzalloc(sizeof(struct chip_data), GFP_KERNEL); |
759 | if (!chip) |
760 | return -ENOMEM; |
761 | } |
762 | @@ -382,6 +381,16 @@ static int dspi_setup(struct spi_device *spi) |
763 | return dspi_setup_transfer(spi, NULL); |
764 | } |
765 | |
766 | +static void dspi_cleanup(struct spi_device *spi) |
767 | +{ |
768 | + struct chip_data *chip = spi_get_ctldata((struct spi_device *)spi); |
769 | + |
770 | + dev_dbg(&spi->dev, "spi_device %u.%u cleanup\n", |
771 | + spi->master->bus_num, spi->chip_select); |
772 | + |
773 | + kfree(chip); |
774 | +} |
775 | + |
776 | static irqreturn_t dspi_interrupt(int irq, void *dev_id) |
777 | { |
778 | struct fsl_dspi *dspi = (struct fsl_dspi *)dev_id; |
779 | @@ -467,6 +476,7 @@ static int dspi_probe(struct platform_device *pdev) |
780 | dspi->bitbang.master->setup = dspi_setup; |
781 | dspi->bitbang.master->dev.of_node = pdev->dev.of_node; |
782 | |
783 | + master->cleanup = dspi_cleanup; |
784 | master->mode_bits = SPI_CPOL | SPI_CPHA; |
785 | master->bits_per_word_mask = SPI_BPW_MASK(4) | SPI_BPW_MASK(8) | |
786 | SPI_BPW_MASK(16); |
787 | diff --git a/drivers/spi/spi-imx.c b/drivers/spi/spi-imx.c |
788 | index 3637847b5370..82269a86fd7a 100644 |
789 | --- a/drivers/spi/spi-imx.c |
790 | +++ b/drivers/spi/spi-imx.c |
791 | @@ -823,6 +823,10 @@ static int spi_imx_sdma_init(struct device *dev, struct spi_imx_data *spi_imx, |
792 | struct dma_slave_config slave_config = {}; |
793 | int ret; |
794 | |
795 | + /* use pio mode for i.mx6dl chip TKT238285 */ |
796 | + if (of_machine_is_compatible("fsl,imx6dl")) |
797 | + return 0; |
798 | + |
799 | /* Prepare for TX DMA: */ |
800 | master->dma_tx = dma_request_slave_channel(dev, "tx"); |
801 | if (!master->dma_tx) { |
802 | diff --git a/fs/cifs/file.c b/fs/cifs/file.c |
803 | index 3e4d00a06c44..9a7b6947874a 100644 |
804 | --- a/fs/cifs/file.c |
805 | +++ b/fs/cifs/file.c |
806 | @@ -366,6 +366,7 @@ void cifsFileInfo_put(struct cifsFileInfo *cifs_file) |
807 | struct cifsLockInfo *li, *tmp; |
808 | struct cifs_fid fid; |
809 | struct cifs_pending_open open; |
810 | + bool oplock_break_cancelled; |
811 | |
812 | spin_lock(&cifs_file_list_lock); |
813 | if (--cifs_file->count > 0) { |
814 | @@ -397,7 +398,7 @@ void cifsFileInfo_put(struct cifsFileInfo *cifs_file) |
815 | } |
816 | spin_unlock(&cifs_file_list_lock); |
817 | |
818 | - cancel_work_sync(&cifs_file->oplock_break); |
819 | + oplock_break_cancelled = cancel_work_sync(&cifs_file->oplock_break); |
820 | |
821 | if (!tcon->need_reconnect && !cifs_file->invalidHandle) { |
822 | struct TCP_Server_Info *server = tcon->ses->server; |
823 | @@ -409,6 +410,9 @@ void cifsFileInfo_put(struct cifsFileInfo *cifs_file) |
824 | _free_xid(xid); |
825 | } |
826 | |
827 | + if (oplock_break_cancelled) |
828 | + cifs_done_oplock_break(cifsi); |
829 | + |
830 | cifs_del_pending_open(&open); |
831 | |
832 | /* |
833 | diff --git a/fs/nilfs2/nilfs.h b/fs/nilfs2/nilfs.h |
834 | index 91093cd74f0d..385704027575 100644 |
835 | --- a/fs/nilfs2/nilfs.h |
836 | +++ b/fs/nilfs2/nilfs.h |
837 | @@ -141,7 +141,6 @@ enum { |
838 | * @ti_save: Backup of journal_info field of task_struct |
839 | * @ti_flags: Flags |
840 | * @ti_count: Nest level |
841 | - * @ti_garbage: List of inode to be put when releasing semaphore |
842 | */ |
843 | struct nilfs_transaction_info { |
844 | u32 ti_magic; |
845 | @@ -150,7 +149,6 @@ struct nilfs_transaction_info { |
846 | one of other filesystems has a bug. */ |
847 | unsigned short ti_flags; |
848 | unsigned short ti_count; |
849 | - struct list_head ti_garbage; |
850 | }; |
851 | |
852 | /* ti_magic */ |
853 | diff --git a/fs/nilfs2/segment.c b/fs/nilfs2/segment.c |
854 | index 7ef18fc656c2..469086b9f99b 100644 |
855 | --- a/fs/nilfs2/segment.c |
856 | +++ b/fs/nilfs2/segment.c |
857 | @@ -305,7 +305,6 @@ static void nilfs_transaction_lock(struct super_block *sb, |
858 | ti->ti_count = 0; |
859 | ti->ti_save = cur_ti; |
860 | ti->ti_magic = NILFS_TI_MAGIC; |
861 | - INIT_LIST_HEAD(&ti->ti_garbage); |
862 | current->journal_info = ti; |
863 | |
864 | for (;;) { |
865 | @@ -332,8 +331,6 @@ static void nilfs_transaction_unlock(struct super_block *sb) |
866 | |
867 | up_write(&nilfs->ns_segctor_sem); |
868 | current->journal_info = ti->ti_save; |
869 | - if (!list_empty(&ti->ti_garbage)) |
870 | - nilfs_dispose_list(nilfs, &ti->ti_garbage, 0); |
871 | } |
872 | |
873 | static void *nilfs_segctor_map_segsum_entry(struct nilfs_sc_info *sci, |
874 | @@ -746,6 +743,15 @@ static void nilfs_dispose_list(struct the_nilfs *nilfs, |
875 | } |
876 | } |
877 | |
878 | +static void nilfs_iput_work_func(struct work_struct *work) |
879 | +{ |
880 | + struct nilfs_sc_info *sci = container_of(work, struct nilfs_sc_info, |
881 | + sc_iput_work); |
882 | + struct the_nilfs *nilfs = sci->sc_super->s_fs_info; |
883 | + |
884 | + nilfs_dispose_list(nilfs, &sci->sc_iput_queue, 0); |
885 | +} |
886 | + |
887 | static int nilfs_test_metadata_dirty(struct the_nilfs *nilfs, |
888 | struct nilfs_root *root) |
889 | { |
890 | @@ -1900,8 +1906,8 @@ static int nilfs_segctor_collect_dirty_files(struct nilfs_sc_info *sci, |
891 | static void nilfs_segctor_drop_written_files(struct nilfs_sc_info *sci, |
892 | struct the_nilfs *nilfs) |
893 | { |
894 | - struct nilfs_transaction_info *ti = current->journal_info; |
895 | struct nilfs_inode_info *ii, *n; |
896 | + int defer_iput = false; |
897 | |
898 | spin_lock(&nilfs->ns_inode_lock); |
899 | list_for_each_entry_safe(ii, n, &sci->sc_dirty_files, i_dirty) { |
900 | @@ -1912,9 +1918,24 @@ static void nilfs_segctor_drop_written_files(struct nilfs_sc_info *sci, |
901 | clear_bit(NILFS_I_BUSY, &ii->i_state); |
902 | brelse(ii->i_bh); |
903 | ii->i_bh = NULL; |
904 | - list_move_tail(&ii->i_dirty, &ti->ti_garbage); |
905 | + list_del_init(&ii->i_dirty); |
906 | + if (!ii->vfs_inode.i_nlink) { |
907 | + /* |
908 | + * Defer calling iput() to avoid a deadlock |
909 | + * over I_SYNC flag for inodes with i_nlink == 0 |
910 | + */ |
911 | + list_add_tail(&ii->i_dirty, &sci->sc_iput_queue); |
912 | + defer_iput = true; |
913 | + } else { |
914 | + spin_unlock(&nilfs->ns_inode_lock); |
915 | + iput(&ii->vfs_inode); |
916 | + spin_lock(&nilfs->ns_inode_lock); |
917 | + } |
918 | } |
919 | spin_unlock(&nilfs->ns_inode_lock); |
920 | + |
921 | + if (defer_iput) |
922 | + schedule_work(&sci->sc_iput_work); |
923 | } |
924 | |
925 | /* |
926 | @@ -2583,6 +2604,8 @@ static struct nilfs_sc_info *nilfs_segctor_new(struct super_block *sb, |
927 | INIT_LIST_HEAD(&sci->sc_segbufs); |
928 | INIT_LIST_HEAD(&sci->sc_write_logs); |
929 | INIT_LIST_HEAD(&sci->sc_gc_inodes); |
930 | + INIT_LIST_HEAD(&sci->sc_iput_queue); |
931 | + INIT_WORK(&sci->sc_iput_work, nilfs_iput_work_func); |
932 | init_timer(&sci->sc_timer); |
933 | |
934 | sci->sc_interval = HZ * NILFS_SC_DEFAULT_TIMEOUT; |
935 | @@ -2609,6 +2632,8 @@ static void nilfs_segctor_write_out(struct nilfs_sc_info *sci) |
936 | ret = nilfs_segctor_construct(sci, SC_LSEG_SR); |
937 | nilfs_transaction_unlock(sci->sc_super); |
938 | |
939 | + flush_work(&sci->sc_iput_work); |
940 | + |
941 | } while (ret && retrycount-- > 0); |
942 | } |
943 | |
944 | @@ -2633,6 +2658,9 @@ static void nilfs_segctor_destroy(struct nilfs_sc_info *sci) |
945 | || sci->sc_seq_request != sci->sc_seq_done); |
946 | spin_unlock(&sci->sc_state_lock); |
947 | |
948 | + if (flush_work(&sci->sc_iput_work)) |
949 | + flag = true; |
950 | + |
951 | if (flag || !nilfs_segctor_confirm(sci)) |
952 | nilfs_segctor_write_out(sci); |
953 | |
954 | @@ -2642,6 +2670,12 @@ static void nilfs_segctor_destroy(struct nilfs_sc_info *sci) |
955 | nilfs_dispose_list(nilfs, &sci->sc_dirty_files, 1); |
956 | } |
957 | |
958 | + if (!list_empty(&sci->sc_iput_queue)) { |
959 | + nilfs_warning(sci->sc_super, __func__, |
960 | + "iput queue is not empty\n"); |
961 | + nilfs_dispose_list(nilfs, &sci->sc_iput_queue, 1); |
962 | + } |
963 | + |
964 | WARN_ON(!list_empty(&sci->sc_segbufs)); |
965 | WARN_ON(!list_empty(&sci->sc_write_logs)); |
966 | |
967 | diff --git a/fs/nilfs2/segment.h b/fs/nilfs2/segment.h |
968 | index 38a1d0013314..a48d6de1e02c 100644 |
969 | --- a/fs/nilfs2/segment.h |
970 | +++ b/fs/nilfs2/segment.h |
971 | @@ -26,6 +26,7 @@ |
972 | #include <linux/types.h> |
973 | #include <linux/fs.h> |
974 | #include <linux/buffer_head.h> |
975 | +#include <linux/workqueue.h> |
976 | #include <linux/nilfs2_fs.h> |
977 | #include "nilfs.h" |
978 | |
979 | @@ -92,6 +93,8 @@ struct nilfs_segsum_pointer { |
980 | * @sc_nblk_inc: Block count of current generation |
981 | * @sc_dirty_files: List of files to be written |
982 | * @sc_gc_inodes: List of GC inodes having blocks to be written |
983 | + * @sc_iput_queue: list of inodes for which iput should be done |
984 | + * @sc_iput_work: work struct to defer iput call |
985 | * @sc_freesegs: array of segment numbers to be freed |
986 | * @sc_nfreesegs: number of segments on @sc_freesegs |
987 | * @sc_dsync_inode: inode whose data pages are written for a sync operation |
988 | @@ -135,6 +138,8 @@ struct nilfs_sc_info { |
989 | |
990 | struct list_head sc_dirty_files; |
991 | struct list_head sc_gc_inodes; |
992 | + struct list_head sc_iput_queue; |
993 | + struct work_struct sc_iput_work; |
994 | |
995 | __u64 *sc_freesegs; |
996 | size_t sc_nfreesegs; |
997 | diff --git a/include/linux/tracepoint.h b/include/linux/tracepoint.h |
998 | index e08e21e5f601..c72851328ca9 100644 |
999 | --- a/include/linux/tracepoint.h |
1000 | +++ b/include/linux/tracepoint.h |
1001 | @@ -173,7 +173,7 @@ extern void syscall_unregfunc(void); |
1002 | TP_PROTO(data_proto), \ |
1003 | TP_ARGS(data_args), \ |
1004 | TP_CONDITION(cond),,); \ |
1005 | - if (IS_ENABLED(CONFIG_LOCKDEP)) { \ |
1006 | + if (IS_ENABLED(CONFIG_LOCKDEP) && (cond)) { \ |
1007 | rcu_read_lock_sched_notrace(); \ |
1008 | rcu_dereference_sched(__tracepoint_##name.funcs);\ |
1009 | rcu_read_unlock_sched_notrace(); \ |
1010 | diff --git a/include/sound/ak4113.h b/include/sound/ak4113.h |
1011 | index 2609048c1d44..3a34f6edc2d1 100644 |
1012 | --- a/include/sound/ak4113.h |
1013 | +++ b/include/sound/ak4113.h |
1014 | @@ -286,7 +286,7 @@ struct ak4113 { |
1015 | ak4113_write_t *write; |
1016 | ak4113_read_t *read; |
1017 | void *private_data; |
1018 | - unsigned int init:1; |
1019 | + atomic_t wq_processing; |
1020 | spinlock_t lock; |
1021 | unsigned char regmap[AK4113_WRITABLE_REGS]; |
1022 | struct snd_kcontrol *kctls[AK4113_CONTROLS]; |
1023 | diff --git a/include/sound/ak4114.h b/include/sound/ak4114.h |
1024 | index 52f02a60dba7..069299a88915 100644 |
1025 | --- a/include/sound/ak4114.h |
1026 | +++ b/include/sound/ak4114.h |
1027 | @@ -168,7 +168,7 @@ struct ak4114 { |
1028 | ak4114_write_t * write; |
1029 | ak4114_read_t * read; |
1030 | void * private_data; |
1031 | - unsigned int init: 1; |
1032 | + atomic_t wq_processing; |
1033 | spinlock_t lock; |
1034 | unsigned char regmap[6]; |
1035 | unsigned char txcsb[5]; |
1036 | diff --git a/include/trace/events/tlb.h b/include/trace/events/tlb.h |
1037 | index 13391d288107..0e7635765153 100644 |
1038 | --- a/include/trace/events/tlb.h |
1039 | +++ b/include/trace/events/tlb.h |
1040 | @@ -13,11 +13,13 @@ |
1041 | { TLB_LOCAL_SHOOTDOWN, "local shootdown" }, \ |
1042 | { TLB_LOCAL_MM_SHOOTDOWN, "local mm shootdown" } |
1043 | |
1044 | -TRACE_EVENT(tlb_flush, |
1045 | +TRACE_EVENT_CONDITION(tlb_flush, |
1046 | |
1047 | TP_PROTO(int reason, unsigned long pages), |
1048 | TP_ARGS(reason, pages), |
1049 | |
1050 | + TP_CONDITION(cpu_online(smp_processor_id())), |
1051 | + |
1052 | TP_STRUCT__entry( |
1053 | __field( int, reason) |
1054 | __field(unsigned long, pages) |
1055 | diff --git a/kernel/smpboot.c b/kernel/smpboot.c |
1056 | index eb89e1807408..60d35ac5d3f1 100644 |
1057 | --- a/kernel/smpboot.c |
1058 | +++ b/kernel/smpboot.c |
1059 | @@ -279,6 +279,7 @@ int smpboot_register_percpu_thread(struct smp_hotplug_thread *plug_thread) |
1060 | unsigned int cpu; |
1061 | int ret = 0; |
1062 | |
1063 | + get_online_cpus(); |
1064 | mutex_lock(&smpboot_threads_lock); |
1065 | for_each_online_cpu(cpu) { |
1066 | ret = __smpboot_create_thread(plug_thread, cpu); |
1067 | @@ -291,6 +292,7 @@ int smpboot_register_percpu_thread(struct smp_hotplug_thread *plug_thread) |
1068 | list_add(&plug_thread->list, &hotplug_threads); |
1069 | out: |
1070 | mutex_unlock(&smpboot_threads_lock); |
1071 | + put_online_cpus(); |
1072 | return ret; |
1073 | } |
1074 | EXPORT_SYMBOL_GPL(smpboot_register_percpu_thread); |
1075 | diff --git a/kernel/time/hrtimer.c b/kernel/time/hrtimer.c |
1076 | index 37e50aadd471..d8c724cda37b 100644 |
1077 | --- a/kernel/time/hrtimer.c |
1078 | +++ b/kernel/time/hrtimer.c |
1079 | @@ -122,7 +122,7 @@ static void hrtimer_get_softirq_time(struct hrtimer_cpu_base *base) |
1080 | mono = ktime_get_update_offsets_tick(&off_real, &off_boot, &off_tai); |
1081 | boot = ktime_add(mono, off_boot); |
1082 | xtim = ktime_add(mono, off_real); |
1083 | - tai = ktime_add(xtim, off_tai); |
1084 | + tai = ktime_add(mono, off_tai); |
1085 | |
1086 | base->clock_base[HRTIMER_BASE_REALTIME].softirq_time = xtim; |
1087 | base->clock_base[HRTIMER_BASE_MONOTONIC].softirq_time = mono; |
1088 | diff --git a/lib/checksum.c b/lib/checksum.c |
1089 | index 129775eb6de6..8b39e86dbab5 100644 |
1090 | --- a/lib/checksum.c |
1091 | +++ b/lib/checksum.c |
1092 | @@ -181,6 +181,15 @@ csum_partial_copy(const void *src, void *dst, int len, __wsum sum) |
1093 | EXPORT_SYMBOL(csum_partial_copy); |
1094 | |
1095 | #ifndef csum_tcpudp_nofold |
1096 | +static inline u32 from64to32(u64 x) |
1097 | +{ |
1098 | + /* add up 32-bit and 32-bit for 32+c bit */ |
1099 | + x = (x & 0xffffffff) + (x >> 32); |
1100 | + /* add up carry.. */ |
1101 | + x = (x & 0xffffffff) + (x >> 32); |
1102 | + return (u32)x; |
1103 | +} |
1104 | + |
1105 | __wsum csum_tcpudp_nofold(__be32 saddr, __be32 daddr, |
1106 | unsigned short len, |
1107 | unsigned short proto, |
1108 | @@ -195,8 +204,7 @@ __wsum csum_tcpudp_nofold(__be32 saddr, __be32 daddr, |
1109 | #else |
1110 | s += (proto + len) << 8; |
1111 | #endif |
1112 | - s += (s >> 32); |
1113 | - return (__force __wsum)s; |
1114 | + return (__force __wsum)from64to32(s); |
1115 | } |
1116 | EXPORT_SYMBOL(csum_tcpudp_nofold); |
1117 | #endif |
1118 | diff --git a/mm/memcontrol.c b/mm/memcontrol.c |
1119 | index 4918b6eefae2..d72bdc3ca09b 100644 |
1120 | --- a/mm/memcontrol.c |
1121 | +++ b/mm/memcontrol.c |
1122 | @@ -6589,7 +6589,7 @@ void mem_cgroup_uncharge_list(struct list_head *page_list) |
1123 | * mem_cgroup_migrate - migrate a charge to another page |
1124 | * @oldpage: currently charged page |
1125 | * @newpage: page to transfer the charge to |
1126 | - * @lrucare: both pages might be on the LRU already |
1127 | + * @lrucare: either or both pages might be on the LRU already |
1128 | * |
1129 | * Migrate the charge from @oldpage to @newpage. |
1130 | * |
1131 | diff --git a/mm/pagewalk.c b/mm/pagewalk.c |
1132 | index ad83195521f2..b264bda46e1b 100644 |
1133 | --- a/mm/pagewalk.c |
1134 | +++ b/mm/pagewalk.c |
1135 | @@ -199,7 +199,10 @@ int walk_page_range(unsigned long addr, unsigned long end, |
1136 | */ |
1137 | if ((vma->vm_start <= addr) && |
1138 | (vma->vm_flags & VM_PFNMAP)) { |
1139 | - next = vma->vm_end; |
1140 | + if (walk->pte_hole) |
1141 | + err = walk->pte_hole(addr, next, walk); |
1142 | + if (err) |
1143 | + break; |
1144 | pgd = pgd_offset(walk->mm, next); |
1145 | continue; |
1146 | } |
1147 | diff --git a/mm/shmem.c b/mm/shmem.c |
1148 | index 185836ba53ef..0b4ba556703a 100644 |
1149 | --- a/mm/shmem.c |
1150 | +++ b/mm/shmem.c |
1151 | @@ -1013,7 +1013,7 @@ static int shmem_replace_page(struct page **pagep, gfp_t gfp, |
1152 | */ |
1153 | oldpage = newpage; |
1154 | } else { |
1155 | - mem_cgroup_migrate(oldpage, newpage, false); |
1156 | + mem_cgroup_migrate(oldpage, newpage, true); |
1157 | lru_cache_add_anon(newpage); |
1158 | *pagep = newpage; |
1159 | } |
1160 | diff --git a/scripts/kconfig/menu.c b/scripts/kconfig/menu.c |
1161 | index a26cc5d2a9b0..72c9dba84c5d 100644 |
1162 | --- a/scripts/kconfig/menu.c |
1163 | +++ b/scripts/kconfig/menu.c |
1164 | @@ -548,7 +548,7 @@ static void get_prompt_str(struct gstr *r, struct property *prop, |
1165 | { |
1166 | int i, j; |
1167 | struct menu *submenu[8], *menu, *location = NULL; |
1168 | - struct jump_key *jump; |
1169 | + struct jump_key *jump = NULL; |
1170 | |
1171 | str_printf(r, _("Prompt: %s\n"), _(prop->text)); |
1172 | menu = prop->menu->parent; |
1173 | @@ -586,7 +586,7 @@ static void get_prompt_str(struct gstr *r, struct property *prop, |
1174 | str_printf(r, _(" Location:\n")); |
1175 | for (j = 4; --i >= 0; j += 2) { |
1176 | menu = submenu[i]; |
1177 | - if (head && location && menu == location) |
1178 | + if (jump && menu == location) |
1179 | jump->offset = strlen(r->s); |
1180 | str_printf(r, "%*c-> %s", j, ' ', |
1181 | _(menu_get_prompt(menu))); |
1182 | diff --git a/sound/i2c/other/ak4113.c b/sound/i2c/other/ak4113.c |
1183 | index 1a3a6fa27158..c6bba99a90b2 100644 |
1184 | --- a/sound/i2c/other/ak4113.c |
1185 | +++ b/sound/i2c/other/ak4113.c |
1186 | @@ -56,8 +56,7 @@ static inline unsigned char reg_read(struct ak4113 *ak4113, unsigned char reg) |
1187 | |
1188 | static void snd_ak4113_free(struct ak4113 *chip) |
1189 | { |
1190 | - chip->init = 1; /* don't schedule new work */ |
1191 | - mb(); |
1192 | + atomic_inc(&chip->wq_processing); /* don't schedule new work */ |
1193 | cancel_delayed_work_sync(&chip->work); |
1194 | kfree(chip); |
1195 | } |
1196 | @@ -89,6 +88,7 @@ int snd_ak4113_create(struct snd_card *card, ak4113_read_t *read, |
1197 | chip->write = write; |
1198 | chip->private_data = private_data; |
1199 | INIT_DELAYED_WORK(&chip->work, ak4113_stats); |
1200 | + atomic_set(&chip->wq_processing, 0); |
1201 | |
1202 | for (reg = 0; reg < AK4113_WRITABLE_REGS ; reg++) |
1203 | chip->regmap[reg] = pgm[reg]; |
1204 | @@ -139,13 +139,11 @@ static void ak4113_init_regs(struct ak4113 *chip) |
1205 | |
1206 | void snd_ak4113_reinit(struct ak4113 *chip) |
1207 | { |
1208 | - chip->init = 1; |
1209 | - mb(); |
1210 | - flush_delayed_work(&chip->work); |
1211 | + if (atomic_inc_return(&chip->wq_processing) == 1) |
1212 | + cancel_delayed_work_sync(&chip->work); |
1213 | ak4113_init_regs(chip); |
1214 | /* bring up statistics / event queing */ |
1215 | - chip->init = 0; |
1216 | - if (chip->kctls[0]) |
1217 | + if (atomic_dec_and_test(&chip->wq_processing)) |
1218 | schedule_delayed_work(&chip->work, HZ / 10); |
1219 | } |
1220 | EXPORT_SYMBOL_GPL(snd_ak4113_reinit); |
1221 | @@ -632,8 +630,9 @@ static void ak4113_stats(struct work_struct *work) |
1222 | { |
1223 | struct ak4113 *chip = container_of(work, struct ak4113, work.work); |
1224 | |
1225 | - if (!chip->init) |
1226 | + if (atomic_inc_return(&chip->wq_processing) == 1) |
1227 | snd_ak4113_check_rate_and_errors(chip, chip->check_flags); |
1228 | |
1229 | - schedule_delayed_work(&chip->work, HZ / 10); |
1230 | + if (atomic_dec_and_test(&chip->wq_processing)) |
1231 | + schedule_delayed_work(&chip->work, HZ / 10); |
1232 | } |
1233 | diff --git a/sound/i2c/other/ak4114.c b/sound/i2c/other/ak4114.c |
1234 | index c7f56339415d..b70e6eccbd03 100644 |
1235 | --- a/sound/i2c/other/ak4114.c |
1236 | +++ b/sound/i2c/other/ak4114.c |
1237 | @@ -66,8 +66,7 @@ static void reg_dump(struct ak4114 *ak4114) |
1238 | |
1239 | static void snd_ak4114_free(struct ak4114 *chip) |
1240 | { |
1241 | - chip->init = 1; /* don't schedule new work */ |
1242 | - mb(); |
1243 | + atomic_inc(&chip->wq_processing); /* don't schedule new work */ |
1244 | cancel_delayed_work_sync(&chip->work); |
1245 | kfree(chip); |
1246 | } |
1247 | @@ -100,6 +99,7 @@ int snd_ak4114_create(struct snd_card *card, |
1248 | chip->write = write; |
1249 | chip->private_data = private_data; |
1250 | INIT_DELAYED_WORK(&chip->work, ak4114_stats); |
1251 | + atomic_set(&chip->wq_processing, 0); |
1252 | |
1253 | for (reg = 0; reg < 6; reg++) |
1254 | chip->regmap[reg] = pgm[reg]; |
1255 | @@ -152,13 +152,11 @@ static void ak4114_init_regs(struct ak4114 *chip) |
1256 | |
1257 | void snd_ak4114_reinit(struct ak4114 *chip) |
1258 | { |
1259 | - chip->init = 1; |
1260 | - mb(); |
1261 | - flush_delayed_work(&chip->work); |
1262 | + if (atomic_inc_return(&chip->wq_processing) == 1) |
1263 | + cancel_delayed_work_sync(&chip->work); |
1264 | ak4114_init_regs(chip); |
1265 | /* bring up statistics / event queing */ |
1266 | - chip->init = 0; |
1267 | - if (chip->kctls[0]) |
1268 | + if (atomic_dec_and_test(&chip->wq_processing)) |
1269 | schedule_delayed_work(&chip->work, HZ / 10); |
1270 | } |
1271 | |
1272 | @@ -612,10 +610,10 @@ static void ak4114_stats(struct work_struct *work) |
1273 | { |
1274 | struct ak4114 *chip = container_of(work, struct ak4114, work.work); |
1275 | |
1276 | - if (!chip->init) |
1277 | + if (atomic_inc_return(&chip->wq_processing) == 1) |
1278 | snd_ak4114_check_rate_and_errors(chip, chip->check_flags); |
1279 | - |
1280 | - schedule_delayed_work(&chip->work, HZ / 10); |
1281 | + if (atomic_dec_and_test(&chip->wq_processing)) |
1282 | + schedule_delayed_work(&chip->work, HZ / 10); |
1283 | } |
1284 | |
1285 | EXPORT_SYMBOL(snd_ak4114_create); |
1286 | diff --git a/sound/soc/atmel/atmel_ssc_dai.c b/sound/soc/atmel/atmel_ssc_dai.c |
1287 | index f403f399808a..51413e239cc3 100644 |
1288 | --- a/sound/soc/atmel/atmel_ssc_dai.c |
1289 | +++ b/sound/soc/atmel/atmel_ssc_dai.c |
1290 | @@ -345,7 +345,6 @@ static int atmel_ssc_hw_params(struct snd_pcm_substream *substream, |
1291 | struct atmel_pcm_dma_params *dma_params; |
1292 | int dir, channels, bits; |
1293 | u32 tfmr, rfmr, tcmr, rcmr; |
1294 | - int start_event; |
1295 | int ret; |
1296 | int fslen, fslen_ext; |
1297 | |
1298 | @@ -454,19 +453,10 @@ static int atmel_ssc_hw_params(struct snd_pcm_substream *substream, |
1299 | * The SSC transmit clock is obtained from the BCLK signal on |
1300 | * on the TK line, and the SSC receive clock is |
1301 | * generated from the transmit clock. |
1302 | - * |
1303 | - * For single channel data, one sample is transferred |
1304 | - * on the falling edge of the LRC clock. |
1305 | - * For two channel data, one sample is |
1306 | - * transferred on both edges of the LRC clock. |
1307 | */ |
1308 | - start_event = ((channels == 1) |
1309 | - ? SSC_START_FALLING_RF |
1310 | - : SSC_START_EDGE_RF); |
1311 | - |
1312 | rcmr = SSC_BF(RCMR_PERIOD, 0) |
1313 | | SSC_BF(RCMR_STTDLY, START_DELAY) |
1314 | - | SSC_BF(RCMR_START, start_event) |
1315 | + | SSC_BF(RCMR_START, SSC_START_FALLING_RF) |
1316 | | SSC_BF(RCMR_CKI, SSC_CKI_RISING) |
1317 | | SSC_BF(RCMR_CKO, SSC_CKO_NONE) |
1318 | | SSC_BF(RCMR_CKS, ssc->clk_from_rk_pin ? |
1319 | @@ -475,14 +465,14 @@ static int atmel_ssc_hw_params(struct snd_pcm_substream *substream, |
1320 | rfmr = SSC_BF(RFMR_FSEDGE, SSC_FSEDGE_POSITIVE) |
1321 | | SSC_BF(RFMR_FSOS, SSC_FSOS_NONE) |
1322 | | SSC_BF(RFMR_FSLEN, 0) |
1323 | - | SSC_BF(RFMR_DATNB, 0) |
1324 | + | SSC_BF(RFMR_DATNB, (channels - 1)) |
1325 | | SSC_BIT(RFMR_MSBF) |
1326 | | SSC_BF(RFMR_LOOP, 0) |
1327 | | SSC_BF(RFMR_DATLEN, (bits - 1)); |
1328 | |
1329 | tcmr = SSC_BF(TCMR_PERIOD, 0) |
1330 | | SSC_BF(TCMR_STTDLY, START_DELAY) |
1331 | - | SSC_BF(TCMR_START, start_event) |
1332 | + | SSC_BF(TCMR_START, SSC_START_FALLING_RF) |
1333 | | SSC_BF(TCMR_CKI, SSC_CKI_FALLING) |
1334 | | SSC_BF(TCMR_CKO, SSC_CKO_NONE) |
1335 | | SSC_BF(TCMR_CKS, ssc->clk_from_rk_pin ? |
1336 | @@ -492,7 +482,7 @@ static int atmel_ssc_hw_params(struct snd_pcm_substream *substream, |
1337 | | SSC_BF(TFMR_FSDEN, 0) |
1338 | | SSC_BF(TFMR_FSOS, SSC_FSOS_NONE) |
1339 | | SSC_BF(TFMR_FSLEN, 0) |
1340 | - | SSC_BF(TFMR_DATNB, 0) |
1341 | + | SSC_BF(TFMR_DATNB, (channels - 1)) |
1342 | | SSC_BIT(TFMR_MSBF) |
1343 | | SSC_BF(TFMR_DATDEF, 0) |
1344 | | SSC_BF(TFMR_DATLEN, (bits - 1)); |
1345 | diff --git a/sound/soc/codecs/sgtl5000.c b/sound/soc/codecs/sgtl5000.c |
1346 | index dab9b15304af..f1287ff8dd29 100644 |
1347 | --- a/sound/soc/codecs/sgtl5000.c |
1348 | +++ b/sound/soc/codecs/sgtl5000.c |
1349 | @@ -1452,6 +1452,9 @@ static int sgtl5000_i2c_probe(struct i2c_client *client, |
1350 | if (ret) |
1351 | return ret; |
1352 | |
1353 | + /* Need 8 clocks before I2C accesses */ |
1354 | + udelay(1); |
1355 | + |
1356 | /* read chip information */ |
1357 | ret = regmap_read(sgtl5000->regmap, SGTL5000_CHIP_ID, ®); |
1358 | if (ret) |