Contents of /trunk/kernel26-alx/patches-3.10/0168-3.10.69-all-fixes.patch
Parent Directory | Revision Log
Revision 2672 -
(show annotations)
(download)
Tue Jul 21 16:46:35 2015 UTC (9 years, 2 months ago) by niro
File size: 28351 byte(s)
Tue Jul 21 16:46:35 2015 UTC (9 years, 2 months ago) by niro
File size: 28351 byte(s)
-3.10.84-alx-r1
1 | diff --git a/Makefile b/Makefile |
2 | index dd67be657716..81ede20061cf 100644 |
3 | --- a/Makefile |
4 | +++ b/Makefile |
5 | @@ -1,6 +1,6 @@ |
6 | VERSION = 3 |
7 | PATCHLEVEL = 10 |
8 | -SUBLEVEL = 68 |
9 | +SUBLEVEL = 69 |
10 | EXTRAVERSION = |
11 | NAME = TOSSUG Baby Fish |
12 | |
13 | diff --git a/arch/arm64/include/asm/cputype.h b/arch/arm64/include/asm/cputype.h |
14 | index cf2749488cd4..be9b5ca9a6c0 100644 |
15 | --- a/arch/arm64/include/asm/cputype.h |
16 | +++ b/arch/arm64/include/asm/cputype.h |
17 | @@ -74,6 +74,8 @@ static inline u32 __attribute_const__ read_cpuid_cachetype(void) |
18 | return read_cpuid(ID_CTR_EL0); |
19 | } |
20 | |
21 | +void cpuinfo_store_cpu(void); |
22 | + |
23 | #endif /* __ASSEMBLY__ */ |
24 | |
25 | #endif |
26 | diff --git a/arch/arm64/kernel/setup.c b/arch/arm64/kernel/setup.c |
27 | index add6ea616843..7cc551d1b0e1 100644 |
28 | --- a/arch/arm64/kernel/setup.c |
29 | +++ b/arch/arm64/kernel/setup.c |
30 | @@ -41,6 +41,7 @@ |
31 | #include <linux/memblock.h> |
32 | #include <linux/of_fdt.h> |
33 | #include <linux/of_platform.h> |
34 | +#include <linux/personality.h> |
35 | |
36 | #include <asm/cputype.h> |
37 | #include <asm/elf.h> |
38 | @@ -97,6 +98,19 @@ void __init early_print(const char *str, ...) |
39 | printk("%s", buf); |
40 | } |
41 | |
42 | +struct cpuinfo_arm64 { |
43 | + struct cpu cpu; |
44 | + u32 reg_midr; |
45 | +}; |
46 | + |
47 | +static DEFINE_PER_CPU(struct cpuinfo_arm64, cpu_data); |
48 | + |
49 | +void cpuinfo_store_cpu(void) |
50 | +{ |
51 | + struct cpuinfo_arm64 *info = this_cpu_ptr(&cpu_data); |
52 | + info->reg_midr = read_cpuid_id(); |
53 | +} |
54 | + |
55 | static void __init setup_processor(void) |
56 | { |
57 | struct cpu_info *cpu_info; |
58 | @@ -127,6 +141,8 @@ static void __init setup_machine_fdt(phys_addr_t dt_phys) |
59 | struct boot_param_header *devtree; |
60 | unsigned long dt_root; |
61 | |
62 | + cpuinfo_store_cpu(); |
63 | + |
64 | /* Check we have a non-NULL DT pointer */ |
65 | if (!dt_phys) { |
66 | early_print("\n" |
67 | @@ -290,14 +306,12 @@ static int __init arm64_device_init(void) |
68 | } |
69 | arch_initcall(arm64_device_init); |
70 | |
71 | -static DEFINE_PER_CPU(struct cpu, cpu_data); |
72 | - |
73 | static int __init topology_init(void) |
74 | { |
75 | int i; |
76 | |
77 | for_each_possible_cpu(i) { |
78 | - struct cpu *cpu = &per_cpu(cpu_data, i); |
79 | + struct cpu *cpu = &per_cpu(cpu_data.cpu, i); |
80 | cpu->hotpluggable = 1; |
81 | register_cpu(cpu, i); |
82 | } |
83 | @@ -312,14 +326,41 @@ static const char *hwcap_str[] = { |
84 | NULL |
85 | }; |
86 | |
87 | +#ifdef CONFIG_COMPAT |
88 | +static const char *compat_hwcap_str[] = { |
89 | + "swp", |
90 | + "half", |
91 | + "thumb", |
92 | + "26bit", |
93 | + "fastmult", |
94 | + "fpa", |
95 | + "vfp", |
96 | + "edsp", |
97 | + "java", |
98 | + "iwmmxt", |
99 | + "crunch", |
100 | + "thumbee", |
101 | + "neon", |
102 | + "vfpv3", |
103 | + "vfpv3d16", |
104 | + "tls", |
105 | + "vfpv4", |
106 | + "idiva", |
107 | + "idivt", |
108 | + "vfpd32", |
109 | + "lpae", |
110 | + "evtstrm" |
111 | +}; |
112 | +#endif /* CONFIG_COMPAT */ |
113 | + |
114 | static int c_show(struct seq_file *m, void *v) |
115 | { |
116 | - int i; |
117 | - |
118 | - seq_printf(m, "Processor\t: %s rev %d (%s)\n", |
119 | - cpu_name, read_cpuid_id() & 15, ELF_PLATFORM); |
120 | + int i, j; |
121 | |
122 | for_each_online_cpu(i) { |
123 | + struct cpuinfo_arm64 *cpuinfo = &per_cpu(cpu_data, i); |
124 | + u32 midr = cpuinfo->reg_midr; |
125 | + |
126 | /* |
127 | * glibc reads /proc/cpuinfo to determine the number of |
128 | * online processors, looking for lines beginning with |
129 | @@ -328,27 +369,36 @@ static int c_show(struct seq_file *m, void *v) |
130 | #ifdef CONFIG_SMP |
131 | seq_printf(m, "processor\t: %d\n", i); |
132 | #endif |
133 | - seq_printf(m, "BogoMIPS\t: %lu.%02lu\n\n", |
134 | + seq_printf(m, "BogoMIPS\t: %lu.%02lu\n", |
135 | loops_per_jiffy / (500000UL/HZ), |
136 | loops_per_jiffy / (5000UL/HZ) % 100); |
137 | - } |
138 | - |
139 | - /* dump out the processor features */ |
140 | - seq_puts(m, "Features\t: "); |
141 | - |
142 | - for (i = 0; hwcap_str[i]; i++) |
143 | - if (elf_hwcap & (1 << i)) |
144 | - seq_printf(m, "%s ", hwcap_str[i]); |
145 | |
146 | - seq_printf(m, "\nCPU implementer\t: 0x%02x\n", read_cpuid_id() >> 24); |
147 | - seq_printf(m, "CPU architecture: AArch64\n"); |
148 | - seq_printf(m, "CPU variant\t: 0x%x\n", (read_cpuid_id() >> 20) & 15); |
149 | - seq_printf(m, "CPU part\t: 0x%03x\n", (read_cpuid_id() >> 4) & 0xfff); |
150 | - seq_printf(m, "CPU revision\t: %d\n", read_cpuid_id() & 15); |
151 | - |
152 | - seq_puts(m, "\n"); |
153 | - |
154 | - seq_printf(m, "Hardware\t: %s\n", machine_name); |
155 | + /* |
156 | + * Dump out the common processor features in a single line. |
157 | + * Userspace should read the hwcaps with getauxval(AT_HWCAP) |
158 | + * rather than attempting to parse this, but there's a body of |
159 | + * software which does already (at least for 32-bit). |
160 | + */ |
161 | + seq_puts(m, "Features\t:"); |
162 | + if (personality(current->personality) == PER_LINUX32) { |
163 | +#ifdef CONFIG_COMPAT |
164 | + for (j = 0; compat_hwcap_str[j]; j++) |
165 | + if (COMPAT_ELF_HWCAP & (1 << j)) |
166 | + seq_printf(m, " %s", compat_hwcap_str[j]); |
167 | +#endif /* CONFIG_COMPAT */ |
168 | + } else { |
169 | + for (j = 0; hwcap_str[j]; j++) |
170 | + if (elf_hwcap & (1 << j)) |
171 | + seq_printf(m, " %s", hwcap_str[j]); |
172 | + } |
173 | + seq_puts(m, "\n"); |
174 | + |
175 | + seq_printf(m, "CPU implementer\t: 0x%02x\n", (midr >> 24)); |
176 | + seq_printf(m, "CPU architecture: 8\n"); |
177 | + seq_printf(m, "CPU variant\t: 0x%x\n", ((midr >> 20) & 0xf)); |
178 | + seq_printf(m, "CPU part\t: 0x%03x\n", ((midr >> 4) & 0xfff)); |
179 | + seq_printf(m, "CPU revision\t: %d\n\n", (midr & 0xf)); |
180 | + } |
181 | |
182 | return 0; |
183 | } |
184 | diff --git a/arch/arm64/kernel/smp.c b/arch/arm64/kernel/smp.c |
185 | index 9c93e126328c..b0a8703a25ec 100644 |
186 | --- a/arch/arm64/kernel/smp.c |
187 | +++ b/arch/arm64/kernel/smp.c |
188 | @@ -200,6 +200,11 @@ asmlinkage void __cpuinit secondary_start_kernel(void) |
189 | raw_spin_unlock(&boot_lock); |
190 | |
191 | /* |
192 | + * Log the CPU info before it is marked online and might get read. |
193 | + */ |
194 | + cpuinfo_store_cpu(); |
195 | + |
196 | + /* |
197 | * OK, now it's safe to let the boot CPU continue. Wait for |
198 | * the CPU migration code to notice that the CPU is online |
199 | * before we continue. |
200 | diff --git a/arch/mips/kernel/irq_cpu.c b/arch/mips/kernel/irq_cpu.c |
201 | index 72ef2d25cbf2..ab941a366012 100644 |
202 | --- a/arch/mips/kernel/irq_cpu.c |
203 | +++ b/arch/mips/kernel/irq_cpu.c |
204 | @@ -56,6 +56,8 @@ static struct irq_chip mips_cpu_irq_controller = { |
205 | .irq_mask_ack = mask_mips_irq, |
206 | .irq_unmask = unmask_mips_irq, |
207 | .irq_eoi = unmask_mips_irq, |
208 | + .irq_disable = mask_mips_irq, |
209 | + .irq_enable = unmask_mips_irq, |
210 | }; |
211 | |
212 | /* |
213 | @@ -92,6 +94,8 @@ static struct irq_chip mips_mt_cpu_irq_controller = { |
214 | .irq_mask_ack = mips_mt_cpu_irq_ack, |
215 | .irq_unmask = unmask_mips_irq, |
216 | .irq_eoi = unmask_mips_irq, |
217 | + .irq_disable = mask_mips_irq, |
218 | + .irq_enable = unmask_mips_irq, |
219 | }; |
220 | |
221 | void __init mips_cpu_irq_init(void) |
222 | diff --git a/arch/mips/kernel/smp.c b/arch/mips/kernel/smp.c |
223 | index 6e7862ab46cc..caeec21df1c4 100644 |
224 | --- a/arch/mips/kernel/smp.c |
225 | +++ b/arch/mips/kernel/smp.c |
226 | @@ -109,10 +109,10 @@ asmlinkage __cpuinit void start_secondary(void) |
227 | else |
228 | #endif /* CONFIG_MIPS_MT_SMTC */ |
229 | cpu_probe(); |
230 | - cpu_report(); |
231 | per_cpu_trap_init(false); |
232 | mips_clockevent_init(); |
233 | mp_ops->init_secondary(); |
234 | + cpu_report(); |
235 | |
236 | /* |
237 | * XXX parity protection should be folded in here when it's converted |
238 | diff --git a/arch/x86/include/uapi/asm/vmx.h b/arch/x86/include/uapi/asm/vmx.h |
239 | index 7a34e8fe54bd..dccea7f29051 100644 |
240 | --- a/arch/x86/include/uapi/asm/vmx.h |
241 | +++ b/arch/x86/include/uapi/asm/vmx.h |
242 | @@ -67,6 +67,7 @@ |
243 | #define EXIT_REASON_EPT_MISCONFIG 49 |
244 | #define EXIT_REASON_INVEPT 50 |
245 | #define EXIT_REASON_PREEMPTION_TIMER 52 |
246 | +#define EXIT_REASON_INVVPID 53 |
247 | #define EXIT_REASON_WBINVD 54 |
248 | #define EXIT_REASON_XSETBV 55 |
249 | #define EXIT_REASON_APIC_WRITE 56 |
250 | @@ -112,6 +113,7 @@ |
251 | { EXIT_REASON_EOI_INDUCED, "EOI_INDUCED" }, \ |
252 | { EXIT_REASON_INVALID_STATE, "INVALID_STATE" }, \ |
253 | { EXIT_REASON_INVD, "INVD" }, \ |
254 | + { EXIT_REASON_INVVPID, "INVVPID" }, \ |
255 | { EXIT_REASON_INVPCID, "INVPCID" }, \ |
256 | { EXIT_REASON_PREEMPTION_TIMER, "PREEMPTION_TIMER" } |
257 | |
258 | diff --git a/arch/x86/kvm/vmx.c b/arch/x86/kvm/vmx.c |
259 | index 7112be5f1eaf..04cc2fa7744f 100644 |
260 | --- a/arch/x86/kvm/vmx.c |
261 | +++ b/arch/x86/kvm/vmx.c |
262 | @@ -438,6 +438,7 @@ struct vcpu_vmx { |
263 | #endif |
264 | int gs_ldt_reload_needed; |
265 | int fs_reload_needed; |
266 | + unsigned long vmcs_host_cr4; /* May not match real cr4 */ |
267 | } host_state; |
268 | struct { |
269 | int vm86_active; |
270 | @@ -4076,11 +4077,16 @@ static void vmx_set_constant_host_state(struct vcpu_vmx *vmx) |
271 | u32 low32, high32; |
272 | unsigned long tmpl; |
273 | struct desc_ptr dt; |
274 | + unsigned long cr4; |
275 | |
276 | vmcs_writel(HOST_CR0, read_cr0() & ~X86_CR0_TS); /* 22.2.3 */ |
277 | - vmcs_writel(HOST_CR4, read_cr4()); /* 22.2.3, 22.2.5 */ |
278 | vmcs_writel(HOST_CR3, read_cr3()); /* 22.2.3 FIXME: shadow tables */ |
279 | |
280 | + /* Save the most likely value for this task's CR4 in the VMCS. */ |
281 | + cr4 = read_cr4(); |
282 | + vmcs_writel(HOST_CR4, cr4); /* 22.2.3, 22.2.5 */ |
283 | + vmx->host_state.vmcs_host_cr4 = cr4; |
284 | + |
285 | vmcs_write16(HOST_CS_SELECTOR, __KERNEL_CS); /* 22.2.4 */ |
286 | #ifdef CONFIG_X86_64 |
287 | /* |
288 | @@ -6248,6 +6254,12 @@ static int handle_invept(struct kvm_vcpu *vcpu) |
289 | return 1; |
290 | } |
291 | |
292 | +static int handle_invvpid(struct kvm_vcpu *vcpu) |
293 | +{ |
294 | + kvm_queue_exception(vcpu, UD_VECTOR); |
295 | + return 1; |
296 | +} |
297 | + |
298 | /* |
299 | * The exit handlers return 1 if the exit was handled fully and guest execution |
300 | * may resume. Otherwise they set the kvm_run parameter to indicate what needs |
301 | @@ -6293,6 +6305,7 @@ static int (*const kvm_vmx_exit_handlers[])(struct kvm_vcpu *vcpu) = { |
302 | [EXIT_REASON_MWAIT_INSTRUCTION] = handle_invalid_op, |
303 | [EXIT_REASON_MONITOR_INSTRUCTION] = handle_invalid_op, |
304 | [EXIT_REASON_INVEPT] = handle_invept, |
305 | + [EXIT_REASON_INVVPID] = handle_invvpid, |
306 | }; |
307 | |
308 | static const int kvm_vmx_max_exit_handlers = |
309 | @@ -6519,7 +6532,7 @@ static bool nested_vmx_exit_handled(struct kvm_vcpu *vcpu) |
310 | case EXIT_REASON_VMPTRST: case EXIT_REASON_VMREAD: |
311 | case EXIT_REASON_VMRESUME: case EXIT_REASON_VMWRITE: |
312 | case EXIT_REASON_VMOFF: case EXIT_REASON_VMON: |
313 | - case EXIT_REASON_INVEPT: |
314 | + case EXIT_REASON_INVEPT: case EXIT_REASON_INVVPID: |
315 | /* |
316 | * VMX instructions trap unconditionally. This allows L1 to |
317 | * emulate them for its L2 guest, i.e., allows 3-level nesting! |
318 | @@ -6964,7 +6977,7 @@ static void atomic_switch_perf_msrs(struct vcpu_vmx *vmx) |
319 | static void __noclone vmx_vcpu_run(struct kvm_vcpu *vcpu) |
320 | { |
321 | struct vcpu_vmx *vmx = to_vmx(vcpu); |
322 | - unsigned long debugctlmsr; |
323 | + unsigned long debugctlmsr, cr4; |
324 | |
325 | /* Record the guest's net vcpu time for enforced NMI injections. */ |
326 | if (unlikely(!cpu_has_virtual_nmis() && vmx->soft_vnmi_blocked)) |
327 | @@ -6985,6 +6998,12 @@ static void __noclone vmx_vcpu_run(struct kvm_vcpu *vcpu) |
328 | if (test_bit(VCPU_REGS_RIP, (unsigned long *)&vcpu->arch.regs_dirty)) |
329 | vmcs_writel(GUEST_RIP, vcpu->arch.regs[VCPU_REGS_RIP]); |
330 | |
331 | + cr4 = read_cr4(); |
332 | + if (unlikely(cr4 != vmx->host_state.vmcs_host_cr4)) { |
333 | + vmcs_writel(HOST_CR4, cr4); |
334 | + vmx->host_state.vmcs_host_cr4 = cr4; |
335 | + } |
336 | + |
337 | /* When single-stepping over STI and MOV SS, we must clear the |
338 | * corresponding interruptibility bits in the guest state. Otherwise |
339 | * vmentry fails as it then expects bit 14 (BS) in pending debug |
340 | diff --git a/arch/x86/pci/common.c b/arch/x86/pci/common.c |
341 | index 981c2dbd72cc..88f143d9754e 100644 |
342 | --- a/arch/x86/pci/common.c |
343 | +++ b/arch/x86/pci/common.c |
344 | @@ -448,6 +448,22 @@ static const struct dmi_system_id pciprobe_dmi_table[] = { |
345 | DMI_MATCH(DMI_PRODUCT_NAME, "ftServer"), |
346 | }, |
347 | }, |
348 | + { |
349 | + .callback = set_scan_all, |
350 | + .ident = "Stratus/NEC ftServer", |
351 | + .matches = { |
352 | + DMI_MATCH(DMI_SYS_VENDOR, "NEC"), |
353 | + DMI_MATCH(DMI_PRODUCT_NAME, "Express5800/R32"), |
354 | + }, |
355 | + }, |
356 | + { |
357 | + .callback = set_scan_all, |
358 | + .ident = "Stratus/NEC ftServer", |
359 | + .matches = { |
360 | + DMI_MATCH(DMI_SYS_VENDOR, "NEC"), |
361 | + DMI_MATCH(DMI_PRODUCT_NAME, "Express5800/R31"), |
362 | + }, |
363 | + }, |
364 | {} |
365 | }; |
366 | |
367 | diff --git a/crypto/crc32c.c b/crypto/crc32c.c |
368 | index 06f7018c9d95..238f0e627ef3 100644 |
369 | --- a/crypto/crc32c.c |
370 | +++ b/crypto/crc32c.c |
371 | @@ -170,3 +170,4 @@ module_exit(crc32c_mod_fini); |
372 | MODULE_AUTHOR("Clay Haapala <chaapala@cisco.com>"); |
373 | MODULE_DESCRIPTION("CRC32c (Castagnoli) calculations wrapper for lib/crc32c"); |
374 | MODULE_LICENSE("GPL"); |
375 | +MODULE_ALIAS_CRYPTO("crc32c"); |
376 | diff --git a/drivers/gpio/gpiolib.c b/drivers/gpio/gpiolib.c |
377 | index 1d74a80e031e..ca1cb2d756c2 100644 |
378 | --- a/drivers/gpio/gpiolib.c |
379 | +++ b/drivers/gpio/gpiolib.c |
380 | @@ -874,6 +874,7 @@ static int gpiod_export_link(struct device *dev, const char *name, |
381 | if (tdev != NULL) { |
382 | status = sysfs_create_link(&dev->kobj, &tdev->kobj, |
383 | name); |
384 | + put_device(tdev); |
385 | } else { |
386 | status = -ENODEV; |
387 | } |
388 | @@ -927,7 +928,7 @@ static int gpiod_sysfs_set_active_low(struct gpio_desc *desc, int value) |
389 | } |
390 | |
391 | status = sysfs_set_active_low(desc, dev, value); |
392 | - |
393 | + put_device(dev); |
394 | unlock: |
395 | mutex_unlock(&sysfs_lock); |
396 | |
397 | diff --git a/fs/ext4/file.c b/fs/ext4/file.c |
398 | index 4635788e14bf..ec9770f42538 100644 |
399 | --- a/fs/ext4/file.c |
400 | +++ b/fs/ext4/file.c |
401 | @@ -100,7 +100,7 @@ ext4_file_dio_write(struct kiocb *iocb, const struct iovec *iov, |
402 | struct blk_plug plug; |
403 | int unaligned_aio = 0; |
404 | ssize_t ret; |
405 | - int overwrite = 0; |
406 | + int *overwrite = iocb->private; |
407 | size_t length = iov_length(iov, nr_segs); |
408 | |
409 | if (ext4_test_inode_flag(inode, EXT4_INODE_EXTENTS) && |
410 | @@ -118,8 +118,6 @@ ext4_file_dio_write(struct kiocb *iocb, const struct iovec *iov, |
411 | mutex_lock(&inode->i_mutex); |
412 | blk_start_plug(&plug); |
413 | |
414 | - iocb->private = &overwrite; |
415 | - |
416 | /* check whether we do a DIO overwrite or not */ |
417 | if (ext4_should_dioread_nolock(inode) && !unaligned_aio && |
418 | !file->f_mapping->nrpages && pos + length <= i_size_read(inode)) { |
419 | @@ -143,7 +141,7 @@ ext4_file_dio_write(struct kiocb *iocb, const struct iovec *iov, |
420 | * So we should check these two conditions. |
421 | */ |
422 | if (err == len && (map.m_flags & EXT4_MAP_MAPPED)) |
423 | - overwrite = 1; |
424 | + *overwrite = 1; |
425 | } |
426 | |
427 | ret = __generic_file_aio_write(iocb, iov, nr_segs, &iocb->ki_pos); |
428 | @@ -170,6 +168,7 @@ ext4_file_write(struct kiocb *iocb, const struct iovec *iov, |
429 | { |
430 | struct inode *inode = file_inode(iocb->ki_filp); |
431 | ssize_t ret; |
432 | + int overwrite = 0; |
433 | |
434 | /* |
435 | * If we have encountered a bitmap-format file, the size limit |
436 | @@ -190,6 +189,7 @@ ext4_file_write(struct kiocb *iocb, const struct iovec *iov, |
437 | } |
438 | } |
439 | |
440 | + iocb->private = &overwrite; |
441 | if (unlikely(iocb->ki_filp->f_flags & O_DIRECT)) |
442 | ret = ext4_file_dio_write(iocb, iov, nr_segs, pos); |
443 | else |
444 | diff --git a/fs/nilfs2/nilfs.h b/fs/nilfs2/nilfs.h |
445 | index 9bc72dec3fa6..b02c202223a6 100644 |
446 | --- a/fs/nilfs2/nilfs.h |
447 | +++ b/fs/nilfs2/nilfs.h |
448 | @@ -141,7 +141,6 @@ enum { |
449 | * @ti_save: Backup of journal_info field of task_struct |
450 | * @ti_flags: Flags |
451 | * @ti_count: Nest level |
452 | - * @ti_garbage: List of inode to be put when releasing semaphore |
453 | */ |
454 | struct nilfs_transaction_info { |
455 | u32 ti_magic; |
456 | @@ -150,7 +149,6 @@ struct nilfs_transaction_info { |
457 | one of other filesystems has a bug. */ |
458 | unsigned short ti_flags; |
459 | unsigned short ti_count; |
460 | - struct list_head ti_garbage; |
461 | }; |
462 | |
463 | /* ti_magic */ |
464 | diff --git a/fs/nilfs2/segment.c b/fs/nilfs2/segment.c |
465 | index 958a5b57ed4a..b3c95c1a4700 100644 |
466 | --- a/fs/nilfs2/segment.c |
467 | +++ b/fs/nilfs2/segment.c |
468 | @@ -305,7 +305,6 @@ static void nilfs_transaction_lock(struct super_block *sb, |
469 | ti->ti_count = 0; |
470 | ti->ti_save = cur_ti; |
471 | ti->ti_magic = NILFS_TI_MAGIC; |
472 | - INIT_LIST_HEAD(&ti->ti_garbage); |
473 | current->journal_info = ti; |
474 | |
475 | for (;;) { |
476 | @@ -332,8 +331,6 @@ static void nilfs_transaction_unlock(struct super_block *sb) |
477 | |
478 | up_write(&nilfs->ns_segctor_sem); |
479 | current->journal_info = ti->ti_save; |
480 | - if (!list_empty(&ti->ti_garbage)) |
481 | - nilfs_dispose_list(nilfs, &ti->ti_garbage, 0); |
482 | } |
483 | |
484 | static void *nilfs_segctor_map_segsum_entry(struct nilfs_sc_info *sci, |
485 | @@ -746,6 +743,15 @@ static void nilfs_dispose_list(struct the_nilfs *nilfs, |
486 | } |
487 | } |
488 | |
489 | +static void nilfs_iput_work_func(struct work_struct *work) |
490 | +{ |
491 | + struct nilfs_sc_info *sci = container_of(work, struct nilfs_sc_info, |
492 | + sc_iput_work); |
493 | + struct the_nilfs *nilfs = sci->sc_super->s_fs_info; |
494 | + |
495 | + nilfs_dispose_list(nilfs, &sci->sc_iput_queue, 0); |
496 | +} |
497 | + |
498 | static int nilfs_test_metadata_dirty(struct the_nilfs *nilfs, |
499 | struct nilfs_root *root) |
500 | { |
501 | @@ -1899,8 +1905,8 @@ static int nilfs_segctor_collect_dirty_files(struct nilfs_sc_info *sci, |
502 | static void nilfs_segctor_drop_written_files(struct nilfs_sc_info *sci, |
503 | struct the_nilfs *nilfs) |
504 | { |
505 | - struct nilfs_transaction_info *ti = current->journal_info; |
506 | struct nilfs_inode_info *ii, *n; |
507 | + int defer_iput = false; |
508 | |
509 | spin_lock(&nilfs->ns_inode_lock); |
510 | list_for_each_entry_safe(ii, n, &sci->sc_dirty_files, i_dirty) { |
511 | @@ -1911,9 +1917,24 @@ static void nilfs_segctor_drop_written_files(struct nilfs_sc_info *sci, |
512 | clear_bit(NILFS_I_BUSY, &ii->i_state); |
513 | brelse(ii->i_bh); |
514 | ii->i_bh = NULL; |
515 | - list_move_tail(&ii->i_dirty, &ti->ti_garbage); |
516 | + list_del_init(&ii->i_dirty); |
517 | + if (!ii->vfs_inode.i_nlink) { |
518 | + /* |
519 | + * Defer calling iput() to avoid a deadlock |
520 | + * over I_SYNC flag for inodes with i_nlink == 0 |
521 | + */ |
522 | + list_add_tail(&ii->i_dirty, &sci->sc_iput_queue); |
523 | + defer_iput = true; |
524 | + } else { |
525 | + spin_unlock(&nilfs->ns_inode_lock); |
526 | + iput(&ii->vfs_inode); |
527 | + spin_lock(&nilfs->ns_inode_lock); |
528 | + } |
529 | } |
530 | spin_unlock(&nilfs->ns_inode_lock); |
531 | + |
532 | + if (defer_iput) |
533 | + schedule_work(&sci->sc_iput_work); |
534 | } |
535 | |
536 | /* |
537 | @@ -2580,6 +2601,8 @@ static struct nilfs_sc_info *nilfs_segctor_new(struct super_block *sb, |
538 | INIT_LIST_HEAD(&sci->sc_segbufs); |
539 | INIT_LIST_HEAD(&sci->sc_write_logs); |
540 | INIT_LIST_HEAD(&sci->sc_gc_inodes); |
541 | + INIT_LIST_HEAD(&sci->sc_iput_queue); |
542 | + INIT_WORK(&sci->sc_iput_work, nilfs_iput_work_func); |
543 | init_timer(&sci->sc_timer); |
544 | |
545 | sci->sc_interval = HZ * NILFS_SC_DEFAULT_TIMEOUT; |
546 | @@ -2606,6 +2629,8 @@ static void nilfs_segctor_write_out(struct nilfs_sc_info *sci) |
547 | ret = nilfs_segctor_construct(sci, SC_LSEG_SR); |
548 | nilfs_transaction_unlock(sci->sc_super); |
549 | |
550 | + flush_work(&sci->sc_iput_work); |
551 | + |
552 | } while (ret && retrycount-- > 0); |
553 | } |
554 | |
555 | @@ -2630,6 +2655,9 @@ static void nilfs_segctor_destroy(struct nilfs_sc_info *sci) |
556 | || sci->sc_seq_request != sci->sc_seq_done); |
557 | spin_unlock(&sci->sc_state_lock); |
558 | |
559 | + if (flush_work(&sci->sc_iput_work)) |
560 | + flag = true; |
561 | + |
562 | if (flag || !nilfs_segctor_confirm(sci)) |
563 | nilfs_segctor_write_out(sci); |
564 | |
565 | @@ -2639,6 +2667,12 @@ static void nilfs_segctor_destroy(struct nilfs_sc_info *sci) |
566 | nilfs_dispose_list(nilfs, &sci->sc_dirty_files, 1); |
567 | } |
568 | |
569 | + if (!list_empty(&sci->sc_iput_queue)) { |
570 | + nilfs_warning(sci->sc_super, __func__, |
571 | + "iput queue is not empty\n"); |
572 | + nilfs_dispose_list(nilfs, &sci->sc_iput_queue, 1); |
573 | + } |
574 | + |
575 | WARN_ON(!list_empty(&sci->sc_segbufs)); |
576 | WARN_ON(!list_empty(&sci->sc_write_logs)); |
577 | |
578 | diff --git a/fs/nilfs2/segment.h b/fs/nilfs2/segment.h |
579 | index 38a1d0013314..a48d6de1e02c 100644 |
580 | --- a/fs/nilfs2/segment.h |
581 | +++ b/fs/nilfs2/segment.h |
582 | @@ -26,6 +26,7 @@ |
583 | #include <linux/types.h> |
584 | #include <linux/fs.h> |
585 | #include <linux/buffer_head.h> |
586 | +#include <linux/workqueue.h> |
587 | #include <linux/nilfs2_fs.h> |
588 | #include "nilfs.h" |
589 | |
590 | @@ -92,6 +93,8 @@ struct nilfs_segsum_pointer { |
591 | * @sc_nblk_inc: Block count of current generation |
592 | * @sc_dirty_files: List of files to be written |
593 | * @sc_gc_inodes: List of GC inodes having blocks to be written |
594 | + * @sc_iput_queue: list of inodes for which iput should be done |
595 | + * @sc_iput_work: work struct to defer iput call |
596 | * @sc_freesegs: array of segment numbers to be freed |
597 | * @sc_nfreesegs: number of segments on @sc_freesegs |
598 | * @sc_dsync_inode: inode whose data pages are written for a sync operation |
599 | @@ -135,6 +138,8 @@ struct nilfs_sc_info { |
600 | |
601 | struct list_head sc_dirty_files; |
602 | struct list_head sc_gc_inodes; |
603 | + struct list_head sc_iput_queue; |
604 | + struct work_struct sc_iput_work; |
605 | |
606 | __u64 *sc_freesegs; |
607 | size_t sc_nfreesegs; |
608 | diff --git a/include/sound/ak4113.h b/include/sound/ak4113.h |
609 | index 2609048c1d44..3a34f6edc2d1 100644 |
610 | --- a/include/sound/ak4113.h |
611 | +++ b/include/sound/ak4113.h |
612 | @@ -286,7 +286,7 @@ struct ak4113 { |
613 | ak4113_write_t *write; |
614 | ak4113_read_t *read; |
615 | void *private_data; |
616 | - unsigned int init:1; |
617 | + atomic_t wq_processing; |
618 | spinlock_t lock; |
619 | unsigned char regmap[AK4113_WRITABLE_REGS]; |
620 | struct snd_kcontrol *kctls[AK4113_CONTROLS]; |
621 | diff --git a/include/sound/ak4114.h b/include/sound/ak4114.h |
622 | index 3ce69fd92523..69441161009c 100644 |
623 | --- a/include/sound/ak4114.h |
624 | +++ b/include/sound/ak4114.h |
625 | @@ -168,7 +168,7 @@ struct ak4114 { |
626 | ak4114_write_t * write; |
627 | ak4114_read_t * read; |
628 | void * private_data; |
629 | - unsigned int init: 1; |
630 | + atomic_t wq_processing; |
631 | spinlock_t lock; |
632 | unsigned char regmap[7]; |
633 | unsigned char txcsb[5]; |
634 | diff --git a/kernel/smpboot.c b/kernel/smpboot.c |
635 | index 02fc5c933673..7020eecb398b 100644 |
636 | --- a/kernel/smpboot.c |
637 | +++ b/kernel/smpboot.c |
638 | @@ -279,6 +279,7 @@ int smpboot_register_percpu_thread(struct smp_hotplug_thread *plug_thread) |
639 | unsigned int cpu; |
640 | int ret = 0; |
641 | |
642 | + get_online_cpus(); |
643 | mutex_lock(&smpboot_threads_lock); |
644 | for_each_online_cpu(cpu) { |
645 | ret = __smpboot_create_thread(plug_thread, cpu); |
646 | @@ -291,6 +292,7 @@ int smpboot_register_percpu_thread(struct smp_hotplug_thread *plug_thread) |
647 | list_add(&plug_thread->list, &hotplug_threads); |
648 | out: |
649 | mutex_unlock(&smpboot_threads_lock); |
650 | + put_online_cpus(); |
651 | return ret; |
652 | } |
653 | EXPORT_SYMBOL_GPL(smpboot_register_percpu_thread); |
654 | diff --git a/lib/checksum.c b/lib/checksum.c |
655 | index 129775eb6de6..8b39e86dbab5 100644 |
656 | --- a/lib/checksum.c |
657 | +++ b/lib/checksum.c |
658 | @@ -181,6 +181,15 @@ csum_partial_copy(const void *src, void *dst, int len, __wsum sum) |
659 | EXPORT_SYMBOL(csum_partial_copy); |
660 | |
661 | #ifndef csum_tcpudp_nofold |
662 | +static inline u32 from64to32(u64 x) |
663 | +{ |
664 | + /* add up 32-bit and 32-bit for 32+c bit */ |
665 | + x = (x & 0xffffffff) + (x >> 32); |
666 | + /* add up carry.. */ |
667 | + x = (x & 0xffffffff) + (x >> 32); |
668 | + return (u32)x; |
669 | +} |
670 | + |
671 | __wsum csum_tcpudp_nofold(__be32 saddr, __be32 daddr, |
672 | unsigned short len, |
673 | unsigned short proto, |
674 | @@ -195,8 +204,7 @@ __wsum csum_tcpudp_nofold(__be32 saddr, __be32 daddr, |
675 | #else |
676 | s += (proto + len) << 8; |
677 | #endif |
678 | - s += (s >> 32); |
679 | - return (__force __wsum)s; |
680 | + return (__force __wsum)from64to32(s); |
681 | } |
682 | EXPORT_SYMBOL(csum_tcpudp_nofold); |
683 | #endif |
684 | diff --git a/mm/pagewalk.c b/mm/pagewalk.c |
685 | index 2beeabf502c5..9056d22d2880 100644 |
686 | --- a/mm/pagewalk.c |
687 | +++ b/mm/pagewalk.c |
688 | @@ -199,7 +199,10 @@ int walk_page_range(unsigned long addr, unsigned long end, |
689 | */ |
690 | if ((vma->vm_start <= addr) && |
691 | (vma->vm_flags & VM_PFNMAP)) { |
692 | - next = vma->vm_end; |
693 | + if (walk->pte_hole) |
694 | + err = walk->pte_hole(addr, next, walk); |
695 | + if (err) |
696 | + break; |
697 | pgd = pgd_offset(walk->mm, next); |
698 | continue; |
699 | } |
700 | diff --git a/sound/i2c/other/ak4113.c b/sound/i2c/other/ak4113.c |
701 | index e04e750a77ed..7a9149bb2a38 100644 |
702 | --- a/sound/i2c/other/ak4113.c |
703 | +++ b/sound/i2c/other/ak4113.c |
704 | @@ -56,8 +56,7 @@ static inline unsigned char reg_read(struct ak4113 *ak4113, unsigned char reg) |
705 | |
706 | static void snd_ak4113_free(struct ak4113 *chip) |
707 | { |
708 | - chip->init = 1; /* don't schedule new work */ |
709 | - mb(); |
710 | + atomic_inc(&chip->wq_processing); /* don't schedule new work */ |
711 | cancel_delayed_work_sync(&chip->work); |
712 | kfree(chip); |
713 | } |
714 | @@ -89,6 +88,7 @@ int snd_ak4113_create(struct snd_card *card, ak4113_read_t *read, |
715 | chip->write = write; |
716 | chip->private_data = private_data; |
717 | INIT_DELAYED_WORK(&chip->work, ak4113_stats); |
718 | + atomic_set(&chip->wq_processing, 0); |
719 | |
720 | for (reg = 0; reg < AK4113_WRITABLE_REGS ; reg++) |
721 | chip->regmap[reg] = pgm[reg]; |
722 | @@ -139,13 +139,11 @@ static void ak4113_init_regs(struct ak4113 *chip) |
723 | |
724 | void snd_ak4113_reinit(struct ak4113 *chip) |
725 | { |
726 | - chip->init = 1; |
727 | - mb(); |
728 | - flush_delayed_work(&chip->work); |
729 | + if (atomic_inc_return(&chip->wq_processing) == 1) |
730 | + cancel_delayed_work_sync(&chip->work); |
731 | ak4113_init_regs(chip); |
732 | /* bring up statistics / event queing */ |
733 | - chip->init = 0; |
734 | - if (chip->kctls[0]) |
735 | + if (atomic_dec_and_test(&chip->wq_processing)) |
736 | schedule_delayed_work(&chip->work, HZ / 10); |
737 | } |
738 | EXPORT_SYMBOL_GPL(snd_ak4113_reinit); |
739 | @@ -632,8 +630,9 @@ static void ak4113_stats(struct work_struct *work) |
740 | { |
741 | struct ak4113 *chip = container_of(work, struct ak4113, work.work); |
742 | |
743 | - if (!chip->init) |
744 | + if (atomic_inc_return(&chip->wq_processing) == 1) |
745 | snd_ak4113_check_rate_and_errors(chip, chip->check_flags); |
746 | |
747 | - schedule_delayed_work(&chip->work, HZ / 10); |
748 | + if (atomic_dec_and_test(&chip->wq_processing)) |
749 | + schedule_delayed_work(&chip->work, HZ / 10); |
750 | } |
751 | diff --git a/sound/i2c/other/ak4114.c b/sound/i2c/other/ak4114.c |
752 | index 5bf4fca19e48..84a1ee7af552 100644 |
753 | --- a/sound/i2c/other/ak4114.c |
754 | +++ b/sound/i2c/other/ak4114.c |
755 | @@ -66,8 +66,7 @@ static void reg_dump(struct ak4114 *ak4114) |
756 | |
757 | static void snd_ak4114_free(struct ak4114 *chip) |
758 | { |
759 | - chip->init = 1; /* don't schedule new work */ |
760 | - mb(); |
761 | + atomic_inc(&chip->wq_processing); /* don't schedule new work */ |
762 | cancel_delayed_work_sync(&chip->work); |
763 | kfree(chip); |
764 | } |
765 | @@ -100,6 +99,7 @@ int snd_ak4114_create(struct snd_card *card, |
766 | chip->write = write; |
767 | chip->private_data = private_data; |
768 | INIT_DELAYED_WORK(&chip->work, ak4114_stats); |
769 | + atomic_set(&chip->wq_processing, 0); |
770 | |
771 | for (reg = 0; reg < 7; reg++) |
772 | chip->regmap[reg] = pgm[reg]; |
773 | @@ -152,13 +152,11 @@ static void ak4114_init_regs(struct ak4114 *chip) |
774 | |
775 | void snd_ak4114_reinit(struct ak4114 *chip) |
776 | { |
777 | - chip->init = 1; |
778 | - mb(); |
779 | - flush_delayed_work(&chip->work); |
780 | + if (atomic_inc_return(&chip->wq_processing) == 1) |
781 | + cancel_delayed_work_sync(&chip->work); |
782 | ak4114_init_regs(chip); |
783 | /* bring up statistics / event queing */ |
784 | - chip->init = 0; |
785 | - if (chip->kctls[0]) |
786 | + if (atomic_dec_and_test(&chip->wq_processing)) |
787 | schedule_delayed_work(&chip->work, HZ / 10); |
788 | } |
789 | |
790 | @@ -612,10 +610,10 @@ static void ak4114_stats(struct work_struct *work) |
791 | { |
792 | struct ak4114 *chip = container_of(work, struct ak4114, work.work); |
793 | |
794 | - if (!chip->init) |
795 | + if (atomic_inc_return(&chip->wq_processing) == 1) |
796 | snd_ak4114_check_rate_and_errors(chip, chip->check_flags); |
797 | - |
798 | - schedule_delayed_work(&chip->work, HZ / 10); |
799 | + if (atomic_dec_and_test(&chip->wq_processing)) |
800 | + schedule_delayed_work(&chip->work, HZ / 10); |
801 | } |
802 | |
803 | EXPORT_SYMBOL(snd_ak4114_create); |
804 | diff --git a/sound/soc/atmel/atmel_ssc_dai.c b/sound/soc/atmel/atmel_ssc_dai.c |
805 | index f3fdfa07fcb9..c5f79591e68b 100644 |
806 | --- a/sound/soc/atmel/atmel_ssc_dai.c |
807 | +++ b/sound/soc/atmel/atmel_ssc_dai.c |
808 | @@ -331,7 +331,6 @@ static int atmel_ssc_hw_params(struct snd_pcm_substream *substream, |
809 | struct atmel_pcm_dma_params *dma_params; |
810 | int dir, channels, bits; |
811 | u32 tfmr, rfmr, tcmr, rcmr; |
812 | - int start_event; |
813 | int ret; |
814 | |
815 | /* |
816 | @@ -450,19 +449,10 @@ static int atmel_ssc_hw_params(struct snd_pcm_substream *substream, |
817 | * The SSC transmit clock is obtained from the BCLK signal on |
818 | * on the TK line, and the SSC receive clock is |
819 | * generated from the transmit clock. |
820 | - * |
821 | - * For single channel data, one sample is transferred |
822 | - * on the falling edge of the LRC clock. |
823 | - * For two channel data, one sample is |
824 | - * transferred on both edges of the LRC clock. |
825 | */ |
826 | - start_event = ((channels == 1) |
827 | - ? SSC_START_FALLING_RF |
828 | - : SSC_START_EDGE_RF); |
829 | - |
830 | rcmr = SSC_BF(RCMR_PERIOD, 0) |
831 | | SSC_BF(RCMR_STTDLY, START_DELAY) |
832 | - | SSC_BF(RCMR_START, start_event) |
833 | + | SSC_BF(RCMR_START, SSC_START_FALLING_RF) |
834 | | SSC_BF(RCMR_CKI, SSC_CKI_RISING) |
835 | | SSC_BF(RCMR_CKO, SSC_CKO_NONE) |
836 | | SSC_BF(RCMR_CKS, SSC_CKS_CLOCK); |
837 | @@ -470,14 +460,14 @@ static int atmel_ssc_hw_params(struct snd_pcm_substream *substream, |
838 | rfmr = SSC_BF(RFMR_FSEDGE, SSC_FSEDGE_POSITIVE) |
839 | | SSC_BF(RFMR_FSOS, SSC_FSOS_NONE) |
840 | | SSC_BF(RFMR_FSLEN, 0) |
841 | - | SSC_BF(RFMR_DATNB, 0) |
842 | + | SSC_BF(RFMR_DATNB, (channels - 1)) |
843 | | SSC_BIT(RFMR_MSBF) |
844 | | SSC_BF(RFMR_LOOP, 0) |
845 | | SSC_BF(RFMR_DATLEN, (bits - 1)); |
846 | |
847 | tcmr = SSC_BF(TCMR_PERIOD, 0) |
848 | | SSC_BF(TCMR_STTDLY, START_DELAY) |
849 | - | SSC_BF(TCMR_START, start_event) |
850 | + | SSC_BF(TCMR_START, SSC_START_FALLING_RF) |
851 | | SSC_BF(TCMR_CKI, SSC_CKI_FALLING) |
852 | | SSC_BF(TCMR_CKO, SSC_CKO_NONE) |
853 | | SSC_BF(TCMR_CKS, SSC_CKS_PIN); |
854 | @@ -486,7 +476,7 @@ static int atmel_ssc_hw_params(struct snd_pcm_substream *substream, |
855 | | SSC_BF(TFMR_FSDEN, 0) |
856 | | SSC_BF(TFMR_FSOS, SSC_FSOS_NONE) |
857 | | SSC_BF(TFMR_FSLEN, 0) |
858 | - | SSC_BF(TFMR_DATNB, 0) |
859 | + | SSC_BF(TFMR_DATNB, (channels - 1)) |
860 | | SSC_BIT(TFMR_MSBF) |
861 | | SSC_BF(TFMR_DATDEF, 0) |
862 | | SSC_BF(TFMR_DATLEN, (bits - 1)); |
863 | diff --git a/sound/soc/codecs/sgtl5000.c b/sound/soc/codecs/sgtl5000.c |
864 | index 23670737116e..3b5f565a23a5 100644 |
865 | --- a/sound/soc/codecs/sgtl5000.c |
866 | +++ b/sound/soc/codecs/sgtl5000.c |
867 | @@ -1242,6 +1242,9 @@ static int sgtl5000_enable_regulators(struct snd_soc_codec *codec) |
868 | /* wait for all power rails bring up */ |
869 | udelay(10); |
870 | |
871 | + /* Need 8 clocks before I2C accesses */ |
872 | + udelay(1); |
873 | + |
874 | /* read chip information */ |
875 | reg = snd_soc_read(codec, SGTL5000_CHIP_ID); |
876 | if (((reg & SGTL5000_PARTID_MASK) >> SGTL5000_PARTID_SHIFT) != |