Annotation of /trunk/kernel-magellan/patches-4.0/0101-4.0.2-all-fixes.patch
Parent Directory | Revision Log
Revision 2564 -
(hide annotations)
(download)
Tue Nov 25 22:54:20 2014 UTC (9 years, 9 months ago) by niro
File size: 287284 byte(s)
Tue Nov 25 22:54:20 2014 UTC (9 years, 9 months ago) by niro
File size: 287284 byte(s)
-linux-4.0.2
1 | niro | 2564 | diff --git a/Documentation/networking/scaling.txt b/Documentation/networking/scaling.txt |
2 | index 99ca40e8e810..5c204df6b689 100644 | ||
3 | --- a/Documentation/networking/scaling.txt | ||
4 | +++ b/Documentation/networking/scaling.txt | ||
5 | @@ -282,7 +282,7 @@ following is true: | ||
6 | |||
7 | - The current CPU's queue head counter >= the recorded tail counter | ||
8 | value in rps_dev_flow[i] | ||
9 | -- The current CPU is unset (equal to RPS_NO_CPU) | ||
10 | +- The current CPU is unset (>= nr_cpu_ids) | ||
11 | - The current CPU is offline | ||
12 | |||
13 | After this check, the packet is sent to the (possibly updated) current | ||
14 | diff --git a/Documentation/virtual/kvm/devices/s390_flic.txt b/Documentation/virtual/kvm/devices/s390_flic.txt | ||
15 | index 4ceef53164b0..d1ad9d5cae46 100644 | ||
16 | --- a/Documentation/virtual/kvm/devices/s390_flic.txt | ||
17 | +++ b/Documentation/virtual/kvm/devices/s390_flic.txt | ||
18 | @@ -27,6 +27,9 @@ Groups: | ||
19 | Copies all floating interrupts into a buffer provided by userspace. | ||
20 | When the buffer is too small it returns -ENOMEM, which is the indication | ||
21 | for userspace to try again with a bigger buffer. | ||
22 | + -ENOBUFS is returned when the allocation of a kernelspace buffer has | ||
23 | + failed. | ||
24 | + -EFAULT is returned when copying data to userspace failed. | ||
25 | All interrupts remain pending, i.e. are not deleted from the list of | ||
26 | currently pending interrupts. | ||
27 | attr->addr contains the userspace address of the buffer into which all | ||
28 | diff --git a/Makefile b/Makefile | ||
29 | index f499cd2f5738..0649a6011a76 100644 | ||
30 | --- a/Makefile | ||
31 | +++ b/Makefile | ||
32 | @@ -1,6 +1,6 @@ | ||
33 | VERSION = 4 | ||
34 | PATCHLEVEL = 0 | ||
35 | -SUBLEVEL = 1 | ||
36 | +SUBLEVEL = 2 | ||
37 | EXTRAVERSION = | ||
38 | NAME = Hurr durr I'ma sheep | ||
39 | |||
40 | diff --git a/arch/arm/boot/dts/at91-sama5d3_xplained.dts b/arch/arm/boot/dts/at91-sama5d3_xplained.dts | ||
41 | index fec1fca2ad66..6c4bc53cbf4e 100644 | ||
42 | --- a/arch/arm/boot/dts/at91-sama5d3_xplained.dts | ||
43 | +++ b/arch/arm/boot/dts/at91-sama5d3_xplained.dts | ||
44 | @@ -167,7 +167,13 @@ | ||
45 | |||
46 | macb1: ethernet@f802c000 { | ||
47 | phy-mode = "rmii"; | ||
48 | + #address-cells = <1>; | ||
49 | + #size-cells = <0>; | ||
50 | status = "okay"; | ||
51 | + | ||
52 | + ethernet-phy@1 { | ||
53 | + reg = <0x1>; | ||
54 | + }; | ||
55 | }; | ||
56 | |||
57 | dbgu: serial@ffffee00 { | ||
58 | diff --git a/arch/arm/boot/dts/dove.dtsi b/arch/arm/boot/dts/dove.dtsi | ||
59 | index a5441d5482a6..3cc8b8320345 100644 | ||
60 | --- a/arch/arm/boot/dts/dove.dtsi | ||
61 | +++ b/arch/arm/boot/dts/dove.dtsi | ||
62 | @@ -154,7 +154,7 @@ | ||
63 | |||
64 | uart2: serial@12200 { | ||
65 | compatible = "ns16550a"; | ||
66 | - reg = <0x12000 0x100>; | ||
67 | + reg = <0x12200 0x100>; | ||
68 | reg-shift = <2>; | ||
69 | interrupts = <9>; | ||
70 | clocks = <&core_clk 0>; | ||
71 | @@ -163,7 +163,7 @@ | ||
72 | |||
73 | uart3: serial@12300 { | ||
74 | compatible = "ns16550a"; | ||
75 | - reg = <0x12100 0x100>; | ||
76 | + reg = <0x12300 0x100>; | ||
77 | reg-shift = <2>; | ||
78 | interrupts = <10>; | ||
79 | clocks = <&core_clk 0>; | ||
80 | diff --git a/arch/arm/boot/dts/exynos5250-spring.dts b/arch/arm/boot/dts/exynos5250-spring.dts | ||
81 | index f02775487cd4..c41600e587e0 100644 | ||
82 | --- a/arch/arm/boot/dts/exynos5250-spring.dts | ||
83 | +++ b/arch/arm/boot/dts/exynos5250-spring.dts | ||
84 | @@ -429,7 +429,6 @@ | ||
85 | &mmc_0 { | ||
86 | status = "okay"; | ||
87 | num-slots = <1>; | ||
88 | - supports-highspeed; | ||
89 | broken-cd; | ||
90 | card-detect-delay = <200>; | ||
91 | samsung,dw-mshc-ciu-div = <3>; | ||
92 | @@ -437,11 +436,8 @@ | ||
93 | samsung,dw-mshc-ddr-timing = <1 2>; | ||
94 | pinctrl-names = "default"; | ||
95 | pinctrl-0 = <&sd0_clk &sd0_cmd &sd0_cd &sd0_bus4 &sd0_bus8>; | ||
96 | - | ||
97 | - slot@0 { | ||
98 | - reg = <0>; | ||
99 | - bus-width = <8>; | ||
100 | - }; | ||
101 | + bus-width = <8>; | ||
102 | + cap-mmc-highspeed; | ||
103 | }; | ||
104 | |||
105 | /* | ||
106 | @@ -451,7 +447,6 @@ | ||
107 | &mmc_1 { | ||
108 | status = "okay"; | ||
109 | num-slots = <1>; | ||
110 | - supports-highspeed; | ||
111 | broken-cd; | ||
112 | card-detect-delay = <200>; | ||
113 | samsung,dw-mshc-ciu-div = <3>; | ||
114 | @@ -459,11 +454,8 @@ | ||
115 | samsung,dw-mshc-ddr-timing = <1 2>; | ||
116 | pinctrl-names = "default"; | ||
117 | pinctrl-0 = <&sd1_clk &sd1_cmd &sd1_cd &sd1_bus4>; | ||
118 | - | ||
119 | - slot@0 { | ||
120 | - reg = <0>; | ||
121 | - bus-width = <4>; | ||
122 | - }; | ||
123 | + bus-width = <4>; | ||
124 | + cap-sd-highspeed; | ||
125 | }; | ||
126 | |||
127 | &pinctrl_0 { | ||
128 | diff --git a/arch/arm/include/asm/elf.h b/arch/arm/include/asm/elf.h | ||
129 | index afb9cafd3786..674d03f4ba15 100644 | ||
130 | --- a/arch/arm/include/asm/elf.h | ||
131 | +++ b/arch/arm/include/asm/elf.h | ||
132 | @@ -115,7 +115,7 @@ int dump_task_regs(struct task_struct *t, elf_gregset_t *elfregs); | ||
133 | the loader. We need to make sure that it is out of the way of the program | ||
134 | that it will "exec", and that there is sufficient room for the brk. */ | ||
135 | |||
136 | -#define ELF_ET_DYN_BASE (2 * TASK_SIZE / 3) | ||
137 | +#define ELF_ET_DYN_BASE (TASK_SIZE / 3 * 2) | ||
138 | |||
139 | /* When the program starts, a1 contains a pointer to a function to be | ||
140 | registered with atexit, as per the SVR4 ABI. A value of 0 means we | ||
141 | diff --git a/arch/arm/include/uapi/asm/kvm.h b/arch/arm/include/uapi/asm/kvm.h | ||
142 | index 0db25bc32864..3a42ac646885 100644 | ||
143 | --- a/arch/arm/include/uapi/asm/kvm.h | ||
144 | +++ b/arch/arm/include/uapi/asm/kvm.h | ||
145 | @@ -195,8 +195,14 @@ struct kvm_arch_memory_slot { | ||
146 | #define KVM_ARM_IRQ_CPU_IRQ 0 | ||
147 | #define KVM_ARM_IRQ_CPU_FIQ 1 | ||
148 | |||
149 | -/* Highest supported SPI, from VGIC_NR_IRQS */ | ||
150 | +/* | ||
151 | + * This used to hold the highest supported SPI, but it is now obsolete | ||
152 | + * and only here to provide source code level compatibility with older | ||
153 | + * userland. The highest SPI number can be set via KVM_DEV_ARM_VGIC_GRP_NR_IRQS. | ||
154 | + */ | ||
155 | +#ifndef __KERNEL__ | ||
156 | #define KVM_ARM_IRQ_GIC_MAX 127 | ||
157 | +#endif | ||
158 | |||
159 | /* PSCI interface */ | ||
160 | #define KVM_PSCI_FN_BASE 0x95c1ba5e | ||
161 | diff --git a/arch/arm/kernel/hibernate.c b/arch/arm/kernel/hibernate.c | ||
162 | index c4cc50e58c13..cfb354ff2a60 100644 | ||
163 | --- a/arch/arm/kernel/hibernate.c | ||
164 | +++ b/arch/arm/kernel/hibernate.c | ||
165 | @@ -22,6 +22,7 @@ | ||
166 | #include <asm/suspend.h> | ||
167 | #include <asm/memory.h> | ||
168 | #include <asm/sections.h> | ||
169 | +#include "reboot.h" | ||
170 | |||
171 | int pfn_is_nosave(unsigned long pfn) | ||
172 | { | ||
173 | @@ -61,7 +62,7 @@ static int notrace arch_save_image(unsigned long unused) | ||
174 | |||
175 | ret = swsusp_save(); | ||
176 | if (ret == 0) | ||
177 | - soft_restart(virt_to_phys(cpu_resume)); | ||
178 | + _soft_restart(virt_to_phys(cpu_resume), false); | ||
179 | return ret; | ||
180 | } | ||
181 | |||
182 | @@ -86,7 +87,7 @@ static void notrace arch_restore_image(void *unused) | ||
183 | for (pbe = restore_pblist; pbe; pbe = pbe->next) | ||
184 | copy_page(pbe->orig_address, pbe->address); | ||
185 | |||
186 | - soft_restart(virt_to_phys(cpu_resume)); | ||
187 | + _soft_restart(virt_to_phys(cpu_resume), false); | ||
188 | } | ||
189 | |||
190 | static u64 resume_stack[PAGE_SIZE/2/sizeof(u64)] __nosavedata; | ||
191 | diff --git a/arch/arm/kernel/process.c b/arch/arm/kernel/process.c | ||
192 | index fdfa3a78ec8c..2bf1a162defb 100644 | ||
193 | --- a/arch/arm/kernel/process.c | ||
194 | +++ b/arch/arm/kernel/process.c | ||
195 | @@ -41,6 +41,7 @@ | ||
196 | #include <asm/system_misc.h> | ||
197 | #include <asm/mach/time.h> | ||
198 | #include <asm/tls.h> | ||
199 | +#include "reboot.h" | ||
200 | |||
201 | #ifdef CONFIG_CC_STACKPROTECTOR | ||
202 | #include <linux/stackprotector.h> | ||
203 | @@ -95,7 +96,7 @@ static void __soft_restart(void *addr) | ||
204 | BUG(); | ||
205 | } | ||
206 | |||
207 | -void soft_restart(unsigned long addr) | ||
208 | +void _soft_restart(unsigned long addr, bool disable_l2) | ||
209 | { | ||
210 | u64 *stack = soft_restart_stack + ARRAY_SIZE(soft_restart_stack); | ||
211 | |||
212 | @@ -104,7 +105,7 @@ void soft_restart(unsigned long addr) | ||
213 | local_fiq_disable(); | ||
214 | |||
215 | /* Disable the L2 if we're the last man standing. */ | ||
216 | - if (num_online_cpus() == 1) | ||
217 | + if (disable_l2) | ||
218 | outer_disable(); | ||
219 | |||
220 | /* Change to the new stack and continue with the reset. */ | ||
221 | @@ -114,6 +115,11 @@ void soft_restart(unsigned long addr) | ||
222 | BUG(); | ||
223 | } | ||
224 | |||
225 | +void soft_restart(unsigned long addr) | ||
226 | +{ | ||
227 | + _soft_restart(addr, num_online_cpus() == 1); | ||
228 | +} | ||
229 | + | ||
230 | /* | ||
231 | * Function pointers to optional machine specific functions | ||
232 | */ | ||
233 | diff --git a/arch/arm/kernel/reboot.h b/arch/arm/kernel/reboot.h | ||
234 | new file mode 100644 | ||
235 | index 000000000000..c87f05816d6b | ||
236 | --- /dev/null | ||
237 | +++ b/arch/arm/kernel/reboot.h | ||
238 | @@ -0,0 +1,6 @@ | ||
239 | +#ifndef REBOOT_H | ||
240 | +#define REBOOT_H | ||
241 | + | ||
242 | +extern void _soft_restart(unsigned long addr, bool disable_l2); | ||
243 | + | ||
244 | +#endif | ||
245 | diff --git a/arch/arm/kvm/arm.c b/arch/arm/kvm/arm.c | ||
246 | index 5560f74f9eee..b652af50fda7 100644 | ||
247 | --- a/arch/arm/kvm/arm.c | ||
248 | +++ b/arch/arm/kvm/arm.c | ||
249 | @@ -651,8 +651,7 @@ int kvm_vm_ioctl_irq_line(struct kvm *kvm, struct kvm_irq_level *irq_level, | ||
250 | if (!irqchip_in_kernel(kvm)) | ||
251 | return -ENXIO; | ||
252 | |||
253 | - if (irq_num < VGIC_NR_PRIVATE_IRQS || | ||
254 | - irq_num > KVM_ARM_IRQ_GIC_MAX) | ||
255 | + if (irq_num < VGIC_NR_PRIVATE_IRQS) | ||
256 | return -EINVAL; | ||
257 | |||
258 | return kvm_vgic_inject_irq(kvm, 0, irq_num, level); | ||
259 | diff --git a/arch/arm/mach-mvebu/pmsu.c b/arch/arm/mach-mvebu/pmsu.c | ||
260 | index 8b9f5e202ccf..4f4e22206ae5 100644 | ||
261 | --- a/arch/arm/mach-mvebu/pmsu.c | ||
262 | +++ b/arch/arm/mach-mvebu/pmsu.c | ||
263 | @@ -415,6 +415,9 @@ static __init int armada_38x_cpuidle_init(void) | ||
264 | void __iomem *mpsoc_base; | ||
265 | u32 reg; | ||
266 | |||
267 | + pr_warn("CPU idle is currently broken on Armada 38x: disabling"); | ||
268 | + return 0; | ||
269 | + | ||
270 | np = of_find_compatible_node(NULL, NULL, | ||
271 | "marvell,armada-380-coherency-fabric"); | ||
272 | if (!np) | ||
273 | @@ -476,6 +479,16 @@ static int __init mvebu_v7_cpu_pm_init(void) | ||
274 | return 0; | ||
275 | of_node_put(np); | ||
276 | |||
277 | + /* | ||
278 | + * Currently the CPU idle support for Armada 38x is broken, as | ||
279 | + * the CPU hotplug uses some of the CPU idle functions it is | ||
280 | + * broken too, so let's disable it | ||
281 | + */ | ||
282 | + if (of_machine_is_compatible("marvell,armada380")) { | ||
283 | + cpu_hotplug_disable(); | ||
284 | + pr_warn("CPU hotplug support is currently broken on Armada 38x: disabling"); | ||
285 | + } | ||
286 | + | ||
287 | if (of_machine_is_compatible("marvell,armadaxp")) | ||
288 | ret = armada_xp_cpuidle_init(); | ||
289 | else if (of_machine_is_compatible("marvell,armada370")) | ||
290 | @@ -489,7 +502,8 @@ static int __init mvebu_v7_cpu_pm_init(void) | ||
291 | return ret; | ||
292 | |||
293 | mvebu_v7_pmsu_enable_l2_powerdown_onidle(); | ||
294 | - platform_device_register(&mvebu_v7_cpuidle_device); | ||
295 | + if (mvebu_v7_cpuidle_device.name) | ||
296 | + platform_device_register(&mvebu_v7_cpuidle_device); | ||
297 | cpu_pm_register_notifier(&mvebu_v7_cpu_pm_notifier); | ||
298 | |||
299 | return 0; | ||
300 | diff --git a/arch/arm/mach-s3c64xx/crag6410.h b/arch/arm/mach-s3c64xx/crag6410.h | ||
301 | index 7bc66682687e..dcbe17f5e5f8 100644 | ||
302 | --- a/arch/arm/mach-s3c64xx/crag6410.h | ||
303 | +++ b/arch/arm/mach-s3c64xx/crag6410.h | ||
304 | @@ -14,6 +14,7 @@ | ||
305 | #include <mach/gpio-samsung.h> | ||
306 | |||
307 | #define GLENFARCLAS_PMIC_IRQ_BASE IRQ_BOARD_START | ||
308 | +#define BANFF_PMIC_IRQ_BASE (IRQ_BOARD_START + 64) | ||
309 | |||
310 | #define PCA935X_GPIO_BASE GPIO_BOARD_START | ||
311 | #define CODEC_GPIO_BASE (GPIO_BOARD_START + 8) | ||
312 | diff --git a/arch/arm/mach-s3c64xx/mach-crag6410.c b/arch/arm/mach-s3c64xx/mach-crag6410.c | ||
313 | index 10b913baab28..65c426bc45f7 100644 | ||
314 | --- a/arch/arm/mach-s3c64xx/mach-crag6410.c | ||
315 | +++ b/arch/arm/mach-s3c64xx/mach-crag6410.c | ||
316 | @@ -554,6 +554,7 @@ static struct wm831x_touch_pdata touch_pdata = { | ||
317 | |||
318 | static struct wm831x_pdata crag_pmic_pdata = { | ||
319 | .wm831x_num = 1, | ||
320 | + .irq_base = BANFF_PMIC_IRQ_BASE, | ||
321 | .gpio_base = BANFF_PMIC_GPIO_BASE, | ||
322 | .soft_shutdown = true, | ||
323 | |||
324 | diff --git a/arch/arm64/Kconfig b/arch/arm64/Kconfig | ||
325 | index 1b8e97331ffb..a6186c24ca47 100644 | ||
326 | --- a/arch/arm64/Kconfig | ||
327 | +++ b/arch/arm64/Kconfig | ||
328 | @@ -361,6 +361,27 @@ config ARM64_ERRATUM_832075 | ||
329 | |||
330 | If unsure, say Y. | ||
331 | |||
332 | +config ARM64_ERRATUM_845719 | ||
333 | + bool "Cortex-A53: 845719: a load might read incorrect data" | ||
334 | + depends on COMPAT | ||
335 | + default y | ||
336 | + help | ||
337 | + This option adds an alternative code sequence to work around ARM | ||
338 | + erratum 845719 on Cortex-A53 parts up to r0p4. | ||
339 | + | ||
340 | + When running a compat (AArch32) userspace on an affected Cortex-A53 | ||
341 | + part, a load at EL0 from a virtual address that matches the bottom 32 | ||
342 | + bits of the virtual address used by a recent load at (AArch64) EL1 | ||
343 | + might return incorrect data. | ||
344 | + | ||
345 | + The workaround is to write the contextidr_el1 register on exception | ||
346 | + return to a 32-bit task. | ||
347 | + Please note that this does not necessarily enable the workaround, | ||
348 | + as it depends on the alternative framework, which will only patch | ||
349 | + the kernel if an affected CPU is detected. | ||
350 | + | ||
351 | + If unsure, say Y. | ||
352 | + | ||
353 | endmenu | ||
354 | |||
355 | |||
356 | @@ -470,6 +491,10 @@ config HOTPLUG_CPU | ||
357 | |||
358 | source kernel/Kconfig.preempt | ||
359 | |||
360 | +config UP_LATE_INIT | ||
361 | + def_bool y | ||
362 | + depends on !SMP | ||
363 | + | ||
364 | config HZ | ||
365 | int | ||
366 | default 100 | ||
367 | diff --git a/arch/arm64/Makefile b/arch/arm64/Makefile | ||
368 | index 69ceedc982a5..4d2a925998f9 100644 | ||
369 | --- a/arch/arm64/Makefile | ||
370 | +++ b/arch/arm64/Makefile | ||
371 | @@ -48,7 +48,7 @@ core-$(CONFIG_KVM) += arch/arm64/kvm/ | ||
372 | core-$(CONFIG_XEN) += arch/arm64/xen/ | ||
373 | core-$(CONFIG_CRYPTO) += arch/arm64/crypto/ | ||
374 | libs-y := arch/arm64/lib/ $(libs-y) | ||
375 | -libs-$(CONFIG_EFI_STUB) += drivers/firmware/efi/libstub/ | ||
376 | +core-$(CONFIG_EFI_STUB) += $(objtree)/drivers/firmware/efi/libstub/lib.a | ||
377 | |||
378 | # Default target when executing plain make | ||
379 | KBUILD_IMAGE := Image.gz | ||
380 | diff --git a/arch/arm64/include/asm/cpufeature.h b/arch/arm64/include/asm/cpufeature.h | ||
381 | index b6c16d5f622f..3f0c53c45771 100644 | ||
382 | --- a/arch/arm64/include/asm/cpufeature.h | ||
383 | +++ b/arch/arm64/include/asm/cpufeature.h | ||
384 | @@ -23,8 +23,9 @@ | ||
385 | |||
386 | #define ARM64_WORKAROUND_CLEAN_CACHE 0 | ||
387 | #define ARM64_WORKAROUND_DEVICE_LOAD_ACQUIRE 1 | ||
388 | +#define ARM64_WORKAROUND_845719 2 | ||
389 | |||
390 | -#define ARM64_NCAPS 2 | ||
391 | +#define ARM64_NCAPS 3 | ||
392 | |||
393 | #ifndef __ASSEMBLY__ | ||
394 | |||
395 | diff --git a/arch/arm64/include/asm/smp_plat.h b/arch/arm64/include/asm/smp_plat.h | ||
396 | index 59e282311b58..8dcd61e32176 100644 | ||
397 | --- a/arch/arm64/include/asm/smp_plat.h | ||
398 | +++ b/arch/arm64/include/asm/smp_plat.h | ||
399 | @@ -40,4 +40,6 @@ static inline u32 mpidr_hash_size(void) | ||
400 | extern u64 __cpu_logical_map[NR_CPUS]; | ||
401 | #define cpu_logical_map(cpu) __cpu_logical_map[cpu] | ||
402 | |||
403 | +void __init do_post_cpus_up_work(void); | ||
404 | + | ||
405 | #endif /* __ASM_SMP_PLAT_H */ | ||
406 | diff --git a/arch/arm64/include/uapi/asm/kvm.h b/arch/arm64/include/uapi/asm/kvm.h | ||
407 | index 3ef77a466018..bc49a1886b61 100644 | ||
408 | --- a/arch/arm64/include/uapi/asm/kvm.h | ||
409 | +++ b/arch/arm64/include/uapi/asm/kvm.h | ||
410 | @@ -188,8 +188,14 @@ struct kvm_arch_memory_slot { | ||
411 | #define KVM_ARM_IRQ_CPU_IRQ 0 | ||
412 | #define KVM_ARM_IRQ_CPU_FIQ 1 | ||
413 | |||
414 | -/* Highest supported SPI, from VGIC_NR_IRQS */ | ||
415 | +/* | ||
416 | + * This used to hold the highest supported SPI, but it is now obsolete | ||
417 | + * and only here to provide source code level compatibility with older | ||
418 | + * userland. The highest SPI number can be set via KVM_DEV_ARM_VGIC_GRP_NR_IRQS. | ||
419 | + */ | ||
420 | +#ifndef __KERNEL__ | ||
421 | #define KVM_ARM_IRQ_GIC_MAX 127 | ||
422 | +#endif | ||
423 | |||
424 | /* PSCI interface */ | ||
425 | #define KVM_PSCI_FN_BASE 0x95c1ba5e | ||
426 | diff --git a/arch/arm64/kernel/cpu_errata.c b/arch/arm64/kernel/cpu_errata.c | ||
427 | index fa62637e63a8..ad6d52392bb1 100644 | ||
428 | --- a/arch/arm64/kernel/cpu_errata.c | ||
429 | +++ b/arch/arm64/kernel/cpu_errata.c | ||
430 | @@ -88,7 +88,16 @@ struct arm64_cpu_capabilities arm64_errata[] = { | ||
431 | /* Cortex-A57 r0p0 - r1p2 */ | ||
432 | .desc = "ARM erratum 832075", | ||
433 | .capability = ARM64_WORKAROUND_DEVICE_LOAD_ACQUIRE, | ||
434 | - MIDR_RANGE(MIDR_CORTEX_A57, 0x00, 0x12), | ||
435 | + MIDR_RANGE(MIDR_CORTEX_A57, 0x00, | ||
436 | + (1 << MIDR_VARIANT_SHIFT) | 2), | ||
437 | + }, | ||
438 | +#endif | ||
439 | +#ifdef CONFIG_ARM64_ERRATUM_845719 | ||
440 | + { | ||
441 | + /* Cortex-A53 r0p[01234] */ | ||
442 | + .desc = "ARM erratum 845719", | ||
443 | + .capability = ARM64_WORKAROUND_845719, | ||
444 | + MIDR_RANGE(MIDR_CORTEX_A53, 0x00, 0x04), | ||
445 | }, | ||
446 | #endif | ||
447 | { | ||
448 | diff --git a/arch/arm64/kernel/entry.S b/arch/arm64/kernel/entry.S | ||
449 | index cf21bb3bf752..959fe8733560 100644 | ||
450 | --- a/arch/arm64/kernel/entry.S | ||
451 | +++ b/arch/arm64/kernel/entry.S | ||
452 | @@ -21,8 +21,10 @@ | ||
453 | #include <linux/init.h> | ||
454 | #include <linux/linkage.h> | ||
455 | |||
456 | +#include <asm/alternative-asm.h> | ||
457 | #include <asm/assembler.h> | ||
458 | #include <asm/asm-offsets.h> | ||
459 | +#include <asm/cpufeature.h> | ||
460 | #include <asm/errno.h> | ||
461 | #include <asm/esr.h> | ||
462 | #include <asm/thread_info.h> | ||
463 | @@ -120,6 +122,24 @@ | ||
464 | ct_user_enter | ||
465 | ldr x23, [sp, #S_SP] // load return stack pointer | ||
466 | msr sp_el0, x23 | ||
467 | + | ||
468 | +#ifdef CONFIG_ARM64_ERRATUM_845719 | ||
469 | + alternative_insn \ | ||
470 | + "nop", \ | ||
471 | + "tbz x22, #4, 1f", \ | ||
472 | + ARM64_WORKAROUND_845719 | ||
473 | +#ifdef CONFIG_PID_IN_CONTEXTIDR | ||
474 | + alternative_insn \ | ||
475 | + "nop; nop", \ | ||
476 | + "mrs x29, contextidr_el1; msr contextidr_el1, x29; 1:", \ | ||
477 | + ARM64_WORKAROUND_845719 | ||
478 | +#else | ||
479 | + alternative_insn \ | ||
480 | + "nop", \ | ||
481 | + "msr contextidr_el1, xzr; 1:", \ | ||
482 | + ARM64_WORKAROUND_845719 | ||
483 | +#endif | ||
484 | +#endif | ||
485 | .endif | ||
486 | msr elr_el1, x21 // set up the return data | ||
487 | msr spsr_el1, x22 | ||
488 | diff --git a/arch/arm64/kernel/head.S b/arch/arm64/kernel/head.S | ||
489 | index 07f930540f4a..c237ffb0effe 100644 | ||
490 | --- a/arch/arm64/kernel/head.S | ||
491 | +++ b/arch/arm64/kernel/head.S | ||
492 | @@ -426,6 +426,7 @@ __create_page_tables: | ||
493 | */ | ||
494 | mov x0, x25 | ||
495 | add x1, x26, #SWAPPER_DIR_SIZE | ||
496 | + dmb sy | ||
497 | bl __inval_cache_range | ||
498 | |||
499 | mov lr, x27 | ||
500 | diff --git a/arch/arm64/kernel/setup.c b/arch/arm64/kernel/setup.c | ||
501 | index e8420f635bd4..781f4697dc26 100644 | ||
502 | --- a/arch/arm64/kernel/setup.c | ||
503 | +++ b/arch/arm64/kernel/setup.c | ||
504 | @@ -207,6 +207,18 @@ static void __init smp_build_mpidr_hash(void) | ||
505 | } | ||
506 | #endif | ||
507 | |||
508 | +void __init do_post_cpus_up_work(void) | ||
509 | +{ | ||
510 | + apply_alternatives_all(); | ||
511 | +} | ||
512 | + | ||
513 | +#ifdef CONFIG_UP_LATE_INIT | ||
514 | +void __init up_late_init(void) | ||
515 | +{ | ||
516 | + do_post_cpus_up_work(); | ||
517 | +} | ||
518 | +#endif /* CONFIG_UP_LATE_INIT */ | ||
519 | + | ||
520 | static void __init setup_processor(void) | ||
521 | { | ||
522 | struct cpu_info *cpu_info; | ||
523 | diff --git a/arch/arm64/kernel/smp.c b/arch/arm64/kernel/smp.c | ||
524 | index 328b8ce4b007..4257369341e4 100644 | ||
525 | --- a/arch/arm64/kernel/smp.c | ||
526 | +++ b/arch/arm64/kernel/smp.c | ||
527 | @@ -309,7 +309,7 @@ void cpu_die(void) | ||
528 | void __init smp_cpus_done(unsigned int max_cpus) | ||
529 | { | ||
530 | pr_info("SMP: Total of %d processors activated.\n", num_online_cpus()); | ||
531 | - apply_alternatives_all(); | ||
532 | + do_post_cpus_up_work(); | ||
533 | } | ||
534 | |||
535 | void __init smp_prepare_boot_cpu(void) | ||
536 | diff --git a/arch/c6x/kernel/time.c b/arch/c6x/kernel/time.c | ||
537 | index 356ee84cad95..04845aaf5985 100644 | ||
538 | --- a/arch/c6x/kernel/time.c | ||
539 | +++ b/arch/c6x/kernel/time.c | ||
540 | @@ -49,7 +49,7 @@ u64 sched_clock(void) | ||
541 | return (tsc * sched_clock_multiplier) >> SCHED_CLOCK_SHIFT; | ||
542 | } | ||
543 | |||
544 | -void time_init(void) | ||
545 | +void __init time_init(void) | ||
546 | { | ||
547 | u64 tmp = (u64)NSEC_PER_SEC << SCHED_CLOCK_SHIFT; | ||
548 | |||
549 | diff --git a/arch/mips/include/asm/asm-eva.h b/arch/mips/include/asm/asm-eva.h | ||
550 | index e41c56e375b1..1e38f0e1ea3e 100644 | ||
551 | --- a/arch/mips/include/asm/asm-eva.h | ||
552 | +++ b/arch/mips/include/asm/asm-eva.h | ||
553 | @@ -11,6 +11,36 @@ | ||
554 | #define __ASM_ASM_EVA_H | ||
555 | |||
556 | #ifndef __ASSEMBLY__ | ||
557 | + | ||
558 | +/* Kernel variants */ | ||
559 | + | ||
560 | +#define kernel_cache(op, base) "cache " op ", " base "\n" | ||
561 | +#define kernel_ll(reg, addr) "ll " reg ", " addr "\n" | ||
562 | +#define kernel_sc(reg, addr) "sc " reg ", " addr "\n" | ||
563 | +#define kernel_lw(reg, addr) "lw " reg ", " addr "\n" | ||
564 | +#define kernel_lwl(reg, addr) "lwl " reg ", " addr "\n" | ||
565 | +#define kernel_lwr(reg, addr) "lwr " reg ", " addr "\n" | ||
566 | +#define kernel_lh(reg, addr) "lh " reg ", " addr "\n" | ||
567 | +#define kernel_lb(reg, addr) "lb " reg ", " addr "\n" | ||
568 | +#define kernel_lbu(reg, addr) "lbu " reg ", " addr "\n" | ||
569 | +#define kernel_sw(reg, addr) "sw " reg ", " addr "\n" | ||
570 | +#define kernel_swl(reg, addr) "swl " reg ", " addr "\n" | ||
571 | +#define kernel_swr(reg, addr) "swr " reg ", " addr "\n" | ||
572 | +#define kernel_sh(reg, addr) "sh " reg ", " addr "\n" | ||
573 | +#define kernel_sb(reg, addr) "sb " reg ", " addr "\n" | ||
574 | + | ||
575 | +#ifdef CONFIG_32BIT | ||
576 | +/* | ||
577 | + * No 'sd' or 'ld' instructions in 32-bit but the code will | ||
578 | + * do the correct thing | ||
579 | + */ | ||
580 | +#define kernel_sd(reg, addr) user_sw(reg, addr) | ||
581 | +#define kernel_ld(reg, addr) user_lw(reg, addr) | ||
582 | +#else | ||
583 | +#define kernel_sd(reg, addr) "sd " reg", " addr "\n" | ||
584 | +#define kernel_ld(reg, addr) "ld " reg", " addr "\n" | ||
585 | +#endif /* CONFIG_32BIT */ | ||
586 | + | ||
587 | #ifdef CONFIG_EVA | ||
588 | |||
589 | #define __BUILD_EVA_INSN(insn, reg, addr) \ | ||
590 | @@ -41,37 +71,60 @@ | ||
591 | |||
592 | #else | ||
593 | |||
594 | -#define user_cache(op, base) "cache " op ", " base "\n" | ||
595 | -#define user_ll(reg, addr) "ll " reg ", " addr "\n" | ||
596 | -#define user_sc(reg, addr) "sc " reg ", " addr "\n" | ||
597 | -#define user_lw(reg, addr) "lw " reg ", " addr "\n" | ||
598 | -#define user_lwl(reg, addr) "lwl " reg ", " addr "\n" | ||
599 | -#define user_lwr(reg, addr) "lwr " reg ", " addr "\n" | ||
600 | -#define user_lh(reg, addr) "lh " reg ", " addr "\n" | ||
601 | -#define user_lb(reg, addr) "lb " reg ", " addr "\n" | ||
602 | -#define user_lbu(reg, addr) "lbu " reg ", " addr "\n" | ||
603 | -#define user_sw(reg, addr) "sw " reg ", " addr "\n" | ||
604 | -#define user_swl(reg, addr) "swl " reg ", " addr "\n" | ||
605 | -#define user_swr(reg, addr) "swr " reg ", " addr "\n" | ||
606 | -#define user_sh(reg, addr) "sh " reg ", " addr "\n" | ||
607 | -#define user_sb(reg, addr) "sb " reg ", " addr "\n" | ||
608 | +#define user_cache(op, base) kernel_cache(op, base) | ||
609 | +#define user_ll(reg, addr) kernel_ll(reg, addr) | ||
610 | +#define user_sc(reg, addr) kernel_sc(reg, addr) | ||
611 | +#define user_lw(reg, addr) kernel_lw(reg, addr) | ||
612 | +#define user_lwl(reg, addr) kernel_lwl(reg, addr) | ||
613 | +#define user_lwr(reg, addr) kernel_lwr(reg, addr) | ||
614 | +#define user_lh(reg, addr) kernel_lh(reg, addr) | ||
615 | +#define user_lb(reg, addr) kernel_lb(reg, addr) | ||
616 | +#define user_lbu(reg, addr) kernel_lbu(reg, addr) | ||
617 | +#define user_sw(reg, addr) kernel_sw(reg, addr) | ||
618 | +#define user_swl(reg, addr) kernel_swl(reg, addr) | ||
619 | +#define user_swr(reg, addr) kernel_swr(reg, addr) | ||
620 | +#define user_sh(reg, addr) kernel_sh(reg, addr) | ||
621 | +#define user_sb(reg, addr) kernel_sb(reg, addr) | ||
622 | |||
623 | #ifdef CONFIG_32BIT | ||
624 | -/* | ||
625 | - * No 'sd' or 'ld' instructions in 32-bit but the code will | ||
626 | - * do the correct thing | ||
627 | - */ | ||
628 | -#define user_sd(reg, addr) user_sw(reg, addr) | ||
629 | -#define user_ld(reg, addr) user_lw(reg, addr) | ||
630 | +#define user_sd(reg, addr) kernel_sw(reg, addr) | ||
631 | +#define user_ld(reg, addr) kernel_lw(reg, addr) | ||
632 | #else | ||
633 | -#define user_sd(reg, addr) "sd " reg", " addr "\n" | ||
634 | -#define user_ld(reg, addr) "ld " reg", " addr "\n" | ||
635 | +#define user_sd(reg, addr) kernel_sd(reg, addr) | ||
636 | +#define user_ld(reg, addr) kernel_ld(reg, addr) | ||
637 | #endif /* CONFIG_32BIT */ | ||
638 | |||
639 | #endif /* CONFIG_EVA */ | ||
640 | |||
641 | #else /* __ASSEMBLY__ */ | ||
642 | |||
643 | +#define kernel_cache(op, base) cache op, base | ||
644 | +#define kernel_ll(reg, addr) ll reg, addr | ||
645 | +#define kernel_sc(reg, addr) sc reg, addr | ||
646 | +#define kernel_lw(reg, addr) lw reg, addr | ||
647 | +#define kernel_lwl(reg, addr) lwl reg, addr | ||
648 | +#define kernel_lwr(reg, addr) lwr reg, addr | ||
649 | +#define kernel_lh(reg, addr) lh reg, addr | ||
650 | +#define kernel_lb(reg, addr) lb reg, addr | ||
651 | +#define kernel_lbu(reg, addr) lbu reg, addr | ||
652 | +#define kernel_sw(reg, addr) sw reg, addr | ||
653 | +#define kernel_swl(reg, addr) swl reg, addr | ||
654 | +#define kernel_swr(reg, addr) swr reg, addr | ||
655 | +#define kernel_sh(reg, addr) sh reg, addr | ||
656 | +#define kernel_sb(reg, addr) sb reg, addr | ||
657 | + | ||
658 | +#ifdef CONFIG_32BIT | ||
659 | +/* | ||
660 | + * No 'sd' or 'ld' instructions in 32-bit but the code will | ||
661 | + * do the correct thing | ||
662 | + */ | ||
663 | +#define kernel_sd(reg, addr) user_sw(reg, addr) | ||
664 | +#define kernel_ld(reg, addr) user_lw(reg, addr) | ||
665 | +#else | ||
666 | +#define kernel_sd(reg, addr) sd reg, addr | ||
667 | +#define kernel_ld(reg, addr) ld reg, addr | ||
668 | +#endif /* CONFIG_32BIT */ | ||
669 | + | ||
670 | #ifdef CONFIG_EVA | ||
671 | |||
672 | #define __BUILD_EVA_INSN(insn, reg, addr) \ | ||
673 | @@ -101,31 +154,27 @@ | ||
674 | #define user_sd(reg, addr) user_sw(reg, addr) | ||
675 | #else | ||
676 | |||
677 | -#define user_cache(op, base) cache op, base | ||
678 | -#define user_ll(reg, addr) ll reg, addr | ||
679 | -#define user_sc(reg, addr) sc reg, addr | ||
680 | -#define user_lw(reg, addr) lw reg, addr | ||
681 | -#define user_lwl(reg, addr) lwl reg, addr | ||
682 | -#define user_lwr(reg, addr) lwr reg, addr | ||
683 | -#define user_lh(reg, addr) lh reg, addr | ||
684 | -#define user_lb(reg, addr) lb reg, addr | ||
685 | -#define user_lbu(reg, addr) lbu reg, addr | ||
686 | -#define user_sw(reg, addr) sw reg, addr | ||
687 | -#define user_swl(reg, addr) swl reg, addr | ||
688 | -#define user_swr(reg, addr) swr reg, addr | ||
689 | -#define user_sh(reg, addr) sh reg, addr | ||
690 | -#define user_sb(reg, addr) sb reg, addr | ||
691 | +#define user_cache(op, base) kernel_cache(op, base) | ||
692 | +#define user_ll(reg, addr) kernel_ll(reg, addr) | ||
693 | +#define user_sc(reg, addr) kernel_sc(reg, addr) | ||
694 | +#define user_lw(reg, addr) kernel_lw(reg, addr) | ||
695 | +#define user_lwl(reg, addr) kernel_lwl(reg, addr) | ||
696 | +#define user_lwr(reg, addr) kernel_lwr(reg, addr) | ||
697 | +#define user_lh(reg, addr) kernel_lh(reg, addr) | ||
698 | +#define user_lb(reg, addr) kernel_lb(reg, addr) | ||
699 | +#define user_lbu(reg, addr) kernel_lbu(reg, addr) | ||
700 | +#define user_sw(reg, addr) kernel_sw(reg, addr) | ||
701 | +#define user_swl(reg, addr) kernel_swl(reg, addr) | ||
702 | +#define user_swr(reg, addr) kernel_swr(reg, addr) | ||
703 | +#define user_sh(reg, addr) kernel_sh(reg, addr) | ||
704 | +#define user_sb(reg, addr) kernel_sb(reg, addr) | ||
705 | |||
706 | #ifdef CONFIG_32BIT | ||
707 | -/* | ||
708 | - * No 'sd' or 'ld' instructions in 32-bit but the code will | ||
709 | - * do the correct thing | ||
710 | - */ | ||
711 | -#define user_sd(reg, addr) user_sw(reg, addr) | ||
712 | -#define user_ld(reg, addr) user_lw(reg, addr) | ||
713 | +#define user_sd(reg, addr) kernel_sw(reg, addr) | ||
714 | +#define user_ld(reg, addr) kernel_lw(reg, addr) | ||
715 | #else | ||
716 | -#define user_sd(reg, addr) sd reg, addr | ||
717 | -#define user_ld(reg, addr) ld reg, addr | ||
718 | +#define user_sd(reg, addr) kernel_sd(reg, addr) | ||
719 | +#define user_ld(reg, addr) kernel_sd(reg, addr) | ||
720 | #endif /* CONFIG_32BIT */ | ||
721 | |||
722 | #endif /* CONFIG_EVA */ | ||
723 | diff --git a/arch/mips/include/asm/fpu.h b/arch/mips/include/asm/fpu.h | ||
724 | index dd083e999b08..9f26b079cc6a 100644 | ||
725 | --- a/arch/mips/include/asm/fpu.h | ||
726 | +++ b/arch/mips/include/asm/fpu.h | ||
727 | @@ -170,6 +170,7 @@ static inline void lose_fpu(int save) | ||
728 | } | ||
729 | disable_msa(); | ||
730 | clear_thread_flag(TIF_USEDMSA); | ||
731 | + __disable_fpu(); | ||
732 | } else if (is_fpu_owner()) { | ||
733 | if (save) | ||
734 | _save_fp(current); | ||
735 | diff --git a/arch/mips/include/asm/kvm_host.h b/arch/mips/include/asm/kvm_host.h | ||
736 | index ac4fc716062b..f722b0528c25 100644 | ||
737 | --- a/arch/mips/include/asm/kvm_host.h | ||
738 | +++ b/arch/mips/include/asm/kvm_host.h | ||
739 | @@ -322,6 +322,7 @@ enum mips_mmu_types { | ||
740 | #define T_TRAP 13 /* Trap instruction */ | ||
741 | #define T_VCEI 14 /* Virtual coherency exception */ | ||
742 | #define T_FPE 15 /* Floating point exception */ | ||
743 | +#define T_MSADIS 21 /* MSA disabled exception */ | ||
744 | #define T_WATCH 23 /* Watch address reference */ | ||
745 | #define T_VCED 31 /* Virtual coherency data */ | ||
746 | |||
747 | @@ -578,6 +579,7 @@ struct kvm_mips_callbacks { | ||
748 | int (*handle_syscall)(struct kvm_vcpu *vcpu); | ||
749 | int (*handle_res_inst)(struct kvm_vcpu *vcpu); | ||
750 | int (*handle_break)(struct kvm_vcpu *vcpu); | ||
751 | + int (*handle_msa_disabled)(struct kvm_vcpu *vcpu); | ||
752 | int (*vm_init)(struct kvm *kvm); | ||
753 | int (*vcpu_init)(struct kvm_vcpu *vcpu); | ||
754 | int (*vcpu_setup)(struct kvm_vcpu *vcpu); | ||
755 | diff --git a/arch/mips/kernel/unaligned.c b/arch/mips/kernel/unaligned.c | ||
756 | index bbb69695a0a1..7659da224fcd 100644 | ||
757 | --- a/arch/mips/kernel/unaligned.c | ||
758 | +++ b/arch/mips/kernel/unaligned.c | ||
759 | @@ -109,10 +109,11 @@ static u32 unaligned_action; | ||
760 | extern void show_registers(struct pt_regs *regs); | ||
761 | |||
762 | #ifdef __BIG_ENDIAN | ||
763 | -#define LoadHW(addr, value, res) \ | ||
764 | +#define _LoadHW(addr, value, res, type) \ | ||
765 | +do { \ | ||
766 | __asm__ __volatile__ (".set\tnoat\n" \ | ||
767 | - "1:\t"user_lb("%0", "0(%2)")"\n" \ | ||
768 | - "2:\t"user_lbu("$1", "1(%2)")"\n\t" \ | ||
769 | + "1:\t"type##_lb("%0", "0(%2)")"\n" \ | ||
770 | + "2:\t"type##_lbu("$1", "1(%2)")"\n\t"\ | ||
771 | "sll\t%0, 0x8\n\t" \ | ||
772 | "or\t%0, $1\n\t" \ | ||
773 | "li\t%1, 0\n" \ | ||
774 | @@ -127,13 +128,15 @@ extern void show_registers(struct pt_regs *regs); | ||
775 | STR(PTR)"\t2b, 4b\n\t" \ | ||
776 | ".previous" \ | ||
777 | : "=&r" (value), "=r" (res) \ | ||
778 | - : "r" (addr), "i" (-EFAULT)); | ||
779 | + : "r" (addr), "i" (-EFAULT)); \ | ||
780 | +} while(0) | ||
781 | |||
782 | #ifndef CONFIG_CPU_MIPSR6 | ||
783 | -#define LoadW(addr, value, res) \ | ||
784 | +#define _LoadW(addr, value, res, type) \ | ||
785 | +do { \ | ||
786 | __asm__ __volatile__ ( \ | ||
787 | - "1:\t"user_lwl("%0", "(%2)")"\n" \ | ||
788 | - "2:\t"user_lwr("%0", "3(%2)")"\n\t" \ | ||
789 | + "1:\t"type##_lwl("%0", "(%2)")"\n" \ | ||
790 | + "2:\t"type##_lwr("%0", "3(%2)")"\n\t"\ | ||
791 | "li\t%1, 0\n" \ | ||
792 | "3:\n\t" \ | ||
793 | ".insn\n\t" \ | ||
794 | @@ -146,21 +149,24 @@ extern void show_registers(struct pt_regs *regs); | ||
795 | STR(PTR)"\t2b, 4b\n\t" \ | ||
796 | ".previous" \ | ||
797 | : "=&r" (value), "=r" (res) \ | ||
798 | - : "r" (addr), "i" (-EFAULT)); | ||
799 | + : "r" (addr), "i" (-EFAULT)); \ | ||
800 | +} while(0) | ||
801 | + | ||
802 | #else | ||
803 | /* MIPSR6 has no lwl instruction */ | ||
804 | -#define LoadW(addr, value, res) \ | ||
805 | +#define _LoadW(addr, value, res, type) \ | ||
806 | +do { \ | ||
807 | __asm__ __volatile__ ( \ | ||
808 | ".set\tpush\n" \ | ||
809 | ".set\tnoat\n\t" \ | ||
810 | - "1:"user_lb("%0", "0(%2)")"\n\t" \ | ||
811 | - "2:"user_lbu("$1", "1(%2)")"\n\t" \ | ||
812 | + "1:"type##_lb("%0", "0(%2)")"\n\t" \ | ||
813 | + "2:"type##_lbu("$1", "1(%2)")"\n\t" \ | ||
814 | "sll\t%0, 0x8\n\t" \ | ||
815 | "or\t%0, $1\n\t" \ | ||
816 | - "3:"user_lbu("$1", "2(%2)")"\n\t" \ | ||
817 | + "3:"type##_lbu("$1", "2(%2)")"\n\t" \ | ||
818 | "sll\t%0, 0x8\n\t" \ | ||
819 | "or\t%0, $1\n\t" \ | ||
820 | - "4:"user_lbu("$1", "3(%2)")"\n\t" \ | ||
821 | + "4:"type##_lbu("$1", "3(%2)")"\n\t" \ | ||
822 | "sll\t%0, 0x8\n\t" \ | ||
823 | "or\t%0, $1\n\t" \ | ||
824 | "li\t%1, 0\n" \ | ||
825 | @@ -178,14 +184,17 @@ extern void show_registers(struct pt_regs *regs); | ||
826 | STR(PTR)"\t4b, 11b\n\t" \ | ||
827 | ".previous" \ | ||
828 | : "=&r" (value), "=r" (res) \ | ||
829 | - : "r" (addr), "i" (-EFAULT)); | ||
830 | + : "r" (addr), "i" (-EFAULT)); \ | ||
831 | +} while(0) | ||
832 | + | ||
833 | #endif /* CONFIG_CPU_MIPSR6 */ | ||
834 | |||
835 | -#define LoadHWU(addr, value, res) \ | ||
836 | +#define _LoadHWU(addr, value, res, type) \ | ||
837 | +do { \ | ||
838 | __asm__ __volatile__ ( \ | ||
839 | ".set\tnoat\n" \ | ||
840 | - "1:\t"user_lbu("%0", "0(%2)")"\n" \ | ||
841 | - "2:\t"user_lbu("$1", "1(%2)")"\n\t" \ | ||
842 | + "1:\t"type##_lbu("%0", "0(%2)")"\n" \ | ||
843 | + "2:\t"type##_lbu("$1", "1(%2)")"\n\t"\ | ||
844 | "sll\t%0, 0x8\n\t" \ | ||
845 | "or\t%0, $1\n\t" \ | ||
846 | "li\t%1, 0\n" \ | ||
847 | @@ -201,13 +210,15 @@ extern void show_registers(struct pt_regs *regs); | ||
848 | STR(PTR)"\t2b, 4b\n\t" \ | ||
849 | ".previous" \ | ||
850 | : "=&r" (value), "=r" (res) \ | ||
851 | - : "r" (addr), "i" (-EFAULT)); | ||
852 | + : "r" (addr), "i" (-EFAULT)); \ | ||
853 | +} while(0) | ||
854 | |||
855 | #ifndef CONFIG_CPU_MIPSR6 | ||
856 | -#define LoadWU(addr, value, res) \ | ||
857 | +#define _LoadWU(addr, value, res, type) \ | ||
858 | +do { \ | ||
859 | __asm__ __volatile__ ( \ | ||
860 | - "1:\t"user_lwl("%0", "(%2)")"\n" \ | ||
861 | - "2:\t"user_lwr("%0", "3(%2)")"\n\t" \ | ||
862 | + "1:\t"type##_lwl("%0", "(%2)")"\n" \ | ||
863 | + "2:\t"type##_lwr("%0", "3(%2)")"\n\t"\ | ||
864 | "dsll\t%0, %0, 32\n\t" \ | ||
865 | "dsrl\t%0, %0, 32\n\t" \ | ||
866 | "li\t%1, 0\n" \ | ||
867 | @@ -222,9 +233,11 @@ extern void show_registers(struct pt_regs *regs); | ||
868 | STR(PTR)"\t2b, 4b\n\t" \ | ||
869 | ".previous" \ | ||
870 | : "=&r" (value), "=r" (res) \ | ||
871 | - : "r" (addr), "i" (-EFAULT)); | ||
872 | + : "r" (addr), "i" (-EFAULT)); \ | ||
873 | +} while(0) | ||
874 | |||
875 | -#define LoadDW(addr, value, res) \ | ||
876 | +#define _LoadDW(addr, value, res) \ | ||
877 | +do { \ | ||
878 | __asm__ __volatile__ ( \ | ||
879 | "1:\tldl\t%0, (%2)\n" \ | ||
880 | "2:\tldr\t%0, 7(%2)\n\t" \ | ||
881 | @@ -240,21 +253,24 @@ extern void show_registers(struct pt_regs *regs); | ||
882 | STR(PTR)"\t2b, 4b\n\t" \ | ||
883 | ".previous" \ | ||
884 | : "=&r" (value), "=r" (res) \ | ||
885 | - : "r" (addr), "i" (-EFAULT)); | ||
886 | + : "r" (addr), "i" (-EFAULT)); \ | ||
887 | +} while(0) | ||
888 | + | ||
889 | #else | ||
890 | /* MIPSR6 has not lwl and ldl instructions */ | ||
891 | -#define LoadWU(addr, value, res) \ | ||
892 | +#define _LoadWU(addr, value, res, type) \ | ||
893 | +do { \ | ||
894 | __asm__ __volatile__ ( \ | ||
895 | ".set\tpush\n\t" \ | ||
896 | ".set\tnoat\n\t" \ | ||
897 | - "1:"user_lbu("%0", "0(%2)")"\n\t" \ | ||
898 | - "2:"user_lbu("$1", "1(%2)")"\n\t" \ | ||
899 | + "1:"type##_lbu("%0", "0(%2)")"\n\t" \ | ||
900 | + "2:"type##_lbu("$1", "1(%2)")"\n\t" \ | ||
901 | "sll\t%0, 0x8\n\t" \ | ||
902 | "or\t%0, $1\n\t" \ | ||
903 | - "3:"user_lbu("$1", "2(%2)")"\n\t" \ | ||
904 | + "3:"type##_lbu("$1", "2(%2)")"\n\t" \ | ||
905 | "sll\t%0, 0x8\n\t" \ | ||
906 | "or\t%0, $1\n\t" \ | ||
907 | - "4:"user_lbu("$1", "3(%2)")"\n\t" \ | ||
908 | + "4:"type##_lbu("$1", "3(%2)")"\n\t" \ | ||
909 | "sll\t%0, 0x8\n\t" \ | ||
910 | "or\t%0, $1\n\t" \ | ||
911 | "li\t%1, 0\n" \ | ||
912 | @@ -272,9 +288,11 @@ extern void show_registers(struct pt_regs *regs); | ||
913 | STR(PTR)"\t4b, 11b\n\t" \ | ||
914 | ".previous" \ | ||
915 | : "=&r" (value), "=r" (res) \ | ||
916 | - : "r" (addr), "i" (-EFAULT)); | ||
917 | + : "r" (addr), "i" (-EFAULT)); \ | ||
918 | +} while(0) | ||
919 | |||
920 | -#define LoadDW(addr, value, res) \ | ||
921 | +#define _LoadDW(addr, value, res) \ | ||
922 | +do { \ | ||
923 | __asm__ __volatile__ ( \ | ||
924 | ".set\tpush\n\t" \ | ||
925 | ".set\tnoat\n\t" \ | ||
926 | @@ -319,16 +337,19 @@ extern void show_registers(struct pt_regs *regs); | ||
927 | STR(PTR)"\t8b, 11b\n\t" \ | ||
928 | ".previous" \ | ||
929 | : "=&r" (value), "=r" (res) \ | ||
930 | - : "r" (addr), "i" (-EFAULT)); | ||
931 | + : "r" (addr), "i" (-EFAULT)); \ | ||
932 | +} while(0) | ||
933 | + | ||
934 | #endif /* CONFIG_CPU_MIPSR6 */ | ||
935 | |||
936 | |||
937 | -#define StoreHW(addr, value, res) \ | ||
938 | +#define _StoreHW(addr, value, res, type) \ | ||
939 | +do { \ | ||
940 | __asm__ __volatile__ ( \ | ||
941 | ".set\tnoat\n" \ | ||
942 | - "1:\t"user_sb("%1", "1(%2)")"\n" \ | ||
943 | + "1:\t"type##_sb("%1", "1(%2)")"\n" \ | ||
944 | "srl\t$1, %1, 0x8\n" \ | ||
945 | - "2:\t"user_sb("$1", "0(%2)")"\n" \ | ||
946 | + "2:\t"type##_sb("$1", "0(%2)")"\n" \ | ||
947 | ".set\tat\n\t" \ | ||
948 | "li\t%0, 0\n" \ | ||
949 | "3:\n\t" \ | ||
950 | @@ -342,13 +363,15 @@ extern void show_registers(struct pt_regs *regs); | ||
951 | STR(PTR)"\t2b, 4b\n\t" \ | ||
952 | ".previous" \ | ||
953 | : "=r" (res) \ | ||
954 | - : "r" (value), "r" (addr), "i" (-EFAULT)); | ||
955 | + : "r" (value), "r" (addr), "i" (-EFAULT));\ | ||
956 | +} while(0) | ||
957 | |||
958 | #ifndef CONFIG_CPU_MIPSR6 | ||
959 | -#define StoreW(addr, value, res) \ | ||
960 | +#define _StoreW(addr, value, res, type) \ | ||
961 | +do { \ | ||
962 | __asm__ __volatile__ ( \ | ||
963 | - "1:\t"user_swl("%1", "(%2)")"\n" \ | ||
964 | - "2:\t"user_swr("%1", "3(%2)")"\n\t" \ | ||
965 | + "1:\t"type##_swl("%1", "(%2)")"\n" \ | ||
966 | + "2:\t"type##_swr("%1", "3(%2)")"\n\t"\ | ||
967 | "li\t%0, 0\n" \ | ||
968 | "3:\n\t" \ | ||
969 | ".insn\n\t" \ | ||
970 | @@ -361,9 +384,11 @@ extern void show_registers(struct pt_regs *regs); | ||
971 | STR(PTR)"\t2b, 4b\n\t" \ | ||
972 | ".previous" \ | ||
973 | : "=r" (res) \ | ||
974 | - : "r" (value), "r" (addr), "i" (-EFAULT)); | ||
975 | + : "r" (value), "r" (addr), "i" (-EFAULT)); \ | ||
976 | +} while(0) | ||
977 | |||
978 | -#define StoreDW(addr, value, res) \ | ||
979 | +#define _StoreDW(addr, value, res) \ | ||
980 | +do { \ | ||
981 | __asm__ __volatile__ ( \ | ||
982 | "1:\tsdl\t%1,(%2)\n" \ | ||
983 | "2:\tsdr\t%1, 7(%2)\n\t" \ | ||
984 | @@ -379,20 +404,23 @@ extern void show_registers(struct pt_regs *regs); | ||
985 | STR(PTR)"\t2b, 4b\n\t" \ | ||
986 | ".previous" \ | ||
987 | : "=r" (res) \ | ||
988 | - : "r" (value), "r" (addr), "i" (-EFAULT)); | ||
989 | + : "r" (value), "r" (addr), "i" (-EFAULT)); \ | ||
990 | +} while(0) | ||
991 | + | ||
992 | #else | ||
993 | /* MIPSR6 has no swl and sdl instructions */ | ||
994 | -#define StoreW(addr, value, res) \ | ||
995 | +#define _StoreW(addr, value, res, type) \ | ||
996 | +do { \ | ||
997 | __asm__ __volatile__ ( \ | ||
998 | ".set\tpush\n\t" \ | ||
999 | ".set\tnoat\n\t" \ | ||
1000 | - "1:"user_sb("%1", "3(%2)")"\n\t" \ | ||
1001 | + "1:"type##_sb("%1", "3(%2)")"\n\t" \ | ||
1002 | "srl\t$1, %1, 0x8\n\t" \ | ||
1003 | - "2:"user_sb("$1", "2(%2)")"\n\t" \ | ||
1004 | + "2:"type##_sb("$1", "2(%2)")"\n\t" \ | ||
1005 | "srl\t$1, $1, 0x8\n\t" \ | ||
1006 | - "3:"user_sb("$1", "1(%2)")"\n\t" \ | ||
1007 | + "3:"type##_sb("$1", "1(%2)")"\n\t" \ | ||
1008 | "srl\t$1, $1, 0x8\n\t" \ | ||
1009 | - "4:"user_sb("$1", "0(%2)")"\n\t" \ | ||
1010 | + "4:"type##_sb("$1", "0(%2)")"\n\t" \ | ||
1011 | ".set\tpop\n\t" \ | ||
1012 | "li\t%0, 0\n" \ | ||
1013 | "10:\n\t" \ | ||
1014 | @@ -409,9 +437,11 @@ extern void show_registers(struct pt_regs *regs); | ||
1015 | ".previous" \ | ||
1016 | : "=&r" (res) \ | ||
1017 | : "r" (value), "r" (addr), "i" (-EFAULT) \ | ||
1018 | - : "memory"); | ||
1019 | + : "memory"); \ | ||
1020 | +} while(0) | ||
1021 | |||
1022 | #define StoreDW(addr, value, res) \ | ||
1023 | +do { \ | ||
1024 | __asm__ __volatile__ ( \ | ||
1025 | ".set\tpush\n\t" \ | ||
1026 | ".set\tnoat\n\t" \ | ||
1027 | @@ -451,15 +481,18 @@ extern void show_registers(struct pt_regs *regs); | ||
1028 | ".previous" \ | ||
1029 | : "=&r" (res) \ | ||
1030 | : "r" (value), "r" (addr), "i" (-EFAULT) \ | ||
1031 | - : "memory"); | ||
1032 | + : "memory"); \ | ||
1033 | +} while(0) | ||
1034 | + | ||
1035 | #endif /* CONFIG_CPU_MIPSR6 */ | ||
1036 | |||
1037 | #else /* __BIG_ENDIAN */ | ||
1038 | |||
1039 | -#define LoadHW(addr, value, res) \ | ||
1040 | +#define _LoadHW(addr, value, res, type) \ | ||
1041 | +do { \ | ||
1042 | __asm__ __volatile__ (".set\tnoat\n" \ | ||
1043 | - "1:\t"user_lb("%0", "1(%2)")"\n" \ | ||
1044 | - "2:\t"user_lbu("$1", "0(%2)")"\n\t" \ | ||
1045 | + "1:\t"type##_lb("%0", "1(%2)")"\n" \ | ||
1046 | + "2:\t"type##_lbu("$1", "0(%2)")"\n\t"\ | ||
1047 | "sll\t%0, 0x8\n\t" \ | ||
1048 | "or\t%0, $1\n\t" \ | ||
1049 | "li\t%1, 0\n" \ | ||
1050 | @@ -474,13 +507,15 @@ extern void show_registers(struct pt_regs *regs); | ||
1051 | STR(PTR)"\t2b, 4b\n\t" \ | ||
1052 | ".previous" \ | ||
1053 | : "=&r" (value), "=r" (res) \ | ||
1054 | - : "r" (addr), "i" (-EFAULT)); | ||
1055 | + : "r" (addr), "i" (-EFAULT)); \ | ||
1056 | +} while(0) | ||
1057 | |||
1058 | #ifndef CONFIG_CPU_MIPSR6 | ||
1059 | -#define LoadW(addr, value, res) \ | ||
1060 | +#define _LoadW(addr, value, res, type) \ | ||
1061 | +do { \ | ||
1062 | __asm__ __volatile__ ( \ | ||
1063 | - "1:\t"user_lwl("%0", "3(%2)")"\n" \ | ||
1064 | - "2:\t"user_lwr("%0", "(%2)")"\n\t" \ | ||
1065 | + "1:\t"type##_lwl("%0", "3(%2)")"\n" \ | ||
1066 | + "2:\t"type##_lwr("%0", "(%2)")"\n\t"\ | ||
1067 | "li\t%1, 0\n" \ | ||
1068 | "3:\n\t" \ | ||
1069 | ".insn\n\t" \ | ||
1070 | @@ -493,21 +528,24 @@ extern void show_registers(struct pt_regs *regs); | ||
1071 | STR(PTR)"\t2b, 4b\n\t" \ | ||
1072 | ".previous" \ | ||
1073 | : "=&r" (value), "=r" (res) \ | ||
1074 | - : "r" (addr), "i" (-EFAULT)); | ||
1075 | + : "r" (addr), "i" (-EFAULT)); \ | ||
1076 | +} while(0) | ||
1077 | + | ||
1078 | #else | ||
1079 | /* MIPSR6 has no lwl instruction */ | ||
1080 | -#define LoadW(addr, value, res) \ | ||
1081 | +#define _LoadW(addr, value, res, type) \ | ||
1082 | +do { \ | ||
1083 | __asm__ __volatile__ ( \ | ||
1084 | ".set\tpush\n" \ | ||
1085 | ".set\tnoat\n\t" \ | ||
1086 | - "1:"user_lb("%0", "3(%2)")"\n\t" \ | ||
1087 | - "2:"user_lbu("$1", "2(%2)")"\n\t" \ | ||
1088 | + "1:"type##_lb("%0", "3(%2)")"\n\t" \ | ||
1089 | + "2:"type##_lbu("$1", "2(%2)")"\n\t" \ | ||
1090 | "sll\t%0, 0x8\n\t" \ | ||
1091 | "or\t%0, $1\n\t" \ | ||
1092 | - "3:"user_lbu("$1", "1(%2)")"\n\t" \ | ||
1093 | + "3:"type##_lbu("$1", "1(%2)")"\n\t" \ | ||
1094 | "sll\t%0, 0x8\n\t" \ | ||
1095 | "or\t%0, $1\n\t" \ | ||
1096 | - "4:"user_lbu("$1", "0(%2)")"\n\t" \ | ||
1097 | + "4:"type##_lbu("$1", "0(%2)")"\n\t" \ | ||
1098 | "sll\t%0, 0x8\n\t" \ | ||
1099 | "or\t%0, $1\n\t" \ | ||
1100 | "li\t%1, 0\n" \ | ||
1101 | @@ -525,15 +563,18 @@ extern void show_registers(struct pt_regs *regs); | ||
1102 | STR(PTR)"\t4b, 11b\n\t" \ | ||
1103 | ".previous" \ | ||
1104 | : "=&r" (value), "=r" (res) \ | ||
1105 | - : "r" (addr), "i" (-EFAULT)); | ||
1106 | + : "r" (addr), "i" (-EFAULT)); \ | ||
1107 | +} while(0) | ||
1108 | + | ||
1109 | #endif /* CONFIG_CPU_MIPSR6 */ | ||
1110 | |||
1111 | |||
1112 | -#define LoadHWU(addr, value, res) \ | ||
1113 | +#define _LoadHWU(addr, value, res, type) \ | ||
1114 | +do { \ | ||
1115 | __asm__ __volatile__ ( \ | ||
1116 | ".set\tnoat\n" \ | ||
1117 | - "1:\t"user_lbu("%0", "1(%2)")"\n" \ | ||
1118 | - "2:\t"user_lbu("$1", "0(%2)")"\n\t" \ | ||
1119 | + "1:\t"type##_lbu("%0", "1(%2)")"\n" \ | ||
1120 | + "2:\t"type##_lbu("$1", "0(%2)")"\n\t"\ | ||
1121 | "sll\t%0, 0x8\n\t" \ | ||
1122 | "or\t%0, $1\n\t" \ | ||
1123 | "li\t%1, 0\n" \ | ||
1124 | @@ -549,13 +590,15 @@ extern void show_registers(struct pt_regs *regs); | ||
1125 | STR(PTR)"\t2b, 4b\n\t" \ | ||
1126 | ".previous" \ | ||
1127 | : "=&r" (value), "=r" (res) \ | ||
1128 | - : "r" (addr), "i" (-EFAULT)); | ||
1129 | + : "r" (addr), "i" (-EFAULT)); \ | ||
1130 | +} while(0) | ||
1131 | |||
1132 | #ifndef CONFIG_CPU_MIPSR6 | ||
1133 | -#define LoadWU(addr, value, res) \ | ||
1134 | +#define _LoadWU(addr, value, res, type) \ | ||
1135 | +do { \ | ||
1136 | __asm__ __volatile__ ( \ | ||
1137 | - "1:\t"user_lwl("%0", "3(%2)")"\n" \ | ||
1138 | - "2:\t"user_lwr("%0", "(%2)")"\n\t" \ | ||
1139 | + "1:\t"type##_lwl("%0", "3(%2)")"\n" \ | ||
1140 | + "2:\t"type##_lwr("%0", "(%2)")"\n\t"\ | ||
1141 | "dsll\t%0, %0, 32\n\t" \ | ||
1142 | "dsrl\t%0, %0, 32\n\t" \ | ||
1143 | "li\t%1, 0\n" \ | ||
1144 | @@ -570,9 +613,11 @@ extern void show_registers(struct pt_regs *regs); | ||
1145 | STR(PTR)"\t2b, 4b\n\t" \ | ||
1146 | ".previous" \ | ||
1147 | : "=&r" (value), "=r" (res) \ | ||
1148 | - : "r" (addr), "i" (-EFAULT)); | ||
1149 | + : "r" (addr), "i" (-EFAULT)); \ | ||
1150 | +} while(0) | ||
1151 | |||
1152 | -#define LoadDW(addr, value, res) \ | ||
1153 | +#define _LoadDW(addr, value, res) \ | ||
1154 | +do { \ | ||
1155 | __asm__ __volatile__ ( \ | ||
1156 | "1:\tldl\t%0, 7(%2)\n" \ | ||
1157 | "2:\tldr\t%0, (%2)\n\t" \ | ||
1158 | @@ -588,21 +633,24 @@ extern void show_registers(struct pt_regs *regs); | ||
1159 | STR(PTR)"\t2b, 4b\n\t" \ | ||
1160 | ".previous" \ | ||
1161 | : "=&r" (value), "=r" (res) \ | ||
1162 | - : "r" (addr), "i" (-EFAULT)); | ||
1163 | + : "r" (addr), "i" (-EFAULT)); \ | ||
1164 | +} while(0) | ||
1165 | + | ||
1166 | #else | ||
1167 | /* MIPSR6 has not lwl and ldl instructions */ | ||
1168 | -#define LoadWU(addr, value, res) \ | ||
1169 | +#define _LoadWU(addr, value, res, type) \ | ||
1170 | +do { \ | ||
1171 | __asm__ __volatile__ ( \ | ||
1172 | ".set\tpush\n\t" \ | ||
1173 | ".set\tnoat\n\t" \ | ||
1174 | - "1:"user_lbu("%0", "3(%2)")"\n\t" \ | ||
1175 | - "2:"user_lbu("$1", "2(%2)")"\n\t" \ | ||
1176 | + "1:"type##_lbu("%0", "3(%2)")"\n\t" \ | ||
1177 | + "2:"type##_lbu("$1", "2(%2)")"\n\t" \ | ||
1178 | "sll\t%0, 0x8\n\t" \ | ||
1179 | "or\t%0, $1\n\t" \ | ||
1180 | - "3:"user_lbu("$1", "1(%2)")"\n\t" \ | ||
1181 | + "3:"type##_lbu("$1", "1(%2)")"\n\t" \ | ||
1182 | "sll\t%0, 0x8\n\t" \ | ||
1183 | "or\t%0, $1\n\t" \ | ||
1184 | - "4:"user_lbu("$1", "0(%2)")"\n\t" \ | ||
1185 | + "4:"type##_lbu("$1", "0(%2)")"\n\t" \ | ||
1186 | "sll\t%0, 0x8\n\t" \ | ||
1187 | "or\t%0, $1\n\t" \ | ||
1188 | "li\t%1, 0\n" \ | ||
1189 | @@ -620,9 +668,11 @@ extern void show_registers(struct pt_regs *regs); | ||
1190 | STR(PTR)"\t4b, 11b\n\t" \ | ||
1191 | ".previous" \ | ||
1192 | : "=&r" (value), "=r" (res) \ | ||
1193 | - : "r" (addr), "i" (-EFAULT)); | ||
1194 | + : "r" (addr), "i" (-EFAULT)); \ | ||
1195 | +} while(0) | ||
1196 | |||
1197 | -#define LoadDW(addr, value, res) \ | ||
1198 | +#define _LoadDW(addr, value, res) \ | ||
1199 | +do { \ | ||
1200 | __asm__ __volatile__ ( \ | ||
1201 | ".set\tpush\n\t" \ | ||
1202 | ".set\tnoat\n\t" \ | ||
1203 | @@ -667,15 +717,17 @@ extern void show_registers(struct pt_regs *regs); | ||
1204 | STR(PTR)"\t8b, 11b\n\t" \ | ||
1205 | ".previous" \ | ||
1206 | : "=&r" (value), "=r" (res) \ | ||
1207 | - : "r" (addr), "i" (-EFAULT)); | ||
1208 | + : "r" (addr), "i" (-EFAULT)); \ | ||
1209 | +} while(0) | ||
1210 | #endif /* CONFIG_CPU_MIPSR6 */ | ||
1211 | |||
1212 | -#define StoreHW(addr, value, res) \ | ||
1213 | +#define _StoreHW(addr, value, res, type) \ | ||
1214 | +do { \ | ||
1215 | __asm__ __volatile__ ( \ | ||
1216 | ".set\tnoat\n" \ | ||
1217 | - "1:\t"user_sb("%1", "0(%2)")"\n" \ | ||
1218 | + "1:\t"type##_sb("%1", "0(%2)")"\n" \ | ||
1219 | "srl\t$1,%1, 0x8\n" \ | ||
1220 | - "2:\t"user_sb("$1", "1(%2)")"\n" \ | ||
1221 | + "2:\t"type##_sb("$1", "1(%2)")"\n" \ | ||
1222 | ".set\tat\n\t" \ | ||
1223 | "li\t%0, 0\n" \ | ||
1224 | "3:\n\t" \ | ||
1225 | @@ -689,12 +741,15 @@ extern void show_registers(struct pt_regs *regs); | ||
1226 | STR(PTR)"\t2b, 4b\n\t" \ | ||
1227 | ".previous" \ | ||
1228 | : "=r" (res) \ | ||
1229 | - : "r" (value), "r" (addr), "i" (-EFAULT)); | ||
1230 | + : "r" (value), "r" (addr), "i" (-EFAULT));\ | ||
1231 | +} while(0) | ||
1232 | + | ||
1233 | #ifndef CONFIG_CPU_MIPSR6 | ||
1234 | -#define StoreW(addr, value, res) \ | ||
1235 | +#define _StoreW(addr, value, res, type) \ | ||
1236 | +do { \ | ||
1237 | __asm__ __volatile__ ( \ | ||
1238 | - "1:\t"user_swl("%1", "3(%2)")"\n" \ | ||
1239 | - "2:\t"user_swr("%1", "(%2)")"\n\t" \ | ||
1240 | + "1:\t"type##_swl("%1", "3(%2)")"\n" \ | ||
1241 | + "2:\t"type##_swr("%1", "(%2)")"\n\t"\ | ||
1242 | "li\t%0, 0\n" \ | ||
1243 | "3:\n\t" \ | ||
1244 | ".insn\n\t" \ | ||
1245 | @@ -707,9 +762,11 @@ extern void show_registers(struct pt_regs *regs); | ||
1246 | STR(PTR)"\t2b, 4b\n\t" \ | ||
1247 | ".previous" \ | ||
1248 | : "=r" (res) \ | ||
1249 | - : "r" (value), "r" (addr), "i" (-EFAULT)); | ||
1250 | + : "r" (value), "r" (addr), "i" (-EFAULT)); \ | ||
1251 | +} while(0) | ||
1252 | |||
1253 | -#define StoreDW(addr, value, res) \ | ||
1254 | +#define _StoreDW(addr, value, res) \ | ||
1255 | +do { \ | ||
1256 | __asm__ __volatile__ ( \ | ||
1257 | "1:\tsdl\t%1, 7(%2)\n" \ | ||
1258 | "2:\tsdr\t%1, (%2)\n\t" \ | ||
1259 | @@ -725,20 +782,23 @@ extern void show_registers(struct pt_regs *regs); | ||
1260 | STR(PTR)"\t2b, 4b\n\t" \ | ||
1261 | ".previous" \ | ||
1262 | : "=r" (res) \ | ||
1263 | - : "r" (value), "r" (addr), "i" (-EFAULT)); | ||
1264 | + : "r" (value), "r" (addr), "i" (-EFAULT)); \ | ||
1265 | +} while(0) | ||
1266 | + | ||
1267 | #else | ||
1268 | /* MIPSR6 has no swl and sdl instructions */ | ||
1269 | -#define StoreW(addr, value, res) \ | ||
1270 | +#define _StoreW(addr, value, res, type) \ | ||
1271 | +do { \ | ||
1272 | __asm__ __volatile__ ( \ | ||
1273 | ".set\tpush\n\t" \ | ||
1274 | ".set\tnoat\n\t" \ | ||
1275 | - "1:"user_sb("%1", "0(%2)")"\n\t" \ | ||
1276 | + "1:"type##_sb("%1", "0(%2)")"\n\t" \ | ||
1277 | "srl\t$1, %1, 0x8\n\t" \ | ||
1278 | - "2:"user_sb("$1", "1(%2)")"\n\t" \ | ||
1279 | + "2:"type##_sb("$1", "1(%2)")"\n\t" \ | ||
1280 | "srl\t$1, $1, 0x8\n\t" \ | ||
1281 | - "3:"user_sb("$1", "2(%2)")"\n\t" \ | ||
1282 | + "3:"type##_sb("$1", "2(%2)")"\n\t" \ | ||
1283 | "srl\t$1, $1, 0x8\n\t" \ | ||
1284 | - "4:"user_sb("$1", "3(%2)")"\n\t" \ | ||
1285 | + "4:"type##_sb("$1", "3(%2)")"\n\t" \ | ||
1286 | ".set\tpop\n\t" \ | ||
1287 | "li\t%0, 0\n" \ | ||
1288 | "10:\n\t" \ | ||
1289 | @@ -755,9 +815,11 @@ extern void show_registers(struct pt_regs *regs); | ||
1290 | ".previous" \ | ||
1291 | : "=&r" (res) \ | ||
1292 | : "r" (value), "r" (addr), "i" (-EFAULT) \ | ||
1293 | - : "memory"); | ||
1294 | + : "memory"); \ | ||
1295 | +} while(0) | ||
1296 | |||
1297 | -#define StoreDW(addr, value, res) \ | ||
1298 | +#define _StoreDW(addr, value, res) \ | ||
1299 | +do { \ | ||
1300 | __asm__ __volatile__ ( \ | ||
1301 | ".set\tpush\n\t" \ | ||
1302 | ".set\tnoat\n\t" \ | ||
1303 | @@ -797,10 +859,28 @@ extern void show_registers(struct pt_regs *regs); | ||
1304 | ".previous" \ | ||
1305 | : "=&r" (res) \ | ||
1306 | : "r" (value), "r" (addr), "i" (-EFAULT) \ | ||
1307 | - : "memory"); | ||
1308 | + : "memory"); \ | ||
1309 | +} while(0) | ||
1310 | + | ||
1311 | #endif /* CONFIG_CPU_MIPSR6 */ | ||
1312 | #endif | ||
1313 | |||
1314 | +#define LoadHWU(addr, value, res) _LoadHWU(addr, value, res, kernel) | ||
1315 | +#define LoadHWUE(addr, value, res) _LoadHWU(addr, value, res, user) | ||
1316 | +#define LoadWU(addr, value, res) _LoadWU(addr, value, res, kernel) | ||
1317 | +#define LoadWUE(addr, value, res) _LoadWU(addr, value, res, user) | ||
1318 | +#define LoadHW(addr, value, res) _LoadHW(addr, value, res, kernel) | ||
1319 | +#define LoadHWE(addr, value, res) _LoadHW(addr, value, res, user) | ||
1320 | +#define LoadW(addr, value, res) _LoadW(addr, value, res, kernel) | ||
1321 | +#define LoadWE(addr, value, res) _LoadW(addr, value, res, user) | ||
1322 | +#define LoadDW(addr, value, res) _LoadDW(addr, value, res) | ||
1323 | + | ||
1324 | +#define StoreHW(addr, value, res) _StoreHW(addr, value, res, kernel) | ||
1325 | +#define StoreHWE(addr, value, res) _StoreHW(addr, value, res, user) | ||
1326 | +#define StoreW(addr, value, res) _StoreW(addr, value, res, kernel) | ||
1327 | +#define StoreWE(addr, value, res) _StoreW(addr, value, res, user) | ||
1328 | +#define StoreDW(addr, value, res) _StoreDW(addr, value, res) | ||
1329 | + | ||
1330 | static void emulate_load_store_insn(struct pt_regs *regs, | ||
1331 | void __user *addr, unsigned int __user *pc) | ||
1332 | { | ||
1333 | @@ -872,7 +952,7 @@ static void emulate_load_store_insn(struct pt_regs *regs, | ||
1334 | set_fs(seg); | ||
1335 | goto sigbus; | ||
1336 | } | ||
1337 | - LoadHW(addr, value, res); | ||
1338 | + LoadHWE(addr, value, res); | ||
1339 | if (res) { | ||
1340 | set_fs(seg); | ||
1341 | goto fault; | ||
1342 | @@ -885,7 +965,7 @@ static void emulate_load_store_insn(struct pt_regs *regs, | ||
1343 | set_fs(seg); | ||
1344 | goto sigbus; | ||
1345 | } | ||
1346 | - LoadW(addr, value, res); | ||
1347 | + LoadWE(addr, value, res); | ||
1348 | if (res) { | ||
1349 | set_fs(seg); | ||
1350 | goto fault; | ||
1351 | @@ -898,7 +978,7 @@ static void emulate_load_store_insn(struct pt_regs *regs, | ||
1352 | set_fs(seg); | ||
1353 | goto sigbus; | ||
1354 | } | ||
1355 | - LoadHWU(addr, value, res); | ||
1356 | + LoadHWUE(addr, value, res); | ||
1357 | if (res) { | ||
1358 | set_fs(seg); | ||
1359 | goto fault; | ||
1360 | @@ -913,7 +993,7 @@ static void emulate_load_store_insn(struct pt_regs *regs, | ||
1361 | } | ||
1362 | compute_return_epc(regs); | ||
1363 | value = regs->regs[insn.spec3_format.rt]; | ||
1364 | - StoreHW(addr, value, res); | ||
1365 | + StoreHWE(addr, value, res); | ||
1366 | if (res) { | ||
1367 | set_fs(seg); | ||
1368 | goto fault; | ||
1369 | @@ -926,7 +1006,7 @@ static void emulate_load_store_insn(struct pt_regs *regs, | ||
1370 | } | ||
1371 | compute_return_epc(regs); | ||
1372 | value = regs->regs[insn.spec3_format.rt]; | ||
1373 | - StoreW(addr, value, res); | ||
1374 | + StoreWE(addr, value, res); | ||
1375 | if (res) { | ||
1376 | set_fs(seg); | ||
1377 | goto fault; | ||
1378 | @@ -943,7 +1023,15 @@ static void emulate_load_store_insn(struct pt_regs *regs, | ||
1379 | if (!access_ok(VERIFY_READ, addr, 2)) | ||
1380 | goto sigbus; | ||
1381 | |||
1382 | - LoadHW(addr, value, res); | ||
1383 | + if (config_enabled(CONFIG_EVA)) { | ||
1384 | + if (segment_eq(get_fs(), get_ds())) | ||
1385 | + LoadHW(addr, value, res); | ||
1386 | + else | ||
1387 | + LoadHWE(addr, value, res); | ||
1388 | + } else { | ||
1389 | + LoadHW(addr, value, res); | ||
1390 | + } | ||
1391 | + | ||
1392 | if (res) | ||
1393 | goto fault; | ||
1394 | compute_return_epc(regs); | ||
1395 | @@ -954,7 +1042,15 @@ static void emulate_load_store_insn(struct pt_regs *regs, | ||
1396 | if (!access_ok(VERIFY_READ, addr, 4)) | ||
1397 | goto sigbus; | ||
1398 | |||
1399 | - LoadW(addr, value, res); | ||
1400 | + if (config_enabled(CONFIG_EVA)) { | ||
1401 | + if (segment_eq(get_fs(), get_ds())) | ||
1402 | + LoadW(addr, value, res); | ||
1403 | + else | ||
1404 | + LoadWE(addr, value, res); | ||
1405 | + } else { | ||
1406 | + LoadW(addr, value, res); | ||
1407 | + } | ||
1408 | + | ||
1409 | if (res) | ||
1410 | goto fault; | ||
1411 | compute_return_epc(regs); | ||
1412 | @@ -965,7 +1061,15 @@ static void emulate_load_store_insn(struct pt_regs *regs, | ||
1413 | if (!access_ok(VERIFY_READ, addr, 2)) | ||
1414 | goto sigbus; | ||
1415 | |||
1416 | - LoadHWU(addr, value, res); | ||
1417 | + if (config_enabled(CONFIG_EVA)) { | ||
1418 | + if (segment_eq(get_fs(), get_ds())) | ||
1419 | + LoadHWU(addr, value, res); | ||
1420 | + else | ||
1421 | + LoadHWUE(addr, value, res); | ||
1422 | + } else { | ||
1423 | + LoadHWU(addr, value, res); | ||
1424 | + } | ||
1425 | + | ||
1426 | if (res) | ||
1427 | goto fault; | ||
1428 | compute_return_epc(regs); | ||
1429 | @@ -1024,7 +1128,16 @@ static void emulate_load_store_insn(struct pt_regs *regs, | ||
1430 | |||
1431 | compute_return_epc(regs); | ||
1432 | value = regs->regs[insn.i_format.rt]; | ||
1433 | - StoreHW(addr, value, res); | ||
1434 | + | ||
1435 | + if (config_enabled(CONFIG_EVA)) { | ||
1436 | + if (segment_eq(get_fs(), get_ds())) | ||
1437 | + StoreHW(addr, value, res); | ||
1438 | + else | ||
1439 | + StoreHWE(addr, value, res); | ||
1440 | + } else { | ||
1441 | + StoreHW(addr, value, res); | ||
1442 | + } | ||
1443 | + | ||
1444 | if (res) | ||
1445 | goto fault; | ||
1446 | break; | ||
1447 | @@ -1035,7 +1148,16 @@ static void emulate_load_store_insn(struct pt_regs *regs, | ||
1448 | |||
1449 | compute_return_epc(regs); | ||
1450 | value = regs->regs[insn.i_format.rt]; | ||
1451 | - StoreW(addr, value, res); | ||
1452 | + | ||
1453 | + if (config_enabled(CONFIG_EVA)) { | ||
1454 | + if (segment_eq(get_fs(), get_ds())) | ||
1455 | + StoreW(addr, value, res); | ||
1456 | + else | ||
1457 | + StoreWE(addr, value, res); | ||
1458 | + } else { | ||
1459 | + StoreW(addr, value, res); | ||
1460 | + } | ||
1461 | + | ||
1462 | if (res) | ||
1463 | goto fault; | ||
1464 | break; | ||
1465 | diff --git a/arch/mips/kvm/emulate.c b/arch/mips/kvm/emulate.c | ||
1466 | index fb3e8dfd1ff6..838d3a6a5b7d 100644 | ||
1467 | --- a/arch/mips/kvm/emulate.c | ||
1468 | +++ b/arch/mips/kvm/emulate.c | ||
1469 | @@ -2176,6 +2176,7 @@ enum emulation_result kvm_mips_check_privilege(unsigned long cause, | ||
1470 | case T_SYSCALL: | ||
1471 | case T_BREAK: | ||
1472 | case T_RES_INST: | ||
1473 | + case T_MSADIS: | ||
1474 | break; | ||
1475 | |||
1476 | case T_COP_UNUSABLE: | ||
1477 | diff --git a/arch/mips/kvm/mips.c b/arch/mips/kvm/mips.c | ||
1478 | index c9eccf5df912..f5e7ddab02f7 100644 | ||
1479 | --- a/arch/mips/kvm/mips.c | ||
1480 | +++ b/arch/mips/kvm/mips.c | ||
1481 | @@ -1119,6 +1119,10 @@ int kvm_mips_handle_exit(struct kvm_run *run, struct kvm_vcpu *vcpu) | ||
1482 | ret = kvm_mips_callbacks->handle_break(vcpu); | ||
1483 | break; | ||
1484 | |||
1485 | + case T_MSADIS: | ||
1486 | + ret = kvm_mips_callbacks->handle_msa_disabled(vcpu); | ||
1487 | + break; | ||
1488 | + | ||
1489 | default: | ||
1490 | kvm_err("Exception Code: %d, not yet handled, @ PC: %p, inst: 0x%08x BadVaddr: %#lx Status: %#lx\n", | ||
1491 | exccode, opc, kvm_get_inst(opc, vcpu), badvaddr, | ||
1492 | diff --git a/arch/mips/kvm/trap_emul.c b/arch/mips/kvm/trap_emul.c | ||
1493 | index fd7257b70e65..4372cc86650c 100644 | ||
1494 | --- a/arch/mips/kvm/trap_emul.c | ||
1495 | +++ b/arch/mips/kvm/trap_emul.c | ||
1496 | @@ -330,6 +330,33 @@ static int kvm_trap_emul_handle_break(struct kvm_vcpu *vcpu) | ||
1497 | return ret; | ||
1498 | } | ||
1499 | |||
1500 | +static int kvm_trap_emul_handle_msa_disabled(struct kvm_vcpu *vcpu) | ||
1501 | +{ | ||
1502 | + struct kvm_run *run = vcpu->run; | ||
1503 | + uint32_t __user *opc = (uint32_t __user *) vcpu->arch.pc; | ||
1504 | + unsigned long cause = vcpu->arch.host_cp0_cause; | ||
1505 | + enum emulation_result er = EMULATE_DONE; | ||
1506 | + int ret = RESUME_GUEST; | ||
1507 | + | ||
1508 | + /* No MSA supported in guest, guest reserved instruction exception */ | ||
1509 | + er = kvm_mips_emulate_ri_exc(cause, opc, run, vcpu); | ||
1510 | + | ||
1511 | + switch (er) { | ||
1512 | + case EMULATE_DONE: | ||
1513 | + ret = RESUME_GUEST; | ||
1514 | + break; | ||
1515 | + | ||
1516 | + case EMULATE_FAIL: | ||
1517 | + run->exit_reason = KVM_EXIT_INTERNAL_ERROR; | ||
1518 | + ret = RESUME_HOST; | ||
1519 | + break; | ||
1520 | + | ||
1521 | + default: | ||
1522 | + BUG(); | ||
1523 | + } | ||
1524 | + return ret; | ||
1525 | +} | ||
1526 | + | ||
1527 | static int kvm_trap_emul_vm_init(struct kvm *kvm) | ||
1528 | { | ||
1529 | return 0; | ||
1530 | @@ -470,6 +497,7 @@ static struct kvm_mips_callbacks kvm_trap_emul_callbacks = { | ||
1531 | .handle_syscall = kvm_trap_emul_handle_syscall, | ||
1532 | .handle_res_inst = kvm_trap_emul_handle_res_inst, | ||
1533 | .handle_break = kvm_trap_emul_handle_break, | ||
1534 | + .handle_msa_disabled = kvm_trap_emul_handle_msa_disabled, | ||
1535 | |||
1536 | .vm_init = kvm_trap_emul_vm_init, | ||
1537 | .vcpu_init = kvm_trap_emul_vcpu_init, | ||
1538 | diff --git a/arch/mips/loongson/loongson-3/irq.c b/arch/mips/loongson/loongson-3/irq.c | ||
1539 | index 21221edda7a9..0f75b6b3d218 100644 | ||
1540 | --- a/arch/mips/loongson/loongson-3/irq.c | ||
1541 | +++ b/arch/mips/loongson/loongson-3/irq.c | ||
1542 | @@ -44,6 +44,7 @@ void mach_irq_dispatch(unsigned int pending) | ||
1543 | |||
1544 | static struct irqaction cascade_irqaction = { | ||
1545 | .handler = no_action, | ||
1546 | + .flags = IRQF_NO_SUSPEND, | ||
1547 | .name = "cascade", | ||
1548 | }; | ||
1549 | |||
1550 | diff --git a/arch/mips/mti-malta/malta-memory.c b/arch/mips/mti-malta/malta-memory.c | ||
1551 | index 8fddd2cdbff7..efe366d618b1 100644 | ||
1552 | --- a/arch/mips/mti-malta/malta-memory.c | ||
1553 | +++ b/arch/mips/mti-malta/malta-memory.c | ||
1554 | @@ -53,6 +53,12 @@ fw_memblock_t * __init fw_getmdesc(int eva) | ||
1555 | pr_warn("memsize not set in YAMON, set to default (32Mb)\n"); | ||
1556 | physical_memsize = 0x02000000; | ||
1557 | } else { | ||
1558 | + if (memsize > (256 << 20)) { /* memsize should be capped to 256M */ | ||
1559 | + pr_warn("Unsupported memsize value (0x%lx) detected! " | ||
1560 | + "Using 0x10000000 (256M) instead\n", | ||
1561 | + memsize); | ||
1562 | + memsize = 256 << 20; | ||
1563 | + } | ||
1564 | /* If ememsize is set, then set physical_memsize to that */ | ||
1565 | physical_memsize = ememsize ? : memsize; | ||
1566 | } | ||
1567 | diff --git a/arch/mips/power/hibernate.S b/arch/mips/power/hibernate.S | ||
1568 | index 32a7c828f073..e7567c8a9e79 100644 | ||
1569 | --- a/arch/mips/power/hibernate.S | ||
1570 | +++ b/arch/mips/power/hibernate.S | ||
1571 | @@ -30,6 +30,8 @@ LEAF(swsusp_arch_suspend) | ||
1572 | END(swsusp_arch_suspend) | ||
1573 | |||
1574 | LEAF(swsusp_arch_resume) | ||
1575 | + /* Avoid TLB mismatch during and after kernel resume */ | ||
1576 | + jal local_flush_tlb_all | ||
1577 | PTR_L t0, restore_pblist | ||
1578 | 0: | ||
1579 | PTR_L t1, PBE_ADDRESS(t0) /* source */ | ||
1580 | @@ -43,7 +45,6 @@ LEAF(swsusp_arch_resume) | ||
1581 | bne t1, t3, 1b | ||
1582 | PTR_L t0, PBE_NEXT(t0) | ||
1583 | bnez t0, 0b | ||
1584 | - jal local_flush_tlb_all /* Avoid TLB mismatch after kernel resume */ | ||
1585 | PTR_LA t0, saved_regs | ||
1586 | PTR_L ra, PT_R31(t0) | ||
1587 | PTR_L sp, PT_R29(t0) | ||
1588 | diff --git a/arch/powerpc/kernel/cacheinfo.c b/arch/powerpc/kernel/cacheinfo.c | ||
1589 | index ae77b7e59889..c641983bbdd6 100644 | ||
1590 | --- a/arch/powerpc/kernel/cacheinfo.c | ||
1591 | +++ b/arch/powerpc/kernel/cacheinfo.c | ||
1592 | @@ -61,12 +61,22 @@ struct cache_type_info { | ||
1593 | }; | ||
1594 | |||
1595 | /* These are used to index the cache_type_info array. */ | ||
1596 | -#define CACHE_TYPE_UNIFIED 0 | ||
1597 | -#define CACHE_TYPE_INSTRUCTION 1 | ||
1598 | -#define CACHE_TYPE_DATA 2 | ||
1599 | +#define CACHE_TYPE_UNIFIED 0 /* cache-size, cache-block-size, etc. */ | ||
1600 | +#define CACHE_TYPE_UNIFIED_D 1 /* d-cache-size, d-cache-block-size, etc */ | ||
1601 | +#define CACHE_TYPE_INSTRUCTION 2 | ||
1602 | +#define CACHE_TYPE_DATA 3 | ||
1603 | |||
1604 | static const struct cache_type_info cache_type_info[] = { | ||
1605 | { | ||
1606 | + /* Embedded systems that use cache-size, cache-block-size, | ||
1607 | + * etc. for the Unified (typically L2) cache. */ | ||
1608 | + .name = "Unified", | ||
1609 | + .size_prop = "cache-size", | ||
1610 | + .line_size_props = { "cache-line-size", | ||
1611 | + "cache-block-size", }, | ||
1612 | + .nr_sets_prop = "cache-sets", | ||
1613 | + }, | ||
1614 | + { | ||
1615 | /* PowerPC Processor binding says the [di]-cache-* | ||
1616 | * must be equal on unified caches, so just use | ||
1617 | * d-cache properties. */ | ||
1618 | @@ -293,7 +303,8 @@ static struct cache *cache_find_first_sibling(struct cache *cache) | ||
1619 | { | ||
1620 | struct cache *iter; | ||
1621 | |||
1622 | - if (cache->type == CACHE_TYPE_UNIFIED) | ||
1623 | + if (cache->type == CACHE_TYPE_UNIFIED || | ||
1624 | + cache->type == CACHE_TYPE_UNIFIED_D) | ||
1625 | return cache; | ||
1626 | |||
1627 | list_for_each_entry(iter, &cache_list, list) | ||
1628 | @@ -324,16 +335,29 @@ static bool cache_node_is_unified(const struct device_node *np) | ||
1629 | return of_get_property(np, "cache-unified", NULL); | ||
1630 | } | ||
1631 | |||
1632 | -static struct cache *cache_do_one_devnode_unified(struct device_node *node, | ||
1633 | - int level) | ||
1634 | +/* | ||
1635 | + * Unified caches can have two different sets of tags. Most embedded | ||
1636 | + * use cache-size, etc. for the unified cache size, but open firmware systems | ||
1637 | + * use d-cache-size, etc. Check on initialization for which type we have, and | ||
1638 | + * return the appropriate structure type. Assume it's embedded if it isn't | ||
1639 | + * open firmware. If it's yet a 3rd type, then there will be missing entries | ||
1640 | + * in /sys/devices/system/cpu/cpu0/cache/index2/, and this code will need | ||
1641 | + * to be extended further. | ||
1642 | + */ | ||
1643 | +static int cache_is_unified_d(const struct device_node *np) | ||
1644 | { | ||
1645 | - struct cache *cache; | ||
1646 | + return of_get_property(np, | ||
1647 | + cache_type_info[CACHE_TYPE_UNIFIED_D].size_prop, NULL) ? | ||
1648 | + CACHE_TYPE_UNIFIED_D : CACHE_TYPE_UNIFIED; | ||
1649 | +} | ||
1650 | |||
1651 | +/* | ||
1652 | + */ | ||
1653 | +static struct cache *cache_do_one_devnode_unified(struct device_node *node, int level) | ||
1654 | +{ | ||
1655 | pr_debug("creating L%d ucache for %s\n", level, node->full_name); | ||
1656 | |||
1657 | - cache = new_cache(CACHE_TYPE_UNIFIED, level, node); | ||
1658 | - | ||
1659 | - return cache; | ||
1660 | + return new_cache(cache_is_unified_d(node), level, node); | ||
1661 | } | ||
1662 | |||
1663 | static struct cache *cache_do_one_devnode_split(struct device_node *node, | ||
1664 | diff --git a/arch/powerpc/mm/hugetlbpage.c b/arch/powerpc/mm/hugetlbpage.c | ||
1665 | index 7e408bfc7948..cecbe00cee24 100644 | ||
1666 | --- a/arch/powerpc/mm/hugetlbpage.c | ||
1667 | +++ b/arch/powerpc/mm/hugetlbpage.c | ||
1668 | @@ -581,6 +581,7 @@ static void hugetlb_free_pmd_range(struct mmu_gather *tlb, pud_t *pud, | ||
1669 | pmd = pmd_offset(pud, start); | ||
1670 | pud_clear(pud); | ||
1671 | pmd_free_tlb(tlb, pmd, start); | ||
1672 | + mm_dec_nr_pmds(tlb->mm); | ||
1673 | } | ||
1674 | |||
1675 | static void hugetlb_free_pud_range(struct mmu_gather *tlb, pgd_t *pgd, | ||
1676 | diff --git a/arch/powerpc/perf/callchain.c b/arch/powerpc/perf/callchain.c | ||
1677 | index 2396dda282cd..ead55351b254 100644 | ||
1678 | --- a/arch/powerpc/perf/callchain.c | ||
1679 | +++ b/arch/powerpc/perf/callchain.c | ||
1680 | @@ -243,7 +243,7 @@ static void perf_callchain_user_64(struct perf_callchain_entry *entry, | ||
1681 | sp = regs->gpr[1]; | ||
1682 | perf_callchain_store(entry, next_ip); | ||
1683 | |||
1684 | - for (;;) { | ||
1685 | + while (entry->nr < PERF_MAX_STACK_DEPTH) { | ||
1686 | fp = (unsigned long __user *) sp; | ||
1687 | if (!valid_user_sp(sp, 1) || read_user_stack_64(fp, &next_sp)) | ||
1688 | return; | ||
1689 | diff --git a/arch/powerpc/platforms/cell/interrupt.c b/arch/powerpc/platforms/cell/interrupt.c | ||
1690 | index 4c11421847be..3af8324c122e 100644 | ||
1691 | --- a/arch/powerpc/platforms/cell/interrupt.c | ||
1692 | +++ b/arch/powerpc/platforms/cell/interrupt.c | ||
1693 | @@ -163,7 +163,7 @@ static unsigned int iic_get_irq(void) | ||
1694 | |||
1695 | void iic_setup_cpu(void) | ||
1696 | { | ||
1697 | - out_be64(this_cpu_ptr(&cpu_iic.regs->prio), 0xff); | ||
1698 | + out_be64(&this_cpu_ptr(&cpu_iic)->regs->prio, 0xff); | ||
1699 | } | ||
1700 | |||
1701 | u8 iic_get_target_id(int cpu) | ||
1702 | diff --git a/arch/powerpc/platforms/cell/iommu.c b/arch/powerpc/platforms/cell/iommu.c | ||
1703 | index c7c8720aa39f..63db1b03e756 100644 | ||
1704 | --- a/arch/powerpc/platforms/cell/iommu.c | ||
1705 | +++ b/arch/powerpc/platforms/cell/iommu.c | ||
1706 | @@ -197,7 +197,7 @@ static int tce_build_cell(struct iommu_table *tbl, long index, long npages, | ||
1707 | |||
1708 | io_pte = (unsigned long *)tbl->it_base + (index - tbl->it_offset); | ||
1709 | |||
1710 | - for (i = 0; i < npages; i++, uaddr += tbl->it_page_shift) | ||
1711 | + for (i = 0; i < npages; i++, uaddr += (1 << tbl->it_page_shift)) | ||
1712 | io_pte[i] = base_pte | (__pa(uaddr) & CBE_IOPTE_RPN_Mask); | ||
1713 | |||
1714 | mb(); | ||
1715 | diff --git a/arch/powerpc/platforms/powernv/pci-ioda.c b/arch/powerpc/platforms/powernv/pci-ioda.c | ||
1716 | index 6c9ff2b95119..1d9369e1e0f4 100644 | ||
1717 | --- a/arch/powerpc/platforms/powernv/pci-ioda.c | ||
1718 | +++ b/arch/powerpc/platforms/powernv/pci-ioda.c | ||
1719 | @@ -1777,7 +1777,8 @@ static void pnv_ioda_setup_pe_seg(struct pci_controller *hose, | ||
1720 | region.start += phb->ioda.io_segsize; | ||
1721 | index++; | ||
1722 | } | ||
1723 | - } else if (res->flags & IORESOURCE_MEM) { | ||
1724 | + } else if ((res->flags & IORESOURCE_MEM) && | ||
1725 | + !pnv_pci_is_mem_pref_64(res->flags)) { | ||
1726 | region.start = res->start - | ||
1727 | hose->mem_offset[0] - | ||
1728 | phb->ioda.m32_pci_base; | ||
1729 | diff --git a/arch/s390/kernel/suspend.c b/arch/s390/kernel/suspend.c | ||
1730 | index 1c4c5accd220..d3236c9e226b 100644 | ||
1731 | --- a/arch/s390/kernel/suspend.c | ||
1732 | +++ b/arch/s390/kernel/suspend.c | ||
1733 | @@ -138,6 +138,8 @@ int pfn_is_nosave(unsigned long pfn) | ||
1734 | { | ||
1735 | unsigned long nosave_begin_pfn = PFN_DOWN(__pa(&__nosave_begin)); | ||
1736 | unsigned long nosave_end_pfn = PFN_DOWN(__pa(&__nosave_end)); | ||
1737 | + unsigned long eshared_pfn = PFN_DOWN(__pa(&_eshared)) - 1; | ||
1738 | + unsigned long stext_pfn = PFN_DOWN(__pa(&_stext)); | ||
1739 | |||
1740 | /* Always save lowcore pages (LC protection might be enabled). */ | ||
1741 | if (pfn <= LC_PAGES) | ||
1742 | @@ -145,6 +147,8 @@ int pfn_is_nosave(unsigned long pfn) | ||
1743 | if (pfn >= nosave_begin_pfn && pfn < nosave_end_pfn) | ||
1744 | return 1; | ||
1745 | /* Skip memory holes and read-only pages (NSS, DCSS, ...). */ | ||
1746 | + if (pfn >= stext_pfn && pfn <= eshared_pfn) | ||
1747 | + return ipl_info.type == IPL_TYPE_NSS ? 1 : 0; | ||
1748 | if (tprot(PFN_PHYS(pfn))) | ||
1749 | return 1; | ||
1750 | return 0; | ||
1751 | diff --git a/arch/s390/kvm/interrupt.c b/arch/s390/kvm/interrupt.c | ||
1752 | index 073b5f387d1d..e7bc2fdb6f67 100644 | ||
1753 | --- a/arch/s390/kvm/interrupt.c | ||
1754 | +++ b/arch/s390/kvm/interrupt.c | ||
1755 | @@ -17,6 +17,7 @@ | ||
1756 | #include <linux/signal.h> | ||
1757 | #include <linux/slab.h> | ||
1758 | #include <linux/bitmap.h> | ||
1759 | +#include <linux/vmalloc.h> | ||
1760 | #include <asm/asm-offsets.h> | ||
1761 | #include <asm/uaccess.h> | ||
1762 | #include <asm/sclp.h> | ||
1763 | @@ -1332,10 +1333,10 @@ int kvm_s390_inject_vm(struct kvm *kvm, | ||
1764 | return rc; | ||
1765 | } | ||
1766 | |||
1767 | -void kvm_s390_reinject_io_int(struct kvm *kvm, | ||
1768 | +int kvm_s390_reinject_io_int(struct kvm *kvm, | ||
1769 | struct kvm_s390_interrupt_info *inti) | ||
1770 | { | ||
1771 | - __inject_vm(kvm, inti); | ||
1772 | + return __inject_vm(kvm, inti); | ||
1773 | } | ||
1774 | |||
1775 | int s390int_to_s390irq(struct kvm_s390_interrupt *s390int, | ||
1776 | @@ -1455,61 +1456,66 @@ void kvm_s390_clear_float_irqs(struct kvm *kvm) | ||
1777 | spin_unlock(&fi->lock); | ||
1778 | } | ||
1779 | |||
1780 | -static inline int copy_irq_to_user(struct kvm_s390_interrupt_info *inti, | ||
1781 | - u8 *addr) | ||
1782 | +static void inti_to_irq(struct kvm_s390_interrupt_info *inti, | ||
1783 | + struct kvm_s390_irq *irq) | ||
1784 | { | ||
1785 | - struct kvm_s390_irq __user *uptr = (struct kvm_s390_irq __user *) addr; | ||
1786 | - struct kvm_s390_irq irq = {0}; | ||
1787 | - | ||
1788 | - irq.type = inti->type; | ||
1789 | + irq->type = inti->type; | ||
1790 | switch (inti->type) { | ||
1791 | case KVM_S390_INT_PFAULT_INIT: | ||
1792 | case KVM_S390_INT_PFAULT_DONE: | ||
1793 | case KVM_S390_INT_VIRTIO: | ||
1794 | case KVM_S390_INT_SERVICE: | ||
1795 | - irq.u.ext = inti->ext; | ||
1796 | + irq->u.ext = inti->ext; | ||
1797 | break; | ||
1798 | case KVM_S390_INT_IO_MIN...KVM_S390_INT_IO_MAX: | ||
1799 | - irq.u.io = inti->io; | ||
1800 | + irq->u.io = inti->io; | ||
1801 | break; | ||
1802 | case KVM_S390_MCHK: | ||
1803 | - irq.u.mchk = inti->mchk; | ||
1804 | + irq->u.mchk = inti->mchk; | ||
1805 | break; | ||
1806 | - default: | ||
1807 | - return -EINVAL; | ||
1808 | } | ||
1809 | - | ||
1810 | - if (copy_to_user(uptr, &irq, sizeof(irq))) | ||
1811 | - return -EFAULT; | ||
1812 | - | ||
1813 | - return 0; | ||
1814 | } | ||
1815 | |||
1816 | -static int get_all_floating_irqs(struct kvm *kvm, __u8 *buf, __u64 len) | ||
1817 | +static int get_all_floating_irqs(struct kvm *kvm, u8 __user *usrbuf, u64 len) | ||
1818 | { | ||
1819 | struct kvm_s390_interrupt_info *inti; | ||
1820 | struct kvm_s390_float_interrupt *fi; | ||
1821 | + struct kvm_s390_irq *buf; | ||
1822 | + int max_irqs; | ||
1823 | int ret = 0; | ||
1824 | int n = 0; | ||
1825 | |||
1826 | + if (len > KVM_S390_FLIC_MAX_BUFFER || len == 0) | ||
1827 | + return -EINVAL; | ||
1828 | + | ||
1829 | + /* | ||
1830 | + * We are already using -ENOMEM to signal | ||
1831 | + * userspace it may retry with a bigger buffer, | ||
1832 | + * so we need to use something else for this case | ||
1833 | + */ | ||
1834 | + buf = vzalloc(len); | ||
1835 | + if (!buf) | ||
1836 | + return -ENOBUFS; | ||
1837 | + | ||
1838 | + max_irqs = len / sizeof(struct kvm_s390_irq); | ||
1839 | + | ||
1840 | fi = &kvm->arch.float_int; | ||
1841 | spin_lock(&fi->lock); | ||
1842 | - | ||
1843 | list_for_each_entry(inti, &fi->list, list) { | ||
1844 | - if (len < sizeof(struct kvm_s390_irq)) { | ||
1845 | + if (n == max_irqs) { | ||
1846 | /* signal userspace to try again */ | ||
1847 | ret = -ENOMEM; | ||
1848 | break; | ||
1849 | } | ||
1850 | - ret = copy_irq_to_user(inti, buf); | ||
1851 | - if (ret) | ||
1852 | - break; | ||
1853 | - buf += sizeof(struct kvm_s390_irq); | ||
1854 | - len -= sizeof(struct kvm_s390_irq); | ||
1855 | + inti_to_irq(inti, &buf[n]); | ||
1856 | n++; | ||
1857 | } | ||
1858 | - | ||
1859 | spin_unlock(&fi->lock); | ||
1860 | + if (!ret && n > 0) { | ||
1861 | + if (copy_to_user(usrbuf, buf, sizeof(struct kvm_s390_irq) * n)) | ||
1862 | + ret = -EFAULT; | ||
1863 | + } | ||
1864 | + vfree(buf); | ||
1865 | |||
1866 | return ret < 0 ? ret : n; | ||
1867 | } | ||
1868 | @@ -1520,7 +1526,7 @@ static int flic_get_attr(struct kvm_device *dev, struct kvm_device_attr *attr) | ||
1869 | |||
1870 | switch (attr->group) { | ||
1871 | case KVM_DEV_FLIC_GET_ALL_IRQS: | ||
1872 | - r = get_all_floating_irqs(dev->kvm, (u8 *) attr->addr, | ||
1873 | + r = get_all_floating_irqs(dev->kvm, (u8 __user *) attr->addr, | ||
1874 | attr->attr); | ||
1875 | break; | ||
1876 | default: | ||
1877 | diff --git a/arch/s390/kvm/kvm-s390.h b/arch/s390/kvm/kvm-s390.h | ||
1878 | index c34109aa552d..6995a3080a0e 100644 | ||
1879 | --- a/arch/s390/kvm/kvm-s390.h | ||
1880 | +++ b/arch/s390/kvm/kvm-s390.h | ||
1881 | @@ -151,8 +151,8 @@ int __must_check kvm_s390_inject_vcpu(struct kvm_vcpu *vcpu, | ||
1882 | int __must_check kvm_s390_inject_program_int(struct kvm_vcpu *vcpu, u16 code); | ||
1883 | struct kvm_s390_interrupt_info *kvm_s390_get_io_int(struct kvm *kvm, | ||
1884 | u64 cr6, u64 schid); | ||
1885 | -void kvm_s390_reinject_io_int(struct kvm *kvm, | ||
1886 | - struct kvm_s390_interrupt_info *inti); | ||
1887 | +int kvm_s390_reinject_io_int(struct kvm *kvm, | ||
1888 | + struct kvm_s390_interrupt_info *inti); | ||
1889 | int kvm_s390_mask_adapter(struct kvm *kvm, unsigned int id, bool masked); | ||
1890 | |||
1891 | /* implemented in intercept.c */ | ||
1892 | diff --git a/arch/s390/kvm/priv.c b/arch/s390/kvm/priv.c | ||
1893 | index 351116939ea2..b982fbca34df 100644 | ||
1894 | --- a/arch/s390/kvm/priv.c | ||
1895 | +++ b/arch/s390/kvm/priv.c | ||
1896 | @@ -229,18 +229,19 @@ static int handle_tpi(struct kvm_vcpu *vcpu) | ||
1897 | struct kvm_s390_interrupt_info *inti; | ||
1898 | unsigned long len; | ||
1899 | u32 tpi_data[3]; | ||
1900 | - int cc, rc; | ||
1901 | + int rc; | ||
1902 | u64 addr; | ||
1903 | |||
1904 | - rc = 0; | ||
1905 | addr = kvm_s390_get_base_disp_s(vcpu); | ||
1906 | if (addr & 3) | ||
1907 | return kvm_s390_inject_program_int(vcpu, PGM_SPECIFICATION); | ||
1908 | - cc = 0; | ||
1909 | + | ||
1910 | inti = kvm_s390_get_io_int(vcpu->kvm, vcpu->arch.sie_block->gcr[6], 0); | ||
1911 | - if (!inti) | ||
1912 | - goto no_interrupt; | ||
1913 | - cc = 1; | ||
1914 | + if (!inti) { | ||
1915 | + kvm_s390_set_psw_cc(vcpu, 0); | ||
1916 | + return 0; | ||
1917 | + } | ||
1918 | + | ||
1919 | tpi_data[0] = inti->io.subchannel_id << 16 | inti->io.subchannel_nr; | ||
1920 | tpi_data[1] = inti->io.io_int_parm; | ||
1921 | tpi_data[2] = inti->io.io_int_word; | ||
1922 | @@ -251,30 +252,38 @@ static int handle_tpi(struct kvm_vcpu *vcpu) | ||
1923 | */ | ||
1924 | len = sizeof(tpi_data) - 4; | ||
1925 | rc = write_guest(vcpu, addr, &tpi_data, len); | ||
1926 | - if (rc) | ||
1927 | - return kvm_s390_inject_prog_cond(vcpu, rc); | ||
1928 | + if (rc) { | ||
1929 | + rc = kvm_s390_inject_prog_cond(vcpu, rc); | ||
1930 | + goto reinject_interrupt; | ||
1931 | + } | ||
1932 | } else { | ||
1933 | /* | ||
1934 | * Store the three-word I/O interruption code into | ||
1935 | * the appropriate lowcore area. | ||
1936 | */ | ||
1937 | len = sizeof(tpi_data); | ||
1938 | - if (write_guest_lc(vcpu, __LC_SUBCHANNEL_ID, &tpi_data, len)) | ||
1939 | + if (write_guest_lc(vcpu, __LC_SUBCHANNEL_ID, &tpi_data, len)) { | ||
1940 | + /* failed writes to the low core are not recoverable */ | ||
1941 | rc = -EFAULT; | ||
1942 | + goto reinject_interrupt; | ||
1943 | + } | ||
1944 | } | ||
1945 | + | ||
1946 | + /* irq was successfully handed to the guest */ | ||
1947 | + kfree(inti); | ||
1948 | + kvm_s390_set_psw_cc(vcpu, 1); | ||
1949 | + return 0; | ||
1950 | +reinject_interrupt: | ||
1951 | /* | ||
1952 | * If we encounter a problem storing the interruption code, the | ||
1953 | * instruction is suppressed from the guest's view: reinject the | ||
1954 | * interrupt. | ||
1955 | */ | ||
1956 | - if (!rc) | ||
1957 | + if (kvm_s390_reinject_io_int(vcpu->kvm, inti)) { | ||
1958 | kfree(inti); | ||
1959 | - else | ||
1960 | - kvm_s390_reinject_io_int(vcpu->kvm, inti); | ||
1961 | -no_interrupt: | ||
1962 | - /* Set condition code and we're done. */ | ||
1963 | - if (!rc) | ||
1964 | - kvm_s390_set_psw_cc(vcpu, cc); | ||
1965 | + rc = -EFAULT; | ||
1966 | + } | ||
1967 | + /* don't set the cc, a pgm irq was injected or we drop to user space */ | ||
1968 | return rc ? -EFAULT : 0; | ||
1969 | } | ||
1970 | |||
1971 | @@ -467,6 +476,7 @@ static void handle_stsi_3_2_2(struct kvm_vcpu *vcpu, struct sysinfo_3_2_2 *mem) | ||
1972 | for (n = mem->count - 1; n > 0 ; n--) | ||
1973 | memcpy(&mem->vm[n], &mem->vm[n - 1], sizeof(mem->vm[0])); | ||
1974 | |||
1975 | + memset(&mem->vm[0], 0, sizeof(mem->vm[0])); | ||
1976 | mem->vm[0].cpus_total = cpus; | ||
1977 | mem->vm[0].cpus_configured = cpus; | ||
1978 | mem->vm[0].cpus_standby = 0; | ||
1979 | diff --git a/arch/x86/include/asm/insn.h b/arch/x86/include/asm/insn.h | ||
1980 | index 47f29b1d1846..e7814b74caf8 100644 | ||
1981 | --- a/arch/x86/include/asm/insn.h | ||
1982 | +++ b/arch/x86/include/asm/insn.h | ||
1983 | @@ -69,7 +69,7 @@ struct insn { | ||
1984 | const insn_byte_t *next_byte; | ||
1985 | }; | ||
1986 | |||
1987 | -#define MAX_INSN_SIZE 16 | ||
1988 | +#define MAX_INSN_SIZE 15 | ||
1989 | |||
1990 | #define X86_MODRM_MOD(modrm) (((modrm) & 0xc0) >> 6) | ||
1991 | #define X86_MODRM_REG(modrm) (((modrm) & 0x38) >> 3) | ||
1992 | diff --git a/arch/x86/include/asm/mwait.h b/arch/x86/include/asm/mwait.h | ||
1993 | index a1410db38a1a..653dfa7662e1 100644 | ||
1994 | --- a/arch/x86/include/asm/mwait.h | ||
1995 | +++ b/arch/x86/include/asm/mwait.h | ||
1996 | @@ -30,6 +30,14 @@ static inline void __mwait(unsigned long eax, unsigned long ecx) | ||
1997 | :: "a" (eax), "c" (ecx)); | ||
1998 | } | ||
1999 | |||
2000 | +static inline void __sti_mwait(unsigned long eax, unsigned long ecx) | ||
2001 | +{ | ||
2002 | + trace_hardirqs_on(); | ||
2003 | + /* "mwait %eax, %ecx;" */ | ||
2004 | + asm volatile("sti; .byte 0x0f, 0x01, 0xc9;" | ||
2005 | + :: "a" (eax), "c" (ecx)); | ||
2006 | +} | ||
2007 | + | ||
2008 | /* | ||
2009 | * This uses new MONITOR/MWAIT instructions on P4 processors with PNI, | ||
2010 | * which can obviate IPI to trigger checking of need_resched. | ||
2011 | diff --git a/arch/x86/include/asm/pvclock.h b/arch/x86/include/asm/pvclock.h | ||
2012 | index d6b078e9fa28..25b1cc07d496 100644 | ||
2013 | --- a/arch/x86/include/asm/pvclock.h | ||
2014 | +++ b/arch/x86/include/asm/pvclock.h | ||
2015 | @@ -95,6 +95,7 @@ unsigned __pvclock_read_cycles(const struct pvclock_vcpu_time_info *src, | ||
2016 | |||
2017 | struct pvclock_vsyscall_time_info { | ||
2018 | struct pvclock_vcpu_time_info pvti; | ||
2019 | + u32 migrate_count; | ||
2020 | } __attribute__((__aligned__(SMP_CACHE_BYTES))); | ||
2021 | |||
2022 | #define PVTI_SIZE sizeof(struct pvclock_vsyscall_time_info) | ||
2023 | diff --git a/arch/x86/kernel/cpu/perf_event_intel_ds.c b/arch/x86/kernel/cpu/perf_event_intel_ds.c | ||
2024 | index 073983398364..666bcf14ce10 100644 | ||
2025 | --- a/arch/x86/kernel/cpu/perf_event_intel_ds.c | ||
2026 | +++ b/arch/x86/kernel/cpu/perf_event_intel_ds.c | ||
2027 | @@ -557,6 +557,8 @@ struct event_constraint intel_core2_pebs_event_constraints[] = { | ||
2028 | INTEL_FLAGS_UEVENT_CONSTRAINT(0x00c5, 0x1), /* BR_INST_RETIRED.MISPRED */ | ||
2029 | INTEL_FLAGS_UEVENT_CONSTRAINT(0x1fc7, 0x1), /* SIMD_INST_RETURED.ANY */ | ||
2030 | INTEL_FLAGS_EVENT_CONSTRAINT(0xcb, 0x1), /* MEM_LOAD_RETIRED.* */ | ||
2031 | + /* INST_RETIRED.ANY_P, inv=1, cmask=16 (cycles:p). */ | ||
2032 | + INTEL_FLAGS_EVENT_CONSTRAINT(0x108000c0, 0x01), | ||
2033 | EVENT_CONSTRAINT_END | ||
2034 | }; | ||
2035 | |||
2036 | @@ -564,6 +566,8 @@ struct event_constraint intel_atom_pebs_event_constraints[] = { | ||
2037 | INTEL_FLAGS_UEVENT_CONSTRAINT(0x00c0, 0x1), /* INST_RETIRED.ANY */ | ||
2038 | INTEL_FLAGS_UEVENT_CONSTRAINT(0x00c5, 0x1), /* MISPREDICTED_BRANCH_RETIRED */ | ||
2039 | INTEL_FLAGS_EVENT_CONSTRAINT(0xcb, 0x1), /* MEM_LOAD_RETIRED.* */ | ||
2040 | + /* INST_RETIRED.ANY_P, inv=1, cmask=16 (cycles:p). */ | ||
2041 | + INTEL_FLAGS_EVENT_CONSTRAINT(0x108000c0, 0x01), | ||
2042 | EVENT_CONSTRAINT_END | ||
2043 | }; | ||
2044 | |||
2045 | @@ -587,6 +591,8 @@ struct event_constraint intel_nehalem_pebs_event_constraints[] = { | ||
2046 | INTEL_FLAGS_UEVENT_CONSTRAINT(0x20c8, 0xf), /* ITLB_MISS_RETIRED */ | ||
2047 | INTEL_FLAGS_EVENT_CONSTRAINT(0xcb, 0xf), /* MEM_LOAD_RETIRED.* */ | ||
2048 | INTEL_FLAGS_EVENT_CONSTRAINT(0xf7, 0xf), /* FP_ASSIST.* */ | ||
2049 | + /* INST_RETIRED.ANY_P, inv=1, cmask=16 (cycles:p). */ | ||
2050 | + INTEL_FLAGS_EVENT_CONSTRAINT(0x108000c0, 0x0f), | ||
2051 | EVENT_CONSTRAINT_END | ||
2052 | }; | ||
2053 | |||
2054 | @@ -602,6 +608,8 @@ struct event_constraint intel_westmere_pebs_event_constraints[] = { | ||
2055 | INTEL_FLAGS_UEVENT_CONSTRAINT(0x20c8, 0xf), /* ITLB_MISS_RETIRED */ | ||
2056 | INTEL_FLAGS_EVENT_CONSTRAINT(0xcb, 0xf), /* MEM_LOAD_RETIRED.* */ | ||
2057 | INTEL_FLAGS_EVENT_CONSTRAINT(0xf7, 0xf), /* FP_ASSIST.* */ | ||
2058 | + /* INST_RETIRED.ANY_P, inv=1, cmask=16 (cycles:p). */ | ||
2059 | + INTEL_FLAGS_EVENT_CONSTRAINT(0x108000c0, 0x0f), | ||
2060 | EVENT_CONSTRAINT_END | ||
2061 | }; | ||
2062 | |||
2063 | diff --git a/arch/x86/kernel/process.c b/arch/x86/kernel/process.c | ||
2064 | index 046e2d620bbe..a388bb883128 100644 | ||
2065 | --- a/arch/x86/kernel/process.c | ||
2066 | +++ b/arch/x86/kernel/process.c | ||
2067 | @@ -24,6 +24,7 @@ | ||
2068 | #include <asm/syscalls.h> | ||
2069 | #include <asm/idle.h> | ||
2070 | #include <asm/uaccess.h> | ||
2071 | +#include <asm/mwait.h> | ||
2072 | #include <asm/i387.h> | ||
2073 | #include <asm/fpu-internal.h> | ||
2074 | #include <asm/debugreg.h> | ||
2075 | @@ -399,6 +400,53 @@ static void amd_e400_idle(void) | ||
2076 | default_idle(); | ||
2077 | } | ||
2078 | |||
2079 | +/* | ||
2080 | + * Intel Core2 and older machines prefer MWAIT over HALT for C1. | ||
2081 | + * We can't rely on cpuidle installing MWAIT, because it will not load | ||
2082 | + * on systems that support only C1 -- so the boot default must be MWAIT. | ||
2083 | + * | ||
2084 | + * Some AMD machines are the opposite, they depend on using HALT. | ||
2085 | + * | ||
2086 | + * So for default C1, which is used during boot until cpuidle loads, | ||
2087 | + * use MWAIT-C1 on Intel HW that has it, else use HALT. | ||
2088 | + */ | ||
2089 | +static int prefer_mwait_c1_over_halt(const struct cpuinfo_x86 *c) | ||
2090 | +{ | ||
2091 | + if (c->x86_vendor != X86_VENDOR_INTEL) | ||
2092 | + return 0; | ||
2093 | + | ||
2094 | + if (!cpu_has(c, X86_FEATURE_MWAIT)) | ||
2095 | + return 0; | ||
2096 | + | ||
2097 | + return 1; | ||
2098 | +} | ||
2099 | + | ||
2100 | +/* | ||
2101 | + * MONITOR/MWAIT with no hints, used for default default C1 state. | ||
2102 | + * This invokes MWAIT with interrutps enabled and no flags, | ||
2103 | + * which is backwards compatible with the original MWAIT implementation. | ||
2104 | + */ | ||
2105 | + | ||
2106 | +static void mwait_idle(void) | ||
2107 | +{ | ||
2108 | + if (!current_set_polling_and_test()) { | ||
2109 | + if (this_cpu_has(X86_BUG_CLFLUSH_MONITOR)) { | ||
2110 | + smp_mb(); /* quirk */ | ||
2111 | + clflush((void *)¤t_thread_info()->flags); | ||
2112 | + smp_mb(); /* quirk */ | ||
2113 | + } | ||
2114 | + | ||
2115 | + __monitor((void *)¤t_thread_info()->flags, 0, 0); | ||
2116 | + if (!need_resched()) | ||
2117 | + __sti_mwait(0, 0); | ||
2118 | + else | ||
2119 | + local_irq_enable(); | ||
2120 | + } else { | ||
2121 | + local_irq_enable(); | ||
2122 | + } | ||
2123 | + __current_clr_polling(); | ||
2124 | +} | ||
2125 | + | ||
2126 | void select_idle_routine(const struct cpuinfo_x86 *c) | ||
2127 | { | ||
2128 | #ifdef CONFIG_SMP | ||
2129 | @@ -412,6 +460,9 @@ void select_idle_routine(const struct cpuinfo_x86 *c) | ||
2130 | /* E400: APIC timer interrupt does not wake up CPU from C1e */ | ||
2131 | pr_info("using AMD E400 aware idle routine\n"); | ||
2132 | x86_idle = amd_e400_idle; | ||
2133 | + } else if (prefer_mwait_c1_over_halt(c)) { | ||
2134 | + pr_info("using mwait in idle threads\n"); | ||
2135 | + x86_idle = mwait_idle; | ||
2136 | } else | ||
2137 | x86_idle = default_idle; | ||
2138 | } | ||
2139 | diff --git a/arch/x86/kernel/pvclock.c b/arch/x86/kernel/pvclock.c | ||
2140 | index 2f355d229a58..e5ecd20e72dd 100644 | ||
2141 | --- a/arch/x86/kernel/pvclock.c | ||
2142 | +++ b/arch/x86/kernel/pvclock.c | ||
2143 | @@ -141,7 +141,46 @@ void pvclock_read_wallclock(struct pvclock_wall_clock *wall_clock, | ||
2144 | set_normalized_timespec(ts, now.tv_sec, now.tv_nsec); | ||
2145 | } | ||
2146 | |||
2147 | +static struct pvclock_vsyscall_time_info *pvclock_vdso_info; | ||
2148 | + | ||
2149 | +static struct pvclock_vsyscall_time_info * | ||
2150 | +pvclock_get_vsyscall_user_time_info(int cpu) | ||
2151 | +{ | ||
2152 | + if (!pvclock_vdso_info) { | ||
2153 | + BUG(); | ||
2154 | + return NULL; | ||
2155 | + } | ||
2156 | + | ||
2157 | + return &pvclock_vdso_info[cpu]; | ||
2158 | +} | ||
2159 | + | ||
2160 | +struct pvclock_vcpu_time_info *pvclock_get_vsyscall_time_info(int cpu) | ||
2161 | +{ | ||
2162 | + return &pvclock_get_vsyscall_user_time_info(cpu)->pvti; | ||
2163 | +} | ||
2164 | + | ||
2165 | #ifdef CONFIG_X86_64 | ||
2166 | +static int pvclock_task_migrate(struct notifier_block *nb, unsigned long l, | ||
2167 | + void *v) | ||
2168 | +{ | ||
2169 | + struct task_migration_notifier *mn = v; | ||
2170 | + struct pvclock_vsyscall_time_info *pvti; | ||
2171 | + | ||
2172 | + pvti = pvclock_get_vsyscall_user_time_info(mn->from_cpu); | ||
2173 | + | ||
2174 | + /* this is NULL when pvclock vsyscall is not initialized */ | ||
2175 | + if (unlikely(pvti == NULL)) | ||
2176 | + return NOTIFY_DONE; | ||
2177 | + | ||
2178 | + pvti->migrate_count++; | ||
2179 | + | ||
2180 | + return NOTIFY_DONE; | ||
2181 | +} | ||
2182 | + | ||
2183 | +static struct notifier_block pvclock_migrate = { | ||
2184 | + .notifier_call = pvclock_task_migrate, | ||
2185 | +}; | ||
2186 | + | ||
2187 | /* | ||
2188 | * Initialize the generic pvclock vsyscall state. This will allocate | ||
2189 | * a/some page(s) for the per-vcpu pvclock information, set up a | ||
2190 | @@ -155,12 +194,17 @@ int __init pvclock_init_vsyscall(struct pvclock_vsyscall_time_info *i, | ||
2191 | |||
2192 | WARN_ON (size != PVCLOCK_VSYSCALL_NR_PAGES*PAGE_SIZE); | ||
2193 | |||
2194 | + pvclock_vdso_info = i; | ||
2195 | + | ||
2196 | for (idx = 0; idx <= (PVCLOCK_FIXMAP_END-PVCLOCK_FIXMAP_BEGIN); idx++) { | ||
2197 | __set_fixmap(PVCLOCK_FIXMAP_BEGIN + idx, | ||
2198 | __pa(i) + (idx*PAGE_SIZE), | ||
2199 | PAGE_KERNEL_VVAR); | ||
2200 | } | ||
2201 | |||
2202 | + | ||
2203 | + register_task_migration_notifier(&pvclock_migrate); | ||
2204 | + | ||
2205 | return 0; | ||
2206 | } | ||
2207 | #endif | ||
2208 | diff --git a/arch/x86/kvm/vmx.c b/arch/x86/kvm/vmx.c | ||
2209 | index ae4f6d35d19c..a60bd3aa0965 100644 | ||
2210 | --- a/arch/x86/kvm/vmx.c | ||
2211 | +++ b/arch/x86/kvm/vmx.c | ||
2212 | @@ -3621,8 +3621,16 @@ static void vmx_set_cr3(struct kvm_vcpu *vcpu, unsigned long cr3) | ||
2213 | |||
2214 | static int vmx_set_cr4(struct kvm_vcpu *vcpu, unsigned long cr4) | ||
2215 | { | ||
2216 | - unsigned long hw_cr4 = cr4 | (to_vmx(vcpu)->rmode.vm86_active ? | ||
2217 | - KVM_RMODE_VM_CR4_ALWAYS_ON : KVM_PMODE_VM_CR4_ALWAYS_ON); | ||
2218 | + /* | ||
2219 | + * Pass through host's Machine Check Enable value to hw_cr4, which | ||
2220 | + * is in force while we are in guest mode. Do not let guests control | ||
2221 | + * this bit, even if host CR4.MCE == 0. | ||
2222 | + */ | ||
2223 | + unsigned long hw_cr4 = | ||
2224 | + (cr4_read_shadow() & X86_CR4_MCE) | | ||
2225 | + (cr4 & ~X86_CR4_MCE) | | ||
2226 | + (to_vmx(vcpu)->rmode.vm86_active ? | ||
2227 | + KVM_RMODE_VM_CR4_ALWAYS_ON : KVM_PMODE_VM_CR4_ALWAYS_ON); | ||
2228 | |||
2229 | if (cr4 & X86_CR4_VMXE) { | ||
2230 | /* | ||
2231 | diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c | ||
2232 | index 32bf19ef3115..e222ba5d2beb 100644 | ||
2233 | --- a/arch/x86/kvm/x86.c | ||
2234 | +++ b/arch/x86/kvm/x86.c | ||
2235 | @@ -5775,7 +5775,6 @@ int kvm_arch_init(void *opaque) | ||
2236 | kvm_set_mmio_spte_mask(); | ||
2237 | |||
2238 | kvm_x86_ops = ops; | ||
2239 | - kvm_init_msr_list(); | ||
2240 | |||
2241 | kvm_mmu_set_mask_ptes(PT_USER_MASK, PT_ACCESSED_MASK, | ||
2242 | PT_DIRTY_MASK, PT64_NX_MASK, 0); | ||
2243 | @@ -7209,7 +7208,14 @@ void kvm_arch_hardware_disable(void) | ||
2244 | |||
2245 | int kvm_arch_hardware_setup(void) | ||
2246 | { | ||
2247 | - return kvm_x86_ops->hardware_setup(); | ||
2248 | + int r; | ||
2249 | + | ||
2250 | + r = kvm_x86_ops->hardware_setup(); | ||
2251 | + if (r != 0) | ||
2252 | + return r; | ||
2253 | + | ||
2254 | + kvm_init_msr_list(); | ||
2255 | + return 0; | ||
2256 | } | ||
2257 | |||
2258 | void kvm_arch_hardware_unsetup(void) | ||
2259 | diff --git a/arch/x86/lib/insn.c b/arch/x86/lib/insn.c | ||
2260 | index 1313ae6b478b..85994f5d48e4 100644 | ||
2261 | --- a/arch/x86/lib/insn.c | ||
2262 | +++ b/arch/x86/lib/insn.c | ||
2263 | @@ -52,6 +52,13 @@ | ||
2264 | */ | ||
2265 | void insn_init(struct insn *insn, const void *kaddr, int buf_len, int x86_64) | ||
2266 | { | ||
2267 | + /* | ||
2268 | + * Instructions longer than MAX_INSN_SIZE (15 bytes) are invalid | ||
2269 | + * even if the input buffer is long enough to hold them. | ||
2270 | + */ | ||
2271 | + if (buf_len > MAX_INSN_SIZE) | ||
2272 | + buf_len = MAX_INSN_SIZE; | ||
2273 | + | ||
2274 | memset(insn, 0, sizeof(*insn)); | ||
2275 | insn->kaddr = kaddr; | ||
2276 | insn->end_kaddr = kaddr + buf_len; | ||
2277 | diff --git a/arch/x86/lib/usercopy_64.c b/arch/x86/lib/usercopy_64.c | ||
2278 | index 1f33b3d1fd68..0a42327a59d7 100644 | ||
2279 | --- a/arch/x86/lib/usercopy_64.c | ||
2280 | +++ b/arch/x86/lib/usercopy_64.c | ||
2281 | @@ -82,7 +82,7 @@ copy_user_handle_tail(char *to, char *from, unsigned len) | ||
2282 | clac(); | ||
2283 | |||
2284 | /* If the destination is a kernel buffer, we always clear the end */ | ||
2285 | - if ((unsigned long)to >= TASK_SIZE_MAX) | ||
2286 | + if (!__addr_ok(to)) | ||
2287 | memset(to, 0, len); | ||
2288 | return len; | ||
2289 | } | ||
2290 | diff --git a/arch/x86/vdso/vclock_gettime.c b/arch/x86/vdso/vclock_gettime.c | ||
2291 | index 9793322751e0..40d2473836c9 100644 | ||
2292 | --- a/arch/x86/vdso/vclock_gettime.c | ||
2293 | +++ b/arch/x86/vdso/vclock_gettime.c | ||
2294 | @@ -82,18 +82,15 @@ static notrace cycle_t vread_pvclock(int *mode) | ||
2295 | cycle_t ret; | ||
2296 | u64 last; | ||
2297 | u32 version; | ||
2298 | + u32 migrate_count; | ||
2299 | u8 flags; | ||
2300 | unsigned cpu, cpu1; | ||
2301 | |||
2302 | |||
2303 | /* | ||
2304 | - * Note: hypervisor must guarantee that: | ||
2305 | - * 1. cpu ID number maps 1:1 to per-CPU pvclock time info. | ||
2306 | - * 2. that per-CPU pvclock time info is updated if the | ||
2307 | - * underlying CPU changes. | ||
2308 | - * 3. that version is increased whenever underlying CPU | ||
2309 | - * changes. | ||
2310 | - * | ||
2311 | + * When looping to get a consistent (time-info, tsc) pair, we | ||
2312 | + * also need to deal with the possibility we can switch vcpus, | ||
2313 | + * so make sure we always re-fetch time-info for the current vcpu. | ||
2314 | */ | ||
2315 | do { | ||
2316 | cpu = __getcpu() & VGETCPU_CPU_MASK; | ||
2317 | @@ -102,20 +99,27 @@ static notrace cycle_t vread_pvclock(int *mode) | ||
2318 | * __getcpu() calls (Gleb). | ||
2319 | */ | ||
2320 | |||
2321 | - pvti = get_pvti(cpu); | ||
2322 | + /* Make sure migrate_count will change if we leave the VCPU. */ | ||
2323 | + do { | ||
2324 | + pvti = get_pvti(cpu); | ||
2325 | + migrate_count = pvti->migrate_count; | ||
2326 | + | ||
2327 | + cpu1 = cpu; | ||
2328 | + cpu = __getcpu() & VGETCPU_CPU_MASK; | ||
2329 | + } while (unlikely(cpu != cpu1)); | ||
2330 | |||
2331 | version = __pvclock_read_cycles(&pvti->pvti, &ret, &flags); | ||
2332 | |||
2333 | /* | ||
2334 | * Test we're still on the cpu as well as the version. | ||
2335 | - * We could have been migrated just after the first | ||
2336 | - * vgetcpu but before fetching the version, so we | ||
2337 | - * wouldn't notice a version change. | ||
2338 | + * - We must read TSC of pvti's VCPU. | ||
2339 | + * - KVM doesn't follow the versioning protocol, so data could | ||
2340 | + * change before version if we left the VCPU. | ||
2341 | */ | ||
2342 | - cpu1 = __getcpu() & VGETCPU_CPU_MASK; | ||
2343 | - } while (unlikely(cpu != cpu1 || | ||
2344 | - (pvti->pvti.version & 1) || | ||
2345 | - pvti->pvti.version != version)); | ||
2346 | + smp_rmb(); | ||
2347 | + } while (unlikely((pvti->pvti.version & 1) || | ||
2348 | + pvti->pvti.version != version || | ||
2349 | + pvti->migrate_count != migrate_count)); | ||
2350 | |||
2351 | if (unlikely(!(flags & PVCLOCK_TSC_STABLE_BIT))) | ||
2352 | *mode = VCLOCK_NONE; | ||
2353 | diff --git a/arch/xtensa/Kconfig b/arch/xtensa/Kconfig | ||
2354 | index e31d4949124a..87be10e8b57a 100644 | ||
2355 | --- a/arch/xtensa/Kconfig | ||
2356 | +++ b/arch/xtensa/Kconfig | ||
2357 | @@ -428,6 +428,36 @@ config DEFAULT_MEM_SIZE | ||
2358 | |||
2359 | If unsure, leave the default value here. | ||
2360 | |||
2361 | +config XTFPGA_LCD | ||
2362 | + bool "Enable XTFPGA LCD driver" | ||
2363 | + depends on XTENSA_PLATFORM_XTFPGA | ||
2364 | + default n | ||
2365 | + help | ||
2366 | + There's a 2x16 LCD on most of XTFPGA boards, kernel may output | ||
2367 | + progress messages there during bootup/shutdown. It may be useful | ||
2368 | + during board bringup. | ||
2369 | + | ||
2370 | + If unsure, say N. | ||
2371 | + | ||
2372 | +config XTFPGA_LCD_BASE_ADDR | ||
2373 | + hex "XTFPGA LCD base address" | ||
2374 | + depends on XTFPGA_LCD | ||
2375 | + default "0x0d0c0000" | ||
2376 | + help | ||
2377 | + Base address of the LCD controller inside KIO region. | ||
2378 | + Different boards from XTFPGA family have LCD controller at different | ||
2379 | + addresses. Please consult prototyping user guide for your board for | ||
2380 | + the correct address. Wrong address here may lead to hardware lockup. | ||
2381 | + | ||
2382 | +config XTFPGA_LCD_8BIT_ACCESS | ||
2383 | + bool "Use 8-bit access to XTFPGA LCD" | ||
2384 | + depends on XTFPGA_LCD | ||
2385 | + default n | ||
2386 | + help | ||
2387 | + LCD may be connected with 4- or 8-bit interface, 8-bit access may | ||
2388 | + only be used with 8-bit interface. Please consult prototyping user | ||
2389 | + guide for your board for the correct interface width. | ||
2390 | + | ||
2391 | endmenu | ||
2392 | |||
2393 | menu "Executable file formats" | ||
2394 | diff --git a/arch/xtensa/include/uapi/asm/unistd.h b/arch/xtensa/include/uapi/asm/unistd.h | ||
2395 | index db5bb72e2f4e..62d84657c60b 100644 | ||
2396 | --- a/arch/xtensa/include/uapi/asm/unistd.h | ||
2397 | +++ b/arch/xtensa/include/uapi/asm/unistd.h | ||
2398 | @@ -715,7 +715,7 @@ __SYSCALL(323, sys_process_vm_writev, 6) | ||
2399 | __SYSCALL(324, sys_name_to_handle_at, 5) | ||
2400 | #define __NR_open_by_handle_at 325 | ||
2401 | __SYSCALL(325, sys_open_by_handle_at, 3) | ||
2402 | -#define __NR_sync_file_range 326 | ||
2403 | +#define __NR_sync_file_range2 326 | ||
2404 | __SYSCALL(326, sys_sync_file_range2, 6) | ||
2405 | #define __NR_perf_event_open 327 | ||
2406 | __SYSCALL(327, sys_perf_event_open, 5) | ||
2407 | diff --git a/arch/xtensa/platforms/iss/network.c b/arch/xtensa/platforms/iss/network.c | ||
2408 | index d05f8feeb8d7..17b1ef3232e4 100644 | ||
2409 | --- a/arch/xtensa/platforms/iss/network.c | ||
2410 | +++ b/arch/xtensa/platforms/iss/network.c | ||
2411 | @@ -349,8 +349,8 @@ static void iss_net_timer(unsigned long priv) | ||
2412 | { | ||
2413 | struct iss_net_private *lp = (struct iss_net_private *)priv; | ||
2414 | |||
2415 | - spin_lock(&lp->lock); | ||
2416 | iss_net_poll(); | ||
2417 | + spin_lock(&lp->lock); | ||
2418 | mod_timer(&lp->timer, jiffies + lp->timer_val); | ||
2419 | spin_unlock(&lp->lock); | ||
2420 | } | ||
2421 | @@ -361,7 +361,7 @@ static int iss_net_open(struct net_device *dev) | ||
2422 | struct iss_net_private *lp = netdev_priv(dev); | ||
2423 | int err; | ||
2424 | |||
2425 | - spin_lock(&lp->lock); | ||
2426 | + spin_lock_bh(&lp->lock); | ||
2427 | |||
2428 | err = lp->tp.open(lp); | ||
2429 | if (err < 0) | ||
2430 | @@ -376,9 +376,11 @@ static int iss_net_open(struct net_device *dev) | ||
2431 | while ((err = iss_net_rx(dev)) > 0) | ||
2432 | ; | ||
2433 | |||
2434 | - spin_lock(&opened_lock); | ||
2435 | + spin_unlock_bh(&lp->lock); | ||
2436 | + spin_lock_bh(&opened_lock); | ||
2437 | list_add(&lp->opened_list, &opened); | ||
2438 | - spin_unlock(&opened_lock); | ||
2439 | + spin_unlock_bh(&opened_lock); | ||
2440 | + spin_lock_bh(&lp->lock); | ||
2441 | |||
2442 | init_timer(&lp->timer); | ||
2443 | lp->timer_val = ISS_NET_TIMER_VALUE; | ||
2444 | @@ -387,7 +389,7 @@ static int iss_net_open(struct net_device *dev) | ||
2445 | mod_timer(&lp->timer, jiffies + lp->timer_val); | ||
2446 | |||
2447 | out: | ||
2448 | - spin_unlock(&lp->lock); | ||
2449 | + spin_unlock_bh(&lp->lock); | ||
2450 | return err; | ||
2451 | } | ||
2452 | |||
2453 | @@ -395,7 +397,7 @@ static int iss_net_close(struct net_device *dev) | ||
2454 | { | ||
2455 | struct iss_net_private *lp = netdev_priv(dev); | ||
2456 | netif_stop_queue(dev); | ||
2457 | - spin_lock(&lp->lock); | ||
2458 | + spin_lock_bh(&lp->lock); | ||
2459 | |||
2460 | spin_lock(&opened_lock); | ||
2461 | list_del(&opened); | ||
2462 | @@ -405,18 +407,17 @@ static int iss_net_close(struct net_device *dev) | ||
2463 | |||
2464 | lp->tp.close(lp); | ||
2465 | |||
2466 | - spin_unlock(&lp->lock); | ||
2467 | + spin_unlock_bh(&lp->lock); | ||
2468 | return 0; | ||
2469 | } | ||
2470 | |||
2471 | static int iss_net_start_xmit(struct sk_buff *skb, struct net_device *dev) | ||
2472 | { | ||
2473 | struct iss_net_private *lp = netdev_priv(dev); | ||
2474 | - unsigned long flags; | ||
2475 | int len; | ||
2476 | |||
2477 | netif_stop_queue(dev); | ||
2478 | - spin_lock_irqsave(&lp->lock, flags); | ||
2479 | + spin_lock_bh(&lp->lock); | ||
2480 | |||
2481 | len = lp->tp.write(lp, &skb); | ||
2482 | |||
2483 | @@ -438,7 +439,7 @@ static int iss_net_start_xmit(struct sk_buff *skb, struct net_device *dev) | ||
2484 | pr_err("%s: %s failed(%d)\n", dev->name, __func__, len); | ||
2485 | } | ||
2486 | |||
2487 | - spin_unlock_irqrestore(&lp->lock, flags); | ||
2488 | + spin_unlock_bh(&lp->lock); | ||
2489 | |||
2490 | dev_kfree_skb(skb); | ||
2491 | return NETDEV_TX_OK; | ||
2492 | @@ -466,9 +467,9 @@ static int iss_net_set_mac(struct net_device *dev, void *addr) | ||
2493 | |||
2494 | if (!is_valid_ether_addr(hwaddr->sa_data)) | ||
2495 | return -EADDRNOTAVAIL; | ||
2496 | - spin_lock(&lp->lock); | ||
2497 | + spin_lock_bh(&lp->lock); | ||
2498 | memcpy(dev->dev_addr, hwaddr->sa_data, ETH_ALEN); | ||
2499 | - spin_unlock(&lp->lock); | ||
2500 | + spin_unlock_bh(&lp->lock); | ||
2501 | return 0; | ||
2502 | } | ||
2503 | |||
2504 | @@ -520,11 +521,11 @@ static int iss_net_configure(int index, char *init) | ||
2505 | *lp = (struct iss_net_private) { | ||
2506 | .device_list = LIST_HEAD_INIT(lp->device_list), | ||
2507 | .opened_list = LIST_HEAD_INIT(lp->opened_list), | ||
2508 | - .lock = __SPIN_LOCK_UNLOCKED(lp.lock), | ||
2509 | .dev = dev, | ||
2510 | .index = index, | ||
2511 | - }; | ||
2512 | + }; | ||
2513 | |||
2514 | + spin_lock_init(&lp->lock); | ||
2515 | /* | ||
2516 | * If this name ends up conflicting with an existing registered | ||
2517 | * netdevice, that is OK, register_netdev{,ice}() will notice this | ||
2518 | diff --git a/arch/xtensa/platforms/xtfpga/Makefile b/arch/xtensa/platforms/xtfpga/Makefile | ||
2519 | index b9ae206340cd..7839d38b2337 100644 | ||
2520 | --- a/arch/xtensa/platforms/xtfpga/Makefile | ||
2521 | +++ b/arch/xtensa/platforms/xtfpga/Makefile | ||
2522 | @@ -6,4 +6,5 @@ | ||
2523 | # | ||
2524 | # Note 2! The CFLAGS definitions are in the main makefile... | ||
2525 | |||
2526 | -obj-y = setup.o lcd.o | ||
2527 | +obj-y += setup.o | ||
2528 | +obj-$(CONFIG_XTFPGA_LCD) += lcd.o | ||
2529 | diff --git a/arch/xtensa/platforms/xtfpga/include/platform/hardware.h b/arch/xtensa/platforms/xtfpga/include/platform/hardware.h | ||
2530 | index 6edd20bb4565..4e0af2662a21 100644 | ||
2531 | --- a/arch/xtensa/platforms/xtfpga/include/platform/hardware.h | ||
2532 | +++ b/arch/xtensa/platforms/xtfpga/include/platform/hardware.h | ||
2533 | @@ -40,9 +40,6 @@ | ||
2534 | |||
2535 | /* UART */ | ||
2536 | #define DUART16552_PADDR (XCHAL_KIO_PADDR + 0x0D050020) | ||
2537 | -/* LCD instruction and data addresses. */ | ||
2538 | -#define LCD_INSTR_ADDR ((char *)IOADDR(0x0D040000)) | ||
2539 | -#define LCD_DATA_ADDR ((char *)IOADDR(0x0D040004)) | ||
2540 | |||
2541 | /* Misc. */ | ||
2542 | #define XTFPGA_FPGAREGS_VADDR IOADDR(0x0D020000) | ||
2543 | diff --git a/arch/xtensa/platforms/xtfpga/include/platform/lcd.h b/arch/xtensa/platforms/xtfpga/include/platform/lcd.h | ||
2544 | index 0e435645af5a..4c8541ed1139 100644 | ||
2545 | --- a/arch/xtensa/platforms/xtfpga/include/platform/lcd.h | ||
2546 | +++ b/arch/xtensa/platforms/xtfpga/include/platform/lcd.h | ||
2547 | @@ -11,10 +11,25 @@ | ||
2548 | #ifndef __XTENSA_XTAVNET_LCD_H | ||
2549 | #define __XTENSA_XTAVNET_LCD_H | ||
2550 | |||
2551 | +#ifdef CONFIG_XTFPGA_LCD | ||
2552 | /* Display string STR at position POS on the LCD. */ | ||
2553 | void lcd_disp_at_pos(char *str, unsigned char pos); | ||
2554 | |||
2555 | /* Shift the contents of the LCD display left or right. */ | ||
2556 | void lcd_shiftleft(void); | ||
2557 | void lcd_shiftright(void); | ||
2558 | +#else | ||
2559 | +static inline void lcd_disp_at_pos(char *str, unsigned char pos) | ||
2560 | +{ | ||
2561 | +} | ||
2562 | + | ||
2563 | +static inline void lcd_shiftleft(void) | ||
2564 | +{ | ||
2565 | +} | ||
2566 | + | ||
2567 | +static inline void lcd_shiftright(void) | ||
2568 | +{ | ||
2569 | +} | ||
2570 | +#endif | ||
2571 | + | ||
2572 | #endif | ||
2573 | diff --git a/arch/xtensa/platforms/xtfpga/lcd.c b/arch/xtensa/platforms/xtfpga/lcd.c | ||
2574 | index 2872301598df..4dc0c1b43f4b 100644 | ||
2575 | --- a/arch/xtensa/platforms/xtfpga/lcd.c | ||
2576 | +++ b/arch/xtensa/platforms/xtfpga/lcd.c | ||
2577 | @@ -1,50 +1,63 @@ | ||
2578 | /* | ||
2579 | - * Driver for the LCD display on the Tensilica LX60 Board. | ||
2580 | + * Driver for the LCD display on the Tensilica XTFPGA board family. | ||
2581 | + * http://www.mytechcorp.com/cfdata/productFile/File1/MOC-16216B-B-A0A04.pdf | ||
2582 | * | ||
2583 | * This file is subject to the terms and conditions of the GNU General Public | ||
2584 | * License. See the file "COPYING" in the main directory of this archive | ||
2585 | * for more details. | ||
2586 | * | ||
2587 | * Copyright (C) 2001, 2006 Tensilica Inc. | ||
2588 | + * Copyright (C) 2015 Cadence Design Systems Inc. | ||
2589 | */ | ||
2590 | |||
2591 | -/* | ||
2592 | - * | ||
2593 | - * FIXME: this code is from the examples from the LX60 user guide. | ||
2594 | - * | ||
2595 | - * The lcd_pause function does busy waiting, which is probably not | ||
2596 | - * great. Maybe the code could be changed to use kernel timers, or | ||
2597 | - * change the hardware to not need to wait. | ||
2598 | - */ | ||
2599 | - | ||
2600 | +#include <linux/delay.h> | ||
2601 | #include <linux/init.h> | ||
2602 | #include <linux/io.h> | ||
2603 | |||
2604 | #include <platform/hardware.h> | ||
2605 | #include <platform/lcd.h> | ||
2606 | -#include <linux/delay.h> | ||
2607 | |||
2608 | -#define LCD_PAUSE_ITERATIONS 4000 | ||
2609 | +/* LCD instruction and data addresses. */ | ||
2610 | +#define LCD_INSTR_ADDR ((char *)IOADDR(CONFIG_XTFPGA_LCD_BASE_ADDR)) | ||
2611 | +#define LCD_DATA_ADDR (LCD_INSTR_ADDR + 4) | ||
2612 | + | ||
2613 | #define LCD_CLEAR 0x1 | ||
2614 | #define LCD_DISPLAY_ON 0xc | ||
2615 | |||
2616 | /* 8bit and 2 lines display */ | ||
2617 | #define LCD_DISPLAY_MODE8BIT 0x38 | ||
2618 | +#define LCD_DISPLAY_MODE4BIT 0x28 | ||
2619 | #define LCD_DISPLAY_POS 0x80 | ||
2620 | #define LCD_SHIFT_LEFT 0x18 | ||
2621 | #define LCD_SHIFT_RIGHT 0x1c | ||
2622 | |||
2623 | +static void lcd_put_byte(u8 *addr, u8 data) | ||
2624 | +{ | ||
2625 | +#ifdef CONFIG_XTFPGA_LCD_8BIT_ACCESS | ||
2626 | + ACCESS_ONCE(*addr) = data; | ||
2627 | +#else | ||
2628 | + ACCESS_ONCE(*addr) = data & 0xf0; | ||
2629 | + ACCESS_ONCE(*addr) = (data << 4) & 0xf0; | ||
2630 | +#endif | ||
2631 | +} | ||
2632 | + | ||
2633 | static int __init lcd_init(void) | ||
2634 | { | ||
2635 | - *LCD_INSTR_ADDR = LCD_DISPLAY_MODE8BIT; | ||
2636 | + ACCESS_ONCE(*LCD_INSTR_ADDR) = LCD_DISPLAY_MODE8BIT; | ||
2637 | mdelay(5); | ||
2638 | - *LCD_INSTR_ADDR = LCD_DISPLAY_MODE8BIT; | ||
2639 | + ACCESS_ONCE(*LCD_INSTR_ADDR) = LCD_DISPLAY_MODE8BIT; | ||
2640 | udelay(200); | ||
2641 | - *LCD_INSTR_ADDR = LCD_DISPLAY_MODE8BIT; | ||
2642 | + ACCESS_ONCE(*LCD_INSTR_ADDR) = LCD_DISPLAY_MODE8BIT; | ||
2643 | + udelay(50); | ||
2644 | +#ifndef CONFIG_XTFPGA_LCD_8BIT_ACCESS | ||
2645 | + ACCESS_ONCE(*LCD_INSTR_ADDR) = LCD_DISPLAY_MODE4BIT; | ||
2646 | + udelay(50); | ||
2647 | + lcd_put_byte(LCD_INSTR_ADDR, LCD_DISPLAY_MODE4BIT); | ||
2648 | udelay(50); | ||
2649 | - *LCD_INSTR_ADDR = LCD_DISPLAY_ON; | ||
2650 | +#endif | ||
2651 | + lcd_put_byte(LCD_INSTR_ADDR, LCD_DISPLAY_ON); | ||
2652 | udelay(50); | ||
2653 | - *LCD_INSTR_ADDR = LCD_CLEAR; | ||
2654 | + lcd_put_byte(LCD_INSTR_ADDR, LCD_CLEAR); | ||
2655 | mdelay(10); | ||
2656 | lcd_disp_at_pos("XTENSA LINUX", 0); | ||
2657 | return 0; | ||
2658 | @@ -52,10 +65,10 @@ static int __init lcd_init(void) | ||
2659 | |||
2660 | void lcd_disp_at_pos(char *str, unsigned char pos) | ||
2661 | { | ||
2662 | - *LCD_INSTR_ADDR = LCD_DISPLAY_POS | pos; | ||
2663 | + lcd_put_byte(LCD_INSTR_ADDR, LCD_DISPLAY_POS | pos); | ||
2664 | udelay(100); | ||
2665 | while (*str != 0) { | ||
2666 | - *LCD_DATA_ADDR = *str; | ||
2667 | + lcd_put_byte(LCD_DATA_ADDR, *str); | ||
2668 | udelay(200); | ||
2669 | str++; | ||
2670 | } | ||
2671 | @@ -63,13 +76,13 @@ void lcd_disp_at_pos(char *str, unsigned char pos) | ||
2672 | |||
2673 | void lcd_shiftleft(void) | ||
2674 | { | ||
2675 | - *LCD_INSTR_ADDR = LCD_SHIFT_LEFT; | ||
2676 | + lcd_put_byte(LCD_INSTR_ADDR, LCD_SHIFT_LEFT); | ||
2677 | udelay(50); | ||
2678 | } | ||
2679 | |||
2680 | void lcd_shiftright(void) | ||
2681 | { | ||
2682 | - *LCD_INSTR_ADDR = LCD_SHIFT_RIGHT; | ||
2683 | + lcd_put_byte(LCD_INSTR_ADDR, LCD_SHIFT_RIGHT); | ||
2684 | udelay(50); | ||
2685 | } | ||
2686 | |||
2687 | diff --git a/drivers/acpi/acpica/evgpe.c b/drivers/acpi/acpica/evgpe.c | ||
2688 | index 5ed064e8673c..ccf793247447 100644 | ||
2689 | --- a/drivers/acpi/acpica/evgpe.c | ||
2690 | +++ b/drivers/acpi/acpica/evgpe.c | ||
2691 | @@ -92,6 +92,7 @@ acpi_ev_update_gpe_enable_mask(struct acpi_gpe_event_info *gpe_event_info) | ||
2692 | ACPI_SET_BIT(gpe_register_info->enable_for_run, | ||
2693 | (u8)register_bit); | ||
2694 | } | ||
2695 | + gpe_register_info->enable_mask = gpe_register_info->enable_for_run; | ||
2696 | |||
2697 | return_ACPI_STATUS(AE_OK); | ||
2698 | } | ||
2699 | @@ -123,7 +124,7 @@ acpi_status acpi_ev_enable_gpe(struct acpi_gpe_event_info *gpe_event_info) | ||
2700 | |||
2701 | /* Enable the requested GPE */ | ||
2702 | |||
2703 | - status = acpi_hw_low_set_gpe(gpe_event_info, ACPI_GPE_ENABLE_SAVE); | ||
2704 | + status = acpi_hw_low_set_gpe(gpe_event_info, ACPI_GPE_ENABLE); | ||
2705 | return_ACPI_STATUS(status); | ||
2706 | } | ||
2707 | |||
2708 | @@ -202,7 +203,7 @@ acpi_ev_remove_gpe_reference(struct acpi_gpe_event_info *gpe_event_info) | ||
2709 | if (ACPI_SUCCESS(status)) { | ||
2710 | status = | ||
2711 | acpi_hw_low_set_gpe(gpe_event_info, | ||
2712 | - ACPI_GPE_DISABLE_SAVE); | ||
2713 | + ACPI_GPE_DISABLE); | ||
2714 | } | ||
2715 | |||
2716 | if (ACPI_FAILURE(status)) { | ||
2717 | diff --git a/drivers/acpi/acpica/hwgpe.c b/drivers/acpi/acpica/hwgpe.c | ||
2718 | index 84bc550f4f1d..af6514ed64c5 100644 | ||
2719 | --- a/drivers/acpi/acpica/hwgpe.c | ||
2720 | +++ b/drivers/acpi/acpica/hwgpe.c | ||
2721 | @@ -89,6 +89,8 @@ u32 acpi_hw_get_gpe_register_bit(struct acpi_gpe_event_info *gpe_event_info) | ||
2722 | * RETURN: Status | ||
2723 | * | ||
2724 | * DESCRIPTION: Enable or disable a single GPE in the parent enable register. | ||
2725 | + * The enable_mask field of the involved GPE register must be | ||
2726 | + * updated by the caller if necessary. | ||
2727 | * | ||
2728 | ******************************************************************************/ | ||
2729 | |||
2730 | @@ -119,7 +121,7 @@ acpi_hw_low_set_gpe(struct acpi_gpe_event_info *gpe_event_info, u32 action) | ||
2731 | /* Set or clear just the bit that corresponds to this GPE */ | ||
2732 | |||
2733 | register_bit = acpi_hw_get_gpe_register_bit(gpe_event_info); | ||
2734 | - switch (action & ~ACPI_GPE_SAVE_MASK) { | ||
2735 | + switch (action) { | ||
2736 | case ACPI_GPE_CONDITIONAL_ENABLE: | ||
2737 | |||
2738 | /* Only enable if the corresponding enable_mask bit is set */ | ||
2739 | @@ -149,9 +151,6 @@ acpi_hw_low_set_gpe(struct acpi_gpe_event_info *gpe_event_info, u32 action) | ||
2740 | /* Write the updated enable mask */ | ||
2741 | |||
2742 | status = acpi_hw_write(enable_mask, &gpe_register_info->enable_address); | ||
2743 | - if (ACPI_SUCCESS(status) && (action & ACPI_GPE_SAVE_MASK)) { | ||
2744 | - gpe_register_info->enable_mask = (u8)enable_mask; | ||
2745 | - } | ||
2746 | return (status); | ||
2747 | } | ||
2748 | |||
2749 | @@ -286,10 +285,8 @@ acpi_hw_gpe_enable_write(u8 enable_mask, | ||
2750 | { | ||
2751 | acpi_status status; | ||
2752 | |||
2753 | + gpe_register_info->enable_mask = enable_mask; | ||
2754 | status = acpi_hw_write(enable_mask, &gpe_register_info->enable_address); | ||
2755 | - if (ACPI_SUCCESS(status)) { | ||
2756 | - gpe_register_info->enable_mask = enable_mask; | ||
2757 | - } | ||
2758 | return (status); | ||
2759 | } | ||
2760 | |||
2761 | diff --git a/drivers/acpi/acpica/tbinstal.c b/drivers/acpi/acpica/tbinstal.c | ||
2762 | index 9bad45e63a45..7fbc2b9dcbbb 100644 | ||
2763 | --- a/drivers/acpi/acpica/tbinstal.c | ||
2764 | +++ b/drivers/acpi/acpica/tbinstal.c | ||
2765 | @@ -346,7 +346,6 @@ acpi_tb_install_standard_table(acpi_physical_address address, | ||
2766 | */ | ||
2767 | acpi_tb_uninstall_table(&new_table_desc); | ||
2768 | *table_index = i; | ||
2769 | - (void)acpi_ut_release_mutex(ACPI_MTX_TABLES); | ||
2770 | return_ACPI_STATUS(AE_OK); | ||
2771 | } | ||
2772 | } | ||
2773 | diff --git a/drivers/acpi/scan.c b/drivers/acpi/scan.c | ||
2774 | index bbca7830e18a..349f4fdd0b25 100644 | ||
2775 | --- a/drivers/acpi/scan.c | ||
2776 | +++ b/drivers/acpi/scan.c | ||
2777 | @@ -298,7 +298,11 @@ bool acpi_scan_is_offline(struct acpi_device *adev, bool uevent) | ||
2778 | struct acpi_device_physical_node *pn; | ||
2779 | bool offline = true; | ||
2780 | |||
2781 | - mutex_lock(&adev->physical_node_lock); | ||
2782 | + /* | ||
2783 | + * acpi_container_offline() calls this for all of the container's | ||
2784 | + * children under the container's physical_node_lock lock. | ||
2785 | + */ | ||
2786 | + mutex_lock_nested(&adev->physical_node_lock, SINGLE_DEPTH_NESTING); | ||
2787 | |||
2788 | list_for_each_entry(pn, &adev->physical_node_list, node) | ||
2789 | if (device_supports_offline(pn->dev) && !pn->dev->offline) { | ||
2790 | diff --git a/drivers/base/bus.c b/drivers/base/bus.c | ||
2791 | index 876bae5ade33..79bc203f51ef 100644 | ||
2792 | --- a/drivers/base/bus.c | ||
2793 | +++ b/drivers/base/bus.c | ||
2794 | @@ -515,11 +515,11 @@ int bus_add_device(struct device *dev) | ||
2795 | goto out_put; | ||
2796 | error = device_add_groups(dev, bus->dev_groups); | ||
2797 | if (error) | ||
2798 | - goto out_groups; | ||
2799 | + goto out_id; | ||
2800 | error = sysfs_create_link(&bus->p->devices_kset->kobj, | ||
2801 | &dev->kobj, dev_name(dev)); | ||
2802 | if (error) | ||
2803 | - goto out_id; | ||
2804 | + goto out_groups; | ||
2805 | error = sysfs_create_link(&dev->kobj, | ||
2806 | &dev->bus->p->subsys.kobj, "subsystem"); | ||
2807 | if (error) | ||
2808 | diff --git a/drivers/base/cacheinfo.c b/drivers/base/cacheinfo.c | ||
2809 | index 6e64563361f0..9c2ba1c97c42 100644 | ||
2810 | --- a/drivers/base/cacheinfo.c | ||
2811 | +++ b/drivers/base/cacheinfo.c | ||
2812 | @@ -62,15 +62,21 @@ static int cache_setup_of_node(unsigned int cpu) | ||
2813 | return -ENOENT; | ||
2814 | } | ||
2815 | |||
2816 | - while (np && index < cache_leaves(cpu)) { | ||
2817 | + while (index < cache_leaves(cpu)) { | ||
2818 | this_leaf = this_cpu_ci->info_list + index; | ||
2819 | if (this_leaf->level != 1) | ||
2820 | np = of_find_next_cache_node(np); | ||
2821 | else | ||
2822 | np = of_node_get(np);/* cpu node itself */ | ||
2823 | + if (!np) | ||
2824 | + break; | ||
2825 | this_leaf->of_node = np; | ||
2826 | index++; | ||
2827 | } | ||
2828 | + | ||
2829 | + if (index != cache_leaves(cpu)) /* not all OF nodes populated */ | ||
2830 | + return -ENOENT; | ||
2831 | + | ||
2832 | return 0; | ||
2833 | } | ||
2834 | |||
2835 | @@ -189,8 +195,11 @@ static int detect_cache_attributes(unsigned int cpu) | ||
2836 | * will be set up here only if they are not populated already | ||
2837 | */ | ||
2838 | ret = cache_shared_cpu_map_setup(cpu); | ||
2839 | - if (ret) | ||
2840 | + if (ret) { | ||
2841 | + pr_warn("Unable to detect cache hierarcy from DT for CPU %d\n", | ||
2842 | + cpu); | ||
2843 | goto free_ci; | ||
2844 | + } | ||
2845 | return 0; | ||
2846 | |||
2847 | free_ci: | ||
2848 | diff --git a/drivers/base/platform.c b/drivers/base/platform.c | ||
2849 | index 9421fed40905..e68ab79df28b 100644 | ||
2850 | --- a/drivers/base/platform.c | ||
2851 | +++ b/drivers/base/platform.c | ||
2852 | @@ -101,6 +101,15 @@ int platform_get_irq(struct platform_device *dev, unsigned int num) | ||
2853 | } | ||
2854 | |||
2855 | r = platform_get_resource(dev, IORESOURCE_IRQ, num); | ||
2856 | + /* | ||
2857 | + * The resources may pass trigger flags to the irqs that need | ||
2858 | + * to be set up. It so happens that the trigger flags for | ||
2859 | + * IORESOURCE_BITS correspond 1-to-1 to the IRQF_TRIGGER* | ||
2860 | + * settings. | ||
2861 | + */ | ||
2862 | + if (r && r->flags & IORESOURCE_BITS) | ||
2863 | + irqd_set_trigger_type(irq_get_irq_data(r->start), | ||
2864 | + r->flags & IORESOURCE_BITS); | ||
2865 | |||
2866 | return r ? r->start : -ENXIO; | ||
2867 | #endif | ||
2868 | diff --git a/drivers/bluetooth/ath3k.c b/drivers/bluetooth/ath3k.c | ||
2869 | index de4c8499cbac..288547a3c566 100644 | ||
2870 | --- a/drivers/bluetooth/ath3k.c | ||
2871 | +++ b/drivers/bluetooth/ath3k.c | ||
2872 | @@ -65,6 +65,7 @@ static const struct usb_device_id ath3k_table[] = { | ||
2873 | /* Atheros AR3011 with sflash firmware*/ | ||
2874 | { USB_DEVICE(0x0489, 0xE027) }, | ||
2875 | { USB_DEVICE(0x0489, 0xE03D) }, | ||
2876 | + { USB_DEVICE(0x04F2, 0xAFF1) }, | ||
2877 | { USB_DEVICE(0x0930, 0x0215) }, | ||
2878 | { USB_DEVICE(0x0CF3, 0x3002) }, | ||
2879 | { USB_DEVICE(0x0CF3, 0xE019) }, | ||
2880 | diff --git a/drivers/bluetooth/btusb.c b/drivers/bluetooth/btusb.c | ||
2881 | index 8bfc4c2bba87..2c527da668ae 100644 | ||
2882 | --- a/drivers/bluetooth/btusb.c | ||
2883 | +++ b/drivers/bluetooth/btusb.c | ||
2884 | @@ -159,6 +159,7 @@ static const struct usb_device_id blacklist_table[] = { | ||
2885 | /* Atheros 3011 with sflash firmware */ | ||
2886 | { USB_DEVICE(0x0489, 0xe027), .driver_info = BTUSB_IGNORE }, | ||
2887 | { USB_DEVICE(0x0489, 0xe03d), .driver_info = BTUSB_IGNORE }, | ||
2888 | + { USB_DEVICE(0x04f2, 0xaff1), .driver_info = BTUSB_IGNORE }, | ||
2889 | { USB_DEVICE(0x0930, 0x0215), .driver_info = BTUSB_IGNORE }, | ||
2890 | { USB_DEVICE(0x0cf3, 0x3002), .driver_info = BTUSB_IGNORE }, | ||
2891 | { USB_DEVICE(0x0cf3, 0xe019), .driver_info = BTUSB_IGNORE }, | ||
2892 | diff --git a/drivers/char/tpm/tpm-chip.c b/drivers/char/tpm/tpm-chip.c | ||
2893 | index e096e9cddb40..283f00a7f036 100644 | ||
2894 | --- a/drivers/char/tpm/tpm-chip.c | ||
2895 | +++ b/drivers/char/tpm/tpm-chip.c | ||
2896 | @@ -170,6 +170,41 @@ static void tpm_dev_del_device(struct tpm_chip *chip) | ||
2897 | device_unregister(&chip->dev); | ||
2898 | } | ||
2899 | |||
2900 | +static int tpm1_chip_register(struct tpm_chip *chip) | ||
2901 | +{ | ||
2902 | + int rc; | ||
2903 | + | ||
2904 | + if (chip->flags & TPM_CHIP_FLAG_TPM2) | ||
2905 | + return 0; | ||
2906 | + | ||
2907 | + rc = tpm_sysfs_add_device(chip); | ||
2908 | + if (rc) | ||
2909 | + return rc; | ||
2910 | + | ||
2911 | + rc = tpm_add_ppi(chip); | ||
2912 | + if (rc) { | ||
2913 | + tpm_sysfs_del_device(chip); | ||
2914 | + return rc; | ||
2915 | + } | ||
2916 | + | ||
2917 | + chip->bios_dir = tpm_bios_log_setup(chip->devname); | ||
2918 | + | ||
2919 | + return 0; | ||
2920 | +} | ||
2921 | + | ||
2922 | +static void tpm1_chip_unregister(struct tpm_chip *chip) | ||
2923 | +{ | ||
2924 | + if (chip->flags & TPM_CHIP_FLAG_TPM2) | ||
2925 | + return; | ||
2926 | + | ||
2927 | + if (chip->bios_dir) | ||
2928 | + tpm_bios_log_teardown(chip->bios_dir); | ||
2929 | + | ||
2930 | + tpm_remove_ppi(chip); | ||
2931 | + | ||
2932 | + tpm_sysfs_del_device(chip); | ||
2933 | +} | ||
2934 | + | ||
2935 | /* | ||
2936 | * tpm_chip_register() - create a character device for the TPM chip | ||
2937 | * @chip: TPM chip to use. | ||
2938 | @@ -185,22 +220,13 @@ int tpm_chip_register(struct tpm_chip *chip) | ||
2939 | { | ||
2940 | int rc; | ||
2941 | |||
2942 | - /* Populate sysfs for TPM1 devices. */ | ||
2943 | - if (!(chip->flags & TPM_CHIP_FLAG_TPM2)) { | ||
2944 | - rc = tpm_sysfs_add_device(chip); | ||
2945 | - if (rc) | ||
2946 | - goto del_misc; | ||
2947 | - | ||
2948 | - rc = tpm_add_ppi(chip); | ||
2949 | - if (rc) | ||
2950 | - goto del_sysfs; | ||
2951 | - | ||
2952 | - chip->bios_dir = tpm_bios_log_setup(chip->devname); | ||
2953 | - } | ||
2954 | + rc = tpm1_chip_register(chip); | ||
2955 | + if (rc) | ||
2956 | + return rc; | ||
2957 | |||
2958 | rc = tpm_dev_add_device(chip); | ||
2959 | if (rc) | ||
2960 | - return rc; | ||
2961 | + goto out_err; | ||
2962 | |||
2963 | /* Make the chip available. */ | ||
2964 | spin_lock(&driver_lock); | ||
2965 | @@ -210,10 +236,8 @@ int tpm_chip_register(struct tpm_chip *chip) | ||
2966 | chip->flags |= TPM_CHIP_FLAG_REGISTERED; | ||
2967 | |||
2968 | return 0; | ||
2969 | -del_sysfs: | ||
2970 | - tpm_sysfs_del_device(chip); | ||
2971 | -del_misc: | ||
2972 | - tpm_dev_del_device(chip); | ||
2973 | +out_err: | ||
2974 | + tpm1_chip_unregister(chip); | ||
2975 | return rc; | ||
2976 | } | ||
2977 | EXPORT_SYMBOL_GPL(tpm_chip_register); | ||
2978 | @@ -238,13 +262,7 @@ void tpm_chip_unregister(struct tpm_chip *chip) | ||
2979 | spin_unlock(&driver_lock); | ||
2980 | synchronize_rcu(); | ||
2981 | |||
2982 | - if (!(chip->flags & TPM_CHIP_FLAG_TPM2)) { | ||
2983 | - if (chip->bios_dir) | ||
2984 | - tpm_bios_log_teardown(chip->bios_dir); | ||
2985 | - tpm_remove_ppi(chip); | ||
2986 | - tpm_sysfs_del_device(chip); | ||
2987 | - } | ||
2988 | - | ||
2989 | + tpm1_chip_unregister(chip); | ||
2990 | tpm_dev_del_device(chip); | ||
2991 | } | ||
2992 | EXPORT_SYMBOL_GPL(tpm_chip_unregister); | ||
2993 | diff --git a/drivers/clk/at91/clk-usb.c b/drivers/clk/at91/clk-usb.c | ||
2994 | index a23ac0c724f0..0b7c3e8840ba 100644 | ||
2995 | --- a/drivers/clk/at91/clk-usb.c | ||
2996 | +++ b/drivers/clk/at91/clk-usb.c | ||
2997 | @@ -56,22 +56,55 @@ static unsigned long at91sam9x5_clk_usb_recalc_rate(struct clk_hw *hw, | ||
2998 | return DIV_ROUND_CLOSEST(parent_rate, (usbdiv + 1)); | ||
2999 | } | ||
3000 | |||
3001 | -static long at91sam9x5_clk_usb_round_rate(struct clk_hw *hw, unsigned long rate, | ||
3002 | - unsigned long *parent_rate) | ||
3003 | +static long at91sam9x5_clk_usb_determine_rate(struct clk_hw *hw, | ||
3004 | + unsigned long rate, | ||
3005 | + unsigned long min_rate, | ||
3006 | + unsigned long max_rate, | ||
3007 | + unsigned long *best_parent_rate, | ||
3008 | + struct clk_hw **best_parent_hw) | ||
3009 | { | ||
3010 | - unsigned long div; | ||
3011 | + struct clk *parent = NULL; | ||
3012 | + long best_rate = -EINVAL; | ||
3013 | + unsigned long tmp_rate; | ||
3014 | + int best_diff = -1; | ||
3015 | + int tmp_diff; | ||
3016 | + int i; | ||
3017 | |||
3018 | - if (!rate) | ||
3019 | - return -EINVAL; | ||
3020 | + for (i = 0; i < __clk_get_num_parents(hw->clk); i++) { | ||
3021 | + int div; | ||
3022 | |||
3023 | - if (rate >= *parent_rate) | ||
3024 | - return *parent_rate; | ||
3025 | + parent = clk_get_parent_by_index(hw->clk, i); | ||
3026 | + if (!parent) | ||
3027 | + continue; | ||
3028 | + | ||
3029 | + for (div = 1; div < SAM9X5_USB_MAX_DIV + 2; div++) { | ||
3030 | + unsigned long tmp_parent_rate; | ||
3031 | + | ||
3032 | + tmp_parent_rate = rate * div; | ||
3033 | + tmp_parent_rate = __clk_round_rate(parent, | ||
3034 | + tmp_parent_rate); | ||
3035 | + tmp_rate = DIV_ROUND_CLOSEST(tmp_parent_rate, div); | ||
3036 | + if (tmp_rate < rate) | ||
3037 | + tmp_diff = rate - tmp_rate; | ||
3038 | + else | ||
3039 | + tmp_diff = tmp_rate - rate; | ||
3040 | + | ||
3041 | + if (best_diff < 0 || best_diff > tmp_diff) { | ||
3042 | + best_rate = tmp_rate; | ||
3043 | + best_diff = tmp_diff; | ||
3044 | + *best_parent_rate = tmp_parent_rate; | ||
3045 | + *best_parent_hw = __clk_get_hw(parent); | ||
3046 | + } | ||
3047 | + | ||
3048 | + if (!best_diff || tmp_rate < rate) | ||
3049 | + break; | ||
3050 | + } | ||
3051 | |||
3052 | - div = DIV_ROUND_CLOSEST(*parent_rate, rate); | ||
3053 | - if (div > SAM9X5_USB_MAX_DIV + 1) | ||
3054 | - div = SAM9X5_USB_MAX_DIV + 1; | ||
3055 | + if (!best_diff) | ||
3056 | + break; | ||
3057 | + } | ||
3058 | |||
3059 | - return DIV_ROUND_CLOSEST(*parent_rate, div); | ||
3060 | + return best_rate; | ||
3061 | } | ||
3062 | |||
3063 | static int at91sam9x5_clk_usb_set_parent(struct clk_hw *hw, u8 index) | ||
3064 | @@ -121,7 +154,7 @@ static int at91sam9x5_clk_usb_set_rate(struct clk_hw *hw, unsigned long rate, | ||
3065 | |||
3066 | static const struct clk_ops at91sam9x5_usb_ops = { | ||
3067 | .recalc_rate = at91sam9x5_clk_usb_recalc_rate, | ||
3068 | - .round_rate = at91sam9x5_clk_usb_round_rate, | ||
3069 | + .determine_rate = at91sam9x5_clk_usb_determine_rate, | ||
3070 | .get_parent = at91sam9x5_clk_usb_get_parent, | ||
3071 | .set_parent = at91sam9x5_clk_usb_set_parent, | ||
3072 | .set_rate = at91sam9x5_clk_usb_set_rate, | ||
3073 | @@ -159,7 +192,7 @@ static const struct clk_ops at91sam9n12_usb_ops = { | ||
3074 | .disable = at91sam9n12_clk_usb_disable, | ||
3075 | .is_enabled = at91sam9n12_clk_usb_is_enabled, | ||
3076 | .recalc_rate = at91sam9x5_clk_usb_recalc_rate, | ||
3077 | - .round_rate = at91sam9x5_clk_usb_round_rate, | ||
3078 | + .determine_rate = at91sam9x5_clk_usb_determine_rate, | ||
3079 | .set_rate = at91sam9x5_clk_usb_set_rate, | ||
3080 | }; | ||
3081 | |||
3082 | @@ -179,7 +212,8 @@ at91sam9x5_clk_register_usb(struct at91_pmc *pmc, const char *name, | ||
3083 | init.ops = &at91sam9x5_usb_ops; | ||
3084 | init.parent_names = parent_names; | ||
3085 | init.num_parents = num_parents; | ||
3086 | - init.flags = CLK_SET_RATE_GATE | CLK_SET_PARENT_GATE; | ||
3087 | + init.flags = CLK_SET_RATE_GATE | CLK_SET_PARENT_GATE | | ||
3088 | + CLK_SET_RATE_PARENT; | ||
3089 | |||
3090 | usb->hw.init = &init; | ||
3091 | usb->pmc = pmc; | ||
3092 | @@ -207,7 +241,7 @@ at91sam9n12_clk_register_usb(struct at91_pmc *pmc, const char *name, | ||
3093 | init.ops = &at91sam9n12_usb_ops; | ||
3094 | init.parent_names = &parent_name; | ||
3095 | init.num_parents = 1; | ||
3096 | - init.flags = CLK_SET_RATE_GATE; | ||
3097 | + init.flags = CLK_SET_RATE_GATE | CLK_SET_RATE_PARENT; | ||
3098 | |||
3099 | usb->hw.init = &init; | ||
3100 | usb->pmc = pmc; | ||
3101 | diff --git a/drivers/clk/qcom/clk-rcg.c b/drivers/clk/qcom/clk-rcg.c | ||
3102 | index 0039bd7d3965..466f30ca65c2 100644 | ||
3103 | --- a/drivers/clk/qcom/clk-rcg.c | ||
3104 | +++ b/drivers/clk/qcom/clk-rcg.c | ||
3105 | @@ -495,6 +495,57 @@ static int clk_rcg_bypass_set_rate(struct clk_hw *hw, unsigned long rate, | ||
3106 | return __clk_rcg_set_rate(rcg, rcg->freq_tbl); | ||
3107 | } | ||
3108 | |||
3109 | +/* | ||
3110 | + * This type of clock has a glitch-free mux that switches between the output of | ||
3111 | + * the M/N counter and an always on clock source (XO). When clk_set_rate() is | ||
3112 | + * called we need to make sure that we don't switch to the M/N counter if it | ||
3113 | + * isn't clocking because the mux will get stuck and the clock will stop | ||
3114 | + * outputting a clock. This can happen if the framework isn't aware that this | ||
3115 | + * clock is on and so clk_set_rate() doesn't turn on the new parent. To fix | ||
3116 | + * this we switch the mux in the enable/disable ops and reprogram the M/N | ||
3117 | + * counter in the set_rate op. We also make sure to switch away from the M/N | ||
3118 | + * counter in set_rate if software thinks the clock is off. | ||
3119 | + */ | ||
3120 | +static int clk_rcg_lcc_set_rate(struct clk_hw *hw, unsigned long rate, | ||
3121 | + unsigned long parent_rate) | ||
3122 | +{ | ||
3123 | + struct clk_rcg *rcg = to_clk_rcg(hw); | ||
3124 | + const struct freq_tbl *f; | ||
3125 | + int ret; | ||
3126 | + u32 gfm = BIT(10); | ||
3127 | + | ||
3128 | + f = qcom_find_freq(rcg->freq_tbl, rate); | ||
3129 | + if (!f) | ||
3130 | + return -EINVAL; | ||
3131 | + | ||
3132 | + /* Switch to XO to avoid glitches */ | ||
3133 | + regmap_update_bits(rcg->clkr.regmap, rcg->ns_reg, gfm, 0); | ||
3134 | + ret = __clk_rcg_set_rate(rcg, f); | ||
3135 | + /* Switch back to M/N if it's clocking */ | ||
3136 | + if (__clk_is_enabled(hw->clk)) | ||
3137 | + regmap_update_bits(rcg->clkr.regmap, rcg->ns_reg, gfm, gfm); | ||
3138 | + | ||
3139 | + return ret; | ||
3140 | +} | ||
3141 | + | ||
3142 | +static int clk_rcg_lcc_enable(struct clk_hw *hw) | ||
3143 | +{ | ||
3144 | + struct clk_rcg *rcg = to_clk_rcg(hw); | ||
3145 | + u32 gfm = BIT(10); | ||
3146 | + | ||
3147 | + /* Use M/N */ | ||
3148 | + return regmap_update_bits(rcg->clkr.regmap, rcg->ns_reg, gfm, gfm); | ||
3149 | +} | ||
3150 | + | ||
3151 | +static void clk_rcg_lcc_disable(struct clk_hw *hw) | ||
3152 | +{ | ||
3153 | + struct clk_rcg *rcg = to_clk_rcg(hw); | ||
3154 | + u32 gfm = BIT(10); | ||
3155 | + | ||
3156 | + /* Use XO */ | ||
3157 | + regmap_update_bits(rcg->clkr.regmap, rcg->ns_reg, gfm, 0); | ||
3158 | +} | ||
3159 | + | ||
3160 | static int __clk_dyn_rcg_set_rate(struct clk_hw *hw, unsigned long rate) | ||
3161 | { | ||
3162 | struct clk_dyn_rcg *rcg = to_clk_dyn_rcg(hw); | ||
3163 | @@ -543,6 +594,17 @@ const struct clk_ops clk_rcg_bypass_ops = { | ||
3164 | }; | ||
3165 | EXPORT_SYMBOL_GPL(clk_rcg_bypass_ops); | ||
3166 | |||
3167 | +const struct clk_ops clk_rcg_lcc_ops = { | ||
3168 | + .enable = clk_rcg_lcc_enable, | ||
3169 | + .disable = clk_rcg_lcc_disable, | ||
3170 | + .get_parent = clk_rcg_get_parent, | ||
3171 | + .set_parent = clk_rcg_set_parent, | ||
3172 | + .recalc_rate = clk_rcg_recalc_rate, | ||
3173 | + .determine_rate = clk_rcg_determine_rate, | ||
3174 | + .set_rate = clk_rcg_lcc_set_rate, | ||
3175 | +}; | ||
3176 | +EXPORT_SYMBOL_GPL(clk_rcg_lcc_ops); | ||
3177 | + | ||
3178 | const struct clk_ops clk_dyn_rcg_ops = { | ||
3179 | .enable = clk_enable_regmap, | ||
3180 | .is_enabled = clk_is_enabled_regmap, | ||
3181 | diff --git a/drivers/clk/qcom/clk-rcg.h b/drivers/clk/qcom/clk-rcg.h | ||
3182 | index 687e41f91d7c..d09d06ba278e 100644 | ||
3183 | --- a/drivers/clk/qcom/clk-rcg.h | ||
3184 | +++ b/drivers/clk/qcom/clk-rcg.h | ||
3185 | @@ -96,6 +96,7 @@ struct clk_rcg { | ||
3186 | |||
3187 | extern const struct clk_ops clk_rcg_ops; | ||
3188 | extern const struct clk_ops clk_rcg_bypass_ops; | ||
3189 | +extern const struct clk_ops clk_rcg_lcc_ops; | ||
3190 | |||
3191 | #define to_clk_rcg(_hw) container_of(to_clk_regmap(_hw), struct clk_rcg, clkr) | ||
3192 | |||
3193 | diff --git a/drivers/clk/qcom/clk-rcg2.c b/drivers/clk/qcom/clk-rcg2.c | ||
3194 | index 742acfa18d63..381f27469a9c 100644 | ||
3195 | --- a/drivers/clk/qcom/clk-rcg2.c | ||
3196 | +++ b/drivers/clk/qcom/clk-rcg2.c | ||
3197 | @@ -243,7 +243,7 @@ static int clk_rcg2_configure(struct clk_rcg2 *rcg, const struct freq_tbl *f) | ||
3198 | mask |= CFG_SRC_SEL_MASK | CFG_MODE_MASK; | ||
3199 | cfg = f->pre_div << CFG_SRC_DIV_SHIFT; | ||
3200 | cfg |= rcg->parent_map[f->src] << CFG_SRC_SEL_SHIFT; | ||
3201 | - if (rcg->mnd_width && f->n) | ||
3202 | + if (rcg->mnd_width && f->n && (f->m != f->n)) | ||
3203 | cfg |= CFG_MODE_DUAL_EDGE; | ||
3204 | ret = regmap_update_bits(rcg->clkr.regmap, | ||
3205 | rcg->cmd_rcgr + CFG_REG, mask, cfg); | ||
3206 | diff --git a/drivers/clk/qcom/gcc-ipq806x.c b/drivers/clk/qcom/gcc-ipq806x.c | ||
3207 | index cbdc31dea7f4..a015bb06c09b 100644 | ||
3208 | --- a/drivers/clk/qcom/gcc-ipq806x.c | ||
3209 | +++ b/drivers/clk/qcom/gcc-ipq806x.c | ||
3210 | @@ -525,8 +525,8 @@ static struct freq_tbl clk_tbl_gsbi_qup[] = { | ||
3211 | { 10800000, P_PXO, 1, 2, 5 }, | ||
3212 | { 15060000, P_PLL8, 1, 2, 51 }, | ||
3213 | { 24000000, P_PLL8, 4, 1, 4 }, | ||
3214 | + { 25000000, P_PXO, 1, 0, 0 }, | ||
3215 | { 25600000, P_PLL8, 1, 1, 15 }, | ||
3216 | - { 27000000, P_PXO, 1, 0, 0 }, | ||
3217 | { 48000000, P_PLL8, 4, 1, 2 }, | ||
3218 | { 51200000, P_PLL8, 1, 2, 15 }, | ||
3219 | { } | ||
3220 | diff --git a/drivers/clk/qcom/lcc-ipq806x.c b/drivers/clk/qcom/lcc-ipq806x.c | ||
3221 | index c9ff27b4648b..a6d3a6745c4d 100644 | ||
3222 | --- a/drivers/clk/qcom/lcc-ipq806x.c | ||
3223 | +++ b/drivers/clk/qcom/lcc-ipq806x.c | ||
3224 | @@ -294,14 +294,14 @@ static struct clk_regmap_mux pcm_clk = { | ||
3225 | }; | ||
3226 | |||
3227 | static struct freq_tbl clk_tbl_aif_osr[] = { | ||
3228 | - { 22050, P_PLL4, 1, 147, 20480 }, | ||
3229 | - { 32000, P_PLL4, 1, 1, 96 }, | ||
3230 | - { 44100, P_PLL4, 1, 147, 10240 }, | ||
3231 | - { 48000, P_PLL4, 1, 1, 64 }, | ||
3232 | - { 88200, P_PLL4, 1, 147, 5120 }, | ||
3233 | - { 96000, P_PLL4, 1, 1, 32 }, | ||
3234 | - { 176400, P_PLL4, 1, 147, 2560 }, | ||
3235 | - { 192000, P_PLL4, 1, 1, 16 }, | ||
3236 | + { 2822400, P_PLL4, 1, 147, 20480 }, | ||
3237 | + { 4096000, P_PLL4, 1, 1, 96 }, | ||
3238 | + { 5644800, P_PLL4, 1, 147, 10240 }, | ||
3239 | + { 6144000, P_PLL4, 1, 1, 64 }, | ||
3240 | + { 11289600, P_PLL4, 1, 147, 5120 }, | ||
3241 | + { 12288000, P_PLL4, 1, 1, 32 }, | ||
3242 | + { 22579200, P_PLL4, 1, 147, 2560 }, | ||
3243 | + { 24576000, P_PLL4, 1, 1, 16 }, | ||
3244 | { }, | ||
3245 | }; | ||
3246 | |||
3247 | @@ -360,7 +360,7 @@ static struct clk_branch spdif_clk = { | ||
3248 | }; | ||
3249 | |||
3250 | static struct freq_tbl clk_tbl_ahbix[] = { | ||
3251 | - { 131072, P_PLL4, 1, 1, 3 }, | ||
3252 | + { 131072000, P_PLL4, 1, 1, 3 }, | ||
3253 | { }, | ||
3254 | }; | ||
3255 | |||
3256 | @@ -386,13 +386,12 @@ static struct clk_rcg ahbix_clk = { | ||
3257 | .freq_tbl = clk_tbl_ahbix, | ||
3258 | .clkr = { | ||
3259 | .enable_reg = 0x38, | ||
3260 | - .enable_mask = BIT(10), /* toggle the gfmux to select mn/pxo */ | ||
3261 | + .enable_mask = BIT(11), | ||
3262 | .hw.init = &(struct clk_init_data){ | ||
3263 | .name = "ahbix", | ||
3264 | .parent_names = lcc_pxo_pll4, | ||
3265 | .num_parents = 2, | ||
3266 | - .ops = &clk_rcg_ops, | ||
3267 | - .flags = CLK_SET_RATE_GATE, | ||
3268 | + .ops = &clk_rcg_lcc_ops, | ||
3269 | }, | ||
3270 | }, | ||
3271 | }; | ||
3272 | diff --git a/drivers/clk/samsung/clk-exynos4.c b/drivers/clk/samsung/clk-exynos4.c | ||
3273 | index 51462e85675f..714d6ba782c8 100644 | ||
3274 | --- a/drivers/clk/samsung/clk-exynos4.c | ||
3275 | +++ b/drivers/clk/samsung/clk-exynos4.c | ||
3276 | @@ -1354,7 +1354,7 @@ static struct samsung_pll_clock exynos4x12_plls[nr_plls] __initdata = { | ||
3277 | VPLL_LOCK, VPLL_CON0, NULL), | ||
3278 | }; | ||
3279 | |||
3280 | -static void __init exynos4_core_down_clock(enum exynos4_soc soc) | ||
3281 | +static void __init exynos4x12_core_down_clock(void) | ||
3282 | { | ||
3283 | unsigned int tmp; | ||
3284 | |||
3285 | @@ -1373,11 +1373,9 @@ static void __init exynos4_core_down_clock(enum exynos4_soc soc) | ||
3286 | __raw_writel(tmp, reg_base + PWR_CTRL1); | ||
3287 | |||
3288 | /* | ||
3289 | - * Disable the clock up feature on Exynos4x12, in case it was | ||
3290 | - * enabled by bootloader. | ||
3291 | + * Disable the clock up feature in case it was enabled by bootloader. | ||
3292 | */ | ||
3293 | - if (exynos4_soc == EXYNOS4X12) | ||
3294 | - __raw_writel(0x0, reg_base + E4X12_PWR_CTRL2); | ||
3295 | + __raw_writel(0x0, reg_base + E4X12_PWR_CTRL2); | ||
3296 | } | ||
3297 | |||
3298 | /* register exynos4 clocks */ | ||
3299 | @@ -1474,7 +1472,8 @@ static void __init exynos4_clk_init(struct device_node *np, | ||
3300 | samsung_clk_register_alias(ctx, exynos4_aliases, | ||
3301 | ARRAY_SIZE(exynos4_aliases)); | ||
3302 | |||
3303 | - exynos4_core_down_clock(soc); | ||
3304 | + if (soc == EXYNOS4X12) | ||
3305 | + exynos4x12_core_down_clock(); | ||
3306 | exynos4_clk_sleep_init(); | ||
3307 | |||
3308 | samsung_clk_of_add_provider(np, ctx); | ||
3309 | diff --git a/drivers/clk/tegra/clk-tegra124.c b/drivers/clk/tegra/clk-tegra124.c | ||
3310 | index 9a893f2fe8e9..23ce0afefca5 100644 | ||
3311 | --- a/drivers/clk/tegra/clk-tegra124.c | ||
3312 | +++ b/drivers/clk/tegra/clk-tegra124.c | ||
3313 | @@ -1110,16 +1110,18 @@ static __init void tegra124_periph_clk_init(void __iomem *clk_base, | ||
3314 | 1, 2); | ||
3315 | clks[TEGRA124_CLK_XUSB_SS_DIV2] = clk; | ||
3316 | |||
3317 | - clk = clk_register_gate(NULL, "plld_dsi", "plld_out0", 0, | ||
3318 | + clk = clk_register_gate(NULL, "pll_d_dsi_out", "pll_d_out0", 0, | ||
3319 | clk_base + PLLD_MISC, 30, 0, &pll_d_lock); | ||
3320 | - clks[TEGRA124_CLK_PLLD_DSI] = clk; | ||
3321 | + clks[TEGRA124_CLK_PLL_D_DSI_OUT] = clk; | ||
3322 | |||
3323 | - clk = tegra_clk_register_periph_gate("dsia", "plld_dsi", 0, clk_base, | ||
3324 | - 0, 48, periph_clk_enb_refcnt); | ||
3325 | + clk = tegra_clk_register_periph_gate("dsia", "pll_d_dsi_out", 0, | ||
3326 | + clk_base, 0, 48, | ||
3327 | + periph_clk_enb_refcnt); | ||
3328 | clks[TEGRA124_CLK_DSIA] = clk; | ||
3329 | |||
3330 | - clk = tegra_clk_register_periph_gate("dsib", "plld_dsi", 0, clk_base, | ||
3331 | - 0, 82, periph_clk_enb_refcnt); | ||
3332 | + clk = tegra_clk_register_periph_gate("dsib", "pll_d_dsi_out", 0, | ||
3333 | + clk_base, 0, 82, | ||
3334 | + periph_clk_enb_refcnt); | ||
3335 | clks[TEGRA124_CLK_DSIB] = clk; | ||
3336 | |||
3337 | /* emc mux */ | ||
3338 | diff --git a/drivers/clk/tegra/clk.c b/drivers/clk/tegra/clk.c | ||
3339 | index 9ddb7547cb43..7a1df61847fc 100644 | ||
3340 | --- a/drivers/clk/tegra/clk.c | ||
3341 | +++ b/drivers/clk/tegra/clk.c | ||
3342 | @@ -272,7 +272,7 @@ void __init tegra_add_of_provider(struct device_node *np) | ||
3343 | of_clk_add_provider(np, of_clk_src_onecell_get, &clk_data); | ||
3344 | |||
3345 | rst_ctlr.of_node = np; | ||
3346 | - rst_ctlr.nr_resets = clk_num * 32; | ||
3347 | + rst_ctlr.nr_resets = periph_banks * 32; | ||
3348 | reset_controller_register(&rst_ctlr); | ||
3349 | } | ||
3350 | |||
3351 | diff --git a/drivers/crypto/omap-aes.c b/drivers/crypto/omap-aes.c | ||
3352 | index 42f95a4326b0..9a28b7e07c71 100644 | ||
3353 | --- a/drivers/crypto/omap-aes.c | ||
3354 | +++ b/drivers/crypto/omap-aes.c | ||
3355 | @@ -554,15 +554,23 @@ static int omap_aes_crypt_dma_stop(struct omap_aes_dev *dd) | ||
3356 | return err; | ||
3357 | } | ||
3358 | |||
3359 | -static int omap_aes_check_aligned(struct scatterlist *sg) | ||
3360 | +static int omap_aes_check_aligned(struct scatterlist *sg, int total) | ||
3361 | { | ||
3362 | + int len = 0; | ||
3363 | + | ||
3364 | while (sg) { | ||
3365 | if (!IS_ALIGNED(sg->offset, 4)) | ||
3366 | return -1; | ||
3367 | if (!IS_ALIGNED(sg->length, AES_BLOCK_SIZE)) | ||
3368 | return -1; | ||
3369 | + | ||
3370 | + len += sg->length; | ||
3371 | sg = sg_next(sg); | ||
3372 | } | ||
3373 | + | ||
3374 | + if (len != total) | ||
3375 | + return -1; | ||
3376 | + | ||
3377 | return 0; | ||
3378 | } | ||
3379 | |||
3380 | @@ -633,8 +641,8 @@ static int omap_aes_handle_queue(struct omap_aes_dev *dd, | ||
3381 | dd->in_sg = req->src; | ||
3382 | dd->out_sg = req->dst; | ||
3383 | |||
3384 | - if (omap_aes_check_aligned(dd->in_sg) || | ||
3385 | - omap_aes_check_aligned(dd->out_sg)) { | ||
3386 | + if (omap_aes_check_aligned(dd->in_sg, dd->total) || | ||
3387 | + omap_aes_check_aligned(dd->out_sg, dd->total)) { | ||
3388 | if (omap_aes_copy_sgs(dd)) | ||
3389 | pr_err("Failed to copy SGs for unaligned cases\n"); | ||
3390 | dd->sgs_copied = 1; | ||
3391 | diff --git a/drivers/gpio/gpio-mvebu.c b/drivers/gpio/gpio-mvebu.c | ||
3392 | index d0bc123c7975..1a54205860f5 100644 | ||
3393 | --- a/drivers/gpio/gpio-mvebu.c | ||
3394 | +++ b/drivers/gpio/gpio-mvebu.c | ||
3395 | @@ -320,11 +320,13 @@ static void mvebu_gpio_edge_irq_mask(struct irq_data *d) | ||
3396 | { | ||
3397 | struct irq_chip_generic *gc = irq_data_get_irq_chip_data(d); | ||
3398 | struct mvebu_gpio_chip *mvchip = gc->private; | ||
3399 | + struct irq_chip_type *ct = irq_data_get_chip_type(d); | ||
3400 | u32 mask = 1 << (d->irq - gc->irq_base); | ||
3401 | |||
3402 | irq_gc_lock(gc); | ||
3403 | - gc->mask_cache &= ~mask; | ||
3404 | - writel_relaxed(gc->mask_cache, mvebu_gpioreg_edge_mask(mvchip)); | ||
3405 | + ct->mask_cache_priv &= ~mask; | ||
3406 | + | ||
3407 | + writel_relaxed(ct->mask_cache_priv, mvebu_gpioreg_edge_mask(mvchip)); | ||
3408 | irq_gc_unlock(gc); | ||
3409 | } | ||
3410 | |||
3411 | @@ -332,11 +334,13 @@ static void mvebu_gpio_edge_irq_unmask(struct irq_data *d) | ||
3412 | { | ||
3413 | struct irq_chip_generic *gc = irq_data_get_irq_chip_data(d); | ||
3414 | struct mvebu_gpio_chip *mvchip = gc->private; | ||
3415 | + struct irq_chip_type *ct = irq_data_get_chip_type(d); | ||
3416 | + | ||
3417 | u32 mask = 1 << (d->irq - gc->irq_base); | ||
3418 | |||
3419 | irq_gc_lock(gc); | ||
3420 | - gc->mask_cache |= mask; | ||
3421 | - writel_relaxed(gc->mask_cache, mvebu_gpioreg_edge_mask(mvchip)); | ||
3422 | + ct->mask_cache_priv |= mask; | ||
3423 | + writel_relaxed(ct->mask_cache_priv, mvebu_gpioreg_edge_mask(mvchip)); | ||
3424 | irq_gc_unlock(gc); | ||
3425 | } | ||
3426 | |||
3427 | @@ -344,11 +348,13 @@ static void mvebu_gpio_level_irq_mask(struct irq_data *d) | ||
3428 | { | ||
3429 | struct irq_chip_generic *gc = irq_data_get_irq_chip_data(d); | ||
3430 | struct mvebu_gpio_chip *mvchip = gc->private; | ||
3431 | + struct irq_chip_type *ct = irq_data_get_chip_type(d); | ||
3432 | + | ||
3433 | u32 mask = 1 << (d->irq - gc->irq_base); | ||
3434 | |||
3435 | irq_gc_lock(gc); | ||
3436 | - gc->mask_cache &= ~mask; | ||
3437 | - writel_relaxed(gc->mask_cache, mvebu_gpioreg_level_mask(mvchip)); | ||
3438 | + ct->mask_cache_priv &= ~mask; | ||
3439 | + writel_relaxed(ct->mask_cache_priv, mvebu_gpioreg_level_mask(mvchip)); | ||
3440 | irq_gc_unlock(gc); | ||
3441 | } | ||
3442 | |||
3443 | @@ -356,11 +362,13 @@ static void mvebu_gpio_level_irq_unmask(struct irq_data *d) | ||
3444 | { | ||
3445 | struct irq_chip_generic *gc = irq_data_get_irq_chip_data(d); | ||
3446 | struct mvebu_gpio_chip *mvchip = gc->private; | ||
3447 | + struct irq_chip_type *ct = irq_data_get_chip_type(d); | ||
3448 | + | ||
3449 | u32 mask = 1 << (d->irq - gc->irq_base); | ||
3450 | |||
3451 | irq_gc_lock(gc); | ||
3452 | - gc->mask_cache |= mask; | ||
3453 | - writel_relaxed(gc->mask_cache, mvebu_gpioreg_level_mask(mvchip)); | ||
3454 | + ct->mask_cache_priv |= mask; | ||
3455 | + writel_relaxed(ct->mask_cache_priv, mvebu_gpioreg_level_mask(mvchip)); | ||
3456 | irq_gc_unlock(gc); | ||
3457 | } | ||
3458 | |||
3459 | diff --git a/drivers/gpu/drm/exynos/exynos_dp_core.c b/drivers/gpu/drm/exynos/exynos_dp_core.c | ||
3460 | index bf17a60b40ed..1dbfba58f909 100644 | ||
3461 | --- a/drivers/gpu/drm/exynos/exynos_dp_core.c | ||
3462 | +++ b/drivers/gpu/drm/exynos/exynos_dp_core.c | ||
3463 | @@ -32,10 +32,16 @@ | ||
3464 | #include <drm/bridge/ptn3460.h> | ||
3465 | |||
3466 | #include "exynos_dp_core.h" | ||
3467 | +#include "exynos_drm_fimd.h" | ||
3468 | |||
3469 | #define ctx_from_connector(c) container_of(c, struct exynos_dp_device, \ | ||
3470 | connector) | ||
3471 | |||
3472 | +static inline struct exynos_drm_crtc *dp_to_crtc(struct exynos_dp_device *dp) | ||
3473 | +{ | ||
3474 | + return to_exynos_crtc(dp->encoder->crtc); | ||
3475 | +} | ||
3476 | + | ||
3477 | static inline struct exynos_dp_device * | ||
3478 | display_to_dp(struct exynos_drm_display *d) | ||
3479 | { | ||
3480 | @@ -1070,6 +1076,8 @@ static void exynos_dp_poweron(struct exynos_dp_device *dp) | ||
3481 | } | ||
3482 | } | ||
3483 | |||
3484 | + fimd_dp_clock_enable(dp_to_crtc(dp), true); | ||
3485 | + | ||
3486 | clk_prepare_enable(dp->clock); | ||
3487 | exynos_dp_phy_init(dp); | ||
3488 | exynos_dp_init_dp(dp); | ||
3489 | @@ -1094,6 +1102,8 @@ static void exynos_dp_poweroff(struct exynos_dp_device *dp) | ||
3490 | exynos_dp_phy_exit(dp); | ||
3491 | clk_disable_unprepare(dp->clock); | ||
3492 | |||
3493 | + fimd_dp_clock_enable(dp_to_crtc(dp), false); | ||
3494 | + | ||
3495 | if (dp->panel) { | ||
3496 | if (drm_panel_unprepare(dp->panel)) | ||
3497 | DRM_ERROR("failed to turnoff the panel\n"); | ||
3498 | diff --git a/drivers/gpu/drm/exynos/exynos_drm_fimd.c b/drivers/gpu/drm/exynos/exynos_drm_fimd.c | ||
3499 | index 33a10ce967ea..5d58f6cc0397 100644 | ||
3500 | --- a/drivers/gpu/drm/exynos/exynos_drm_fimd.c | ||
3501 | +++ b/drivers/gpu/drm/exynos/exynos_drm_fimd.c | ||
3502 | @@ -32,6 +32,7 @@ | ||
3503 | #include "exynos_drm_fbdev.h" | ||
3504 | #include "exynos_drm_crtc.h" | ||
3505 | #include "exynos_drm_iommu.h" | ||
3506 | +#include "exynos_drm_fimd.h" | ||
3507 | |||
3508 | /* | ||
3509 | * FIMD stands for Fully Interactive Mobile Display and | ||
3510 | @@ -1233,6 +1234,24 @@ static int fimd_remove(struct platform_device *pdev) | ||
3511 | return 0; | ||
3512 | } | ||
3513 | |||
3514 | +void fimd_dp_clock_enable(struct exynos_drm_crtc *crtc, bool enable) | ||
3515 | +{ | ||
3516 | + struct fimd_context *ctx = crtc->ctx; | ||
3517 | + u32 val; | ||
3518 | + | ||
3519 | + /* | ||
3520 | + * Only Exynos 5250, 5260, 5410 and 542x requires enabling DP/MIE | ||
3521 | + * clock. On these SoCs the bootloader may enable it but any | ||
3522 | + * power domain off/on will reset it to disable state. | ||
3523 | + */ | ||
3524 | + if (ctx->driver_data != &exynos5_fimd_driver_data) | ||
3525 | + return; | ||
3526 | + | ||
3527 | + val = enable ? DP_MIE_CLK_DP_ENABLE : DP_MIE_CLK_DISABLE; | ||
3528 | + writel(DP_MIE_CLK_DP_ENABLE, ctx->regs + DP_MIE_CLKCON); | ||
3529 | +} | ||
3530 | +EXPORT_SYMBOL_GPL(fimd_dp_clock_enable); | ||
3531 | + | ||
3532 | struct platform_driver fimd_driver = { | ||
3533 | .probe = fimd_probe, | ||
3534 | .remove = fimd_remove, | ||
3535 | diff --git a/drivers/gpu/drm/exynos/exynos_drm_fimd.h b/drivers/gpu/drm/exynos/exynos_drm_fimd.h | ||
3536 | new file mode 100644 | ||
3537 | index 000000000000..b4fcaa568456 | ||
3538 | --- /dev/null | ||
3539 | +++ b/drivers/gpu/drm/exynos/exynos_drm_fimd.h | ||
3540 | @@ -0,0 +1,15 @@ | ||
3541 | +/* | ||
3542 | + * Copyright (c) 2015 Samsung Electronics Co., Ltd. | ||
3543 | + * | ||
3544 | + * This program is free software; you can redistribute it and/or modify it | ||
3545 | + * under the terms of the GNU General Public License as published by the | ||
3546 | + * Free Software Foundation; either version 2 of the License, or (at your | ||
3547 | + * option) any later version. | ||
3548 | + */ | ||
3549 | + | ||
3550 | +#ifndef _EXYNOS_DRM_FIMD_H_ | ||
3551 | +#define _EXYNOS_DRM_FIMD_H_ | ||
3552 | + | ||
3553 | +extern void fimd_dp_clock_enable(struct exynos_drm_crtc *crtc, bool enable); | ||
3554 | + | ||
3555 | +#endif /* _EXYNOS_DRM_FIMD_H_ */ | ||
3556 | diff --git a/drivers/gpu/drm/i2c/adv7511.c b/drivers/gpu/drm/i2c/adv7511.c | ||
3557 | index fa140e04d5fa..60ab1f75d58e 100644 | ||
3558 | --- a/drivers/gpu/drm/i2c/adv7511.c | ||
3559 | +++ b/drivers/gpu/drm/i2c/adv7511.c | ||
3560 | @@ -33,6 +33,7 @@ struct adv7511 { | ||
3561 | |||
3562 | unsigned int current_edid_segment; | ||
3563 | uint8_t edid_buf[256]; | ||
3564 | + bool edid_read; | ||
3565 | |||
3566 | wait_queue_head_t wq; | ||
3567 | struct drm_encoder *encoder; | ||
3568 | @@ -379,69 +380,71 @@ static bool adv7511_hpd(struct adv7511 *adv7511) | ||
3569 | return false; | ||
3570 | } | ||
3571 | |||
3572 | -static irqreturn_t adv7511_irq_handler(int irq, void *devid) | ||
3573 | -{ | ||
3574 | - struct adv7511 *adv7511 = devid; | ||
3575 | - | ||
3576 | - if (adv7511_hpd(adv7511)) | ||
3577 | - drm_helper_hpd_irq_event(adv7511->encoder->dev); | ||
3578 | - | ||
3579 | - wake_up_all(&adv7511->wq); | ||
3580 | - | ||
3581 | - return IRQ_HANDLED; | ||
3582 | -} | ||
3583 | - | ||
3584 | -static unsigned int adv7511_is_interrupt_pending(struct adv7511 *adv7511, | ||
3585 | - unsigned int irq) | ||
3586 | +static int adv7511_irq_process(struct adv7511 *adv7511) | ||
3587 | { | ||
3588 | unsigned int irq0, irq1; | ||
3589 | - unsigned int pending; | ||
3590 | int ret; | ||
3591 | |||
3592 | ret = regmap_read(adv7511->regmap, ADV7511_REG_INT(0), &irq0); | ||
3593 | if (ret < 0) | ||
3594 | - return 0; | ||
3595 | + return ret; | ||
3596 | + | ||
3597 | ret = regmap_read(adv7511->regmap, ADV7511_REG_INT(1), &irq1); | ||
3598 | if (ret < 0) | ||
3599 | - return 0; | ||
3600 | + return ret; | ||
3601 | + | ||
3602 | + regmap_write(adv7511->regmap, ADV7511_REG_INT(0), irq0); | ||
3603 | + regmap_write(adv7511->regmap, ADV7511_REG_INT(1), irq1); | ||
3604 | + | ||
3605 | + if (irq0 & ADV7511_INT0_HDP) | ||
3606 | + drm_helper_hpd_irq_event(adv7511->encoder->dev); | ||
3607 | + | ||
3608 | + if (irq0 & ADV7511_INT0_EDID_READY || irq1 & ADV7511_INT1_DDC_ERROR) { | ||
3609 | + adv7511->edid_read = true; | ||
3610 | + | ||
3611 | + if (adv7511->i2c_main->irq) | ||
3612 | + wake_up_all(&adv7511->wq); | ||
3613 | + } | ||
3614 | + | ||
3615 | + return 0; | ||
3616 | +} | ||
3617 | |||
3618 | - pending = (irq1 << 8) | irq0; | ||
3619 | +static irqreturn_t adv7511_irq_handler(int irq, void *devid) | ||
3620 | +{ | ||
3621 | + struct adv7511 *adv7511 = devid; | ||
3622 | + int ret; | ||
3623 | |||
3624 | - return pending & irq; | ||
3625 | + ret = adv7511_irq_process(adv7511); | ||
3626 | + return ret < 0 ? IRQ_NONE : IRQ_HANDLED; | ||
3627 | } | ||
3628 | |||
3629 | -static int adv7511_wait_for_interrupt(struct adv7511 *adv7511, int irq, | ||
3630 | - int timeout) | ||
3631 | +/* ----------------------------------------------------------------------------- | ||
3632 | + * EDID retrieval | ||
3633 | + */ | ||
3634 | + | ||
3635 | +static int adv7511_wait_for_edid(struct adv7511 *adv7511, int timeout) | ||
3636 | { | ||
3637 | - unsigned int pending; | ||
3638 | int ret; | ||
3639 | |||
3640 | if (adv7511->i2c_main->irq) { | ||
3641 | ret = wait_event_interruptible_timeout(adv7511->wq, | ||
3642 | - adv7511_is_interrupt_pending(adv7511, irq), | ||
3643 | - msecs_to_jiffies(timeout)); | ||
3644 | - if (ret <= 0) | ||
3645 | - return 0; | ||
3646 | - pending = adv7511_is_interrupt_pending(adv7511, irq); | ||
3647 | + adv7511->edid_read, msecs_to_jiffies(timeout)); | ||
3648 | } else { | ||
3649 | - if (timeout < 25) | ||
3650 | - timeout = 25; | ||
3651 | - do { | ||
3652 | - pending = adv7511_is_interrupt_pending(adv7511, irq); | ||
3653 | - if (pending) | ||
3654 | + for (; timeout > 0; timeout -= 25) { | ||
3655 | + ret = adv7511_irq_process(adv7511); | ||
3656 | + if (ret < 0) | ||
3657 | break; | ||
3658 | + | ||
3659 | + if (adv7511->edid_read) | ||
3660 | + break; | ||
3661 | + | ||
3662 | msleep(25); | ||
3663 | - timeout -= 25; | ||
3664 | - } while (timeout >= 25); | ||
3665 | + } | ||
3666 | } | ||
3667 | |||
3668 | - return pending; | ||
3669 | + return adv7511->edid_read ? 0 : -EIO; | ||
3670 | } | ||
3671 | |||
3672 | -/* ----------------------------------------------------------------------------- | ||
3673 | - * EDID retrieval | ||
3674 | - */ | ||
3675 | - | ||
3676 | static int adv7511_get_edid_block(void *data, u8 *buf, unsigned int block, | ||
3677 | size_t len) | ||
3678 | { | ||
3679 | @@ -463,19 +466,14 @@ static int adv7511_get_edid_block(void *data, u8 *buf, unsigned int block, | ||
3680 | return ret; | ||
3681 | |||
3682 | if (status != 2) { | ||
3683 | + adv7511->edid_read = false; | ||
3684 | regmap_write(adv7511->regmap, ADV7511_REG_EDID_SEGMENT, | ||
3685 | block); | ||
3686 | - ret = adv7511_wait_for_interrupt(adv7511, | ||
3687 | - ADV7511_INT0_EDID_READY | | ||
3688 | - ADV7511_INT1_DDC_ERROR, 200); | ||
3689 | - | ||
3690 | - if (!(ret & ADV7511_INT0_EDID_READY)) | ||
3691 | - return -EIO; | ||
3692 | + ret = adv7511_wait_for_edid(adv7511, 200); | ||
3693 | + if (ret < 0) | ||
3694 | + return ret; | ||
3695 | } | ||
3696 | |||
3697 | - regmap_write(adv7511->regmap, ADV7511_REG_INT(0), | ||
3698 | - ADV7511_INT0_EDID_READY | ADV7511_INT1_DDC_ERROR); | ||
3699 | - | ||
3700 | /* Break this apart, hopefully more I2C controllers will | ||
3701 | * support 64 byte transfers than 256 byte transfers | ||
3702 | */ | ||
3703 | @@ -528,7 +526,9 @@ static int adv7511_get_modes(struct drm_encoder *encoder, | ||
3704 | /* Reading the EDID only works if the device is powered */ | ||
3705 | if (adv7511->dpms_mode != DRM_MODE_DPMS_ON) { | ||
3706 | regmap_write(adv7511->regmap, ADV7511_REG_INT(0), | ||
3707 | - ADV7511_INT0_EDID_READY | ADV7511_INT1_DDC_ERROR); | ||
3708 | + ADV7511_INT0_EDID_READY); | ||
3709 | + regmap_write(adv7511->regmap, ADV7511_REG_INT(1), | ||
3710 | + ADV7511_INT1_DDC_ERROR); | ||
3711 | regmap_update_bits(adv7511->regmap, ADV7511_REG_POWER, | ||
3712 | ADV7511_POWER_POWER_DOWN, 0); | ||
3713 | adv7511->current_edid_segment = -1; | ||
3714 | @@ -563,7 +563,9 @@ static void adv7511_encoder_dpms(struct drm_encoder *encoder, int mode) | ||
3715 | adv7511->current_edid_segment = -1; | ||
3716 | |||
3717 | regmap_write(adv7511->regmap, ADV7511_REG_INT(0), | ||
3718 | - ADV7511_INT0_EDID_READY | ADV7511_INT1_DDC_ERROR); | ||
3719 | + ADV7511_INT0_EDID_READY); | ||
3720 | + regmap_write(adv7511->regmap, ADV7511_REG_INT(1), | ||
3721 | + ADV7511_INT1_DDC_ERROR); | ||
3722 | regmap_update_bits(adv7511->regmap, ADV7511_REG_POWER, | ||
3723 | ADV7511_POWER_POWER_DOWN, 0); | ||
3724 | /* | ||
3725 | diff --git a/drivers/gpu/drm/i915/i915_drv.c b/drivers/gpu/drm/i915/i915_drv.c | ||
3726 | index 5c66b568bb81..ec4d932f8be4 100644 | ||
3727 | --- a/drivers/gpu/drm/i915/i915_drv.c | ||
3728 | +++ b/drivers/gpu/drm/i915/i915_drv.c | ||
3729 | @@ -1042,7 +1042,7 @@ static void vlv_save_gunit_s0ix_state(struct drm_i915_private *dev_priv) | ||
3730 | s->lra_limits[i] = I915_READ(GEN7_LRA_LIMITS_BASE + i * 4); | ||
3731 | |||
3732 | s->media_max_req_count = I915_READ(GEN7_MEDIA_MAX_REQ_COUNT); | ||
3733 | - s->gfx_max_req_count = I915_READ(GEN7_MEDIA_MAX_REQ_COUNT); | ||
3734 | + s->gfx_max_req_count = I915_READ(GEN7_GFX_MAX_REQ_COUNT); | ||
3735 | |||
3736 | s->render_hwsp = I915_READ(RENDER_HWS_PGA_GEN7); | ||
3737 | s->ecochk = I915_READ(GAM_ECOCHK); | ||
3738 | @@ -1124,7 +1124,7 @@ static void vlv_restore_gunit_s0ix_state(struct drm_i915_private *dev_priv) | ||
3739 | I915_WRITE(GEN7_LRA_LIMITS_BASE + i * 4, s->lra_limits[i]); | ||
3740 | |||
3741 | I915_WRITE(GEN7_MEDIA_MAX_REQ_COUNT, s->media_max_req_count); | ||
3742 | - I915_WRITE(GEN7_MEDIA_MAX_REQ_COUNT, s->gfx_max_req_count); | ||
3743 | + I915_WRITE(GEN7_GFX_MAX_REQ_COUNT, s->gfx_max_req_count); | ||
3744 | |||
3745 | I915_WRITE(RENDER_HWS_PGA_GEN7, s->render_hwsp); | ||
3746 | I915_WRITE(GAM_ECOCHK, s->ecochk); | ||
3747 | diff --git a/drivers/gpu/drm/i915/i915_irq.c b/drivers/gpu/drm/i915/i915_irq.c | ||
3748 | index ede5bbbd8a08..07320cb32611 100644 | ||
3749 | --- a/drivers/gpu/drm/i915/i915_irq.c | ||
3750 | +++ b/drivers/gpu/drm/i915/i915_irq.c | ||
3751 | @@ -3718,14 +3718,12 @@ static int i8xx_irq_postinstall(struct drm_device *dev) | ||
3752 | ~(I915_DISPLAY_PIPE_A_EVENT_INTERRUPT | | ||
3753 | I915_DISPLAY_PIPE_B_EVENT_INTERRUPT | | ||
3754 | I915_DISPLAY_PLANE_A_FLIP_PENDING_INTERRUPT | | ||
3755 | - I915_DISPLAY_PLANE_B_FLIP_PENDING_INTERRUPT | | ||
3756 | - I915_RENDER_COMMAND_PARSER_ERROR_INTERRUPT); | ||
3757 | + I915_DISPLAY_PLANE_B_FLIP_PENDING_INTERRUPT); | ||
3758 | I915_WRITE16(IMR, dev_priv->irq_mask); | ||
3759 | |||
3760 | I915_WRITE16(IER, | ||
3761 | I915_DISPLAY_PIPE_A_EVENT_INTERRUPT | | ||
3762 | I915_DISPLAY_PIPE_B_EVENT_INTERRUPT | | ||
3763 | - I915_RENDER_COMMAND_PARSER_ERROR_INTERRUPT | | ||
3764 | I915_USER_INTERRUPT); | ||
3765 | POSTING_READ16(IER); | ||
3766 | |||
3767 | @@ -3887,14 +3885,12 @@ static int i915_irq_postinstall(struct drm_device *dev) | ||
3768 | I915_DISPLAY_PIPE_A_EVENT_INTERRUPT | | ||
3769 | I915_DISPLAY_PIPE_B_EVENT_INTERRUPT | | ||
3770 | I915_DISPLAY_PLANE_A_FLIP_PENDING_INTERRUPT | | ||
3771 | - I915_DISPLAY_PLANE_B_FLIP_PENDING_INTERRUPT | | ||
3772 | - I915_RENDER_COMMAND_PARSER_ERROR_INTERRUPT); | ||
3773 | + I915_DISPLAY_PLANE_B_FLIP_PENDING_INTERRUPT); | ||
3774 | |||
3775 | enable_mask = | ||
3776 | I915_ASLE_INTERRUPT | | ||
3777 | I915_DISPLAY_PIPE_A_EVENT_INTERRUPT | | ||
3778 | I915_DISPLAY_PIPE_B_EVENT_INTERRUPT | | ||
3779 | - I915_RENDER_COMMAND_PARSER_ERROR_INTERRUPT | | ||
3780 | I915_USER_INTERRUPT; | ||
3781 | |||
3782 | if (I915_HAS_HOTPLUG(dev)) { | ||
3783 | diff --git a/drivers/gpu/drm/i915/i915_reg.h b/drivers/gpu/drm/i915/i915_reg.h | ||
3784 | index 33b3d0a24071..f536ff2628fd 100644 | ||
3785 | --- a/drivers/gpu/drm/i915/i915_reg.h | ||
3786 | +++ b/drivers/gpu/drm/i915/i915_reg.h | ||
3787 | @@ -1740,6 +1740,7 @@ enum punit_power_well { | ||
3788 | #define GMBUS_CYCLE_INDEX (2<<25) | ||
3789 | #define GMBUS_CYCLE_STOP (4<<25) | ||
3790 | #define GMBUS_BYTE_COUNT_SHIFT 16 | ||
3791 | +#define GMBUS_BYTE_COUNT_MAX 256U | ||
3792 | #define GMBUS_SLAVE_INDEX_SHIFT 8 | ||
3793 | #define GMBUS_SLAVE_ADDR_SHIFT 1 | ||
3794 | #define GMBUS_SLAVE_READ (1<<0) | ||
3795 | diff --git a/drivers/gpu/drm/i915/intel_i2c.c b/drivers/gpu/drm/i915/intel_i2c.c | ||
3796 | index b31088a551f2..56e437e31580 100644 | ||
3797 | --- a/drivers/gpu/drm/i915/intel_i2c.c | ||
3798 | +++ b/drivers/gpu/drm/i915/intel_i2c.c | ||
3799 | @@ -270,18 +270,17 @@ gmbus_wait_idle(struct drm_i915_private *dev_priv) | ||
3800 | } | ||
3801 | |||
3802 | static int | ||
3803 | -gmbus_xfer_read(struct drm_i915_private *dev_priv, struct i2c_msg *msg, | ||
3804 | - u32 gmbus1_index) | ||
3805 | +gmbus_xfer_read_chunk(struct drm_i915_private *dev_priv, | ||
3806 | + unsigned short addr, u8 *buf, unsigned int len, | ||
3807 | + u32 gmbus1_index) | ||
3808 | { | ||
3809 | int reg_offset = dev_priv->gpio_mmio_base; | ||
3810 | - u16 len = msg->len; | ||
3811 | - u8 *buf = msg->buf; | ||
3812 | |||
3813 | I915_WRITE(GMBUS1 + reg_offset, | ||
3814 | gmbus1_index | | ||
3815 | GMBUS_CYCLE_WAIT | | ||
3816 | (len << GMBUS_BYTE_COUNT_SHIFT) | | ||
3817 | - (msg->addr << GMBUS_SLAVE_ADDR_SHIFT) | | ||
3818 | + (addr << GMBUS_SLAVE_ADDR_SHIFT) | | ||
3819 | GMBUS_SLAVE_READ | GMBUS_SW_RDY); | ||
3820 | while (len) { | ||
3821 | int ret; | ||
3822 | @@ -303,11 +302,35 @@ gmbus_xfer_read(struct drm_i915_private *dev_priv, struct i2c_msg *msg, | ||
3823 | } | ||
3824 | |||
3825 | static int | ||
3826 | -gmbus_xfer_write(struct drm_i915_private *dev_priv, struct i2c_msg *msg) | ||
3827 | +gmbus_xfer_read(struct drm_i915_private *dev_priv, struct i2c_msg *msg, | ||
3828 | + u32 gmbus1_index) | ||
3829 | { | ||
3830 | - int reg_offset = dev_priv->gpio_mmio_base; | ||
3831 | - u16 len = msg->len; | ||
3832 | u8 *buf = msg->buf; | ||
3833 | + unsigned int rx_size = msg->len; | ||
3834 | + unsigned int len; | ||
3835 | + int ret; | ||
3836 | + | ||
3837 | + do { | ||
3838 | + len = min(rx_size, GMBUS_BYTE_COUNT_MAX); | ||
3839 | + | ||
3840 | + ret = gmbus_xfer_read_chunk(dev_priv, msg->addr, | ||
3841 | + buf, len, gmbus1_index); | ||
3842 | + if (ret) | ||
3843 | + return ret; | ||
3844 | + | ||
3845 | + rx_size -= len; | ||
3846 | + buf += len; | ||
3847 | + } while (rx_size != 0); | ||
3848 | + | ||
3849 | + return 0; | ||
3850 | +} | ||
3851 | + | ||
3852 | +static int | ||
3853 | +gmbus_xfer_write_chunk(struct drm_i915_private *dev_priv, | ||
3854 | + unsigned short addr, u8 *buf, unsigned int len) | ||
3855 | +{ | ||
3856 | + int reg_offset = dev_priv->gpio_mmio_base; | ||
3857 | + unsigned int chunk_size = len; | ||
3858 | u32 val, loop; | ||
3859 | |||
3860 | val = loop = 0; | ||
3861 | @@ -319,8 +342,8 @@ gmbus_xfer_write(struct drm_i915_private *dev_priv, struct i2c_msg *msg) | ||
3862 | I915_WRITE(GMBUS3 + reg_offset, val); | ||
3863 | I915_WRITE(GMBUS1 + reg_offset, | ||
3864 | GMBUS_CYCLE_WAIT | | ||
3865 | - (msg->len << GMBUS_BYTE_COUNT_SHIFT) | | ||
3866 | - (msg->addr << GMBUS_SLAVE_ADDR_SHIFT) | | ||
3867 | + (chunk_size << GMBUS_BYTE_COUNT_SHIFT) | | ||
3868 | + (addr << GMBUS_SLAVE_ADDR_SHIFT) | | ||
3869 | GMBUS_SLAVE_WRITE | GMBUS_SW_RDY); | ||
3870 | while (len) { | ||
3871 | int ret; | ||
3872 | @@ -337,6 +360,29 @@ gmbus_xfer_write(struct drm_i915_private *dev_priv, struct i2c_msg *msg) | ||
3873 | if (ret) | ||
3874 | return ret; | ||
3875 | } | ||
3876 | + | ||
3877 | + return 0; | ||
3878 | +} | ||
3879 | + | ||
3880 | +static int | ||
3881 | +gmbus_xfer_write(struct drm_i915_private *dev_priv, struct i2c_msg *msg) | ||
3882 | +{ | ||
3883 | + u8 *buf = msg->buf; | ||
3884 | + unsigned int tx_size = msg->len; | ||
3885 | + unsigned int len; | ||
3886 | + int ret; | ||
3887 | + | ||
3888 | + do { | ||
3889 | + len = min(tx_size, GMBUS_BYTE_COUNT_MAX); | ||
3890 | + | ||
3891 | + ret = gmbus_xfer_write_chunk(dev_priv, msg->addr, buf, len); | ||
3892 | + if (ret) | ||
3893 | + return ret; | ||
3894 | + | ||
3895 | + buf += len; | ||
3896 | + tx_size -= len; | ||
3897 | + } while (tx_size != 0); | ||
3898 | + | ||
3899 | return 0; | ||
3900 | } | ||
3901 | |||
3902 | diff --git a/drivers/gpu/drm/radeon/atombios_crtc.c b/drivers/gpu/drm/radeon/atombios_crtc.c | ||
3903 | index 86807ee91bd1..9bd56116fd5a 100644 | ||
3904 | --- a/drivers/gpu/drm/radeon/atombios_crtc.c | ||
3905 | +++ b/drivers/gpu/drm/radeon/atombios_crtc.c | ||
3906 | @@ -330,8 +330,10 @@ atombios_set_crtc_dtd_timing(struct drm_crtc *crtc, | ||
3907 | misc |= ATOM_COMPOSITESYNC; | ||
3908 | if (mode->flags & DRM_MODE_FLAG_INTERLACE) | ||
3909 | misc |= ATOM_INTERLACE; | ||
3910 | - if (mode->flags & DRM_MODE_FLAG_DBLSCAN) | ||
3911 | + if (mode->flags & DRM_MODE_FLAG_DBLCLK) | ||
3912 | misc |= ATOM_DOUBLE_CLOCK_MODE; | ||
3913 | + if (mode->flags & DRM_MODE_FLAG_DBLSCAN) | ||
3914 | + misc |= ATOM_H_REPLICATIONBY2 | ATOM_V_REPLICATIONBY2; | ||
3915 | |||
3916 | args.susModeMiscInfo.usAccess = cpu_to_le16(misc); | ||
3917 | args.ucCRTC = radeon_crtc->crtc_id; | ||
3918 | @@ -374,8 +376,10 @@ static void atombios_crtc_set_timing(struct drm_crtc *crtc, | ||
3919 | misc |= ATOM_COMPOSITESYNC; | ||
3920 | if (mode->flags & DRM_MODE_FLAG_INTERLACE) | ||
3921 | misc |= ATOM_INTERLACE; | ||
3922 | - if (mode->flags & DRM_MODE_FLAG_DBLSCAN) | ||
3923 | + if (mode->flags & DRM_MODE_FLAG_DBLCLK) | ||
3924 | misc |= ATOM_DOUBLE_CLOCK_MODE; | ||
3925 | + if (mode->flags & DRM_MODE_FLAG_DBLSCAN) | ||
3926 | + misc |= ATOM_H_REPLICATIONBY2 | ATOM_V_REPLICATIONBY2; | ||
3927 | |||
3928 | args.susModeMiscInfo.usAccess = cpu_to_le16(misc); | ||
3929 | args.ucCRTC = radeon_crtc->crtc_id; | ||
3930 | diff --git a/drivers/hid/hid-ids.h b/drivers/hid/hid-ids.h | ||
3931 | index 9c4786759f16..7fe5590b328b 100644 | ||
3932 | --- a/drivers/hid/hid-ids.h | ||
3933 | +++ b/drivers/hid/hid-ids.h | ||
3934 | @@ -459,6 +459,10 @@ | ||
3935 | #define USB_DEVICE_ID_UGCI_FLYING 0x0020 | ||
3936 | #define USB_DEVICE_ID_UGCI_FIGHTING 0x0030 | ||
3937 | |||
3938 | +#define USB_VENDOR_ID_HP 0x03f0 | ||
3939 | +#define USB_PRODUCT_ID_HP_LOGITECH_OEM_USB_OPTICAL_MOUSE 0x0a4a | ||
3940 | +#define USB_PRODUCT_ID_HP_PIXART_OEM_USB_OPTICAL_MOUSE 0x134a | ||
3941 | + | ||
3942 | #define USB_VENDOR_ID_HUION 0x256c | ||
3943 | #define USB_DEVICE_ID_HUION_TABLET 0x006e | ||
3944 | |||
3945 | diff --git a/drivers/hid/usbhid/hid-quirks.c b/drivers/hid/usbhid/hid-quirks.c | ||
3946 | index a82127753461..4e3ae9fbb9b5 100644 | ||
3947 | --- a/drivers/hid/usbhid/hid-quirks.c | ||
3948 | +++ b/drivers/hid/usbhid/hid-quirks.c | ||
3949 | @@ -78,6 +78,8 @@ static const struct hid_blacklist { | ||
3950 | { USB_VENDOR_ID_ELO, USB_DEVICE_ID_ELO_TS2700, HID_QUIRK_NOGET }, | ||
3951 | { USB_VENDOR_ID_FORMOSA, USB_DEVICE_ID_FORMOSA_IR_RECEIVER, HID_QUIRK_NO_INIT_REPORTS }, | ||
3952 | { USB_VENDOR_ID_FREESCALE, USB_DEVICE_ID_FREESCALE_MX28, HID_QUIRK_NOGET }, | ||
3953 | + { USB_VENDOR_ID_HP, USB_PRODUCT_ID_HP_LOGITECH_OEM_USB_OPTICAL_MOUSE, HID_QUIRK_ALWAYS_POLL }, | ||
3954 | + { USB_VENDOR_ID_HP, USB_PRODUCT_ID_HP_PIXART_OEM_USB_OPTICAL_MOUSE, HID_QUIRK_ALWAYS_POLL }, | ||
3955 | { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_C077, HID_QUIRK_ALWAYS_POLL }, | ||
3956 | { USB_VENDOR_ID_MGE, USB_DEVICE_ID_MGE_UPS, HID_QUIRK_NOGET }, | ||
3957 | { USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_TYPE_COVER_3, HID_QUIRK_NO_INIT_REPORTS }, | ||
3958 | diff --git a/drivers/hv/channel.c b/drivers/hv/channel.c | ||
3959 | index 2978f5ee8d2a..00bc30e0db7f 100644 | ||
3960 | --- a/drivers/hv/channel.c | ||
3961 | +++ b/drivers/hv/channel.c | ||
3962 | @@ -135,7 +135,7 @@ int vmbus_open(struct vmbus_channel *newchannel, u32 send_ringbuffer_size, | ||
3963 | GFP_KERNEL); | ||
3964 | if (!open_info) { | ||
3965 | err = -ENOMEM; | ||
3966 | - goto error0; | ||
3967 | + goto error_gpadl; | ||
3968 | } | ||
3969 | |||
3970 | init_completion(&open_info->waitevent); | ||
3971 | @@ -151,7 +151,7 @@ int vmbus_open(struct vmbus_channel *newchannel, u32 send_ringbuffer_size, | ||
3972 | |||
3973 | if (userdatalen > MAX_USER_DEFINED_BYTES) { | ||
3974 | err = -EINVAL; | ||
3975 | - goto error0; | ||
3976 | + goto error_gpadl; | ||
3977 | } | ||
3978 | |||
3979 | if (userdatalen) | ||
3980 | @@ -195,6 +195,9 @@ error1: | ||
3981 | list_del(&open_info->msglistentry); | ||
3982 | spin_unlock_irqrestore(&vmbus_connection.channelmsg_lock, flags); | ||
3983 | |||
3984 | +error_gpadl: | ||
3985 | + vmbus_teardown_gpadl(newchannel, newchannel->ringbuffer_gpadlhandle); | ||
3986 | + | ||
3987 | error0: | ||
3988 | free_pages((unsigned long)out, | ||
3989 | get_order(send_ringbuffer_size + recv_ringbuffer_size)); | ||
3990 | diff --git a/drivers/i2c/busses/i2c-rk3x.c b/drivers/i2c/busses/i2c-rk3x.c | ||
3991 | index 5f96b1b3e3a5..019d5426fe52 100644 | ||
3992 | --- a/drivers/i2c/busses/i2c-rk3x.c | ||
3993 | +++ b/drivers/i2c/busses/i2c-rk3x.c | ||
3994 | @@ -833,7 +833,7 @@ static int rk3x_i2c_xfer(struct i2c_adapter *adap, | ||
3995 | clk_disable(i2c->clk); | ||
3996 | spin_unlock_irqrestore(&i2c->lock, flags); | ||
3997 | |||
3998 | - return ret; | ||
3999 | + return ret < 0 ? ret : num; | ||
4000 | } | ||
4001 | |||
4002 | static u32 rk3x_i2c_func(struct i2c_adapter *adap) | ||
4003 | diff --git a/drivers/i2c/i2c-core.c b/drivers/i2c/i2c-core.c | ||
4004 | index edf274cabe81..8143162b374d 100644 | ||
4005 | --- a/drivers/i2c/i2c-core.c | ||
4006 | +++ b/drivers/i2c/i2c-core.c | ||
4007 | @@ -596,6 +596,7 @@ int i2c_generic_scl_recovery(struct i2c_adapter *adap) | ||
4008 | adap->bus_recovery_info->set_scl(adap, 1); | ||
4009 | return i2c_generic_recovery(adap); | ||
4010 | } | ||
4011 | +EXPORT_SYMBOL_GPL(i2c_generic_scl_recovery); | ||
4012 | |||
4013 | int i2c_generic_gpio_recovery(struct i2c_adapter *adap) | ||
4014 | { | ||
4015 | @@ -610,6 +611,7 @@ int i2c_generic_gpio_recovery(struct i2c_adapter *adap) | ||
4016 | |||
4017 | return ret; | ||
4018 | } | ||
4019 | +EXPORT_SYMBOL_GPL(i2c_generic_gpio_recovery); | ||
4020 | |||
4021 | int i2c_recover_bus(struct i2c_adapter *adap) | ||
4022 | { | ||
4023 | @@ -619,6 +621,7 @@ int i2c_recover_bus(struct i2c_adapter *adap) | ||
4024 | dev_dbg(&adap->dev, "Trying i2c bus recovery\n"); | ||
4025 | return adap->bus_recovery_info->recover_bus(adap); | ||
4026 | } | ||
4027 | +EXPORT_SYMBOL_GPL(i2c_recover_bus); | ||
4028 | |||
4029 | static int i2c_device_probe(struct device *dev) | ||
4030 | { | ||
4031 | @@ -1410,6 +1413,8 @@ static int i2c_register_adapter(struct i2c_adapter *adap) | ||
4032 | |||
4033 | dev_dbg(&adap->dev, "adapter [%s] registered\n", adap->name); | ||
4034 | |||
4035 | + pm_runtime_no_callbacks(&adap->dev); | ||
4036 | + | ||
4037 | #ifdef CONFIG_I2C_COMPAT | ||
4038 | res = class_compat_create_link(i2c_adapter_compat_class, &adap->dev, | ||
4039 | adap->dev.parent); | ||
4040 | diff --git a/drivers/i2c/i2c-mux.c b/drivers/i2c/i2c-mux.c | ||
4041 | index 593f7ca9adc7..06cc1ff088f1 100644 | ||
4042 | --- a/drivers/i2c/i2c-mux.c | ||
4043 | +++ b/drivers/i2c/i2c-mux.c | ||
4044 | @@ -32,8 +32,9 @@ struct i2c_mux_priv { | ||
4045 | struct i2c_algorithm algo; | ||
4046 | |||
4047 | struct i2c_adapter *parent; | ||
4048 | - void *mux_priv; /* the mux chip/device */ | ||
4049 | - u32 chan_id; /* the channel id */ | ||
4050 | + struct device *mux_dev; | ||
4051 | + void *mux_priv; | ||
4052 | + u32 chan_id; | ||
4053 | |||
4054 | int (*select)(struct i2c_adapter *, void *mux_priv, u32 chan_id); | ||
4055 | int (*deselect)(struct i2c_adapter *, void *mux_priv, u32 chan_id); | ||
4056 | @@ -119,6 +120,7 @@ struct i2c_adapter *i2c_add_mux_adapter(struct i2c_adapter *parent, | ||
4057 | |||
4058 | /* Set up private adapter data */ | ||
4059 | priv->parent = parent; | ||
4060 | + priv->mux_dev = mux_dev; | ||
4061 | priv->mux_priv = mux_priv; | ||
4062 | priv->chan_id = chan_id; | ||
4063 | priv->select = select; | ||
4064 | @@ -203,7 +205,7 @@ void i2c_del_mux_adapter(struct i2c_adapter *adap) | ||
4065 | char symlink_name[20]; | ||
4066 | |||
4067 | snprintf(symlink_name, sizeof(symlink_name), "channel-%u", priv->chan_id); | ||
4068 | - sysfs_remove_link(&adap->dev.parent->kobj, symlink_name); | ||
4069 | + sysfs_remove_link(&priv->mux_dev->kobj, symlink_name); | ||
4070 | |||
4071 | sysfs_remove_link(&priv->adap.dev.kobj, "mux_device"); | ||
4072 | i2c_del_adapter(adap); | ||
4073 | diff --git a/drivers/idle/intel_idle.c b/drivers/idle/intel_idle.c | ||
4074 | index b0e58522780d..44d1d7920202 100644 | ||
4075 | --- a/drivers/idle/intel_idle.c | ||
4076 | +++ b/drivers/idle/intel_idle.c | ||
4077 | @@ -218,18 +218,10 @@ static struct cpuidle_state byt_cstates[] = { | ||
4078 | .enter = &intel_idle, | ||
4079 | .enter_freeze = intel_idle_freeze, }, | ||
4080 | { | ||
4081 | - .name = "C1E-BYT", | ||
4082 | - .desc = "MWAIT 0x01", | ||
4083 | - .flags = MWAIT2flg(0x01), | ||
4084 | - .exit_latency = 15, | ||
4085 | - .target_residency = 30, | ||
4086 | - .enter = &intel_idle, | ||
4087 | - .enter_freeze = intel_idle_freeze, }, | ||
4088 | - { | ||
4089 | .name = "C6N-BYT", | ||
4090 | .desc = "MWAIT 0x58", | ||
4091 | .flags = MWAIT2flg(0x58) | CPUIDLE_FLAG_TLB_FLUSHED, | ||
4092 | - .exit_latency = 40, | ||
4093 | + .exit_latency = 300, | ||
4094 | .target_residency = 275, | ||
4095 | .enter = &intel_idle, | ||
4096 | .enter_freeze = intel_idle_freeze, }, | ||
4097 | @@ -237,7 +229,7 @@ static struct cpuidle_state byt_cstates[] = { | ||
4098 | .name = "C6S-BYT", | ||
4099 | .desc = "MWAIT 0x52", | ||
4100 | .flags = MWAIT2flg(0x52) | CPUIDLE_FLAG_TLB_FLUSHED, | ||
4101 | - .exit_latency = 140, | ||
4102 | + .exit_latency = 500, | ||
4103 | .target_residency = 560, | ||
4104 | .enter = &intel_idle, | ||
4105 | .enter_freeze = intel_idle_freeze, }, | ||
4106 | @@ -246,7 +238,7 @@ static struct cpuidle_state byt_cstates[] = { | ||
4107 | .desc = "MWAIT 0x60", | ||
4108 | .flags = MWAIT2flg(0x60) | CPUIDLE_FLAG_TLB_FLUSHED, | ||
4109 | .exit_latency = 1200, | ||
4110 | - .target_residency = 1500, | ||
4111 | + .target_residency = 4000, | ||
4112 | .enter = &intel_idle, | ||
4113 | .enter_freeze = intel_idle_freeze, }, | ||
4114 | { | ||
4115 | diff --git a/drivers/infiniband/core/umem.c b/drivers/infiniband/core/umem.c | ||
4116 | index 8c014b5dab4c..38acb3cfc545 100644 | ||
4117 | --- a/drivers/infiniband/core/umem.c | ||
4118 | +++ b/drivers/infiniband/core/umem.c | ||
4119 | @@ -99,12 +99,15 @@ struct ib_umem *ib_umem_get(struct ib_ucontext *context, unsigned long addr, | ||
4120 | if (dmasync) | ||
4121 | dma_set_attr(DMA_ATTR_WRITE_BARRIER, &attrs); | ||
4122 | |||
4123 | + if (!size) | ||
4124 | + return ERR_PTR(-EINVAL); | ||
4125 | + | ||
4126 | /* | ||
4127 | * If the combination of the addr and size requested for this memory | ||
4128 | * region causes an integer overflow, return error. | ||
4129 | */ | ||
4130 | - if ((PAGE_ALIGN(addr + size) <= size) || | ||
4131 | - (PAGE_ALIGN(addr + size) <= addr)) | ||
4132 | + if (((addr + size) < addr) || | ||
4133 | + PAGE_ALIGN(addr + size) < (addr + size)) | ||
4134 | return ERR_PTR(-EINVAL); | ||
4135 | |||
4136 | if (!can_do_mlock()) | ||
4137 | diff --git a/drivers/infiniband/hw/mlx4/qp.c b/drivers/infiniband/hw/mlx4/qp.c | ||
4138 | index ed2bd6701f9b..fbde33a5228c 100644 | ||
4139 | --- a/drivers/infiniband/hw/mlx4/qp.c | ||
4140 | +++ b/drivers/infiniband/hw/mlx4/qp.c | ||
4141 | @@ -2605,8 +2605,7 @@ static int build_lso_seg(struct mlx4_wqe_lso_seg *wqe, struct ib_send_wr *wr, | ||
4142 | |||
4143 | memcpy(wqe->header, wr->wr.ud.header, wr->wr.ud.hlen); | ||
4144 | |||
4145 | - *lso_hdr_sz = cpu_to_be32((wr->wr.ud.mss - wr->wr.ud.hlen) << 16 | | ||
4146 | - wr->wr.ud.hlen); | ||
4147 | + *lso_hdr_sz = cpu_to_be32(wr->wr.ud.mss << 16 | wr->wr.ud.hlen); | ||
4148 | *lso_seg_len = halign; | ||
4149 | return 0; | ||
4150 | } | ||
4151 | diff --git a/drivers/infiniband/ulp/iser/iser_initiator.c b/drivers/infiniband/ulp/iser/iser_initiator.c | ||
4152 | index 20e859a6f1a6..76eb57b31a59 100644 | ||
4153 | --- a/drivers/infiniband/ulp/iser/iser_initiator.c | ||
4154 | +++ b/drivers/infiniband/ulp/iser/iser_initiator.c | ||
4155 | @@ -409,8 +409,8 @@ int iser_send_command(struct iscsi_conn *conn, | ||
4156 | if (scsi_prot_sg_count(sc)) { | ||
4157 | prot_buf->buf = scsi_prot_sglist(sc); | ||
4158 | prot_buf->size = scsi_prot_sg_count(sc); | ||
4159 | - prot_buf->data_len = data_buf->data_len >> | ||
4160 | - ilog2(sc->device->sector_size) * 8; | ||
4161 | + prot_buf->data_len = (data_buf->data_len >> | ||
4162 | + ilog2(sc->device->sector_size)) * 8; | ||
4163 | } | ||
4164 | |||
4165 | if (hdr->flags & ISCSI_FLAG_CMD_READ) { | ||
4166 | diff --git a/drivers/infiniband/ulp/isert/ib_isert.c b/drivers/infiniband/ulp/isert/ib_isert.c | ||
4167 | index 075b19cc78e8..147029adb885 100644 | ||
4168 | --- a/drivers/infiniband/ulp/isert/ib_isert.c | ||
4169 | +++ b/drivers/infiniband/ulp/isert/ib_isert.c | ||
4170 | @@ -222,7 +222,7 @@ fail: | ||
4171 | static void | ||
4172 | isert_free_rx_descriptors(struct isert_conn *isert_conn) | ||
4173 | { | ||
4174 | - struct ib_device *ib_dev = isert_conn->conn_cm_id->device; | ||
4175 | + struct ib_device *ib_dev = isert_conn->conn_device->ib_device; | ||
4176 | struct iser_rx_desc *rx_desc; | ||
4177 | int i; | ||
4178 | |||
4179 | @@ -719,8 +719,8 @@ out: | ||
4180 | static void | ||
4181 | isert_connect_release(struct isert_conn *isert_conn) | ||
4182 | { | ||
4183 | - struct ib_device *ib_dev = isert_conn->conn_cm_id->device; | ||
4184 | struct isert_device *device = isert_conn->conn_device; | ||
4185 | + struct ib_device *ib_dev = device->ib_device; | ||
4186 | |||
4187 | isert_dbg("conn %p\n", isert_conn); | ||
4188 | |||
4189 | @@ -728,7 +728,8 @@ isert_connect_release(struct isert_conn *isert_conn) | ||
4190 | isert_conn_free_fastreg_pool(isert_conn); | ||
4191 | |||
4192 | isert_free_rx_descriptors(isert_conn); | ||
4193 | - rdma_destroy_id(isert_conn->conn_cm_id); | ||
4194 | + if (isert_conn->conn_cm_id) | ||
4195 | + rdma_destroy_id(isert_conn->conn_cm_id); | ||
4196 | |||
4197 | if (isert_conn->conn_qp) { | ||
4198 | struct isert_comp *comp = isert_conn->conn_qp->recv_cq->cq_context; | ||
4199 | @@ -878,12 +879,15 @@ isert_disconnected_handler(struct rdma_cm_id *cma_id, | ||
4200 | return 0; | ||
4201 | } | ||
4202 | |||
4203 | -static void | ||
4204 | +static int | ||
4205 | isert_connect_error(struct rdma_cm_id *cma_id) | ||
4206 | { | ||
4207 | struct isert_conn *isert_conn = cma_id->qp->qp_context; | ||
4208 | |||
4209 | + isert_conn->conn_cm_id = NULL; | ||
4210 | isert_put_conn(isert_conn); | ||
4211 | + | ||
4212 | + return -1; | ||
4213 | } | ||
4214 | |||
4215 | static int | ||
4216 | @@ -912,7 +916,7 @@ isert_cma_handler(struct rdma_cm_id *cma_id, struct rdma_cm_event *event) | ||
4217 | case RDMA_CM_EVENT_REJECTED: /* FALLTHRU */ | ||
4218 | case RDMA_CM_EVENT_UNREACHABLE: /* FALLTHRU */ | ||
4219 | case RDMA_CM_EVENT_CONNECT_ERROR: | ||
4220 | - isert_connect_error(cma_id); | ||
4221 | + ret = isert_connect_error(cma_id); | ||
4222 | break; | ||
4223 | default: | ||
4224 | isert_err("Unhandled RDMA CMA event: %d\n", event->event); | ||
4225 | @@ -1861,11 +1865,13 @@ isert_completion_rdma_read(struct iser_tx_desc *tx_desc, | ||
4226 | cmd->i_state = ISTATE_RECEIVED_LAST_DATAOUT; | ||
4227 | spin_unlock_bh(&cmd->istate_lock); | ||
4228 | |||
4229 | - if (ret) | ||
4230 | + if (ret) { | ||
4231 | + target_put_sess_cmd(se_cmd->se_sess, se_cmd); | ||
4232 | transport_send_check_condition_and_sense(se_cmd, | ||
4233 | se_cmd->pi_err, 0); | ||
4234 | - else | ||
4235 | + } else { | ||
4236 | target_execute_cmd(se_cmd); | ||
4237 | + } | ||
4238 | } | ||
4239 | |||
4240 | static void | ||
4241 | diff --git a/drivers/input/mouse/alps.c b/drivers/input/mouse/alps.c | ||
4242 | index 27bcdbc950c9..ea6cb64dfb28 100644 | ||
4243 | --- a/drivers/input/mouse/alps.c | ||
4244 | +++ b/drivers/input/mouse/alps.c | ||
4245 | @@ -1159,13 +1159,14 @@ static void alps_report_bare_ps2_packet(struct psmouse *psmouse, | ||
4246 | bool report_buttons) | ||
4247 | { | ||
4248 | struct alps_data *priv = psmouse->private; | ||
4249 | - struct input_dev *dev; | ||
4250 | + struct input_dev *dev, *dev2 = NULL; | ||
4251 | |||
4252 | /* Figure out which device to use to report the bare packet */ | ||
4253 | if (priv->proto_version == ALPS_PROTO_V2 && | ||
4254 | (priv->flags & ALPS_DUALPOINT)) { | ||
4255 | /* On V2 devices the DualPoint Stick reports bare packets */ | ||
4256 | dev = priv->dev2; | ||
4257 | + dev2 = psmouse->dev; | ||
4258 | } else if (unlikely(IS_ERR_OR_NULL(priv->dev3))) { | ||
4259 | /* Register dev3 mouse if we received PS/2 packet first time */ | ||
4260 | if (!IS_ERR(priv->dev3)) | ||
4261 | @@ -1177,7 +1178,7 @@ static void alps_report_bare_ps2_packet(struct psmouse *psmouse, | ||
4262 | } | ||
4263 | |||
4264 | if (report_buttons) | ||
4265 | - alps_report_buttons(dev, NULL, | ||
4266 | + alps_report_buttons(dev, dev2, | ||
4267 | packet[0] & 1, packet[0] & 2, packet[0] & 4); | ||
4268 | |||
4269 | input_report_rel(dev, REL_X, | ||
4270 | diff --git a/drivers/input/mouse/elantech.c b/drivers/input/mouse/elantech.c | ||
4271 | index 6e22682c8255..991dc6b20a58 100644 | ||
4272 | --- a/drivers/input/mouse/elantech.c | ||
4273 | +++ b/drivers/input/mouse/elantech.c | ||
4274 | @@ -893,6 +893,21 @@ static psmouse_ret_t elantech_process_byte(struct psmouse *psmouse) | ||
4275 | } | ||
4276 | |||
4277 | /* | ||
4278 | + * This writes the reg_07 value again to the hardware at the end of every | ||
4279 | + * set_rate call because the register loses its value. reg_07 allows setting | ||
4280 | + * absolute mode on v4 hardware | ||
4281 | + */ | ||
4282 | +static void elantech_set_rate_restore_reg_07(struct psmouse *psmouse, | ||
4283 | + unsigned int rate) | ||
4284 | +{ | ||
4285 | + struct elantech_data *etd = psmouse->private; | ||
4286 | + | ||
4287 | + etd->original_set_rate(psmouse, rate); | ||
4288 | + if (elantech_write_reg(psmouse, 0x07, etd->reg_07)) | ||
4289 | + psmouse_err(psmouse, "restoring reg_07 failed\n"); | ||
4290 | +} | ||
4291 | + | ||
4292 | +/* | ||
4293 | * Put the touchpad into absolute mode | ||
4294 | */ | ||
4295 | static int elantech_set_absolute_mode(struct psmouse *psmouse) | ||
4296 | @@ -1094,6 +1109,8 @@ static int elantech_get_resolution_v4(struct psmouse *psmouse, | ||
4297 | * Asus K53SV 0x450f01 78, 15, 0c 2 hw buttons | ||
4298 | * Asus G46VW 0x460f02 00, 18, 0c 2 hw buttons | ||
4299 | * Asus G750JX 0x360f00 00, 16, 0c 2 hw buttons | ||
4300 | + * Asus TP500LN 0x381f17 10, 14, 0e clickpad | ||
4301 | + * Asus X750JN 0x381f17 10, 14, 0e clickpad | ||
4302 | * Asus UX31 0x361f00 20, 15, 0e clickpad | ||
4303 | * Asus UX32VD 0x361f02 00, 15, 0e clickpad | ||
4304 | * Avatar AVIU-145A2 0x361f00 ? clickpad | ||
4305 | @@ -1635,6 +1652,11 @@ int elantech_init(struct psmouse *psmouse) | ||
4306 | goto init_fail; | ||
4307 | } | ||
4308 | |||
4309 | + if (etd->fw_version == 0x381f17) { | ||
4310 | + etd->original_set_rate = psmouse->set_rate; | ||
4311 | + psmouse->set_rate = elantech_set_rate_restore_reg_07; | ||
4312 | + } | ||
4313 | + | ||
4314 | if (elantech_set_input_params(psmouse)) { | ||
4315 | psmouse_err(psmouse, "failed to query touchpad range.\n"); | ||
4316 | goto init_fail; | ||
4317 | diff --git a/drivers/input/mouse/elantech.h b/drivers/input/mouse/elantech.h | ||
4318 | index 6f3afec02f03..f965d1569cc3 100644 | ||
4319 | --- a/drivers/input/mouse/elantech.h | ||
4320 | +++ b/drivers/input/mouse/elantech.h | ||
4321 | @@ -142,6 +142,7 @@ struct elantech_data { | ||
4322 | struct finger_pos mt[ETP_MAX_FINGERS]; | ||
4323 | unsigned char parity[256]; | ||
4324 | int (*send_cmd)(struct psmouse *psmouse, unsigned char c, unsigned char *param); | ||
4325 | + void (*original_set_rate)(struct psmouse *psmouse, unsigned int rate); | ||
4326 | }; | ||
4327 | |||
4328 | #ifdef CONFIG_MOUSE_PS2_ELANTECH | ||
4329 | diff --git a/drivers/md/dm-crypt.c b/drivers/md/dm-crypt.c | ||
4330 | index 713a96237a80..414739295d04 100644 | ||
4331 | --- a/drivers/md/dm-crypt.c | ||
4332 | +++ b/drivers/md/dm-crypt.c | ||
4333 | @@ -925,11 +925,10 @@ static int crypt_convert(struct crypt_config *cc, | ||
4334 | |||
4335 | switch (r) { | ||
4336 | /* async */ | ||
4337 | + case -EINPROGRESS: | ||
4338 | case -EBUSY: | ||
4339 | wait_for_completion(&ctx->restart); | ||
4340 | reinit_completion(&ctx->restart); | ||
4341 | - /* fall through*/ | ||
4342 | - case -EINPROGRESS: | ||
4343 | ctx->req = NULL; | ||
4344 | ctx->cc_sector++; | ||
4345 | continue; | ||
4346 | @@ -1346,10 +1345,8 @@ static void kcryptd_async_done(struct crypto_async_request *async_req, | ||
4347 | struct dm_crypt_io *io = container_of(ctx, struct dm_crypt_io, ctx); | ||
4348 | struct crypt_config *cc = io->cc; | ||
4349 | |||
4350 | - if (error == -EINPROGRESS) { | ||
4351 | - complete(&ctx->restart); | ||
4352 | + if (error == -EINPROGRESS) | ||
4353 | return; | ||
4354 | - } | ||
4355 | |||
4356 | if (!error && cc->iv_gen_ops && cc->iv_gen_ops->post) | ||
4357 | error = cc->iv_gen_ops->post(cc, iv_of_dmreq(cc, dmreq), dmreq); | ||
4358 | @@ -1360,12 +1357,15 @@ static void kcryptd_async_done(struct crypto_async_request *async_req, | ||
4359 | crypt_free_req(cc, req_of_dmreq(cc, dmreq), io->base_bio); | ||
4360 | |||
4361 | if (!atomic_dec_and_test(&ctx->cc_pending)) | ||
4362 | - return; | ||
4363 | + goto done; | ||
4364 | |||
4365 | if (bio_data_dir(io->base_bio) == READ) | ||
4366 | kcryptd_crypt_read_done(io); | ||
4367 | else | ||
4368 | kcryptd_crypt_write_io_submit(io, 1); | ||
4369 | +done: | ||
4370 | + if (!completion_done(&ctx->restart)) | ||
4371 | + complete(&ctx->restart); | ||
4372 | } | ||
4373 | |||
4374 | static void kcryptd_crypt(struct work_struct *work) | ||
4375 | diff --git a/drivers/md/md.c b/drivers/md/md.c | ||
4376 | index 717daad71fb1..e6178787ce3d 100644 | ||
4377 | --- a/drivers/md/md.c | ||
4378 | +++ b/drivers/md/md.c | ||
4379 | @@ -249,6 +249,7 @@ static void md_make_request(struct request_queue *q, struct bio *bio) | ||
4380 | const int rw = bio_data_dir(bio); | ||
4381 | struct mddev *mddev = q->queuedata; | ||
4382 | unsigned int sectors; | ||
4383 | + int cpu; | ||
4384 | |||
4385 | if (mddev == NULL || mddev->pers == NULL | ||
4386 | || !mddev->ready) { | ||
4387 | @@ -284,7 +285,10 @@ static void md_make_request(struct request_queue *q, struct bio *bio) | ||
4388 | sectors = bio_sectors(bio); | ||
4389 | mddev->pers->make_request(mddev, bio); | ||
4390 | |||
4391 | - generic_start_io_acct(rw, sectors, &mddev->gendisk->part0); | ||
4392 | + cpu = part_stat_lock(); | ||
4393 | + part_stat_inc(cpu, &mddev->gendisk->part0, ios[rw]); | ||
4394 | + part_stat_add(cpu, &mddev->gendisk->part0, sectors[rw], sectors); | ||
4395 | + part_stat_unlock(); | ||
4396 | |||
4397 | if (atomic_dec_and_test(&mddev->active_io) && mddev->suspended) | ||
4398 | wake_up(&mddev->sb_wait); | ||
4399 | diff --git a/drivers/md/raid0.c b/drivers/md/raid0.c | ||
4400 | index 3ed9f42ddca6..3b5d7f704aa3 100644 | ||
4401 | --- a/drivers/md/raid0.c | ||
4402 | +++ b/drivers/md/raid0.c | ||
4403 | @@ -313,7 +313,7 @@ static struct strip_zone *find_zone(struct r0conf *conf, | ||
4404 | |||
4405 | /* | ||
4406 | * remaps the bio to the target device. we separate two flows. | ||
4407 | - * power 2 flow and a general flow for the sake of perfromance | ||
4408 | + * power 2 flow and a general flow for the sake of performance | ||
4409 | */ | ||
4410 | static struct md_rdev *map_sector(struct mddev *mddev, struct strip_zone *zone, | ||
4411 | sector_t sector, sector_t *sector_offset) | ||
4412 | @@ -524,6 +524,7 @@ static void raid0_make_request(struct mddev *mddev, struct bio *bio) | ||
4413 | split = bio; | ||
4414 | } | ||
4415 | |||
4416 | + sector = bio->bi_iter.bi_sector; | ||
4417 | zone = find_zone(mddev->private, §or); | ||
4418 | tmp_dev = map_sector(mddev, zone, sector, §or); | ||
4419 | split->bi_bdev = tmp_dev->bdev; | ||
4420 | diff --git a/drivers/media/rc/img-ir/img-ir-core.c b/drivers/media/rc/img-ir/img-ir-core.c | ||
4421 | index 77c78de4f5bf..7020659f23c2 100644 | ||
4422 | --- a/drivers/media/rc/img-ir/img-ir-core.c | ||
4423 | +++ b/drivers/media/rc/img-ir/img-ir-core.c | ||
4424 | @@ -146,7 +146,7 @@ static int img_ir_remove(struct platform_device *pdev) | ||
4425 | { | ||
4426 | struct img_ir_priv *priv = platform_get_drvdata(pdev); | ||
4427 | |||
4428 | - free_irq(priv->irq, img_ir_isr); | ||
4429 | + free_irq(priv->irq, priv); | ||
4430 | img_ir_remove_hw(priv); | ||
4431 | img_ir_remove_raw(priv); | ||
4432 | |||
4433 | diff --git a/drivers/media/usb/stk1160/stk1160-v4l.c b/drivers/media/usb/stk1160/stk1160-v4l.c | ||
4434 | index 65a326c5128f..749ad5603c9e 100644 | ||
4435 | --- a/drivers/media/usb/stk1160/stk1160-v4l.c | ||
4436 | +++ b/drivers/media/usb/stk1160/stk1160-v4l.c | ||
4437 | @@ -240,6 +240,11 @@ static int stk1160_stop_streaming(struct stk1160 *dev) | ||
4438 | if (mutex_lock_interruptible(&dev->v4l_lock)) | ||
4439 | return -ERESTARTSYS; | ||
4440 | |||
4441 | + /* | ||
4442 | + * Once URBs are cancelled, the URB complete handler | ||
4443 | + * won't be running. This is required to safely release the | ||
4444 | + * current buffer (dev->isoc_ctl.buf). | ||
4445 | + */ | ||
4446 | stk1160_cancel_isoc(dev); | ||
4447 | |||
4448 | /* | ||
4449 | @@ -620,8 +625,16 @@ void stk1160_clear_queue(struct stk1160 *dev) | ||
4450 | stk1160_info("buffer [%p/%d] aborted\n", | ||
4451 | buf, buf->vb.v4l2_buf.index); | ||
4452 | } | ||
4453 | - /* It's important to clear current buffer */ | ||
4454 | - dev->isoc_ctl.buf = NULL; | ||
4455 | + | ||
4456 | + /* It's important to release the current buffer */ | ||
4457 | + if (dev->isoc_ctl.buf) { | ||
4458 | + buf = dev->isoc_ctl.buf; | ||
4459 | + dev->isoc_ctl.buf = NULL; | ||
4460 | + | ||
4461 | + vb2_buffer_done(&buf->vb, VB2_BUF_STATE_ERROR); | ||
4462 | + stk1160_info("buffer [%p/%d] aborted\n", | ||
4463 | + buf, buf->vb.v4l2_buf.index); | ||
4464 | + } | ||
4465 | spin_unlock_irqrestore(&dev->buf_lock, flags); | ||
4466 | } | ||
4467 | |||
4468 | diff --git a/drivers/memstick/core/mspro_block.c b/drivers/memstick/core/mspro_block.c | ||
4469 | index fc145d202c46..922a750640e8 100644 | ||
4470 | --- a/drivers/memstick/core/mspro_block.c | ||
4471 | +++ b/drivers/memstick/core/mspro_block.c | ||
4472 | @@ -758,7 +758,7 @@ static int mspro_block_complete_req(struct memstick_dev *card, int error) | ||
4473 | |||
4474 | if (error || (card->current_mrq.tpc == MSPRO_CMD_STOP)) { | ||
4475 | if (msb->data_dir == READ) { | ||
4476 | - for (cnt = 0; cnt < msb->current_seg; cnt++) | ||
4477 | + for (cnt = 0; cnt < msb->current_seg; cnt++) { | ||
4478 | t_len += msb->req_sg[cnt].length | ||
4479 | / msb->page_size; | ||
4480 | |||
4481 | @@ -766,6 +766,7 @@ static int mspro_block_complete_req(struct memstick_dev *card, int error) | ||
4482 | t_len += msb->current_page - 1; | ||
4483 | |||
4484 | t_len *= msb->page_size; | ||
4485 | + } | ||
4486 | } | ||
4487 | } else | ||
4488 | t_len = blk_rq_bytes(msb->block_req); | ||
4489 | diff --git a/drivers/mfd/mfd-core.c b/drivers/mfd/mfd-core.c | ||
4490 | index 2a87f69be53d..1aed3b7b8d9b 100644 | ||
4491 | --- a/drivers/mfd/mfd-core.c | ||
4492 | +++ b/drivers/mfd/mfd-core.c | ||
4493 | @@ -128,7 +128,7 @@ static int mfd_add_device(struct device *parent, int id, | ||
4494 | int platform_id; | ||
4495 | int r; | ||
4496 | |||
4497 | - if (id < 0) | ||
4498 | + if (id == PLATFORM_DEVID_AUTO) | ||
4499 | platform_id = id; | ||
4500 | else | ||
4501 | platform_id = id + cell->id; | ||
4502 | diff --git a/drivers/mmc/host/sunxi-mmc.c b/drivers/mmc/host/sunxi-mmc.c | ||
4503 | index e8a4218b5726..459ed1b601db 100644 | ||
4504 | --- a/drivers/mmc/host/sunxi-mmc.c | ||
4505 | +++ b/drivers/mmc/host/sunxi-mmc.c | ||
4506 | @@ -930,7 +930,9 @@ static int sunxi_mmc_resource_request(struct sunxi_mmc_host *host, | ||
4507 | return PTR_ERR(host->clk_sample); | ||
4508 | } | ||
4509 | |||
4510 | - host->reset = devm_reset_control_get(&pdev->dev, "ahb"); | ||
4511 | + host->reset = devm_reset_control_get_optional(&pdev->dev, "ahb"); | ||
4512 | + if (PTR_ERR(host->reset) == -EPROBE_DEFER) | ||
4513 | + return PTR_ERR(host->reset); | ||
4514 | |||
4515 | ret = clk_prepare_enable(host->clk_ahb); | ||
4516 | if (ret) { | ||
4517 | diff --git a/drivers/mmc/host/tmio_mmc_pio.c b/drivers/mmc/host/tmio_mmc_pio.c | ||
4518 | index a31c3573d386..dba7e1c19dd7 100644 | ||
4519 | --- a/drivers/mmc/host/tmio_mmc_pio.c | ||
4520 | +++ b/drivers/mmc/host/tmio_mmc_pio.c | ||
4521 | @@ -1073,8 +1073,6 @@ EXPORT_SYMBOL(tmio_mmc_host_alloc); | ||
4522 | void tmio_mmc_host_free(struct tmio_mmc_host *host) | ||
4523 | { | ||
4524 | mmc_free_host(host->mmc); | ||
4525 | - | ||
4526 | - host->mmc = NULL; | ||
4527 | } | ||
4528 | EXPORT_SYMBOL(tmio_mmc_host_free); | ||
4529 | |||
4530 | diff --git a/drivers/mtd/ubi/attach.c b/drivers/mtd/ubi/attach.c | ||
4531 | index 9d2e16f3150a..b5e154856994 100644 | ||
4532 | --- a/drivers/mtd/ubi/attach.c | ||
4533 | +++ b/drivers/mtd/ubi/attach.c | ||
4534 | @@ -410,7 +410,7 @@ int ubi_compare_lebs(struct ubi_device *ubi, const struct ubi_ainf_peb *aeb, | ||
4535 | second_is_newer = !second_is_newer; | ||
4536 | } else { | ||
4537 | dbg_bld("PEB %d CRC is OK", pnum); | ||
4538 | - bitflips = !!err; | ||
4539 | + bitflips |= !!err; | ||
4540 | } | ||
4541 | mutex_unlock(&ubi->buf_mutex); | ||
4542 | |||
4543 | diff --git a/drivers/mtd/ubi/cdev.c b/drivers/mtd/ubi/cdev.c | ||
4544 | index d647e504f9b1..d16fccf79179 100644 | ||
4545 | --- a/drivers/mtd/ubi/cdev.c | ||
4546 | +++ b/drivers/mtd/ubi/cdev.c | ||
4547 | @@ -455,7 +455,7 @@ static long vol_cdev_ioctl(struct file *file, unsigned int cmd, | ||
4548 | /* Validate the request */ | ||
4549 | err = -EINVAL; | ||
4550 | if (req.lnum < 0 || req.lnum >= vol->reserved_pebs || | ||
4551 | - req.bytes < 0 || req.lnum >= vol->usable_leb_size) | ||
4552 | + req.bytes < 0 || req.bytes > vol->usable_leb_size) | ||
4553 | break; | ||
4554 | |||
4555 | err = get_exclusive(desc); | ||
4556 | diff --git a/drivers/mtd/ubi/eba.c b/drivers/mtd/ubi/eba.c | ||
4557 | index 16e34b37d134..8c9a710def99 100644 | ||
4558 | --- a/drivers/mtd/ubi/eba.c | ||
4559 | +++ b/drivers/mtd/ubi/eba.c | ||
4560 | @@ -1419,7 +1419,8 @@ int ubi_eba_init(struct ubi_device *ubi, struct ubi_attach_info *ai) | ||
4561 | * during re-size. | ||
4562 | */ | ||
4563 | ubi_move_aeb_to_list(av, aeb, &ai->erase); | ||
4564 | - vol->eba_tbl[aeb->lnum] = aeb->pnum; | ||
4565 | + else | ||
4566 | + vol->eba_tbl[aeb->lnum] = aeb->pnum; | ||
4567 | } | ||
4568 | } | ||
4569 | |||
4570 | diff --git a/drivers/mtd/ubi/wl.c b/drivers/mtd/ubi/wl.c | ||
4571 | index 8f7bde6a85d6..0bd92d816391 100644 | ||
4572 | --- a/drivers/mtd/ubi/wl.c | ||
4573 | +++ b/drivers/mtd/ubi/wl.c | ||
4574 | @@ -1002,7 +1002,7 @@ static int wear_leveling_worker(struct ubi_device *ubi, struct ubi_work *wrk, | ||
4575 | int shutdown) | ||
4576 | { | ||
4577 | int err, scrubbing = 0, torture = 0, protect = 0, erroneous = 0; | ||
4578 | - int vol_id = -1, uninitialized_var(lnum); | ||
4579 | + int vol_id = -1, lnum = -1; | ||
4580 | #ifdef CONFIG_MTD_UBI_FASTMAP | ||
4581 | int anchor = wrk->anchor; | ||
4582 | #endif | ||
4583 | diff --git a/drivers/net/ethernet/cadence/macb.c b/drivers/net/ethernet/cadence/macb.c | ||
4584 | index 81d41539fcba..77bf1337d179 100644 | ||
4585 | --- a/drivers/net/ethernet/cadence/macb.c | ||
4586 | +++ b/drivers/net/ethernet/cadence/macb.c | ||
4587 | @@ -2165,7 +2165,7 @@ static void macb_configure_caps(struct macb *bp) | ||
4588 | } | ||
4589 | } | ||
4590 | |||
4591 | - if (MACB_BFEXT(IDNUM, macb_readl(bp, MID)) == 0x2) | ||
4592 | + if (MACB_BFEXT(IDNUM, macb_readl(bp, MID)) >= 0x2) | ||
4593 | bp->caps |= MACB_CAPS_MACB_IS_GEM; | ||
4594 | |||
4595 | if (macb_is_gem(bp)) { | ||
4596 | diff --git a/drivers/net/ethernet/intel/e1000/e1000_main.c b/drivers/net/ethernet/intel/e1000/e1000_main.c | ||
4597 | index 7f997d36948f..a71c446631d1 100644 | ||
4598 | --- a/drivers/net/ethernet/intel/e1000/e1000_main.c | ||
4599 | +++ b/drivers/net/ethernet/intel/e1000/e1000_main.c | ||
4600 | @@ -144,6 +144,11 @@ static bool e1000_clean_rx_irq(struct e1000_adapter *adapter, | ||
4601 | static bool e1000_clean_jumbo_rx_irq(struct e1000_adapter *adapter, | ||
4602 | struct e1000_rx_ring *rx_ring, | ||
4603 | int *work_done, int work_to_do); | ||
4604 | +static void e1000_alloc_dummy_rx_buffers(struct e1000_adapter *adapter, | ||
4605 | + struct e1000_rx_ring *rx_ring, | ||
4606 | + int cleaned_count) | ||
4607 | +{ | ||
4608 | +} | ||
4609 | static void e1000_alloc_rx_buffers(struct e1000_adapter *adapter, | ||
4610 | struct e1000_rx_ring *rx_ring, | ||
4611 | int cleaned_count); | ||
4612 | @@ -3552,8 +3557,11 @@ static int e1000_change_mtu(struct net_device *netdev, int new_mtu) | ||
4613 | msleep(1); | ||
4614 | /* e1000_down has a dependency on max_frame_size */ | ||
4615 | hw->max_frame_size = max_frame; | ||
4616 | - if (netif_running(netdev)) | ||
4617 | + if (netif_running(netdev)) { | ||
4618 | + /* prevent buffers from being reallocated */ | ||
4619 | + adapter->alloc_rx_buf = e1000_alloc_dummy_rx_buffers; | ||
4620 | e1000_down(adapter); | ||
4621 | + } | ||
4622 | |||
4623 | /* NOTE: netdev_alloc_skb reserves 16 bytes, and typically NET_IP_ALIGN | ||
4624 | * means we reserve 2 more, this pushes us to allocate from the next | ||
4625 | diff --git a/drivers/net/ethernet/marvell/pxa168_eth.c b/drivers/net/ethernet/marvell/pxa168_eth.c | ||
4626 | index af829c578400..7ace07dad6a3 100644 | ||
4627 | --- a/drivers/net/ethernet/marvell/pxa168_eth.c | ||
4628 | +++ b/drivers/net/ethernet/marvell/pxa168_eth.c | ||
4629 | @@ -1508,7 +1508,8 @@ static int pxa168_eth_probe(struct platform_device *pdev) | ||
4630 | np = of_parse_phandle(pdev->dev.of_node, "phy-handle", 0); | ||
4631 | if (!np) { | ||
4632 | dev_err(&pdev->dev, "missing phy-handle\n"); | ||
4633 | - return -EINVAL; | ||
4634 | + err = -EINVAL; | ||
4635 | + goto err_netdev; | ||
4636 | } | ||
4637 | of_property_read_u32(np, "reg", &pep->phy_addr); | ||
4638 | pep->phy_intf = of_get_phy_mode(pdev->dev.of_node); | ||
4639 | @@ -1526,7 +1527,7 @@ static int pxa168_eth_probe(struct platform_device *pdev) | ||
4640 | pep->smi_bus = mdiobus_alloc(); | ||
4641 | if (pep->smi_bus == NULL) { | ||
4642 | err = -ENOMEM; | ||
4643 | - goto err_base; | ||
4644 | + goto err_netdev; | ||
4645 | } | ||
4646 | pep->smi_bus->priv = pep; | ||
4647 | pep->smi_bus->name = "pxa168_eth smi"; | ||
4648 | @@ -1551,13 +1552,10 @@ err_mdiobus: | ||
4649 | mdiobus_unregister(pep->smi_bus); | ||
4650 | err_free_mdio: | ||
4651 | mdiobus_free(pep->smi_bus); | ||
4652 | -err_base: | ||
4653 | - iounmap(pep->base); | ||
4654 | err_netdev: | ||
4655 | free_netdev(dev); | ||
4656 | err_clk: | ||
4657 | - clk_disable(clk); | ||
4658 | - clk_put(clk); | ||
4659 | + clk_disable_unprepare(clk); | ||
4660 | return err; | ||
4661 | } | ||
4662 | |||
4663 | @@ -1574,13 +1572,9 @@ static int pxa168_eth_remove(struct platform_device *pdev) | ||
4664 | if (pep->phy) | ||
4665 | phy_disconnect(pep->phy); | ||
4666 | if (pep->clk) { | ||
4667 | - clk_disable(pep->clk); | ||
4668 | - clk_put(pep->clk); | ||
4669 | - pep->clk = NULL; | ||
4670 | + clk_disable_unprepare(pep->clk); | ||
4671 | } | ||
4672 | |||
4673 | - iounmap(pep->base); | ||
4674 | - pep->base = NULL; | ||
4675 | mdiobus_unregister(pep->smi_bus); | ||
4676 | mdiobus_free(pep->smi_bus); | ||
4677 | unregister_netdev(dev); | ||
4678 | diff --git a/drivers/net/ethernet/mellanox/mlx4/en_ethtool.c b/drivers/net/ethernet/mellanox/mlx4/en_ethtool.c | ||
4679 | index a7b58ba8492b..3dccf01837db 100644 | ||
4680 | --- a/drivers/net/ethernet/mellanox/mlx4/en_ethtool.c | ||
4681 | +++ b/drivers/net/ethernet/mellanox/mlx4/en_ethtool.c | ||
4682 | @@ -981,20 +981,21 @@ static int mlx4_en_check_rxfh_func(struct net_device *dev, u8 hfunc) | ||
4683 | struct mlx4_en_priv *priv = netdev_priv(dev); | ||
4684 | |||
4685 | /* check if requested function is supported by the device */ | ||
4686 | - if ((hfunc == ETH_RSS_HASH_TOP && | ||
4687 | - !(priv->mdev->dev->caps.flags2 & MLX4_DEV_CAP_FLAG2_RSS_TOP)) || | ||
4688 | - (hfunc == ETH_RSS_HASH_XOR && | ||
4689 | - !(priv->mdev->dev->caps.flags2 & MLX4_DEV_CAP_FLAG2_RSS_XOR))) | ||
4690 | - return -EINVAL; | ||
4691 | + if (hfunc == ETH_RSS_HASH_TOP) { | ||
4692 | + if (!(priv->mdev->dev->caps.flags2 & MLX4_DEV_CAP_FLAG2_RSS_TOP)) | ||
4693 | + return -EINVAL; | ||
4694 | + if (!(dev->features & NETIF_F_RXHASH)) | ||
4695 | + en_warn(priv, "Toeplitz hash function should be used in conjunction with RX hashing for optimal performance\n"); | ||
4696 | + return 0; | ||
4697 | + } else if (hfunc == ETH_RSS_HASH_XOR) { | ||
4698 | + if (!(priv->mdev->dev->caps.flags2 & MLX4_DEV_CAP_FLAG2_RSS_XOR)) | ||
4699 | + return -EINVAL; | ||
4700 | + if (dev->features & NETIF_F_RXHASH) | ||
4701 | + en_warn(priv, "Enabling both XOR Hash function and RX Hashing can limit RPS functionality\n"); | ||
4702 | + return 0; | ||
4703 | + } | ||
4704 | |||
4705 | - priv->rss_hash_fn = hfunc; | ||
4706 | - if (hfunc == ETH_RSS_HASH_TOP && !(dev->features & NETIF_F_RXHASH)) | ||
4707 | - en_warn(priv, | ||
4708 | - "Toeplitz hash function should be used in conjunction with RX hashing for optimal performance\n"); | ||
4709 | - if (hfunc == ETH_RSS_HASH_XOR && (dev->features & NETIF_F_RXHASH)) | ||
4710 | - en_warn(priv, | ||
4711 | - "Enabling both XOR Hash function and RX Hashing can limit RPS functionality\n"); | ||
4712 | - return 0; | ||
4713 | + return -EINVAL; | ||
4714 | } | ||
4715 | |||
4716 | static int mlx4_en_get_rxfh(struct net_device *dev, u32 *ring_index, u8 *key, | ||
4717 | @@ -1068,6 +1069,8 @@ static int mlx4_en_set_rxfh(struct net_device *dev, const u32 *ring_index, | ||
4718 | priv->prof->rss_rings = rss_rings; | ||
4719 | if (key) | ||
4720 | memcpy(priv->rss_key, key, MLX4_EN_RSS_KEY_SIZE); | ||
4721 | + if (hfunc != ETH_RSS_HASH_NO_CHANGE) | ||
4722 | + priv->rss_hash_fn = hfunc; | ||
4723 | |||
4724 | if (port_up) { | ||
4725 | err = mlx4_en_start_port(dev); | ||
4726 | diff --git a/drivers/net/ppp/ppp_generic.c b/drivers/net/ppp/ppp_generic.c | ||
4727 | index af034dba9bd6..9d15566521a7 100644 | ||
4728 | --- a/drivers/net/ppp/ppp_generic.c | ||
4729 | +++ b/drivers/net/ppp/ppp_generic.c | ||
4730 | @@ -1716,6 +1716,7 @@ ppp_receive_frame(struct ppp *ppp, struct sk_buff *skb, struct channel *pch) | ||
4731 | { | ||
4732 | /* note: a 0-length skb is used as an error indication */ | ||
4733 | if (skb->len > 0) { | ||
4734 | + skb_checksum_complete_unset(skb); | ||
4735 | #ifdef CONFIG_PPP_MULTILINK | ||
4736 | /* XXX do channel-level decompression here */ | ||
4737 | if (PPP_PROTO(skb) == PPP_MP) | ||
4738 | diff --git a/drivers/net/wireless/rtlwifi/rtl8192cu/sw.c b/drivers/net/wireless/rtlwifi/rtl8192cu/sw.c | ||
4739 | index 90a714c189a8..23806c243a53 100644 | ||
4740 | --- a/drivers/net/wireless/rtlwifi/rtl8192cu/sw.c | ||
4741 | +++ b/drivers/net/wireless/rtlwifi/rtl8192cu/sw.c | ||
4742 | @@ -321,6 +321,7 @@ static struct usb_device_id rtl8192c_usb_ids[] = { | ||
4743 | {RTL_USB_DEVICE(0x07b8, 0x8188, rtl92cu_hal_cfg)}, /*Abocom - Abocom*/ | ||
4744 | {RTL_USB_DEVICE(0x07b8, 0x8189, rtl92cu_hal_cfg)}, /*Funai - Abocom*/ | ||
4745 | {RTL_USB_DEVICE(0x0846, 0x9041, rtl92cu_hal_cfg)}, /*NetGear WNA1000M*/ | ||
4746 | + {RTL_USB_DEVICE(0x0b05, 0x17ba, rtl92cu_hal_cfg)}, /*ASUS-Edimax*/ | ||
4747 | {RTL_USB_DEVICE(0x0bda, 0x5088, rtl92cu_hal_cfg)}, /*Thinkware-CC&C*/ | ||
4748 | {RTL_USB_DEVICE(0x0df6, 0x0052, rtl92cu_hal_cfg)}, /*Sitecom - Edimax*/ | ||
4749 | {RTL_USB_DEVICE(0x0df6, 0x005c, rtl92cu_hal_cfg)}, /*Sitecom - Edimax*/ | ||
4750 | @@ -377,6 +378,7 @@ static struct usb_device_id rtl8192c_usb_ids[] = { | ||
4751 | {RTL_USB_DEVICE(0x2001, 0x3307, rtl92cu_hal_cfg)}, /*D-Link-Cameo*/ | ||
4752 | {RTL_USB_DEVICE(0x2001, 0x3309, rtl92cu_hal_cfg)}, /*D-Link-Alpha*/ | ||
4753 | {RTL_USB_DEVICE(0x2001, 0x330a, rtl92cu_hal_cfg)}, /*D-Link-Alpha*/ | ||
4754 | + {RTL_USB_DEVICE(0x2001, 0x330d, rtl92cu_hal_cfg)}, /*D-Link DWA-131 */ | ||
4755 | {RTL_USB_DEVICE(0x2019, 0xab2b, rtl92cu_hal_cfg)}, /*Planex -Abocom*/ | ||
4756 | {RTL_USB_DEVICE(0x20f4, 0x624d, rtl92cu_hal_cfg)}, /*TRENDNet*/ | ||
4757 | {RTL_USB_DEVICE(0x2357, 0x0100, rtl92cu_hal_cfg)}, /*TP-Link WN8200ND*/ | ||
4758 | diff --git a/drivers/net/wireless/ti/wl18xx/debugfs.c b/drivers/net/wireless/ti/wl18xx/debugfs.c | ||
4759 | index c93fae95baac..5fbd2230f372 100644 | ||
4760 | --- a/drivers/net/wireless/ti/wl18xx/debugfs.c | ||
4761 | +++ b/drivers/net/wireless/ti/wl18xx/debugfs.c | ||
4762 | @@ -139,7 +139,7 @@ WL18XX_DEBUGFS_FWSTATS_FILE(rx_filter, protection_filter, "%u"); | ||
4763 | WL18XX_DEBUGFS_FWSTATS_FILE(rx_filter, accum_arp_pend_requests, "%u"); | ||
4764 | WL18XX_DEBUGFS_FWSTATS_FILE(rx_filter, max_arp_queue_dep, "%u"); | ||
4765 | |||
4766 | -WL18XX_DEBUGFS_FWSTATS_FILE(rx_rate, rx_frames_per_rates, "%u"); | ||
4767 | +WL18XX_DEBUGFS_FWSTATS_FILE_ARRAY(rx_rate, rx_frames_per_rates, 50); | ||
4768 | |||
4769 | WL18XX_DEBUGFS_FWSTATS_FILE_ARRAY(aggr_size, tx_agg_vs_rate, | ||
4770 | AGGR_STATS_TX_AGG*AGGR_STATS_TX_RATE); | ||
4771 | diff --git a/drivers/net/wireless/ti/wlcore/debugfs.h b/drivers/net/wireless/ti/wlcore/debugfs.h | ||
4772 | index 0f2cfb0d2a9e..bf14676e6515 100644 | ||
4773 | --- a/drivers/net/wireless/ti/wlcore/debugfs.h | ||
4774 | +++ b/drivers/net/wireless/ti/wlcore/debugfs.h | ||
4775 | @@ -26,8 +26,8 @@ | ||
4776 | |||
4777 | #include "wlcore.h" | ||
4778 | |||
4779 | -int wl1271_format_buffer(char __user *userbuf, size_t count, | ||
4780 | - loff_t *ppos, char *fmt, ...); | ||
4781 | +__printf(4, 5) int wl1271_format_buffer(char __user *userbuf, size_t count, | ||
4782 | + loff_t *ppos, char *fmt, ...); | ||
4783 | |||
4784 | int wl1271_debugfs_init(struct wl1271 *wl); | ||
4785 | void wl1271_debugfs_exit(struct wl1271 *wl); | ||
4786 | diff --git a/drivers/nfc/st21nfcb/i2c.c b/drivers/nfc/st21nfcb/i2c.c | ||
4787 | index eb886932d972..7b53a5c84041 100644 | ||
4788 | --- a/drivers/nfc/st21nfcb/i2c.c | ||
4789 | +++ b/drivers/nfc/st21nfcb/i2c.c | ||
4790 | @@ -109,7 +109,7 @@ static int st21nfcb_nci_i2c_write(void *phy_id, struct sk_buff *skb) | ||
4791 | return phy->ndlc->hard_fault; | ||
4792 | |||
4793 | r = i2c_master_send(client, skb->data, skb->len); | ||
4794 | - if (r == -EREMOTEIO) { /* Retry, chip was in standby */ | ||
4795 | + if (r < 0) { /* Retry, chip was in standby */ | ||
4796 | usleep_range(1000, 4000); | ||
4797 | r = i2c_master_send(client, skb->data, skb->len); | ||
4798 | } | ||
4799 | @@ -148,7 +148,7 @@ static int st21nfcb_nci_i2c_read(struct st21nfcb_i2c_phy *phy, | ||
4800 | struct i2c_client *client = phy->i2c_dev; | ||
4801 | |||
4802 | r = i2c_master_recv(client, buf, ST21NFCB_NCI_I2C_MIN_SIZE); | ||
4803 | - if (r == -EREMOTEIO) { /* Retry, chip was in standby */ | ||
4804 | + if (r < 0) { /* Retry, chip was in standby */ | ||
4805 | usleep_range(1000, 4000); | ||
4806 | r = i2c_master_recv(client, buf, ST21NFCB_NCI_I2C_MIN_SIZE); | ||
4807 | } | ||
4808 | diff --git a/drivers/platform/x86/compal-laptop.c b/drivers/platform/x86/compal-laptop.c | ||
4809 | index 15c0fab2bfa1..bceb30b539f3 100644 | ||
4810 | --- a/drivers/platform/x86/compal-laptop.c | ||
4811 | +++ b/drivers/platform/x86/compal-laptop.c | ||
4812 | @@ -1026,9 +1026,9 @@ static int compal_probe(struct platform_device *pdev) | ||
4813 | if (err) | ||
4814 | return err; | ||
4815 | |||
4816 | - hwmon_dev = hwmon_device_register_with_groups(&pdev->dev, | ||
4817 | - "compal", data, | ||
4818 | - compal_hwmon_groups); | ||
4819 | + hwmon_dev = devm_hwmon_device_register_with_groups(&pdev->dev, | ||
4820 | + "compal", data, | ||
4821 | + compal_hwmon_groups); | ||
4822 | if (IS_ERR(hwmon_dev)) { | ||
4823 | err = PTR_ERR(hwmon_dev); | ||
4824 | goto remove; | ||
4825 | @@ -1036,7 +1036,9 @@ static int compal_probe(struct platform_device *pdev) | ||
4826 | |||
4827 | /* Power supply */ | ||
4828 | initialize_power_supply_data(data); | ||
4829 | - power_supply_register(&compal_device->dev, &data->psy); | ||
4830 | + err = power_supply_register(&compal_device->dev, &data->psy); | ||
4831 | + if (err < 0) | ||
4832 | + goto remove; | ||
4833 | |||
4834 | platform_set_drvdata(pdev, data); | ||
4835 | |||
4836 | diff --git a/drivers/power/ipaq_micro_battery.c b/drivers/power/ipaq_micro_battery.c | ||
4837 | index 9d694605cdb7..96b15e003f3f 100644 | ||
4838 | --- a/drivers/power/ipaq_micro_battery.c | ||
4839 | +++ b/drivers/power/ipaq_micro_battery.c | ||
4840 | @@ -226,6 +226,7 @@ static struct power_supply micro_ac_power = { | ||
4841 | static int micro_batt_probe(struct platform_device *pdev) | ||
4842 | { | ||
4843 | struct micro_battery *mb; | ||
4844 | + int ret; | ||
4845 | |||
4846 | mb = devm_kzalloc(&pdev->dev, sizeof(*mb), GFP_KERNEL); | ||
4847 | if (!mb) | ||
4848 | @@ -233,14 +234,30 @@ static int micro_batt_probe(struct platform_device *pdev) | ||
4849 | |||
4850 | mb->micro = dev_get_drvdata(pdev->dev.parent); | ||
4851 | mb->wq = create_singlethread_workqueue("ipaq-battery-wq"); | ||
4852 | + if (!mb->wq) | ||
4853 | + return -ENOMEM; | ||
4854 | + | ||
4855 | INIT_DELAYED_WORK(&mb->update, micro_battery_work); | ||
4856 | platform_set_drvdata(pdev, mb); | ||
4857 | queue_delayed_work(mb->wq, &mb->update, 1); | ||
4858 | - power_supply_register(&pdev->dev, µ_batt_power); | ||
4859 | - power_supply_register(&pdev->dev, µ_ac_power); | ||
4860 | + | ||
4861 | + ret = power_supply_register(&pdev->dev, µ_batt_power); | ||
4862 | + if (ret < 0) | ||
4863 | + goto batt_err; | ||
4864 | + | ||
4865 | + ret = power_supply_register(&pdev->dev, µ_ac_power); | ||
4866 | + if (ret < 0) | ||
4867 | + goto ac_err; | ||
4868 | |||
4869 | dev_info(&pdev->dev, "iPAQ micro battery driver\n"); | ||
4870 | return 0; | ||
4871 | + | ||
4872 | +ac_err: | ||
4873 | + power_supply_unregister(µ_ac_power); | ||
4874 | +batt_err: | ||
4875 | + cancel_delayed_work_sync(&mb->update); | ||
4876 | + destroy_workqueue(mb->wq); | ||
4877 | + return ret; | ||
4878 | } | ||
4879 | |||
4880 | static int micro_batt_remove(struct platform_device *pdev) | ||
4881 | @@ -251,6 +268,7 @@ static int micro_batt_remove(struct platform_device *pdev) | ||
4882 | power_supply_unregister(µ_ac_power); | ||
4883 | power_supply_unregister(µ_batt_power); | ||
4884 | cancel_delayed_work_sync(&mb->update); | ||
4885 | + destroy_workqueue(mb->wq); | ||
4886 | |||
4887 | return 0; | ||
4888 | } | ||
4889 | diff --git a/drivers/power/lp8788-charger.c b/drivers/power/lp8788-charger.c | ||
4890 | index 21fc233c7d61..176dab2e4c16 100644 | ||
4891 | --- a/drivers/power/lp8788-charger.c | ||
4892 | +++ b/drivers/power/lp8788-charger.c | ||
4893 | @@ -417,8 +417,10 @@ static int lp8788_psy_register(struct platform_device *pdev, | ||
4894 | pchg->battery.num_properties = ARRAY_SIZE(lp8788_battery_prop); | ||
4895 | pchg->battery.get_property = lp8788_battery_get_property; | ||
4896 | |||
4897 | - if (power_supply_register(&pdev->dev, &pchg->battery)) | ||
4898 | + if (power_supply_register(&pdev->dev, &pchg->battery)) { | ||
4899 | + power_supply_unregister(&pchg->charger); | ||
4900 | return -EPERM; | ||
4901 | + } | ||
4902 | |||
4903 | return 0; | ||
4904 | } | ||
4905 | diff --git a/drivers/power/twl4030_madc_battery.c b/drivers/power/twl4030_madc_battery.c | ||
4906 | index 7ef445a6cfa6..cf907609ec49 100644 | ||
4907 | --- a/drivers/power/twl4030_madc_battery.c | ||
4908 | +++ b/drivers/power/twl4030_madc_battery.c | ||
4909 | @@ -192,6 +192,7 @@ static int twl4030_madc_battery_probe(struct platform_device *pdev) | ||
4910 | { | ||
4911 | struct twl4030_madc_battery *twl4030_madc_bat; | ||
4912 | struct twl4030_madc_bat_platform_data *pdata = pdev->dev.platform_data; | ||
4913 | + int ret = 0; | ||
4914 | |||
4915 | twl4030_madc_bat = kzalloc(sizeof(*twl4030_madc_bat), GFP_KERNEL); | ||
4916 | if (!twl4030_madc_bat) | ||
4917 | @@ -216,9 +217,11 @@ static int twl4030_madc_battery_probe(struct platform_device *pdev) | ||
4918 | |||
4919 | twl4030_madc_bat->pdata = pdata; | ||
4920 | platform_set_drvdata(pdev, twl4030_madc_bat); | ||
4921 | - power_supply_register(&pdev->dev, &twl4030_madc_bat->psy); | ||
4922 | + ret = power_supply_register(&pdev->dev, &twl4030_madc_bat->psy); | ||
4923 | + if (ret < 0) | ||
4924 | + kfree(twl4030_madc_bat); | ||
4925 | |||
4926 | - return 0; | ||
4927 | + return ret; | ||
4928 | } | ||
4929 | |||
4930 | static int twl4030_madc_battery_remove(struct platform_device *pdev) | ||
4931 | diff --git a/drivers/scsi/megaraid/megaraid_sas_fusion.c b/drivers/scsi/megaraid/megaraid_sas_fusion.c | ||
4932 | index 675b5e7aba94..5a0800d19970 100644 | ||
4933 | --- a/drivers/scsi/megaraid/megaraid_sas_fusion.c | ||
4934 | +++ b/drivers/scsi/megaraid/megaraid_sas_fusion.c | ||
4935 | @@ -1584,11 +1584,11 @@ megasas_build_ldio_fusion(struct megasas_instance *instance, | ||
4936 | fp_possible = io_info.fpOkForIo; | ||
4937 | } | ||
4938 | |||
4939 | - /* Use smp_processor_id() for now until cmd->request->cpu is CPU | ||
4940 | + /* Use raw_smp_processor_id() for now until cmd->request->cpu is CPU | ||
4941 | id by default, not CPU group id, otherwise all MSI-X queues won't | ||
4942 | be utilized */ | ||
4943 | cmd->request_desc->SCSIIO.MSIxIndex = instance->msix_vectors ? | ||
4944 | - smp_processor_id() % instance->msix_vectors : 0; | ||
4945 | + raw_smp_processor_id() % instance->msix_vectors : 0; | ||
4946 | |||
4947 | if (fp_possible) { | ||
4948 | megasas_set_pd_lba(io_request, scp->cmd_len, &io_info, scp, | ||
4949 | @@ -1693,7 +1693,10 @@ megasas_build_dcdb_fusion(struct megasas_instance *instance, | ||
4950 | << MR_RAID_CTX_RAID_FLAGS_IO_SUB_TYPE_SHIFT; | ||
4951 | cmd->request_desc->SCSIIO.DevHandle = io_request->DevHandle; | ||
4952 | cmd->request_desc->SCSIIO.MSIxIndex = | ||
4953 | - instance->msix_vectors ? smp_processor_id() % instance->msix_vectors : 0; | ||
4954 | + instance->msix_vectors ? | ||
4955 | + raw_smp_processor_id() % | ||
4956 | + instance->msix_vectors : | ||
4957 | + 0; | ||
4958 | os_timeout_value = scmd->request->timeout / HZ; | ||
4959 | |||
4960 | if (instance->secure_jbod_support && | ||
4961 | diff --git a/drivers/scsi/mvsas/mv_sas.c b/drivers/scsi/mvsas/mv_sas.c | ||
4962 | index 2d5ab6d969ec..454536c49315 100644 | ||
4963 | --- a/drivers/scsi/mvsas/mv_sas.c | ||
4964 | +++ b/drivers/scsi/mvsas/mv_sas.c | ||
4965 | @@ -441,14 +441,11 @@ static u32 mvs_get_ncq_tag(struct sas_task *task, u32 *tag) | ||
4966 | static int mvs_task_prep_ata(struct mvs_info *mvi, | ||
4967 | struct mvs_task_exec_info *tei) | ||
4968 | { | ||
4969 | - struct sas_ha_struct *sha = mvi->sas; | ||
4970 | struct sas_task *task = tei->task; | ||
4971 | struct domain_device *dev = task->dev; | ||
4972 | struct mvs_device *mvi_dev = dev->lldd_dev; | ||
4973 | struct mvs_cmd_hdr *hdr = tei->hdr; | ||
4974 | struct asd_sas_port *sas_port = dev->port; | ||
4975 | - struct sas_phy *sphy = dev->phy; | ||
4976 | - struct asd_sas_phy *sas_phy = sha->sas_phy[sphy->number]; | ||
4977 | struct mvs_slot_info *slot; | ||
4978 | void *buf_prd; | ||
4979 | u32 tag = tei->tag, hdr_tag; | ||
4980 | @@ -468,7 +465,7 @@ static int mvs_task_prep_ata(struct mvs_info *mvi, | ||
4981 | slot->tx = mvi->tx_prod; | ||
4982 | del_q = TXQ_MODE_I | tag | | ||
4983 | (TXQ_CMD_STP << TXQ_CMD_SHIFT) | | ||
4984 | - (MVS_PHY_ID << TXQ_PHY_SHIFT) | | ||
4985 | + ((sas_port->phy_mask & TXQ_PHY_MASK) << TXQ_PHY_SHIFT) | | ||
4986 | (mvi_dev->taskfileset << TXQ_SRS_SHIFT); | ||
4987 | mvi->tx[mvi->tx_prod] = cpu_to_le32(del_q); | ||
4988 | |||
4989 | diff --git a/drivers/scsi/sd.c b/drivers/scsi/sd.c | ||
4990 | index 6b78476d04bb..3290a3ed5b31 100644 | ||
4991 | --- a/drivers/scsi/sd.c | ||
4992 | +++ b/drivers/scsi/sd.c | ||
4993 | @@ -3100,6 +3100,7 @@ static void scsi_disk_release(struct device *dev) | ||
4994 | ida_remove(&sd_index_ida, sdkp->index); | ||
4995 | spin_unlock(&sd_index_lock); | ||
4996 | |||
4997 | + blk_integrity_unregister(disk); | ||
4998 | disk->private_data = NULL; | ||
4999 | put_disk(disk); | ||
5000 | put_device(&sdkp->device->sdev_gendev); | ||
5001 | diff --git a/drivers/scsi/sd_dif.c b/drivers/scsi/sd_dif.c | ||
5002 | index 14c7d42a11c2..5c06d292b94c 100644 | ||
5003 | --- a/drivers/scsi/sd_dif.c | ||
5004 | +++ b/drivers/scsi/sd_dif.c | ||
5005 | @@ -77,7 +77,7 @@ void sd_dif_config_host(struct scsi_disk *sdkp) | ||
5006 | |||
5007 | disk->integrity->flags |= BLK_INTEGRITY_DEVICE_CAPABLE; | ||
5008 | |||
5009 | - if (!sdkp) | ||
5010 | + if (!sdkp->ATO) | ||
5011 | return; | ||
5012 | |||
5013 | if (type == SD_DIF_TYPE3_PROTECTION) | ||
5014 | diff --git a/drivers/scsi/storvsc_drv.c b/drivers/scsi/storvsc_drv.c | ||
5015 | index efc6e446b6c8..bf8c5c1e254e 100644 | ||
5016 | --- a/drivers/scsi/storvsc_drv.c | ||
5017 | +++ b/drivers/scsi/storvsc_drv.c | ||
5018 | @@ -746,21 +746,22 @@ static unsigned int copy_to_bounce_buffer(struct scatterlist *orig_sgl, | ||
5019 | if (bounce_sgl[j].length == PAGE_SIZE) { | ||
5020 | /* full..move to next entry */ | ||
5021 | sg_kunmap_atomic(bounce_addr); | ||
5022 | + bounce_addr = 0; | ||
5023 | j++; | ||
5024 | + } | ||
5025 | |||
5026 | - /* if we need to use another bounce buffer */ | ||
5027 | - if (srclen || i != orig_sgl_count - 1) | ||
5028 | - bounce_addr = sg_kmap_atomic(bounce_sgl,j); | ||
5029 | + /* if we need to use another bounce buffer */ | ||
5030 | + if (srclen && bounce_addr == 0) | ||
5031 | + bounce_addr = sg_kmap_atomic(bounce_sgl, j); | ||
5032 | |||
5033 | - } else if (srclen == 0 && i == orig_sgl_count - 1) { | ||
5034 | - /* unmap the last bounce that is < PAGE_SIZE */ | ||
5035 | - sg_kunmap_atomic(bounce_addr); | ||
5036 | - } | ||
5037 | } | ||
5038 | |||
5039 | sg_kunmap_atomic(src_addr - orig_sgl[i].offset); | ||
5040 | } | ||
5041 | |||
5042 | + if (bounce_addr) | ||
5043 | + sg_kunmap_atomic(bounce_addr); | ||
5044 | + | ||
5045 | local_irq_restore(flags); | ||
5046 | |||
5047 | return total_copied; | ||
5048 | diff --git a/drivers/spi/spi-imx.c b/drivers/spi/spi-imx.c | ||
5049 | index 6fea4af51c41..aea3a67e5ce1 100644 | ||
5050 | --- a/drivers/spi/spi-imx.c | ||
5051 | +++ b/drivers/spi/spi-imx.c | ||
5052 | @@ -370,8 +370,6 @@ static int __maybe_unused mx51_ecspi_config(struct spi_imx_data *spi_imx, | ||
5053 | if (spi_imx->dma_is_inited) { | ||
5054 | dma = readl(spi_imx->base + MX51_ECSPI_DMA); | ||
5055 | |||
5056 | - spi_imx->tx_wml = spi_imx_get_fifosize(spi_imx) / 2; | ||
5057 | - spi_imx->rx_wml = spi_imx_get_fifosize(spi_imx) / 2; | ||
5058 | spi_imx->rxt_wml = spi_imx_get_fifosize(spi_imx) / 2; | ||
5059 | rx_wml_cfg = spi_imx->rx_wml << MX51_ECSPI_DMA_RX_WML_OFFSET; | ||
5060 | tx_wml_cfg = spi_imx->tx_wml << MX51_ECSPI_DMA_TX_WML_OFFSET; | ||
5061 | @@ -868,6 +866,8 @@ static int spi_imx_sdma_init(struct device *dev, struct spi_imx_data *spi_imx, | ||
5062 | master->max_dma_len = MAX_SDMA_BD_BYTES; | ||
5063 | spi_imx->bitbang.master->flags = SPI_MASTER_MUST_RX | | ||
5064 | SPI_MASTER_MUST_TX; | ||
5065 | + spi_imx->tx_wml = spi_imx_get_fifosize(spi_imx) / 2; | ||
5066 | + spi_imx->rx_wml = spi_imx_get_fifosize(spi_imx) / 2; | ||
5067 | spi_imx->dma_is_inited = 1; | ||
5068 | |||
5069 | return 0; | ||
5070 | diff --git a/drivers/spi/spidev.c b/drivers/spi/spidev.c | ||
5071 | index 4eb7a980e670..7bf51860fd08 100644 | ||
5072 | --- a/drivers/spi/spidev.c | ||
5073 | +++ b/drivers/spi/spidev.c | ||
5074 | @@ -245,7 +245,10 @@ static int spidev_message(struct spidev_data *spidev, | ||
5075 | k_tmp->len = u_tmp->len; | ||
5076 | |||
5077 | total += k_tmp->len; | ||
5078 | - if (total > bufsiz) { | ||
5079 | + /* Check total length of transfers. Also check each | ||
5080 | + * transfer length to avoid arithmetic overflow. | ||
5081 | + */ | ||
5082 | + if (total > bufsiz || k_tmp->len > bufsiz) { | ||
5083 | status = -EMSGSIZE; | ||
5084 | goto done; | ||
5085 | } | ||
5086 | diff --git a/drivers/staging/android/sync.c b/drivers/staging/android/sync.c | ||
5087 | index 7bdb62bf6b40..f83e00c78051 100644 | ||
5088 | --- a/drivers/staging/android/sync.c | ||
5089 | +++ b/drivers/staging/android/sync.c | ||
5090 | @@ -114,7 +114,7 @@ void sync_timeline_signal(struct sync_timeline *obj) | ||
5091 | list_for_each_entry_safe(pt, next, &obj->active_list_head, | ||
5092 | active_list) { | ||
5093 | if (fence_is_signaled_locked(&pt->base)) | ||
5094 | - list_del(&pt->active_list); | ||
5095 | + list_del_init(&pt->active_list); | ||
5096 | } | ||
5097 | |||
5098 | spin_unlock_irqrestore(&obj->child_list_lock, flags); | ||
5099 | diff --git a/drivers/staging/panel/panel.c b/drivers/staging/panel/panel.c | ||
5100 | index 6ed35b6ecf0d..04fc217481c7 100644 | ||
5101 | --- a/drivers/staging/panel/panel.c | ||
5102 | +++ b/drivers/staging/panel/panel.c | ||
5103 | @@ -335,11 +335,11 @@ static unsigned char lcd_bits[LCD_PORTS][LCD_BITS][BIT_STATES]; | ||
5104 | * LCD types | ||
5105 | */ | ||
5106 | #define LCD_TYPE_NONE 0 | ||
5107 | -#define LCD_TYPE_OLD 1 | ||
5108 | -#define LCD_TYPE_KS0074 2 | ||
5109 | -#define LCD_TYPE_HANTRONIX 3 | ||
5110 | -#define LCD_TYPE_NEXCOM 4 | ||
5111 | -#define LCD_TYPE_CUSTOM 5 | ||
5112 | +#define LCD_TYPE_CUSTOM 1 | ||
5113 | +#define LCD_TYPE_OLD 2 | ||
5114 | +#define LCD_TYPE_KS0074 3 | ||
5115 | +#define LCD_TYPE_HANTRONIX 4 | ||
5116 | +#define LCD_TYPE_NEXCOM 5 | ||
5117 | |||
5118 | /* | ||
5119 | * keypad types | ||
5120 | @@ -502,7 +502,7 @@ MODULE_PARM_DESC(keypad_type, | ||
5121 | static int lcd_type = NOT_SET; | ||
5122 | module_param(lcd_type, int, 0000); | ||
5123 | MODULE_PARM_DESC(lcd_type, | ||
5124 | - "LCD type: 0=none, 1=old //, 2=serial ks0074, 3=hantronix //, 4=nexcom //, 5=compiled-in"); | ||
5125 | + "LCD type: 0=none, 1=compiled-in, 2=old, 3=serial ks0074, 4=hantronix, 5=nexcom"); | ||
5126 | |||
5127 | static int lcd_height = NOT_SET; | ||
5128 | module_param(lcd_height, int, 0000); | ||
5129 | diff --git a/drivers/staging/vt6655/rxtx.c b/drivers/staging/vt6655/rxtx.c | ||
5130 | index 07ce3fd88e70..fdf5c56251e5 100644 | ||
5131 | --- a/drivers/staging/vt6655/rxtx.c | ||
5132 | +++ b/drivers/staging/vt6655/rxtx.c | ||
5133 | @@ -1308,10 +1308,18 @@ int vnt_generate_fifo_header(struct vnt_private *priv, u32 dma_idx, | ||
5134 | priv->hw->conf.chandef.chan->hw_value); | ||
5135 | } | ||
5136 | |||
5137 | - if (current_rate > RATE_11M) | ||
5138 | - pkt_type = (u8)priv->byPacketType; | ||
5139 | - else | ||
5140 | + if (current_rate > RATE_11M) { | ||
5141 | + if (info->band == IEEE80211_BAND_5GHZ) { | ||
5142 | + pkt_type = PK_TYPE_11A; | ||
5143 | + } else { | ||
5144 | + if (tx_rate->flags & IEEE80211_TX_RC_USE_CTS_PROTECT) | ||
5145 | + pkt_type = PK_TYPE_11GB; | ||
5146 | + else | ||
5147 | + pkt_type = PK_TYPE_11GA; | ||
5148 | + } | ||
5149 | + } else { | ||
5150 | pkt_type = PK_TYPE_11B; | ||
5151 | + } | ||
5152 | |||
5153 | /*Set fifo controls */ | ||
5154 | if (pkt_type == PK_TYPE_11A) | ||
5155 | diff --git a/drivers/target/iscsi/iscsi_target.c b/drivers/target/iscsi/iscsi_target.c | ||
5156 | index 77d64251af40..5e3561243eda 100644 | ||
5157 | --- a/drivers/target/iscsi/iscsi_target.c | ||
5158 | +++ b/drivers/target/iscsi/iscsi_target.c | ||
5159 | @@ -537,7 +537,7 @@ static struct iscsit_transport iscsi_target_transport = { | ||
5160 | |||
5161 | static int __init iscsi_target_init_module(void) | ||
5162 | { | ||
5163 | - int ret = 0; | ||
5164 | + int ret = 0, size; | ||
5165 | |||
5166 | pr_debug("iSCSI-Target "ISCSIT_VERSION"\n"); | ||
5167 | |||
5168 | @@ -546,6 +546,7 @@ static int __init iscsi_target_init_module(void) | ||
5169 | pr_err("Unable to allocate memory for iscsit_global\n"); | ||
5170 | return -1; | ||
5171 | } | ||
5172 | + spin_lock_init(&iscsit_global->ts_bitmap_lock); | ||
5173 | mutex_init(&auth_id_lock); | ||
5174 | spin_lock_init(&sess_idr_lock); | ||
5175 | idr_init(&tiqn_idr); | ||
5176 | @@ -555,15 +556,11 @@ static int __init iscsi_target_init_module(void) | ||
5177 | if (ret < 0) | ||
5178 | goto out; | ||
5179 | |||
5180 | - ret = iscsi_thread_set_init(); | ||
5181 | - if (ret < 0) | ||
5182 | + size = BITS_TO_LONGS(ISCSIT_BITMAP_BITS) * sizeof(long); | ||
5183 | + iscsit_global->ts_bitmap = vzalloc(size); | ||
5184 | + if (!iscsit_global->ts_bitmap) { | ||
5185 | + pr_err("Unable to allocate iscsit_global->ts_bitmap\n"); | ||
5186 | goto configfs_out; | ||
5187 | - | ||
5188 | - if (iscsi_allocate_thread_sets(TARGET_THREAD_SET_COUNT) != | ||
5189 | - TARGET_THREAD_SET_COUNT) { | ||
5190 | - pr_err("iscsi_allocate_thread_sets() returned" | ||
5191 | - " unexpected value!\n"); | ||
5192 | - goto ts_out1; | ||
5193 | } | ||
5194 | |||
5195 | lio_qr_cache = kmem_cache_create("lio_qr_cache", | ||
5196 | @@ -572,7 +569,7 @@ static int __init iscsi_target_init_module(void) | ||
5197 | if (!lio_qr_cache) { | ||
5198 | pr_err("nable to kmem_cache_create() for" | ||
5199 | " lio_qr_cache\n"); | ||
5200 | - goto ts_out2; | ||
5201 | + goto bitmap_out; | ||
5202 | } | ||
5203 | |||
5204 | lio_dr_cache = kmem_cache_create("lio_dr_cache", | ||
5205 | @@ -617,10 +614,8 @@ dr_out: | ||
5206 | kmem_cache_destroy(lio_dr_cache); | ||
5207 | qr_out: | ||
5208 | kmem_cache_destroy(lio_qr_cache); | ||
5209 | -ts_out2: | ||
5210 | - iscsi_deallocate_thread_sets(); | ||
5211 | -ts_out1: | ||
5212 | - iscsi_thread_set_free(); | ||
5213 | +bitmap_out: | ||
5214 | + vfree(iscsit_global->ts_bitmap); | ||
5215 | configfs_out: | ||
5216 | iscsi_target_deregister_configfs(); | ||
5217 | out: | ||
5218 | @@ -630,8 +625,6 @@ out: | ||
5219 | |||
5220 | static void __exit iscsi_target_cleanup_module(void) | ||
5221 | { | ||
5222 | - iscsi_deallocate_thread_sets(); | ||
5223 | - iscsi_thread_set_free(); | ||
5224 | iscsit_release_discovery_tpg(); | ||
5225 | iscsit_unregister_transport(&iscsi_target_transport); | ||
5226 | kmem_cache_destroy(lio_qr_cache); | ||
5227 | @@ -641,6 +634,7 @@ static void __exit iscsi_target_cleanup_module(void) | ||
5228 | |||
5229 | iscsi_target_deregister_configfs(); | ||
5230 | |||
5231 | + vfree(iscsit_global->ts_bitmap); | ||
5232 | kfree(iscsit_global); | ||
5233 | } | ||
5234 | |||
5235 | @@ -3715,17 +3709,16 @@ static int iscsit_send_reject( | ||
5236 | |||
5237 | void iscsit_thread_get_cpumask(struct iscsi_conn *conn) | ||
5238 | { | ||
5239 | - struct iscsi_thread_set *ts = conn->thread_set; | ||
5240 | int ord, cpu; | ||
5241 | /* | ||
5242 | - * thread_id is assigned from iscsit_global->ts_bitmap from | ||
5243 | - * within iscsi_thread_set.c:iscsi_allocate_thread_sets() | ||
5244 | + * bitmap_id is assigned from iscsit_global->ts_bitmap from | ||
5245 | + * within iscsit_start_kthreads() | ||
5246 | * | ||
5247 | - * Here we use thread_id to determine which CPU that this | ||
5248 | - * iSCSI connection's iscsi_thread_set will be scheduled to | ||
5249 | + * Here we use bitmap_id to determine which CPU that this | ||
5250 | + * iSCSI connection's RX/TX threads will be scheduled to | ||
5251 | * execute upon. | ||
5252 | */ | ||
5253 | - ord = ts->thread_id % cpumask_weight(cpu_online_mask); | ||
5254 | + ord = conn->bitmap_id % cpumask_weight(cpu_online_mask); | ||
5255 | for_each_online_cpu(cpu) { | ||
5256 | if (ord-- == 0) { | ||
5257 | cpumask_set_cpu(cpu, conn->conn_cpumask); | ||
5258 | @@ -3914,7 +3907,7 @@ check_rsp_state: | ||
5259 | switch (state) { | ||
5260 | case ISTATE_SEND_LOGOUTRSP: | ||
5261 | if (!iscsit_logout_post_handler(cmd, conn)) | ||
5262 | - goto restart; | ||
5263 | + return -ECONNRESET; | ||
5264 | /* fall through */ | ||
5265 | case ISTATE_SEND_STATUS: | ||
5266 | case ISTATE_SEND_ASYNCMSG: | ||
5267 | @@ -3942,8 +3935,6 @@ check_rsp_state: | ||
5268 | |||
5269 | err: | ||
5270 | return -1; | ||
5271 | -restart: | ||
5272 | - return -EAGAIN; | ||
5273 | } | ||
5274 | |||
5275 | static int iscsit_handle_response_queue(struct iscsi_conn *conn) | ||
5276 | @@ -3970,21 +3961,13 @@ static int iscsit_handle_response_queue(struct iscsi_conn *conn) | ||
5277 | int iscsi_target_tx_thread(void *arg) | ||
5278 | { | ||
5279 | int ret = 0; | ||
5280 | - struct iscsi_conn *conn; | ||
5281 | - struct iscsi_thread_set *ts = arg; | ||
5282 | + struct iscsi_conn *conn = arg; | ||
5283 | /* | ||
5284 | * Allow ourselves to be interrupted by SIGINT so that a | ||
5285 | * connection recovery / failure event can be triggered externally. | ||
5286 | */ | ||
5287 | allow_signal(SIGINT); | ||
5288 | |||
5289 | -restart: | ||
5290 | - conn = iscsi_tx_thread_pre_handler(ts); | ||
5291 | - if (!conn) | ||
5292 | - goto out; | ||
5293 | - | ||
5294 | - ret = 0; | ||
5295 | - | ||
5296 | while (!kthread_should_stop()) { | ||
5297 | /* | ||
5298 | * Ensure that both TX and RX per connection kthreads | ||
5299 | @@ -3993,11 +3976,9 @@ restart: | ||
5300 | iscsit_thread_check_cpumask(conn, current, 1); | ||
5301 | |||
5302 | wait_event_interruptible(conn->queues_wq, | ||
5303 | - !iscsit_conn_all_queues_empty(conn) || | ||
5304 | - ts->status == ISCSI_THREAD_SET_RESET); | ||
5305 | + !iscsit_conn_all_queues_empty(conn)); | ||
5306 | |||
5307 | - if ((ts->status == ISCSI_THREAD_SET_RESET) || | ||
5308 | - signal_pending(current)) | ||
5309 | + if (signal_pending(current)) | ||
5310 | goto transport_err; | ||
5311 | |||
5312 | get_immediate: | ||
5313 | @@ -4008,15 +3989,14 @@ get_immediate: | ||
5314 | ret = iscsit_handle_response_queue(conn); | ||
5315 | if (ret == 1) | ||
5316 | goto get_immediate; | ||
5317 | - else if (ret == -EAGAIN) | ||
5318 | - goto restart; | ||
5319 | + else if (ret == -ECONNRESET) | ||
5320 | + goto out; | ||
5321 | else if (ret < 0) | ||
5322 | goto transport_err; | ||
5323 | } | ||
5324 | |||
5325 | transport_err: | ||
5326 | iscsit_take_action_for_connection_exit(conn); | ||
5327 | - goto restart; | ||
5328 | out: | ||
5329 | return 0; | ||
5330 | } | ||
5331 | @@ -4111,8 +4091,7 @@ int iscsi_target_rx_thread(void *arg) | ||
5332 | int ret; | ||
5333 | u8 buffer[ISCSI_HDR_LEN], opcode; | ||
5334 | u32 checksum = 0, digest = 0; | ||
5335 | - struct iscsi_conn *conn = NULL; | ||
5336 | - struct iscsi_thread_set *ts = arg; | ||
5337 | + struct iscsi_conn *conn = arg; | ||
5338 | struct kvec iov; | ||
5339 | /* | ||
5340 | * Allow ourselves to be interrupted by SIGINT so that a | ||
5341 | @@ -4120,11 +4099,6 @@ int iscsi_target_rx_thread(void *arg) | ||
5342 | */ | ||
5343 | allow_signal(SIGINT); | ||
5344 | |||
5345 | -restart: | ||
5346 | - conn = iscsi_rx_thread_pre_handler(ts); | ||
5347 | - if (!conn) | ||
5348 | - goto out; | ||
5349 | - | ||
5350 | if (conn->conn_transport->transport_type == ISCSI_INFINIBAND) { | ||
5351 | struct completion comp; | ||
5352 | int rc; | ||
5353 | @@ -4134,7 +4108,7 @@ restart: | ||
5354 | if (rc < 0) | ||
5355 | goto transport_err; | ||
5356 | |||
5357 | - goto out; | ||
5358 | + goto transport_err; | ||
5359 | } | ||
5360 | |||
5361 | while (!kthread_should_stop()) { | ||
5362 | @@ -4210,8 +4184,6 @@ transport_err: | ||
5363 | if (!signal_pending(current)) | ||
5364 | atomic_set(&conn->transport_failed, 1); | ||
5365 | iscsit_take_action_for_connection_exit(conn); | ||
5366 | - goto restart; | ||
5367 | -out: | ||
5368 | return 0; | ||
5369 | } | ||
5370 | |||
5371 | @@ -4273,7 +4245,24 @@ int iscsit_close_connection( | ||
5372 | if (conn->conn_transport->transport_type == ISCSI_TCP) | ||
5373 | complete(&conn->conn_logout_comp); | ||
5374 | |||
5375 | - iscsi_release_thread_set(conn); | ||
5376 | + if (!strcmp(current->comm, ISCSI_RX_THREAD_NAME)) { | ||
5377 | + if (conn->tx_thread && | ||
5378 | + cmpxchg(&conn->tx_thread_active, true, false)) { | ||
5379 | + send_sig(SIGINT, conn->tx_thread, 1); | ||
5380 | + kthread_stop(conn->tx_thread); | ||
5381 | + } | ||
5382 | + } else if (!strcmp(current->comm, ISCSI_TX_THREAD_NAME)) { | ||
5383 | + if (conn->rx_thread && | ||
5384 | + cmpxchg(&conn->rx_thread_active, true, false)) { | ||
5385 | + send_sig(SIGINT, conn->rx_thread, 1); | ||
5386 | + kthread_stop(conn->rx_thread); | ||
5387 | + } | ||
5388 | + } | ||
5389 | + | ||
5390 | + spin_lock(&iscsit_global->ts_bitmap_lock); | ||
5391 | + bitmap_release_region(iscsit_global->ts_bitmap, conn->bitmap_id, | ||
5392 | + get_order(1)); | ||
5393 | + spin_unlock(&iscsit_global->ts_bitmap_lock); | ||
5394 | |||
5395 | iscsit_stop_timers_for_cmds(conn); | ||
5396 | iscsit_stop_nopin_response_timer(conn); | ||
5397 | @@ -4551,15 +4540,13 @@ static void iscsit_logout_post_handler_closesession( | ||
5398 | struct iscsi_conn *conn) | ||
5399 | { | ||
5400 | struct iscsi_session *sess = conn->sess; | ||
5401 | - | ||
5402 | - iscsi_set_thread_clear(conn, ISCSI_CLEAR_TX_THREAD); | ||
5403 | - iscsi_set_thread_set_signal(conn, ISCSI_SIGNAL_TX_THREAD); | ||
5404 | + int sleep = cmpxchg(&conn->tx_thread_active, true, false); | ||
5405 | |||
5406 | atomic_set(&conn->conn_logout_remove, 0); | ||
5407 | complete(&conn->conn_logout_comp); | ||
5408 | |||
5409 | iscsit_dec_conn_usage_count(conn); | ||
5410 | - iscsit_stop_session(sess, 1, 1); | ||
5411 | + iscsit_stop_session(sess, sleep, sleep); | ||
5412 | iscsit_dec_session_usage_count(sess); | ||
5413 | target_put_session(sess->se_sess); | ||
5414 | } | ||
5415 | @@ -4567,13 +4554,12 @@ static void iscsit_logout_post_handler_closesession( | ||
5416 | static void iscsit_logout_post_handler_samecid( | ||
5417 | struct iscsi_conn *conn) | ||
5418 | { | ||
5419 | - iscsi_set_thread_clear(conn, ISCSI_CLEAR_TX_THREAD); | ||
5420 | - iscsi_set_thread_set_signal(conn, ISCSI_SIGNAL_TX_THREAD); | ||
5421 | + int sleep = cmpxchg(&conn->tx_thread_active, true, false); | ||
5422 | |||
5423 | atomic_set(&conn->conn_logout_remove, 0); | ||
5424 | complete(&conn->conn_logout_comp); | ||
5425 | |||
5426 | - iscsit_cause_connection_reinstatement(conn, 1); | ||
5427 | + iscsit_cause_connection_reinstatement(conn, sleep); | ||
5428 | iscsit_dec_conn_usage_count(conn); | ||
5429 | } | ||
5430 | |||
5431 | diff --git a/drivers/target/iscsi/iscsi_target_erl0.c b/drivers/target/iscsi/iscsi_target_erl0.c | ||
5432 | index bdd8731a4daa..e008ed261364 100644 | ||
5433 | --- a/drivers/target/iscsi/iscsi_target_erl0.c | ||
5434 | +++ b/drivers/target/iscsi/iscsi_target_erl0.c | ||
5435 | @@ -860,7 +860,10 @@ void iscsit_connection_reinstatement_rcfr(struct iscsi_conn *conn) | ||
5436 | } | ||
5437 | spin_unlock_bh(&conn->state_lock); | ||
5438 | |||
5439 | - iscsi_thread_set_force_reinstatement(conn); | ||
5440 | + if (conn->tx_thread && conn->tx_thread_active) | ||
5441 | + send_sig(SIGINT, conn->tx_thread, 1); | ||
5442 | + if (conn->rx_thread && conn->rx_thread_active) | ||
5443 | + send_sig(SIGINT, conn->rx_thread, 1); | ||
5444 | |||
5445 | sleep: | ||
5446 | wait_for_completion(&conn->conn_wait_rcfr_comp); | ||
5447 | @@ -885,10 +888,10 @@ void iscsit_cause_connection_reinstatement(struct iscsi_conn *conn, int sleep) | ||
5448 | return; | ||
5449 | } | ||
5450 | |||
5451 | - if (iscsi_thread_set_force_reinstatement(conn) < 0) { | ||
5452 | - spin_unlock_bh(&conn->state_lock); | ||
5453 | - return; | ||
5454 | - } | ||
5455 | + if (conn->tx_thread && conn->tx_thread_active) | ||
5456 | + send_sig(SIGINT, conn->tx_thread, 1); | ||
5457 | + if (conn->rx_thread && conn->rx_thread_active) | ||
5458 | + send_sig(SIGINT, conn->rx_thread, 1); | ||
5459 | |||
5460 | atomic_set(&conn->connection_reinstatement, 1); | ||
5461 | if (!sleep) { | ||
5462 | diff --git a/drivers/target/iscsi/iscsi_target_login.c b/drivers/target/iscsi/iscsi_target_login.c | ||
5463 | index 153fb66ac1b8..345f073ff6dc 100644 | ||
5464 | --- a/drivers/target/iscsi/iscsi_target_login.c | ||
5465 | +++ b/drivers/target/iscsi/iscsi_target_login.c | ||
5466 | @@ -699,6 +699,51 @@ static void iscsi_post_login_start_timers(struct iscsi_conn *conn) | ||
5467 | iscsit_start_nopin_timer(conn); | ||
5468 | } | ||
5469 | |||
5470 | +int iscsit_start_kthreads(struct iscsi_conn *conn) | ||
5471 | +{ | ||
5472 | + int ret = 0; | ||
5473 | + | ||
5474 | + spin_lock(&iscsit_global->ts_bitmap_lock); | ||
5475 | + conn->bitmap_id = bitmap_find_free_region(iscsit_global->ts_bitmap, | ||
5476 | + ISCSIT_BITMAP_BITS, get_order(1)); | ||
5477 | + spin_unlock(&iscsit_global->ts_bitmap_lock); | ||
5478 | + | ||
5479 | + if (conn->bitmap_id < 0) { | ||
5480 | + pr_err("bitmap_find_free_region() failed for" | ||
5481 | + " iscsit_start_kthreads()\n"); | ||
5482 | + return -ENOMEM; | ||
5483 | + } | ||
5484 | + | ||
5485 | + conn->tx_thread = kthread_run(iscsi_target_tx_thread, conn, | ||
5486 | + "%s", ISCSI_TX_THREAD_NAME); | ||
5487 | + if (IS_ERR(conn->tx_thread)) { | ||
5488 | + pr_err("Unable to start iscsi_target_tx_thread\n"); | ||
5489 | + ret = PTR_ERR(conn->tx_thread); | ||
5490 | + goto out_bitmap; | ||
5491 | + } | ||
5492 | + conn->tx_thread_active = true; | ||
5493 | + | ||
5494 | + conn->rx_thread = kthread_run(iscsi_target_rx_thread, conn, | ||
5495 | + "%s", ISCSI_RX_THREAD_NAME); | ||
5496 | + if (IS_ERR(conn->rx_thread)) { | ||
5497 | + pr_err("Unable to start iscsi_target_rx_thread\n"); | ||
5498 | + ret = PTR_ERR(conn->rx_thread); | ||
5499 | + goto out_tx; | ||
5500 | + } | ||
5501 | + conn->rx_thread_active = true; | ||
5502 | + | ||
5503 | + return 0; | ||
5504 | +out_tx: | ||
5505 | + kthread_stop(conn->tx_thread); | ||
5506 | + conn->tx_thread_active = false; | ||
5507 | +out_bitmap: | ||
5508 | + spin_lock(&iscsit_global->ts_bitmap_lock); | ||
5509 | + bitmap_release_region(iscsit_global->ts_bitmap, conn->bitmap_id, | ||
5510 | + get_order(1)); | ||
5511 | + spin_unlock(&iscsit_global->ts_bitmap_lock); | ||
5512 | + return ret; | ||
5513 | +} | ||
5514 | + | ||
5515 | int iscsi_post_login_handler( | ||
5516 | struct iscsi_np *np, | ||
5517 | struct iscsi_conn *conn, | ||
5518 | @@ -709,7 +754,7 @@ int iscsi_post_login_handler( | ||
5519 | struct se_session *se_sess = sess->se_sess; | ||
5520 | struct iscsi_portal_group *tpg = sess->tpg; | ||
5521 | struct se_portal_group *se_tpg = &tpg->tpg_se_tpg; | ||
5522 | - struct iscsi_thread_set *ts; | ||
5523 | + int rc; | ||
5524 | |||
5525 | iscsit_inc_conn_usage_count(conn); | ||
5526 | |||
5527 | @@ -724,7 +769,6 @@ int iscsi_post_login_handler( | ||
5528 | /* | ||
5529 | * SCSI Initiator -> SCSI Target Port Mapping | ||
5530 | */ | ||
5531 | - ts = iscsi_get_thread_set(); | ||
5532 | if (!zero_tsih) { | ||
5533 | iscsi_set_session_parameters(sess->sess_ops, | ||
5534 | conn->param_list, 0); | ||
5535 | @@ -751,9 +795,11 @@ int iscsi_post_login_handler( | ||
5536 | sess->sess_ops->InitiatorName); | ||
5537 | spin_unlock_bh(&sess->conn_lock); | ||
5538 | |||
5539 | - iscsi_post_login_start_timers(conn); | ||
5540 | + rc = iscsit_start_kthreads(conn); | ||
5541 | + if (rc) | ||
5542 | + return rc; | ||
5543 | |||
5544 | - iscsi_activate_thread_set(conn, ts); | ||
5545 | + iscsi_post_login_start_timers(conn); | ||
5546 | /* | ||
5547 | * Determine CPU mask to ensure connection's RX and TX kthreads | ||
5548 | * are scheduled on the same CPU. | ||
5549 | @@ -810,8 +856,11 @@ int iscsi_post_login_handler( | ||
5550 | " iSCSI Target Portal Group: %hu\n", tpg->nsessions, tpg->tpgt); | ||
5551 | spin_unlock_bh(&se_tpg->session_lock); | ||
5552 | |||
5553 | + rc = iscsit_start_kthreads(conn); | ||
5554 | + if (rc) | ||
5555 | + return rc; | ||
5556 | + | ||
5557 | iscsi_post_login_start_timers(conn); | ||
5558 | - iscsi_activate_thread_set(conn, ts); | ||
5559 | /* | ||
5560 | * Determine CPU mask to ensure connection's RX and TX kthreads | ||
5561 | * are scheduled on the same CPU. | ||
5562 | diff --git a/drivers/target/target_core_file.c b/drivers/target/target_core_file.c | ||
5563 | index 44620fb6bd45..cbb0cc277f4e 100644 | ||
5564 | --- a/drivers/target/target_core_file.c | ||
5565 | +++ b/drivers/target/target_core_file.c | ||
5566 | @@ -264,40 +264,32 @@ static int fd_do_prot_rw(struct se_cmd *cmd, struct fd_prot *fd_prot, | ||
5567 | struct se_device *se_dev = cmd->se_dev; | ||
5568 | struct fd_dev *dev = FD_DEV(se_dev); | ||
5569 | struct file *prot_fd = dev->fd_prot_file; | ||
5570 | - struct scatterlist *sg; | ||
5571 | loff_t pos = (cmd->t_task_lba * se_dev->prot_length); | ||
5572 | unsigned char *buf; | ||
5573 | - u32 prot_size, len, size; | ||
5574 | - int rc, ret = 1, i; | ||
5575 | + u32 prot_size; | ||
5576 | + int rc, ret = 1; | ||
5577 | |||
5578 | prot_size = (cmd->data_length / se_dev->dev_attrib.block_size) * | ||
5579 | se_dev->prot_length; | ||
5580 | |||
5581 | if (!is_write) { | ||
5582 | - fd_prot->prot_buf = vzalloc(prot_size); | ||
5583 | + fd_prot->prot_buf = kzalloc(prot_size, GFP_KERNEL); | ||
5584 | if (!fd_prot->prot_buf) { | ||
5585 | pr_err("Unable to allocate fd_prot->prot_buf\n"); | ||
5586 | return -ENOMEM; | ||
5587 | } | ||
5588 | buf = fd_prot->prot_buf; | ||
5589 | |||
5590 | - fd_prot->prot_sg_nents = cmd->t_prot_nents; | ||
5591 | - fd_prot->prot_sg = kzalloc(sizeof(struct scatterlist) * | ||
5592 | - fd_prot->prot_sg_nents, GFP_KERNEL); | ||
5593 | + fd_prot->prot_sg_nents = 1; | ||
5594 | + fd_prot->prot_sg = kzalloc(sizeof(struct scatterlist), | ||
5595 | + GFP_KERNEL); | ||
5596 | if (!fd_prot->prot_sg) { | ||
5597 | pr_err("Unable to allocate fd_prot->prot_sg\n"); | ||
5598 | - vfree(fd_prot->prot_buf); | ||
5599 | + kfree(fd_prot->prot_buf); | ||
5600 | return -ENOMEM; | ||
5601 | } | ||
5602 | - size = prot_size; | ||
5603 | - | ||
5604 | - for_each_sg(fd_prot->prot_sg, sg, fd_prot->prot_sg_nents, i) { | ||
5605 | - | ||
5606 | - len = min_t(u32, PAGE_SIZE, size); | ||
5607 | - sg_set_buf(sg, buf, len); | ||
5608 | - size -= len; | ||
5609 | - buf += len; | ||
5610 | - } | ||
5611 | + sg_init_table(fd_prot->prot_sg, fd_prot->prot_sg_nents); | ||
5612 | + sg_set_buf(fd_prot->prot_sg, buf, prot_size); | ||
5613 | } | ||
5614 | |||
5615 | if (is_write) { | ||
5616 | @@ -318,7 +310,7 @@ static int fd_do_prot_rw(struct se_cmd *cmd, struct fd_prot *fd_prot, | ||
5617 | |||
5618 | if (is_write || ret < 0) { | ||
5619 | kfree(fd_prot->prot_sg); | ||
5620 | - vfree(fd_prot->prot_buf); | ||
5621 | + kfree(fd_prot->prot_buf); | ||
5622 | } | ||
5623 | |||
5624 | return ret; | ||
5625 | @@ -549,6 +541,56 @@ fd_execute_write_same(struct se_cmd *cmd) | ||
5626 | return 0; | ||
5627 | } | ||
5628 | |||
5629 | +static int | ||
5630 | +fd_do_prot_fill(struct se_device *se_dev, sector_t lba, sector_t nolb, | ||
5631 | + void *buf, size_t bufsize) | ||
5632 | +{ | ||
5633 | + struct fd_dev *fd_dev = FD_DEV(se_dev); | ||
5634 | + struct file *prot_fd = fd_dev->fd_prot_file; | ||
5635 | + sector_t prot_length, prot; | ||
5636 | + loff_t pos = lba * se_dev->prot_length; | ||
5637 | + | ||
5638 | + if (!prot_fd) { | ||
5639 | + pr_err("Unable to locate fd_dev->fd_prot_file\n"); | ||
5640 | + return -ENODEV; | ||
5641 | + } | ||
5642 | + | ||
5643 | + prot_length = nolb * se_dev->prot_length; | ||
5644 | + | ||
5645 | + for (prot = 0; prot < prot_length;) { | ||
5646 | + sector_t len = min_t(sector_t, bufsize, prot_length - prot); | ||
5647 | + ssize_t ret = kernel_write(prot_fd, buf, len, pos + prot); | ||
5648 | + | ||
5649 | + if (ret != len) { | ||
5650 | + pr_err("vfs_write to prot file failed: %zd\n", ret); | ||
5651 | + return ret < 0 ? ret : -ENODEV; | ||
5652 | + } | ||
5653 | + prot += ret; | ||
5654 | + } | ||
5655 | + | ||
5656 | + return 0; | ||
5657 | +} | ||
5658 | + | ||
5659 | +static int | ||
5660 | +fd_do_prot_unmap(struct se_cmd *cmd, sector_t lba, sector_t nolb) | ||
5661 | +{ | ||
5662 | + void *buf; | ||
5663 | + int rc; | ||
5664 | + | ||
5665 | + buf = (void *)__get_free_page(GFP_KERNEL); | ||
5666 | + if (!buf) { | ||
5667 | + pr_err("Unable to allocate FILEIO prot buf\n"); | ||
5668 | + return -ENOMEM; | ||
5669 | + } | ||
5670 | + memset(buf, 0xff, PAGE_SIZE); | ||
5671 | + | ||
5672 | + rc = fd_do_prot_fill(cmd->se_dev, lba, nolb, buf, PAGE_SIZE); | ||
5673 | + | ||
5674 | + free_page((unsigned long)buf); | ||
5675 | + | ||
5676 | + return rc; | ||
5677 | +} | ||
5678 | + | ||
5679 | static sense_reason_t | ||
5680 | fd_do_unmap(struct se_cmd *cmd, void *priv, sector_t lba, sector_t nolb) | ||
5681 | { | ||
5682 | @@ -556,6 +598,12 @@ fd_do_unmap(struct se_cmd *cmd, void *priv, sector_t lba, sector_t nolb) | ||
5683 | struct inode *inode = file->f_mapping->host; | ||
5684 | int ret; | ||
5685 | |||
5686 | + if (cmd->se_dev->dev_attrib.pi_prot_type) { | ||
5687 | + ret = fd_do_prot_unmap(cmd, lba, nolb); | ||
5688 | + if (ret) | ||
5689 | + return TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE; | ||
5690 | + } | ||
5691 | + | ||
5692 | if (S_ISBLK(inode->i_mode)) { | ||
5693 | /* The backend is block device, use discard */ | ||
5694 | struct block_device *bdev = inode->i_bdev; | ||
5695 | @@ -658,11 +706,11 @@ fd_execute_rw(struct se_cmd *cmd, struct scatterlist *sgl, u32 sgl_nents, | ||
5696 | 0, fd_prot.prot_sg, 0); | ||
5697 | if (rc) { | ||
5698 | kfree(fd_prot.prot_sg); | ||
5699 | - vfree(fd_prot.prot_buf); | ||
5700 | + kfree(fd_prot.prot_buf); | ||
5701 | return rc; | ||
5702 | } | ||
5703 | kfree(fd_prot.prot_sg); | ||
5704 | - vfree(fd_prot.prot_buf); | ||
5705 | + kfree(fd_prot.prot_buf); | ||
5706 | } | ||
5707 | } else { | ||
5708 | memset(&fd_prot, 0, sizeof(struct fd_prot)); | ||
5709 | @@ -678,7 +726,7 @@ fd_execute_rw(struct se_cmd *cmd, struct scatterlist *sgl, u32 sgl_nents, | ||
5710 | 0, fd_prot.prot_sg, 0); | ||
5711 | if (rc) { | ||
5712 | kfree(fd_prot.prot_sg); | ||
5713 | - vfree(fd_prot.prot_buf); | ||
5714 | + kfree(fd_prot.prot_buf); | ||
5715 | return rc; | ||
5716 | } | ||
5717 | } | ||
5718 | @@ -714,7 +762,7 @@ fd_execute_rw(struct se_cmd *cmd, struct scatterlist *sgl, u32 sgl_nents, | ||
5719 | |||
5720 | if (ret < 0) { | ||
5721 | kfree(fd_prot.prot_sg); | ||
5722 | - vfree(fd_prot.prot_buf); | ||
5723 | + kfree(fd_prot.prot_buf); | ||
5724 | return TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE; | ||
5725 | } | ||
5726 | |||
5727 | @@ -878,48 +926,28 @@ static int fd_init_prot(struct se_device *dev) | ||
5728 | |||
5729 | static int fd_format_prot(struct se_device *dev) | ||
5730 | { | ||
5731 | - struct fd_dev *fd_dev = FD_DEV(dev); | ||
5732 | - struct file *prot_fd = fd_dev->fd_prot_file; | ||
5733 | - sector_t prot_length, prot; | ||
5734 | unsigned char *buf; | ||
5735 | - loff_t pos = 0; | ||
5736 | int unit_size = FDBD_FORMAT_UNIT_SIZE * dev->dev_attrib.block_size; | ||
5737 | - int rc, ret = 0, size, len; | ||
5738 | + int ret; | ||
5739 | |||
5740 | if (!dev->dev_attrib.pi_prot_type) { | ||
5741 | pr_err("Unable to format_prot while pi_prot_type == 0\n"); | ||
5742 | return -ENODEV; | ||
5743 | } | ||
5744 | - if (!prot_fd) { | ||
5745 | - pr_err("Unable to locate fd_dev->fd_prot_file\n"); | ||
5746 | - return -ENODEV; | ||
5747 | - } | ||
5748 | |||
5749 | buf = vzalloc(unit_size); | ||
5750 | if (!buf) { | ||
5751 | pr_err("Unable to allocate FILEIO prot buf\n"); | ||
5752 | return -ENOMEM; | ||
5753 | } | ||
5754 | - prot_length = (dev->transport->get_blocks(dev) + 1) * dev->prot_length; | ||
5755 | - size = prot_length; | ||
5756 | |||
5757 | pr_debug("Using FILEIO prot_length: %llu\n", | ||
5758 | - (unsigned long long)prot_length); | ||
5759 | + (unsigned long long)(dev->transport->get_blocks(dev) + 1) * | ||
5760 | + dev->prot_length); | ||
5761 | |||
5762 | memset(buf, 0xff, unit_size); | ||
5763 | - for (prot = 0; prot < prot_length; prot += unit_size) { | ||
5764 | - len = min(unit_size, size); | ||
5765 | - rc = kernel_write(prot_fd, buf, len, pos); | ||
5766 | - if (rc != len) { | ||
5767 | - pr_err("vfs_write to prot file failed: %d\n", rc); | ||
5768 | - ret = -ENODEV; | ||
5769 | - goto out; | ||
5770 | - } | ||
5771 | - pos += len; | ||
5772 | - size -= len; | ||
5773 | - } | ||
5774 | - | ||
5775 | -out: | ||
5776 | + ret = fd_do_prot_fill(dev, 0, dev->transport->get_blocks(dev) + 1, | ||
5777 | + buf, unit_size); | ||
5778 | vfree(buf); | ||
5779 | return ret; | ||
5780 | } | ||
5781 | diff --git a/drivers/target/target_core_sbc.c b/drivers/target/target_core_sbc.c | ||
5782 | index 3e7297411110..755bd9b34612 100644 | ||
5783 | --- a/drivers/target/target_core_sbc.c | ||
5784 | +++ b/drivers/target/target_core_sbc.c | ||
5785 | @@ -312,7 +312,7 @@ sbc_setup_write_same(struct se_cmd *cmd, unsigned char *flags, struct sbc_ops *o | ||
5786 | return 0; | ||
5787 | } | ||
5788 | |||
5789 | -static sense_reason_t xdreadwrite_callback(struct se_cmd *cmd) | ||
5790 | +static sense_reason_t xdreadwrite_callback(struct se_cmd *cmd, bool success) | ||
5791 | { | ||
5792 | unsigned char *buf, *addr; | ||
5793 | struct scatterlist *sg; | ||
5794 | @@ -376,7 +376,7 @@ sbc_execute_rw(struct se_cmd *cmd) | ||
5795 | cmd->data_direction); | ||
5796 | } | ||
5797 | |||
5798 | -static sense_reason_t compare_and_write_post(struct se_cmd *cmd) | ||
5799 | +static sense_reason_t compare_and_write_post(struct se_cmd *cmd, bool success) | ||
5800 | { | ||
5801 | struct se_device *dev = cmd->se_dev; | ||
5802 | |||
5803 | @@ -399,7 +399,7 @@ static sense_reason_t compare_and_write_post(struct se_cmd *cmd) | ||
5804 | return TCM_NO_SENSE; | ||
5805 | } | ||
5806 | |||
5807 | -static sense_reason_t compare_and_write_callback(struct se_cmd *cmd) | ||
5808 | +static sense_reason_t compare_and_write_callback(struct se_cmd *cmd, bool success) | ||
5809 | { | ||
5810 | struct se_device *dev = cmd->se_dev; | ||
5811 | struct scatterlist *write_sg = NULL, *sg; | ||
5812 | @@ -414,11 +414,16 @@ static sense_reason_t compare_and_write_callback(struct se_cmd *cmd) | ||
5813 | |||
5814 | /* | ||
5815 | * Handle early failure in transport_generic_request_failure(), | ||
5816 | - * which will not have taken ->caw_mutex yet.. | ||
5817 | + * which will not have taken ->caw_sem yet.. | ||
5818 | */ | ||
5819 | - if (!cmd->t_data_sg || !cmd->t_bidi_data_sg) | ||
5820 | + if (!success && (!cmd->t_data_sg || !cmd->t_bidi_data_sg)) | ||
5821 | return TCM_NO_SENSE; | ||
5822 | /* | ||
5823 | + * Handle special case for zero-length COMPARE_AND_WRITE | ||
5824 | + */ | ||
5825 | + if (!cmd->data_length) | ||
5826 | + goto out; | ||
5827 | + /* | ||
5828 | * Immediately exit + release dev->caw_sem if command has already | ||
5829 | * been failed with a non-zero SCSI status. | ||
5830 | */ | ||
5831 | diff --git a/drivers/target/target_core_transport.c b/drivers/target/target_core_transport.c | ||
5832 | index ac3cbabdbdf0..f786de0290db 100644 | ||
5833 | --- a/drivers/target/target_core_transport.c | ||
5834 | +++ b/drivers/target/target_core_transport.c | ||
5835 | @@ -1615,11 +1615,11 @@ void transport_generic_request_failure(struct se_cmd *cmd, | ||
5836 | transport_complete_task_attr(cmd); | ||
5837 | /* | ||
5838 | * Handle special case for COMPARE_AND_WRITE failure, where the | ||
5839 | - * callback is expected to drop the per device ->caw_mutex. | ||
5840 | + * callback is expected to drop the per device ->caw_sem. | ||
5841 | */ | ||
5842 | if ((cmd->se_cmd_flags & SCF_COMPARE_AND_WRITE) && | ||
5843 | cmd->transport_complete_callback) | ||
5844 | - cmd->transport_complete_callback(cmd); | ||
5845 | + cmd->transport_complete_callback(cmd, false); | ||
5846 | |||
5847 | switch (sense_reason) { | ||
5848 | case TCM_NON_EXISTENT_LUN: | ||
5849 | @@ -1975,8 +1975,12 @@ static void target_complete_ok_work(struct work_struct *work) | ||
5850 | if (cmd->transport_complete_callback) { | ||
5851 | sense_reason_t rc; | ||
5852 | |||
5853 | - rc = cmd->transport_complete_callback(cmd); | ||
5854 | + rc = cmd->transport_complete_callback(cmd, true); | ||
5855 | if (!rc && !(cmd->se_cmd_flags & SCF_COMPARE_AND_WRITE_POST)) { | ||
5856 | + if ((cmd->se_cmd_flags & SCF_COMPARE_AND_WRITE) && | ||
5857 | + !cmd->data_length) | ||
5858 | + goto queue_rsp; | ||
5859 | + | ||
5860 | return; | ||
5861 | } else if (rc) { | ||
5862 | ret = transport_send_check_condition_and_sense(cmd, | ||
5863 | @@ -1990,6 +1994,7 @@ static void target_complete_ok_work(struct work_struct *work) | ||
5864 | } | ||
5865 | } | ||
5866 | |||
5867 | +queue_rsp: | ||
5868 | switch (cmd->data_direction) { | ||
5869 | case DMA_FROM_DEVICE: | ||
5870 | spin_lock(&cmd->se_lun->lun_sep_lock); | ||
5871 | @@ -2094,6 +2099,16 @@ static inline void transport_reset_sgl_orig(struct se_cmd *cmd) | ||
5872 | static inline void transport_free_pages(struct se_cmd *cmd) | ||
5873 | { | ||
5874 | if (cmd->se_cmd_flags & SCF_PASSTHROUGH_SG_TO_MEM_NOALLOC) { | ||
5875 | + /* | ||
5876 | + * Release special case READ buffer payload required for | ||
5877 | + * SG_TO_MEM_NOALLOC to function with COMPARE_AND_WRITE | ||
5878 | + */ | ||
5879 | + if (cmd->se_cmd_flags & SCF_COMPARE_AND_WRITE) { | ||
5880 | + transport_free_sgl(cmd->t_bidi_data_sg, | ||
5881 | + cmd->t_bidi_data_nents); | ||
5882 | + cmd->t_bidi_data_sg = NULL; | ||
5883 | + cmd->t_bidi_data_nents = 0; | ||
5884 | + } | ||
5885 | transport_reset_sgl_orig(cmd); | ||
5886 | return; | ||
5887 | } | ||
5888 | @@ -2246,6 +2261,7 @@ sense_reason_t | ||
5889 | transport_generic_new_cmd(struct se_cmd *cmd) | ||
5890 | { | ||
5891 | int ret = 0; | ||
5892 | + bool zero_flag = !(cmd->se_cmd_flags & SCF_SCSI_DATA_CDB); | ||
5893 | |||
5894 | /* | ||
5895 | * Determine is the TCM fabric module has already allocated physical | ||
5896 | @@ -2254,7 +2270,6 @@ transport_generic_new_cmd(struct se_cmd *cmd) | ||
5897 | */ | ||
5898 | if (!(cmd->se_cmd_flags & SCF_PASSTHROUGH_SG_TO_MEM_NOALLOC) && | ||
5899 | cmd->data_length) { | ||
5900 | - bool zero_flag = !(cmd->se_cmd_flags & SCF_SCSI_DATA_CDB); | ||
5901 | |||
5902 | if ((cmd->se_cmd_flags & SCF_BIDI) || | ||
5903 | (cmd->se_cmd_flags & SCF_COMPARE_AND_WRITE)) { | ||
5904 | @@ -2285,6 +2300,20 @@ transport_generic_new_cmd(struct se_cmd *cmd) | ||
5905 | cmd->data_length, zero_flag); | ||
5906 | if (ret < 0) | ||
5907 | return TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE; | ||
5908 | + } else if ((cmd->se_cmd_flags & SCF_COMPARE_AND_WRITE) && | ||
5909 | + cmd->data_length) { | ||
5910 | + /* | ||
5911 | + * Special case for COMPARE_AND_WRITE with fabrics | ||
5912 | + * using SCF_PASSTHROUGH_SG_TO_MEM_NOALLOC. | ||
5913 | + */ | ||
5914 | + u32 caw_length = cmd->t_task_nolb * | ||
5915 | + cmd->se_dev->dev_attrib.block_size; | ||
5916 | + | ||
5917 | + ret = target_alloc_sgl(&cmd->t_bidi_data_sg, | ||
5918 | + &cmd->t_bidi_data_nents, | ||
5919 | + caw_length, zero_flag); | ||
5920 | + if (ret < 0) | ||
5921 | + return TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE; | ||
5922 | } | ||
5923 | /* | ||
5924 | * If this command is not a write we can execute it right here, | ||
5925 | diff --git a/drivers/tty/serial/8250/8250_core.c b/drivers/tty/serial/8250/8250_core.c | ||
5926 | index deae122c9c4b..d465ace95186 100644 | ||
5927 | --- a/drivers/tty/serial/8250/8250_core.c | ||
5928 | +++ b/drivers/tty/serial/8250/8250_core.c | ||
5929 | @@ -3444,7 +3444,8 @@ void serial8250_suspend_port(int line) | ||
5930 | port->type != PORT_8250) { | ||
5931 | unsigned char canary = 0xa5; | ||
5932 | serial_out(up, UART_SCR, canary); | ||
5933 | - up->canary = canary; | ||
5934 | + if (serial_in(up, UART_SCR) == canary) | ||
5935 | + up->canary = canary; | ||
5936 | } | ||
5937 | |||
5938 | uart_suspend_port(&serial8250_reg, port); | ||
5939 | diff --git a/drivers/tty/serial/8250/8250_dw.c b/drivers/tty/serial/8250/8250_dw.c | ||
5940 | index 6ae5b8560e4d..7a80250475eb 100644 | ||
5941 | --- a/drivers/tty/serial/8250/8250_dw.c | ||
5942 | +++ b/drivers/tty/serial/8250/8250_dw.c | ||
5943 | @@ -629,6 +629,7 @@ static const struct acpi_device_id dw8250_acpi_match[] = { | ||
5944 | { "80860F0A", 0 }, | ||
5945 | { "8086228A", 0 }, | ||
5946 | { "APMC0D08", 0}, | ||
5947 | + { "AMD0020", 0 }, | ||
5948 | { }, | ||
5949 | }; | ||
5950 | MODULE_DEVICE_TABLE(acpi, dw8250_acpi_match); | ||
5951 | diff --git a/drivers/tty/serial/imx.c b/drivers/tty/serial/imx.c | ||
5952 | index 0eb29b1c47ac..23061918b0e4 100644 | ||
5953 | --- a/drivers/tty/serial/imx.c | ||
5954 | +++ b/drivers/tty/serial/imx.c | ||
5955 | @@ -818,7 +818,7 @@ static irqreturn_t imx_int(int irq, void *dev_id) | ||
5956 | if (sts2 & USR2_ORE) { | ||
5957 | dev_err(sport->port.dev, "Rx FIFO overrun\n"); | ||
5958 | sport->port.icount.overrun++; | ||
5959 | - writel(sts2 | USR2_ORE, sport->port.membase + USR2); | ||
5960 | + writel(USR2_ORE, sport->port.membase + USR2); | ||
5961 | } | ||
5962 | |||
5963 | return IRQ_HANDLED; | ||
5964 | @@ -1181,10 +1181,12 @@ static int imx_startup(struct uart_port *port) | ||
5965 | imx_uart_dma_init(sport); | ||
5966 | |||
5967 | spin_lock_irqsave(&sport->port.lock, flags); | ||
5968 | + | ||
5969 | /* | ||
5970 | * Finally, clear and enable interrupts | ||
5971 | */ | ||
5972 | writel(USR1_RTSD, sport->port.membase + USR1); | ||
5973 | + writel(USR2_ORE, sport->port.membase + USR2); | ||
5974 | |||
5975 | if (sport->dma_is_inited && !sport->dma_is_enabled) | ||
5976 | imx_enable_dma(sport); | ||
5977 | @@ -1199,10 +1201,6 @@ static int imx_startup(struct uart_port *port) | ||
5978 | |||
5979 | writel(temp, sport->port.membase + UCR1); | ||
5980 | |||
5981 | - /* Clear any pending ORE flag before enabling interrupt */ | ||
5982 | - temp = readl(sport->port.membase + USR2); | ||
5983 | - writel(temp | USR2_ORE, sport->port.membase + USR2); | ||
5984 | - | ||
5985 | temp = readl(sport->port.membase + UCR4); | ||
5986 | temp |= UCR4_OREN; | ||
5987 | writel(temp, sport->port.membase + UCR4); | ||
5988 | diff --git a/drivers/usb/class/cdc-wdm.c b/drivers/usb/class/cdc-wdm.c | ||
5989 | index a051a7a2b1bd..a81f9dd7ee97 100644 | ||
5990 | --- a/drivers/usb/class/cdc-wdm.c | ||
5991 | +++ b/drivers/usb/class/cdc-wdm.c | ||
5992 | @@ -245,7 +245,7 @@ static void wdm_int_callback(struct urb *urb) | ||
5993 | case USB_CDC_NOTIFY_RESPONSE_AVAILABLE: | ||
5994 | dev_dbg(&desc->intf->dev, | ||
5995 | "NOTIFY_RESPONSE_AVAILABLE received: index %d len %d", | ||
5996 | - dr->wIndex, dr->wLength); | ||
5997 | + le16_to_cpu(dr->wIndex), le16_to_cpu(dr->wLength)); | ||
5998 | break; | ||
5999 | |||
6000 | case USB_CDC_NOTIFY_NETWORK_CONNECTION: | ||
6001 | @@ -262,7 +262,9 @@ static void wdm_int_callback(struct urb *urb) | ||
6002 | clear_bit(WDM_POLL_RUNNING, &desc->flags); | ||
6003 | dev_err(&desc->intf->dev, | ||
6004 | "unknown notification %d received: index %d len %d\n", | ||
6005 | - dr->bNotificationType, dr->wIndex, dr->wLength); | ||
6006 | + dr->bNotificationType, | ||
6007 | + le16_to_cpu(dr->wIndex), | ||
6008 | + le16_to_cpu(dr->wLength)); | ||
6009 | goto exit; | ||
6010 | } | ||
6011 | |||
6012 | @@ -408,7 +410,7 @@ static ssize_t wdm_write | ||
6013 | USB_RECIP_INTERFACE); | ||
6014 | req->bRequest = USB_CDC_SEND_ENCAPSULATED_COMMAND; | ||
6015 | req->wValue = 0; | ||
6016 | - req->wIndex = desc->inum; | ||
6017 | + req->wIndex = desc->inum; /* already converted */ | ||
6018 | req->wLength = cpu_to_le16(count); | ||
6019 | set_bit(WDM_IN_USE, &desc->flags); | ||
6020 | desc->outbuf = buf; | ||
6021 | @@ -422,7 +424,7 @@ static ssize_t wdm_write | ||
6022 | rv = usb_translate_errors(rv); | ||
6023 | } else { | ||
6024 | dev_dbg(&desc->intf->dev, "Tx URB has been submitted index=%d", | ||
6025 | - req->wIndex); | ||
6026 | + le16_to_cpu(req->wIndex)); | ||
6027 | } | ||
6028 | out: | ||
6029 | usb_autopm_put_interface(desc->intf); | ||
6030 | @@ -820,7 +822,7 @@ static int wdm_create(struct usb_interface *intf, struct usb_endpoint_descriptor | ||
6031 | desc->irq->bRequestType = (USB_DIR_IN | USB_TYPE_CLASS | USB_RECIP_INTERFACE); | ||
6032 | desc->irq->bRequest = USB_CDC_GET_ENCAPSULATED_RESPONSE; | ||
6033 | desc->irq->wValue = 0; | ||
6034 | - desc->irq->wIndex = desc->inum; | ||
6035 | + desc->irq->wIndex = desc->inum; /* already converted */ | ||
6036 | desc->irq->wLength = cpu_to_le16(desc->wMaxCommand); | ||
6037 | |||
6038 | usb_fill_control_urb( | ||
6039 | diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c | ||
6040 | index d7c3d5a35946..3b7151687776 100644 | ||
6041 | --- a/drivers/usb/core/hub.c | ||
6042 | +++ b/drivers/usb/core/hub.c | ||
6043 | @@ -3406,10 +3406,10 @@ int usb_port_resume(struct usb_device *udev, pm_message_t msg) | ||
6044 | if (status) { | ||
6045 | dev_dbg(&port_dev->dev, "can't resume, status %d\n", status); | ||
6046 | } else { | ||
6047 | - /* drive resume for at least 20 msec */ | ||
6048 | + /* drive resume for USB_RESUME_TIMEOUT msec */ | ||
6049 | dev_dbg(&udev->dev, "usb %sresume\n", | ||
6050 | (PMSG_IS_AUTO(msg) ? "auto-" : "")); | ||
6051 | - msleep(25); | ||
6052 | + msleep(USB_RESUME_TIMEOUT); | ||
6053 | |||
6054 | /* Virtual root hubs can trigger on GET_PORT_STATUS to | ||
6055 | * stop resume signaling. Then finish the resume | ||
6056 | diff --git a/drivers/usb/dwc2/hcd.c b/drivers/usb/dwc2/hcd.c | ||
6057 | index c78c8740db1d..758b7e0380f6 100644 | ||
6058 | --- a/drivers/usb/dwc2/hcd.c | ||
6059 | +++ b/drivers/usb/dwc2/hcd.c | ||
6060 | @@ -1521,7 +1521,7 @@ static int dwc2_hcd_hub_control(struct dwc2_hsotg *hsotg, u16 typereq, | ||
6061 | dev_dbg(hsotg->dev, | ||
6062 | "ClearPortFeature USB_PORT_FEAT_SUSPEND\n"); | ||
6063 | writel(0, hsotg->regs + PCGCTL); | ||
6064 | - usleep_range(20000, 40000); | ||
6065 | + msleep(USB_RESUME_TIMEOUT); | ||
6066 | |||
6067 | hprt0 = dwc2_read_hprt0(hsotg); | ||
6068 | hprt0 |= HPRT0_RES; | ||
6069 | diff --git a/drivers/usb/gadget/legacy/printer.c b/drivers/usb/gadget/legacy/printer.c | ||
6070 | index 90545980542f..6385c198c134 100644 | ||
6071 | --- a/drivers/usb/gadget/legacy/printer.c | ||
6072 | +++ b/drivers/usb/gadget/legacy/printer.c | ||
6073 | @@ -1031,6 +1031,15 @@ unknown: | ||
6074 | break; | ||
6075 | } | ||
6076 | /* host either stalls (value < 0) or reports success */ | ||
6077 | + if (value >= 0) { | ||
6078 | + req->length = value; | ||
6079 | + req->zero = value < wLength; | ||
6080 | + value = usb_ep_queue(cdev->gadget->ep0, req, GFP_ATOMIC); | ||
6081 | + if (value < 0) { | ||
6082 | + ERROR(dev, "%s:%d Error!\n", __func__, __LINE__); | ||
6083 | + req->status = 0; | ||
6084 | + } | ||
6085 | + } | ||
6086 | return value; | ||
6087 | } | ||
6088 | |||
6089 | diff --git a/drivers/usb/host/ehci-hcd.c b/drivers/usb/host/ehci-hcd.c | ||
6090 | index 85e56d1abd23..f4d88dfb26a7 100644 | ||
6091 | --- a/drivers/usb/host/ehci-hcd.c | ||
6092 | +++ b/drivers/usb/host/ehci-hcd.c | ||
6093 | @@ -792,12 +792,12 @@ static irqreturn_t ehci_irq (struct usb_hcd *hcd) | ||
6094 | ehci->reset_done[i] == 0)) | ||
6095 | continue; | ||
6096 | |||
6097 | - /* start 20 msec resume signaling from this port, | ||
6098 | - * and make hub_wq collect PORT_STAT_C_SUSPEND to | ||
6099 | - * stop that signaling. Use 5 ms extra for safety, | ||
6100 | - * like usb_port_resume() does. | ||
6101 | + /* start USB_RESUME_TIMEOUT msec resume signaling from | ||
6102 | + * this port, and make hub_wq collect | ||
6103 | + * PORT_STAT_C_SUSPEND to stop that signaling. | ||
6104 | */ | ||
6105 | - ehci->reset_done[i] = jiffies + msecs_to_jiffies(25); | ||
6106 | + ehci->reset_done[i] = jiffies + | ||
6107 | + msecs_to_jiffies(USB_RESUME_TIMEOUT); | ||
6108 | set_bit(i, &ehci->resuming_ports); | ||
6109 | ehci_dbg (ehci, "port %d remote wakeup\n", i + 1); | ||
6110 | usb_hcd_start_port_resume(&hcd->self, i); | ||
6111 | diff --git a/drivers/usb/host/ehci-hub.c b/drivers/usb/host/ehci-hub.c | ||
6112 | index 87cf86f38b36..7354d0129a72 100644 | ||
6113 | --- a/drivers/usb/host/ehci-hub.c | ||
6114 | +++ b/drivers/usb/host/ehci-hub.c | ||
6115 | @@ -471,10 +471,13 @@ static int ehci_bus_resume (struct usb_hcd *hcd) | ||
6116 | ehci_writel(ehci, temp, &ehci->regs->port_status [i]); | ||
6117 | } | ||
6118 | |||
6119 | - /* msleep for 20ms only if code is trying to resume port */ | ||
6120 | + /* | ||
6121 | + * msleep for USB_RESUME_TIMEOUT ms only if code is trying to resume | ||
6122 | + * port | ||
6123 | + */ | ||
6124 | if (resume_needed) { | ||
6125 | spin_unlock_irq(&ehci->lock); | ||
6126 | - msleep(20); | ||
6127 | + msleep(USB_RESUME_TIMEOUT); | ||
6128 | spin_lock_irq(&ehci->lock); | ||
6129 | if (ehci->shutdown) | ||
6130 | goto shutdown; | ||
6131 | @@ -942,7 +945,7 @@ int ehci_hub_control( | ||
6132 | temp &= ~PORT_WAKE_BITS; | ||
6133 | ehci_writel(ehci, temp | PORT_RESUME, status_reg); | ||
6134 | ehci->reset_done[wIndex] = jiffies | ||
6135 | - + msecs_to_jiffies(20); | ||
6136 | + + msecs_to_jiffies(USB_RESUME_TIMEOUT); | ||
6137 | set_bit(wIndex, &ehci->resuming_ports); | ||
6138 | usb_hcd_start_port_resume(&hcd->self, wIndex); | ||
6139 | break; | ||
6140 | diff --git a/drivers/usb/host/fotg210-hcd.c b/drivers/usb/host/fotg210-hcd.c | ||
6141 | index 475b21fd373b..7a6681fb7675 100644 | ||
6142 | --- a/drivers/usb/host/fotg210-hcd.c | ||
6143 | +++ b/drivers/usb/host/fotg210-hcd.c | ||
6144 | @@ -1595,7 +1595,7 @@ static int fotg210_hub_control( | ||
6145 | /* resume signaling for 20 msec */ | ||
6146 | fotg210_writel(fotg210, temp | PORT_RESUME, status_reg); | ||
6147 | fotg210->reset_done[wIndex] = jiffies | ||
6148 | - + msecs_to_jiffies(20); | ||
6149 | + + msecs_to_jiffies(USB_RESUME_TIMEOUT); | ||
6150 | break; | ||
6151 | case USB_PORT_FEAT_C_SUSPEND: | ||
6152 | clear_bit(wIndex, &fotg210->port_c_suspend); | ||
6153 | diff --git a/drivers/usb/host/fusbh200-hcd.c b/drivers/usb/host/fusbh200-hcd.c | ||
6154 | index a83eefefffda..ba77e2e43f62 100644 | ||
6155 | --- a/drivers/usb/host/fusbh200-hcd.c | ||
6156 | +++ b/drivers/usb/host/fusbh200-hcd.c | ||
6157 | @@ -1550,10 +1550,9 @@ static int fusbh200_hub_control ( | ||
6158 | if ((temp & PORT_PE) == 0) | ||
6159 | goto error; | ||
6160 | |||
6161 | - /* resume signaling for 20 msec */ | ||
6162 | fusbh200_writel(fusbh200, temp | PORT_RESUME, status_reg); | ||
6163 | fusbh200->reset_done[wIndex] = jiffies | ||
6164 | - + msecs_to_jiffies(20); | ||
6165 | + + msecs_to_jiffies(USB_RESUME_TIMEOUT); | ||
6166 | break; | ||
6167 | case USB_PORT_FEAT_C_SUSPEND: | ||
6168 | clear_bit(wIndex, &fusbh200->port_c_suspend); | ||
6169 | diff --git a/drivers/usb/host/isp116x-hcd.c b/drivers/usb/host/isp116x-hcd.c | ||
6170 | index 113d0cc6cc43..9ef56443446d 100644 | ||
6171 | --- a/drivers/usb/host/isp116x-hcd.c | ||
6172 | +++ b/drivers/usb/host/isp116x-hcd.c | ||
6173 | @@ -1490,7 +1490,7 @@ static int isp116x_bus_resume(struct usb_hcd *hcd) | ||
6174 | spin_unlock_irq(&isp116x->lock); | ||
6175 | |||
6176 | hcd->state = HC_STATE_RESUMING; | ||
6177 | - msleep(20); | ||
6178 | + msleep(USB_RESUME_TIMEOUT); | ||
6179 | |||
6180 | /* Go operational */ | ||
6181 | spin_lock_irq(&isp116x->lock); | ||
6182 | diff --git a/drivers/usb/host/oxu210hp-hcd.c b/drivers/usb/host/oxu210hp-hcd.c | ||
6183 | index ef7efb278b15..28a2866b6b16 100644 | ||
6184 | --- a/drivers/usb/host/oxu210hp-hcd.c | ||
6185 | +++ b/drivers/usb/host/oxu210hp-hcd.c | ||
6186 | @@ -2500,11 +2500,12 @@ static irqreturn_t oxu210_hcd_irq(struct usb_hcd *hcd) | ||
6187 | || oxu->reset_done[i] != 0) | ||
6188 | continue; | ||
6189 | |||
6190 | - /* start 20 msec resume signaling from this port, | ||
6191 | - * and make hub_wq collect PORT_STAT_C_SUSPEND to | ||
6192 | + /* start USB_RESUME_TIMEOUT resume signaling from this | ||
6193 | + * port, and make hub_wq collect PORT_STAT_C_SUSPEND to | ||
6194 | * stop that signaling. | ||
6195 | */ | ||
6196 | - oxu->reset_done[i] = jiffies + msecs_to_jiffies(20); | ||
6197 | + oxu->reset_done[i] = jiffies + | ||
6198 | + msecs_to_jiffies(USB_RESUME_TIMEOUT); | ||
6199 | oxu_dbg(oxu, "port %d remote wakeup\n", i + 1); | ||
6200 | mod_timer(&hcd->rh_timer, oxu->reset_done[i]); | ||
6201 | } | ||
6202 | diff --git a/drivers/usb/host/r8a66597-hcd.c b/drivers/usb/host/r8a66597-hcd.c | ||
6203 | index bdc82fea0a1f..54a417043e44 100644 | ||
6204 | --- a/drivers/usb/host/r8a66597-hcd.c | ||
6205 | +++ b/drivers/usb/host/r8a66597-hcd.c | ||
6206 | @@ -2301,7 +2301,7 @@ static int r8a66597_bus_resume(struct usb_hcd *hcd) | ||
6207 | rh->port &= ~USB_PORT_STAT_SUSPEND; | ||
6208 | rh->port |= USB_PORT_STAT_C_SUSPEND << 16; | ||
6209 | r8a66597_mdfy(r8a66597, RESUME, RESUME | UACT, dvstctr_reg); | ||
6210 | - msleep(50); | ||
6211 | + msleep(USB_RESUME_TIMEOUT); | ||
6212 | r8a66597_mdfy(r8a66597, UACT, RESUME | UACT, dvstctr_reg); | ||
6213 | } | ||
6214 | |||
6215 | diff --git a/drivers/usb/host/sl811-hcd.c b/drivers/usb/host/sl811-hcd.c | ||
6216 | index 4f4ba1ea9e9b..9118cd8de1a7 100644 | ||
6217 | --- a/drivers/usb/host/sl811-hcd.c | ||
6218 | +++ b/drivers/usb/host/sl811-hcd.c | ||
6219 | @@ -1259,7 +1259,7 @@ sl811h_hub_control( | ||
6220 | sl811_write(sl811, SL11H_CTLREG1, sl811->ctrl1); | ||
6221 | |||
6222 | mod_timer(&sl811->timer, jiffies | ||
6223 | - + msecs_to_jiffies(20)); | ||
6224 | + + msecs_to_jiffies(USB_RESUME_TIMEOUT)); | ||
6225 | break; | ||
6226 | case USB_PORT_FEAT_POWER: | ||
6227 | port_power(sl811, 0); | ||
6228 | diff --git a/drivers/usb/host/uhci-hub.c b/drivers/usb/host/uhci-hub.c | ||
6229 | index 19ba5eafb31e..7b3d1afcc14a 100644 | ||
6230 | --- a/drivers/usb/host/uhci-hub.c | ||
6231 | +++ b/drivers/usb/host/uhci-hub.c | ||
6232 | @@ -166,7 +166,7 @@ static void uhci_check_ports(struct uhci_hcd *uhci) | ||
6233 | /* Port received a wakeup request */ | ||
6234 | set_bit(port, &uhci->resuming_ports); | ||
6235 | uhci->ports_timeout = jiffies + | ||
6236 | - msecs_to_jiffies(25); | ||
6237 | + msecs_to_jiffies(USB_RESUME_TIMEOUT); | ||
6238 | usb_hcd_start_port_resume( | ||
6239 | &uhci_to_hcd(uhci)->self, port); | ||
6240 | |||
6241 | @@ -338,7 +338,8 @@ static int uhci_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue, | ||
6242 | uhci_finish_suspend(uhci, port, port_addr); | ||
6243 | |||
6244 | /* USB v2.0 7.1.7.5 */ | ||
6245 | - uhci->ports_timeout = jiffies + msecs_to_jiffies(50); | ||
6246 | + uhci->ports_timeout = jiffies + | ||
6247 | + msecs_to_jiffies(USB_RESUME_TIMEOUT); | ||
6248 | break; | ||
6249 | case USB_PORT_FEAT_POWER: | ||
6250 | /* UHCI has no power switching */ | ||
6251 | diff --git a/drivers/usb/host/xhci-ring.c b/drivers/usb/host/xhci-ring.c | ||
6252 | index 73485fa4372f..eeedde8c435a 100644 | ||
6253 | --- a/drivers/usb/host/xhci-ring.c | ||
6254 | +++ b/drivers/usb/host/xhci-ring.c | ||
6255 | @@ -1574,7 +1574,7 @@ static void handle_port_status(struct xhci_hcd *xhci, | ||
6256 | } else { | ||
6257 | xhci_dbg(xhci, "resume HS port %d\n", port_id); | ||
6258 | bus_state->resume_done[faked_port_index] = jiffies + | ||
6259 | - msecs_to_jiffies(20); | ||
6260 | + msecs_to_jiffies(USB_RESUME_TIMEOUT); | ||
6261 | set_bit(faked_port_index, &bus_state->resuming_ports); | ||
6262 | mod_timer(&hcd->rh_timer, | ||
6263 | bus_state->resume_done[faked_port_index]); | ||
6264 | diff --git a/drivers/usb/isp1760/isp1760-hcd.c b/drivers/usb/isp1760/isp1760-hcd.c | ||
6265 | index 3cb98b1d5d29..7911b6b6fe40 100644 | ||
6266 | --- a/drivers/usb/isp1760/isp1760-hcd.c | ||
6267 | +++ b/drivers/usb/isp1760/isp1760-hcd.c | ||
6268 | @@ -1869,7 +1869,7 @@ static int isp1760_hub_control(struct usb_hcd *hcd, u16 typeReq, | ||
6269 | reg_write32(hcd->regs, HC_PORTSC1, | ||
6270 | temp | PORT_RESUME); | ||
6271 | priv->reset_done = jiffies + | ||
6272 | - msecs_to_jiffies(20); | ||
6273 | + msecs_to_jiffies(USB_RESUME_TIMEOUT); | ||
6274 | } | ||
6275 | break; | ||
6276 | case USB_PORT_FEAT_C_SUSPEND: | ||
6277 | diff --git a/drivers/usb/musb/musb_core.c b/drivers/usb/musb/musb_core.c | ||
6278 | index 067920f2d570..ec0ee3b486f5 100644 | ||
6279 | --- a/drivers/usb/musb/musb_core.c | ||
6280 | +++ b/drivers/usb/musb/musb_core.c | ||
6281 | @@ -99,6 +99,7 @@ | ||
6282 | #include <linux/platform_device.h> | ||
6283 | #include <linux/io.h> | ||
6284 | #include <linux/dma-mapping.h> | ||
6285 | +#include <linux/usb.h> | ||
6286 | |||
6287 | #include "musb_core.h" | ||
6288 | |||
6289 | @@ -562,7 +563,7 @@ static irqreturn_t musb_stage0_irq(struct musb *musb, u8 int_usb, | ||
6290 | (USB_PORT_STAT_C_SUSPEND << 16) | ||
6291 | | MUSB_PORT_STAT_RESUME; | ||
6292 | musb->rh_timer = jiffies | ||
6293 | - + msecs_to_jiffies(20); | ||
6294 | + + msecs_to_jiffies(USB_RESUME_TIMEOUT); | ||
6295 | musb->need_finish_resume = 1; | ||
6296 | |||
6297 | musb->xceiv->otg->state = OTG_STATE_A_HOST; | ||
6298 | @@ -1597,16 +1598,30 @@ irqreturn_t musb_interrupt(struct musb *musb) | ||
6299 | is_host_active(musb) ? "host" : "peripheral", | ||
6300 | musb->int_usb, musb->int_tx, musb->int_rx); | ||
6301 | |||
6302 | - /* the core can interrupt us for multiple reasons; docs have | ||
6303 | - * a generic interrupt flowchart to follow | ||
6304 | + /** | ||
6305 | + * According to Mentor Graphics' documentation, flowchart on page 98, | ||
6306 | + * IRQ should be handled as follows: | ||
6307 | + * | ||
6308 | + * . Resume IRQ | ||
6309 | + * . Session Request IRQ | ||
6310 | + * . VBUS Error IRQ | ||
6311 | + * . Suspend IRQ | ||
6312 | + * . Connect IRQ | ||
6313 | + * . Disconnect IRQ | ||
6314 | + * . Reset/Babble IRQ | ||
6315 | + * . SOF IRQ (we're not using this one) | ||
6316 | + * . Endpoint 0 IRQ | ||
6317 | + * . TX Endpoints | ||
6318 | + * . RX Endpoints | ||
6319 | + * | ||
6320 | + * We will be following that flowchart in order to avoid any problems | ||
6321 | + * that might arise with internal Finite State Machine. | ||
6322 | */ | ||
6323 | + | ||
6324 | if (musb->int_usb) | ||
6325 | retval |= musb_stage0_irq(musb, musb->int_usb, | ||
6326 | devctl); | ||
6327 | |||
6328 | - /* "stage 1" is handling endpoint irqs */ | ||
6329 | - | ||
6330 | - /* handle endpoint 0 first */ | ||
6331 | if (musb->int_tx & 1) { | ||
6332 | if (is_host_active(musb)) | ||
6333 | retval |= musb_h_ep0_irq(musb); | ||
6334 | @@ -1614,37 +1629,31 @@ irqreturn_t musb_interrupt(struct musb *musb) | ||
6335 | retval |= musb_g_ep0_irq(musb); | ||
6336 | } | ||
6337 | |||
6338 | - /* RX on endpoints 1-15 */ | ||
6339 | - reg = musb->int_rx >> 1; | ||
6340 | + reg = musb->int_tx >> 1; | ||
6341 | ep_num = 1; | ||
6342 | while (reg) { | ||
6343 | if (reg & 1) { | ||
6344 | - /* musb_ep_select(musb->mregs, ep_num); */ | ||
6345 | - /* REVISIT just retval = ep->rx_irq(...) */ | ||
6346 | retval = IRQ_HANDLED; | ||
6347 | if (is_host_active(musb)) | ||
6348 | - musb_host_rx(musb, ep_num); | ||
6349 | + musb_host_tx(musb, ep_num); | ||
6350 | else | ||
6351 | - musb_g_rx(musb, ep_num); | ||
6352 | + musb_g_tx(musb, ep_num); | ||
6353 | } | ||
6354 | - | ||
6355 | reg >>= 1; | ||
6356 | ep_num++; | ||
6357 | } | ||
6358 | |||
6359 | - /* TX on endpoints 1-15 */ | ||
6360 | - reg = musb->int_tx >> 1; | ||
6361 | + reg = musb->int_rx >> 1; | ||
6362 | ep_num = 1; | ||
6363 | while (reg) { | ||
6364 | if (reg & 1) { | ||
6365 | - /* musb_ep_select(musb->mregs, ep_num); */ | ||
6366 | - /* REVISIT just retval |= ep->tx_irq(...) */ | ||
6367 | retval = IRQ_HANDLED; | ||
6368 | if (is_host_active(musb)) | ||
6369 | - musb_host_tx(musb, ep_num); | ||
6370 | + musb_host_rx(musb, ep_num); | ||
6371 | else | ||
6372 | - musb_g_tx(musb, ep_num); | ||
6373 | + musb_g_rx(musb, ep_num); | ||
6374 | } | ||
6375 | + | ||
6376 | reg >>= 1; | ||
6377 | ep_num++; | ||
6378 | } | ||
6379 | @@ -2463,7 +2472,7 @@ static int musb_resume(struct device *dev) | ||
6380 | if (musb->need_finish_resume) { | ||
6381 | musb->need_finish_resume = 0; | ||
6382 | schedule_delayed_work(&musb->finish_resume_work, | ||
6383 | - msecs_to_jiffies(20)); | ||
6384 | + msecs_to_jiffies(USB_RESUME_TIMEOUT)); | ||
6385 | } | ||
6386 | |||
6387 | /* | ||
6388 | @@ -2506,7 +2515,7 @@ static int musb_runtime_resume(struct device *dev) | ||
6389 | if (musb->need_finish_resume) { | ||
6390 | musb->need_finish_resume = 0; | ||
6391 | schedule_delayed_work(&musb->finish_resume_work, | ||
6392 | - msecs_to_jiffies(20)); | ||
6393 | + msecs_to_jiffies(USB_RESUME_TIMEOUT)); | ||
6394 | } | ||
6395 | |||
6396 | return 0; | ||
6397 | diff --git a/drivers/usb/musb/musb_virthub.c b/drivers/usb/musb/musb_virthub.c | ||
6398 | index 294e159f4afe..5428ed11440d 100644 | ||
6399 | --- a/drivers/usb/musb/musb_virthub.c | ||
6400 | +++ b/drivers/usb/musb/musb_virthub.c | ||
6401 | @@ -136,7 +136,7 @@ void musb_port_suspend(struct musb *musb, bool do_suspend) | ||
6402 | /* later, GetPortStatus will stop RESUME signaling */ | ||
6403 | musb->port1_status |= MUSB_PORT_STAT_RESUME; | ||
6404 | schedule_delayed_work(&musb->finish_resume_work, | ||
6405 | - msecs_to_jiffies(20)); | ||
6406 | + msecs_to_jiffies(USB_RESUME_TIMEOUT)); | ||
6407 | } | ||
6408 | } | ||
6409 | |||
6410 | diff --git a/drivers/usb/phy/phy.c b/drivers/usb/phy/phy.c | ||
6411 | index 2f9735b35338..d1cd6b50f520 100644 | ||
6412 | --- a/drivers/usb/phy/phy.c | ||
6413 | +++ b/drivers/usb/phy/phy.c | ||
6414 | @@ -81,7 +81,9 @@ static void devm_usb_phy_release(struct device *dev, void *res) | ||
6415 | |||
6416 | static int devm_usb_phy_match(struct device *dev, void *res, void *match_data) | ||
6417 | { | ||
6418 | - return res == match_data; | ||
6419 | + struct usb_phy **phy = res; | ||
6420 | + | ||
6421 | + return *phy == match_data; | ||
6422 | } | ||
6423 | |||
6424 | /** | ||
6425 | diff --git a/fs/binfmt_elf.c b/fs/binfmt_elf.c | ||
6426 | index 995986b8e36b..d925f55e4857 100644 | ||
6427 | --- a/fs/binfmt_elf.c | ||
6428 | +++ b/fs/binfmt_elf.c | ||
6429 | @@ -862,6 +862,7 @@ static int load_elf_binary(struct linux_binprm *bprm) | ||
6430 | i < loc->elf_ex.e_phnum; i++, elf_ppnt++) { | ||
6431 | int elf_prot = 0, elf_flags; | ||
6432 | unsigned long k, vaddr; | ||
6433 | + unsigned long total_size = 0; | ||
6434 | |||
6435 | if (elf_ppnt->p_type != PT_LOAD) | ||
6436 | continue; | ||
6437 | @@ -924,10 +925,16 @@ static int load_elf_binary(struct linux_binprm *bprm) | ||
6438 | #else | ||
6439 | load_bias = ELF_PAGESTART(ELF_ET_DYN_BASE - vaddr); | ||
6440 | #endif | ||
6441 | + total_size = total_mapping_size(elf_phdata, | ||
6442 | + loc->elf_ex.e_phnum); | ||
6443 | + if (!total_size) { | ||
6444 | + error = -EINVAL; | ||
6445 | + goto out_free_dentry; | ||
6446 | + } | ||
6447 | } | ||
6448 | |||
6449 | error = elf_map(bprm->file, load_bias + vaddr, elf_ppnt, | ||
6450 | - elf_prot, elf_flags, 0); | ||
6451 | + elf_prot, elf_flags, total_size); | ||
6452 | if (BAD_ADDR(error)) { | ||
6453 | retval = IS_ERR((void *)error) ? | ||
6454 | PTR_ERR((void*)error) : -EINVAL; | ||
6455 | diff --git a/fs/btrfs/extent-tree.c b/fs/btrfs/extent-tree.c | ||
6456 | index 8b353ad02f03..0a795c969c78 100644 | ||
6457 | --- a/fs/btrfs/extent-tree.c | ||
6458 | +++ b/fs/btrfs/extent-tree.c | ||
6459 | @@ -6956,12 +6956,11 @@ static int __btrfs_free_reserved_extent(struct btrfs_root *root, | ||
6460 | return -ENOSPC; | ||
6461 | } | ||
6462 | |||
6463 | - if (btrfs_test_opt(root, DISCARD)) | ||
6464 | - ret = btrfs_discard_extent(root, start, len, NULL); | ||
6465 | - | ||
6466 | if (pin) | ||
6467 | pin_down_extent(root, cache, start, len, 1); | ||
6468 | else { | ||
6469 | + if (btrfs_test_opt(root, DISCARD)) | ||
6470 | + ret = btrfs_discard_extent(root, start, len, NULL); | ||
6471 | btrfs_add_free_space(cache, start, len); | ||
6472 | btrfs_update_reserved_bytes(cache, len, RESERVE_FREE, delalloc); | ||
6473 | } | ||
6474 | diff --git a/fs/btrfs/ioctl.c b/fs/btrfs/ioctl.c | ||
6475 | index 74609b931ba5..f23d4be3280e 100644 | ||
6476 | --- a/fs/btrfs/ioctl.c | ||
6477 | +++ b/fs/btrfs/ioctl.c | ||
6478 | @@ -2897,6 +2897,9 @@ static int btrfs_extent_same(struct inode *src, u64 loff, u64 len, | ||
6479 | if (src == dst) | ||
6480 | return -EINVAL; | ||
6481 | |||
6482 | + if (len == 0) | ||
6483 | + return 0; | ||
6484 | + | ||
6485 | btrfs_double_lock(src, loff, dst, dst_loff, len); | ||
6486 | |||
6487 | ret = extent_same_check_offsets(src, loff, len); | ||
6488 | @@ -3626,6 +3629,11 @@ static noinline long btrfs_ioctl_clone(struct file *file, unsigned long srcfd, | ||
6489 | if (off + len == src->i_size) | ||
6490 | len = ALIGN(src->i_size, bs) - off; | ||
6491 | |||
6492 | + if (len == 0) { | ||
6493 | + ret = 0; | ||
6494 | + goto out_unlock; | ||
6495 | + } | ||
6496 | + | ||
6497 | /* verify the end result is block aligned */ | ||
6498 | if (!IS_ALIGNED(off, bs) || !IS_ALIGNED(off + len, bs) || | ||
6499 | !IS_ALIGNED(destoff, bs)) | ||
6500 | diff --git a/fs/btrfs/xattr.c b/fs/btrfs/xattr.c | ||
6501 | index 883b93623bc5..45ea704be030 100644 | ||
6502 | --- a/fs/btrfs/xattr.c | ||
6503 | +++ b/fs/btrfs/xattr.c | ||
6504 | @@ -364,22 +364,42 @@ const struct xattr_handler *btrfs_xattr_handlers[] = { | ||
6505 | /* | ||
6506 | * Check if the attribute is in a supported namespace. | ||
6507 | * | ||
6508 | - * This applied after the check for the synthetic attributes in the system | ||
6509 | + * This is applied after the check for the synthetic attributes in the system | ||
6510 | * namespace. | ||
6511 | */ | ||
6512 | -static bool btrfs_is_valid_xattr(const char *name) | ||
6513 | +static int btrfs_is_valid_xattr(const char *name) | ||
6514 | { | ||
6515 | - return !strncmp(name, XATTR_SECURITY_PREFIX, | ||
6516 | - XATTR_SECURITY_PREFIX_LEN) || | ||
6517 | - !strncmp(name, XATTR_SYSTEM_PREFIX, XATTR_SYSTEM_PREFIX_LEN) || | ||
6518 | - !strncmp(name, XATTR_TRUSTED_PREFIX, XATTR_TRUSTED_PREFIX_LEN) || | ||
6519 | - !strncmp(name, XATTR_USER_PREFIX, XATTR_USER_PREFIX_LEN) || | ||
6520 | - !strncmp(name, XATTR_BTRFS_PREFIX, XATTR_BTRFS_PREFIX_LEN); | ||
6521 | + int len = strlen(name); | ||
6522 | + int prefixlen = 0; | ||
6523 | + | ||
6524 | + if (!strncmp(name, XATTR_SECURITY_PREFIX, | ||
6525 | + XATTR_SECURITY_PREFIX_LEN)) | ||
6526 | + prefixlen = XATTR_SECURITY_PREFIX_LEN; | ||
6527 | + else if (!strncmp(name, XATTR_SYSTEM_PREFIX, XATTR_SYSTEM_PREFIX_LEN)) | ||
6528 | + prefixlen = XATTR_SYSTEM_PREFIX_LEN; | ||
6529 | + else if (!strncmp(name, XATTR_TRUSTED_PREFIX, XATTR_TRUSTED_PREFIX_LEN)) | ||
6530 | + prefixlen = XATTR_TRUSTED_PREFIX_LEN; | ||
6531 | + else if (!strncmp(name, XATTR_USER_PREFIX, XATTR_USER_PREFIX_LEN)) | ||
6532 | + prefixlen = XATTR_USER_PREFIX_LEN; | ||
6533 | + else if (!strncmp(name, XATTR_BTRFS_PREFIX, XATTR_BTRFS_PREFIX_LEN)) | ||
6534 | + prefixlen = XATTR_BTRFS_PREFIX_LEN; | ||
6535 | + else | ||
6536 | + return -EOPNOTSUPP; | ||
6537 | + | ||
6538 | + /* | ||
6539 | + * The name cannot consist of just prefix | ||
6540 | + */ | ||
6541 | + if (len <= prefixlen) | ||
6542 | + return -EINVAL; | ||
6543 | + | ||
6544 | + return 0; | ||
6545 | } | ||
6546 | |||
6547 | ssize_t btrfs_getxattr(struct dentry *dentry, const char *name, | ||
6548 | void *buffer, size_t size) | ||
6549 | { | ||
6550 | + int ret; | ||
6551 | + | ||
6552 | /* | ||
6553 | * If this is a request for a synthetic attribute in the system.* | ||
6554 | * namespace use the generic infrastructure to resolve a handler | ||
6555 | @@ -388,8 +408,9 @@ ssize_t btrfs_getxattr(struct dentry *dentry, const char *name, | ||
6556 | if (!strncmp(name, XATTR_SYSTEM_PREFIX, XATTR_SYSTEM_PREFIX_LEN)) | ||
6557 | return generic_getxattr(dentry, name, buffer, size); | ||
6558 | |||
6559 | - if (!btrfs_is_valid_xattr(name)) | ||
6560 | - return -EOPNOTSUPP; | ||
6561 | + ret = btrfs_is_valid_xattr(name); | ||
6562 | + if (ret) | ||
6563 | + return ret; | ||
6564 | return __btrfs_getxattr(dentry->d_inode, name, buffer, size); | ||
6565 | } | ||
6566 | |||
6567 | @@ -397,6 +418,7 @@ int btrfs_setxattr(struct dentry *dentry, const char *name, const void *value, | ||
6568 | size_t size, int flags) | ||
6569 | { | ||
6570 | struct btrfs_root *root = BTRFS_I(dentry->d_inode)->root; | ||
6571 | + int ret; | ||
6572 | |||
6573 | /* | ||
6574 | * The permission on security.* and system.* is not checked | ||
6575 | @@ -413,8 +435,9 @@ int btrfs_setxattr(struct dentry *dentry, const char *name, const void *value, | ||
6576 | if (!strncmp(name, XATTR_SYSTEM_PREFIX, XATTR_SYSTEM_PREFIX_LEN)) | ||
6577 | return generic_setxattr(dentry, name, value, size, flags); | ||
6578 | |||
6579 | - if (!btrfs_is_valid_xattr(name)) | ||
6580 | - return -EOPNOTSUPP; | ||
6581 | + ret = btrfs_is_valid_xattr(name); | ||
6582 | + if (ret) | ||
6583 | + return ret; | ||
6584 | |||
6585 | if (!strncmp(name, XATTR_BTRFS_PREFIX, XATTR_BTRFS_PREFIX_LEN)) | ||
6586 | return btrfs_set_prop(dentry->d_inode, name, | ||
6587 | @@ -430,6 +453,7 @@ int btrfs_setxattr(struct dentry *dentry, const char *name, const void *value, | ||
6588 | int btrfs_removexattr(struct dentry *dentry, const char *name) | ||
6589 | { | ||
6590 | struct btrfs_root *root = BTRFS_I(dentry->d_inode)->root; | ||
6591 | + int ret; | ||
6592 | |||
6593 | /* | ||
6594 | * The permission on security.* and system.* is not checked | ||
6595 | @@ -446,8 +470,9 @@ int btrfs_removexattr(struct dentry *dentry, const char *name) | ||
6596 | if (!strncmp(name, XATTR_SYSTEM_PREFIX, XATTR_SYSTEM_PREFIX_LEN)) | ||
6597 | return generic_removexattr(dentry, name); | ||
6598 | |||
6599 | - if (!btrfs_is_valid_xattr(name)) | ||
6600 | - return -EOPNOTSUPP; | ||
6601 | + ret = btrfs_is_valid_xattr(name); | ||
6602 | + if (ret) | ||
6603 | + return ret; | ||
6604 | |||
6605 | if (!strncmp(name, XATTR_BTRFS_PREFIX, XATTR_BTRFS_PREFIX_LEN)) | ||
6606 | return btrfs_set_prop(dentry->d_inode, name, | ||
6607 | diff --git a/fs/ext4/namei.c b/fs/ext4/namei.c | ||
6608 | index 28fe71a2904c..aae7011d99e8 100644 | ||
6609 | --- a/fs/ext4/namei.c | ||
6610 | +++ b/fs/ext4/namei.c | ||
6611 | @@ -1865,7 +1865,7 @@ static int ext4_add_entry(handle_t *handle, struct dentry *dentry, | ||
6612 | struct inode *inode) | ||
6613 | { | ||
6614 | struct inode *dir = dentry->d_parent->d_inode; | ||
6615 | - struct buffer_head *bh; | ||
6616 | + struct buffer_head *bh = NULL; | ||
6617 | struct ext4_dir_entry_2 *de; | ||
6618 | struct ext4_dir_entry_tail *t; | ||
6619 | struct super_block *sb; | ||
6620 | @@ -1889,14 +1889,14 @@ static int ext4_add_entry(handle_t *handle, struct dentry *dentry, | ||
6621 | return retval; | ||
6622 | if (retval == 1) { | ||
6623 | retval = 0; | ||
6624 | - return retval; | ||
6625 | + goto out; | ||
6626 | } | ||
6627 | } | ||
6628 | |||
6629 | if (is_dx(dir)) { | ||
6630 | retval = ext4_dx_add_entry(handle, dentry, inode); | ||
6631 | if (!retval || (retval != ERR_BAD_DX_DIR)) | ||
6632 | - return retval; | ||
6633 | + goto out; | ||
6634 | ext4_clear_inode_flag(dir, EXT4_INODE_INDEX); | ||
6635 | dx_fallback++; | ||
6636 | ext4_mark_inode_dirty(handle, dir); | ||
6637 | @@ -1908,14 +1908,15 @@ static int ext4_add_entry(handle_t *handle, struct dentry *dentry, | ||
6638 | return PTR_ERR(bh); | ||
6639 | |||
6640 | retval = add_dirent_to_buf(handle, dentry, inode, NULL, bh); | ||
6641 | - if (retval != -ENOSPC) { | ||
6642 | - brelse(bh); | ||
6643 | - return retval; | ||
6644 | - } | ||
6645 | + if (retval != -ENOSPC) | ||
6646 | + goto out; | ||
6647 | |||
6648 | if (blocks == 1 && !dx_fallback && | ||
6649 | - EXT4_HAS_COMPAT_FEATURE(sb, EXT4_FEATURE_COMPAT_DIR_INDEX)) | ||
6650 | - return make_indexed_dir(handle, dentry, inode, bh); | ||
6651 | + EXT4_HAS_COMPAT_FEATURE(sb, EXT4_FEATURE_COMPAT_DIR_INDEX)) { | ||
6652 | + retval = make_indexed_dir(handle, dentry, inode, bh); | ||
6653 | + bh = NULL; /* make_indexed_dir releases bh */ | ||
6654 | + goto out; | ||
6655 | + } | ||
6656 | brelse(bh); | ||
6657 | } | ||
6658 | bh = ext4_append(handle, dir, &block); | ||
6659 | @@ -1931,6 +1932,7 @@ static int ext4_add_entry(handle_t *handle, struct dentry *dentry, | ||
6660 | } | ||
6661 | |||
6662 | retval = add_dirent_to_buf(handle, dentry, inode, de, bh); | ||
6663 | +out: | ||
6664 | brelse(bh); | ||
6665 | if (retval == 0) | ||
6666 | ext4_set_inode_state(inode, EXT4_STATE_NEWENTRY); | ||
6667 | diff --git a/fs/lockd/svcsubs.c b/fs/lockd/svcsubs.c | ||
6668 | index 665ef5a05183..a563ddbc19e6 100644 | ||
6669 | --- a/fs/lockd/svcsubs.c | ||
6670 | +++ b/fs/lockd/svcsubs.c | ||
6671 | @@ -31,7 +31,7 @@ | ||
6672 | static struct hlist_head nlm_files[FILE_NRHASH]; | ||
6673 | static DEFINE_MUTEX(nlm_file_mutex); | ||
6674 | |||
6675 | -#ifdef NFSD_DEBUG | ||
6676 | +#ifdef CONFIG_SUNRPC_DEBUG | ||
6677 | static inline void nlm_debug_print_fh(char *msg, struct nfs_fh *f) | ||
6678 | { | ||
6679 | u32 *fhp = (u32*)f->data; | ||
6680 | diff --git a/fs/namei.c b/fs/namei.c | ||
6681 | index c83145af4bfc..caa38a24e1f7 100644 | ||
6682 | --- a/fs/namei.c | ||
6683 | +++ b/fs/namei.c | ||
6684 | @@ -1591,7 +1591,8 @@ static inline int walk_component(struct nameidata *nd, struct path *path, | ||
6685 | |||
6686 | if (should_follow_link(path->dentry, follow)) { | ||
6687 | if (nd->flags & LOOKUP_RCU) { | ||
6688 | - if (unlikely(unlazy_walk(nd, path->dentry))) { | ||
6689 | + if (unlikely(nd->path.mnt != path->mnt || | ||
6690 | + unlazy_walk(nd, path->dentry))) { | ||
6691 | err = -ECHILD; | ||
6692 | goto out_err; | ||
6693 | } | ||
6694 | @@ -3047,7 +3048,8 @@ finish_lookup: | ||
6695 | |||
6696 | if (should_follow_link(path->dentry, !symlink_ok)) { | ||
6697 | if (nd->flags & LOOKUP_RCU) { | ||
6698 | - if (unlikely(unlazy_walk(nd, path->dentry))) { | ||
6699 | + if (unlikely(nd->path.mnt != path->mnt || | ||
6700 | + unlazy_walk(nd, path->dentry))) { | ||
6701 | error = -ECHILD; | ||
6702 | goto out; | ||
6703 | } | ||
6704 | diff --git a/fs/namespace.c b/fs/namespace.c | ||
6705 | index 82ef1405260e..4622ee32a5e2 100644 | ||
6706 | --- a/fs/namespace.c | ||
6707 | +++ b/fs/namespace.c | ||
6708 | @@ -632,14 +632,17 @@ struct mount *__lookup_mnt(struct vfsmount *mnt, struct dentry *dentry) | ||
6709 | */ | ||
6710 | struct mount *__lookup_mnt_last(struct vfsmount *mnt, struct dentry *dentry) | ||
6711 | { | ||
6712 | - struct mount *p, *res; | ||
6713 | - res = p = __lookup_mnt(mnt, dentry); | ||
6714 | + struct mount *p, *res = NULL; | ||
6715 | + p = __lookup_mnt(mnt, dentry); | ||
6716 | if (!p) | ||
6717 | goto out; | ||
6718 | + if (!(p->mnt.mnt_flags & MNT_UMOUNT)) | ||
6719 | + res = p; | ||
6720 | hlist_for_each_entry_continue(p, mnt_hash) { | ||
6721 | if (&p->mnt_parent->mnt != mnt || p->mnt_mountpoint != dentry) | ||
6722 | break; | ||
6723 | - res = p; | ||
6724 | + if (!(p->mnt.mnt_flags & MNT_UMOUNT)) | ||
6725 | + res = p; | ||
6726 | } | ||
6727 | out: | ||
6728 | return res; | ||
6729 | @@ -795,10 +798,8 @@ static void __touch_mnt_namespace(struct mnt_namespace *ns) | ||
6730 | /* | ||
6731 | * vfsmount lock must be held for write | ||
6732 | */ | ||
6733 | -static void detach_mnt(struct mount *mnt, struct path *old_path) | ||
6734 | +static void unhash_mnt(struct mount *mnt) | ||
6735 | { | ||
6736 | - old_path->dentry = mnt->mnt_mountpoint; | ||
6737 | - old_path->mnt = &mnt->mnt_parent->mnt; | ||
6738 | mnt->mnt_parent = mnt; | ||
6739 | mnt->mnt_mountpoint = mnt->mnt.mnt_root; | ||
6740 | list_del_init(&mnt->mnt_child); | ||
6741 | @@ -811,6 +812,26 @@ static void detach_mnt(struct mount *mnt, struct path *old_path) | ||
6742 | /* | ||
6743 | * vfsmount lock must be held for write | ||
6744 | */ | ||
6745 | +static void detach_mnt(struct mount *mnt, struct path *old_path) | ||
6746 | +{ | ||
6747 | + old_path->dentry = mnt->mnt_mountpoint; | ||
6748 | + old_path->mnt = &mnt->mnt_parent->mnt; | ||
6749 | + unhash_mnt(mnt); | ||
6750 | +} | ||
6751 | + | ||
6752 | +/* | ||
6753 | + * vfsmount lock must be held for write | ||
6754 | + */ | ||
6755 | +static void umount_mnt(struct mount *mnt) | ||
6756 | +{ | ||
6757 | + /* old mountpoint will be dropped when we can do that */ | ||
6758 | + mnt->mnt_ex_mountpoint = mnt->mnt_mountpoint; | ||
6759 | + unhash_mnt(mnt); | ||
6760 | +} | ||
6761 | + | ||
6762 | +/* | ||
6763 | + * vfsmount lock must be held for write | ||
6764 | + */ | ||
6765 | void mnt_set_mountpoint(struct mount *mnt, | ||
6766 | struct mountpoint *mp, | ||
6767 | struct mount *child_mnt) | ||
6768 | @@ -1078,6 +1099,13 @@ static void mntput_no_expire(struct mount *mnt) | ||
6769 | rcu_read_unlock(); | ||
6770 | |||
6771 | list_del(&mnt->mnt_instance); | ||
6772 | + | ||
6773 | + if (unlikely(!list_empty(&mnt->mnt_mounts))) { | ||
6774 | + struct mount *p, *tmp; | ||
6775 | + list_for_each_entry_safe(p, tmp, &mnt->mnt_mounts, mnt_child) { | ||
6776 | + umount_mnt(p); | ||
6777 | + } | ||
6778 | + } | ||
6779 | unlock_mount_hash(); | ||
6780 | |||
6781 | if (likely(!(mnt->mnt.mnt_flags & MNT_INTERNAL))) { | ||
6782 | @@ -1319,49 +1347,63 @@ static inline void namespace_lock(void) | ||
6783 | down_write(&namespace_sem); | ||
6784 | } | ||
6785 | |||
6786 | +enum umount_tree_flags { | ||
6787 | + UMOUNT_SYNC = 1, | ||
6788 | + UMOUNT_PROPAGATE = 2, | ||
6789 | + UMOUNT_CONNECTED = 4, | ||
6790 | +}; | ||
6791 | /* | ||
6792 | * mount_lock must be held | ||
6793 | * namespace_sem must be held for write | ||
6794 | - * how = 0 => just this tree, don't propagate | ||
6795 | - * how = 1 => propagate; we know that nobody else has reference to any victims | ||
6796 | - * how = 2 => lazy umount | ||
6797 | */ | ||
6798 | -void umount_tree(struct mount *mnt, int how) | ||
6799 | +static void umount_tree(struct mount *mnt, enum umount_tree_flags how) | ||
6800 | { | ||
6801 | - HLIST_HEAD(tmp_list); | ||
6802 | + LIST_HEAD(tmp_list); | ||
6803 | struct mount *p; | ||
6804 | |||
6805 | + if (how & UMOUNT_PROPAGATE) | ||
6806 | + propagate_mount_unlock(mnt); | ||
6807 | + | ||
6808 | + /* Gather the mounts to umount */ | ||
6809 | for (p = mnt; p; p = next_mnt(p, mnt)) { | ||
6810 | - hlist_del_init_rcu(&p->mnt_hash); | ||
6811 | - hlist_add_head(&p->mnt_hash, &tmp_list); | ||
6812 | + p->mnt.mnt_flags |= MNT_UMOUNT; | ||
6813 | + list_move(&p->mnt_list, &tmp_list); | ||
6814 | } | ||
6815 | |||
6816 | - hlist_for_each_entry(p, &tmp_list, mnt_hash) | ||
6817 | + /* Hide the mounts from mnt_mounts */ | ||
6818 | + list_for_each_entry(p, &tmp_list, mnt_list) { | ||
6819 | list_del_init(&p->mnt_child); | ||
6820 | + } | ||
6821 | |||
6822 | - if (how) | ||
6823 | + /* Add propogated mounts to the tmp_list */ | ||
6824 | + if (how & UMOUNT_PROPAGATE) | ||
6825 | propagate_umount(&tmp_list); | ||
6826 | |||
6827 | - while (!hlist_empty(&tmp_list)) { | ||
6828 | - p = hlist_entry(tmp_list.first, struct mount, mnt_hash); | ||
6829 | - hlist_del_init_rcu(&p->mnt_hash); | ||
6830 | + while (!list_empty(&tmp_list)) { | ||
6831 | + bool disconnect; | ||
6832 | + p = list_first_entry(&tmp_list, struct mount, mnt_list); | ||
6833 | list_del_init(&p->mnt_expire); | ||
6834 | list_del_init(&p->mnt_list); | ||
6835 | __touch_mnt_namespace(p->mnt_ns); | ||
6836 | p->mnt_ns = NULL; | ||
6837 | - if (how < 2) | ||
6838 | + if (how & UMOUNT_SYNC) | ||
6839 | p->mnt.mnt_flags |= MNT_SYNC_UMOUNT; | ||
6840 | |||
6841 | - pin_insert_group(&p->mnt_umount, &p->mnt_parent->mnt, &unmounted); | ||
6842 | + disconnect = !(((how & UMOUNT_CONNECTED) && | ||
6843 | + mnt_has_parent(p) && | ||
6844 | + (p->mnt_parent->mnt.mnt_flags & MNT_UMOUNT)) || | ||
6845 | + IS_MNT_LOCKED_AND_LAZY(p)); | ||
6846 | + | ||
6847 | + pin_insert_group(&p->mnt_umount, &p->mnt_parent->mnt, | ||
6848 | + disconnect ? &unmounted : NULL); | ||
6849 | if (mnt_has_parent(p)) { | ||
6850 | - hlist_del_init(&p->mnt_mp_list); | ||
6851 | - put_mountpoint(p->mnt_mp); | ||
6852 | mnt_add_count(p->mnt_parent, -1); | ||
6853 | - /* old mountpoint will be dropped when we can do that */ | ||
6854 | - p->mnt_ex_mountpoint = p->mnt_mountpoint; | ||
6855 | - p->mnt_mountpoint = p->mnt.mnt_root; | ||
6856 | - p->mnt_parent = p; | ||
6857 | - p->mnt_mp = NULL; | ||
6858 | + if (!disconnect) { | ||
6859 | + /* Don't forget about p */ | ||
6860 | + list_add_tail(&p->mnt_child, &p->mnt_parent->mnt_mounts); | ||
6861 | + } else { | ||
6862 | + umount_mnt(p); | ||
6863 | + } | ||
6864 | } | ||
6865 | change_mnt_propagation(p, MS_PRIVATE); | ||
6866 | } | ||
6867 | @@ -1447,14 +1489,14 @@ static int do_umount(struct mount *mnt, int flags) | ||
6868 | |||
6869 | if (flags & MNT_DETACH) { | ||
6870 | if (!list_empty(&mnt->mnt_list)) | ||
6871 | - umount_tree(mnt, 2); | ||
6872 | + umount_tree(mnt, UMOUNT_PROPAGATE); | ||
6873 | retval = 0; | ||
6874 | } else { | ||
6875 | shrink_submounts(mnt); | ||
6876 | retval = -EBUSY; | ||
6877 | if (!propagate_mount_busy(mnt, 2)) { | ||
6878 | if (!list_empty(&mnt->mnt_list)) | ||
6879 | - umount_tree(mnt, 1); | ||
6880 | + umount_tree(mnt, UMOUNT_PROPAGATE|UMOUNT_SYNC); | ||
6881 | retval = 0; | ||
6882 | } | ||
6883 | } | ||
6884 | @@ -1480,13 +1522,20 @@ void __detach_mounts(struct dentry *dentry) | ||
6885 | |||
6886 | namespace_lock(); | ||
6887 | mp = lookup_mountpoint(dentry); | ||
6888 | - if (!mp) | ||
6889 | + if (IS_ERR_OR_NULL(mp)) | ||
6890 | goto out_unlock; | ||
6891 | |||
6892 | lock_mount_hash(); | ||
6893 | while (!hlist_empty(&mp->m_list)) { | ||
6894 | mnt = hlist_entry(mp->m_list.first, struct mount, mnt_mp_list); | ||
6895 | - umount_tree(mnt, 2); | ||
6896 | + if (mnt->mnt.mnt_flags & MNT_UMOUNT) { | ||
6897 | + struct mount *p, *tmp; | ||
6898 | + list_for_each_entry_safe(p, tmp, &mnt->mnt_mounts, mnt_child) { | ||
6899 | + hlist_add_head(&p->mnt_umount.s_list, &unmounted); | ||
6900 | + umount_mnt(p); | ||
6901 | + } | ||
6902 | + } | ||
6903 | + else umount_tree(mnt, UMOUNT_CONNECTED); | ||
6904 | } | ||
6905 | unlock_mount_hash(); | ||
6906 | put_mountpoint(mp); | ||
6907 | @@ -1648,7 +1697,7 @@ struct mount *copy_tree(struct mount *mnt, struct dentry *dentry, | ||
6908 | out: | ||
6909 | if (res) { | ||
6910 | lock_mount_hash(); | ||
6911 | - umount_tree(res, 0); | ||
6912 | + umount_tree(res, UMOUNT_SYNC); | ||
6913 | unlock_mount_hash(); | ||
6914 | } | ||
6915 | return q; | ||
6916 | @@ -1672,7 +1721,7 @@ void drop_collected_mounts(struct vfsmount *mnt) | ||
6917 | { | ||
6918 | namespace_lock(); | ||
6919 | lock_mount_hash(); | ||
6920 | - umount_tree(real_mount(mnt), 0); | ||
6921 | + umount_tree(real_mount(mnt), UMOUNT_SYNC); | ||
6922 | unlock_mount_hash(); | ||
6923 | namespace_unlock(); | ||
6924 | } | ||
6925 | @@ -1855,7 +1904,7 @@ static int attach_recursive_mnt(struct mount *source_mnt, | ||
6926 | out_cleanup_ids: | ||
6927 | while (!hlist_empty(&tree_list)) { | ||
6928 | child = hlist_entry(tree_list.first, struct mount, mnt_hash); | ||
6929 | - umount_tree(child, 0); | ||
6930 | + umount_tree(child, UMOUNT_SYNC); | ||
6931 | } | ||
6932 | unlock_mount_hash(); | ||
6933 | cleanup_group_ids(source_mnt, NULL); | ||
6934 | @@ -2035,7 +2084,7 @@ static int do_loopback(struct path *path, const char *old_name, | ||
6935 | err = graft_tree(mnt, parent, mp); | ||
6936 | if (err) { | ||
6937 | lock_mount_hash(); | ||
6938 | - umount_tree(mnt, 0); | ||
6939 | + umount_tree(mnt, UMOUNT_SYNC); | ||
6940 | unlock_mount_hash(); | ||
6941 | } | ||
6942 | out2: | ||
6943 | @@ -2406,7 +2455,7 @@ void mark_mounts_for_expiry(struct list_head *mounts) | ||
6944 | while (!list_empty(&graveyard)) { | ||
6945 | mnt = list_first_entry(&graveyard, struct mount, mnt_expire); | ||
6946 | touch_mnt_namespace(mnt->mnt_ns); | ||
6947 | - umount_tree(mnt, 1); | ||
6948 | + umount_tree(mnt, UMOUNT_PROPAGATE|UMOUNT_SYNC); | ||
6949 | } | ||
6950 | unlock_mount_hash(); | ||
6951 | namespace_unlock(); | ||
6952 | @@ -2477,7 +2526,7 @@ static void shrink_submounts(struct mount *mnt) | ||
6953 | m = list_first_entry(&graveyard, struct mount, | ||
6954 | mnt_expire); | ||
6955 | touch_mnt_namespace(m->mnt_ns); | ||
6956 | - umount_tree(m, 1); | ||
6957 | + umount_tree(m, UMOUNT_PROPAGATE|UMOUNT_SYNC); | ||
6958 | } | ||
6959 | } | ||
6960 | } | ||
6961 | diff --git a/fs/nfs/callback.c b/fs/nfs/callback.c | ||
6962 | index 351be9205bf8..8d129bb7355a 100644 | ||
6963 | --- a/fs/nfs/callback.c | ||
6964 | +++ b/fs/nfs/callback.c | ||
6965 | @@ -128,7 +128,7 @@ nfs41_callback_svc(void *vrqstp) | ||
6966 | if (try_to_freeze()) | ||
6967 | continue; | ||
6968 | |||
6969 | - prepare_to_wait(&serv->sv_cb_waitq, &wq, TASK_UNINTERRUPTIBLE); | ||
6970 | + prepare_to_wait(&serv->sv_cb_waitq, &wq, TASK_INTERRUPTIBLE); | ||
6971 | spin_lock_bh(&serv->sv_cb_lock); | ||
6972 | if (!list_empty(&serv->sv_cb_list)) { | ||
6973 | req = list_first_entry(&serv->sv_cb_list, | ||
6974 | @@ -142,10 +142,10 @@ nfs41_callback_svc(void *vrqstp) | ||
6975 | error); | ||
6976 | } else { | ||
6977 | spin_unlock_bh(&serv->sv_cb_lock); | ||
6978 | - /* schedule_timeout to game the hung task watchdog */ | ||
6979 | - schedule_timeout(60 * HZ); | ||
6980 | + schedule(); | ||
6981 | finish_wait(&serv->sv_cb_waitq, &wq); | ||
6982 | } | ||
6983 | + flush_signals(current); | ||
6984 | } | ||
6985 | return 0; | ||
6986 | } | ||
6987 | diff --git a/fs/nfs/direct.c b/fs/nfs/direct.c | ||
6988 | index e907c8cf732e..ab21ef16a11a 100644 | ||
6989 | --- a/fs/nfs/direct.c | ||
6990 | +++ b/fs/nfs/direct.c | ||
6991 | @@ -129,22 +129,25 @@ nfs_direct_good_bytes(struct nfs_direct_req *dreq, struct nfs_pgio_header *hdr) | ||
6992 | int i; | ||
6993 | ssize_t count; | ||
6994 | |||
6995 | - WARN_ON_ONCE(hdr->pgio_mirror_idx >= dreq->mirror_count); | ||
6996 | - | ||
6997 | - count = dreq->mirrors[hdr->pgio_mirror_idx].count; | ||
6998 | - if (count + dreq->io_start < hdr->io_start + hdr->good_bytes) { | ||
6999 | - count = hdr->io_start + hdr->good_bytes - dreq->io_start; | ||
7000 | - dreq->mirrors[hdr->pgio_mirror_idx].count = count; | ||
7001 | - } | ||
7002 | - | ||
7003 | - /* update the dreq->count by finding the minimum agreed count from all | ||
7004 | - * mirrors */ | ||
7005 | - count = dreq->mirrors[0].count; | ||
7006 | + if (dreq->mirror_count == 1) { | ||
7007 | + dreq->mirrors[hdr->pgio_mirror_idx].count += hdr->good_bytes; | ||
7008 | + dreq->count += hdr->good_bytes; | ||
7009 | + } else { | ||
7010 | + /* mirrored writes */ | ||
7011 | + count = dreq->mirrors[hdr->pgio_mirror_idx].count; | ||
7012 | + if (count + dreq->io_start < hdr->io_start + hdr->good_bytes) { | ||
7013 | + count = hdr->io_start + hdr->good_bytes - dreq->io_start; | ||
7014 | + dreq->mirrors[hdr->pgio_mirror_idx].count = count; | ||
7015 | + } | ||
7016 | + /* update the dreq->count by finding the minimum agreed count from all | ||
7017 | + * mirrors */ | ||
7018 | + count = dreq->mirrors[0].count; | ||
7019 | |||
7020 | - for (i = 1; i < dreq->mirror_count; i++) | ||
7021 | - count = min(count, dreq->mirrors[i].count); | ||
7022 | + for (i = 1; i < dreq->mirror_count; i++) | ||
7023 | + count = min(count, dreq->mirrors[i].count); | ||
7024 | |||
7025 | - dreq->count = count; | ||
7026 | + dreq->count = count; | ||
7027 | + } | ||
7028 | } | ||
7029 | |||
7030 | /* | ||
7031 | diff --git a/fs/nfs/nfs4xdr.c b/fs/nfs/nfs4xdr.c | ||
7032 | index 5c399ec41079..d494ea2d66a9 100644 | ||
7033 | --- a/fs/nfs/nfs4xdr.c | ||
7034 | +++ b/fs/nfs/nfs4xdr.c | ||
7035 | @@ -7365,6 +7365,11 @@ nfs4_stat_to_errno(int stat) | ||
7036 | .p_name = #proc, \ | ||
7037 | } | ||
7038 | |||
7039 | +#define STUB(proc) \ | ||
7040 | +[NFSPROC4_CLNT_##proc] = { \ | ||
7041 | + .p_name = #proc, \ | ||
7042 | +} | ||
7043 | + | ||
7044 | struct rpc_procinfo nfs4_procedures[] = { | ||
7045 | PROC(READ, enc_read, dec_read), | ||
7046 | PROC(WRITE, enc_write, dec_write), | ||
7047 | @@ -7417,6 +7422,7 @@ struct rpc_procinfo nfs4_procedures[] = { | ||
7048 | PROC(SECINFO_NO_NAME, enc_secinfo_no_name, dec_secinfo_no_name), | ||
7049 | PROC(TEST_STATEID, enc_test_stateid, dec_test_stateid), | ||
7050 | PROC(FREE_STATEID, enc_free_stateid, dec_free_stateid), | ||
7051 | + STUB(GETDEVICELIST), | ||
7052 | PROC(BIND_CONN_TO_SESSION, | ||
7053 | enc_bind_conn_to_session, dec_bind_conn_to_session), | ||
7054 | PROC(DESTROY_CLIENTID, enc_destroy_clientid, dec_destroy_clientid), | ||
7055 | diff --git a/fs/nfs/read.c b/fs/nfs/read.c | ||
7056 | index 568ecf0a880f..848d8b1db4ce 100644 | ||
7057 | --- a/fs/nfs/read.c | ||
7058 | +++ b/fs/nfs/read.c | ||
7059 | @@ -284,7 +284,7 @@ int nfs_readpage(struct file *file, struct page *page) | ||
7060 | dprintk("NFS: nfs_readpage (%p %ld@%lu)\n", | ||
7061 | page, PAGE_CACHE_SIZE, page_file_index(page)); | ||
7062 | nfs_inc_stats(inode, NFSIOS_VFSREADPAGE); | ||
7063 | - nfs_inc_stats(inode, NFSIOS_READPAGES); | ||
7064 | + nfs_add_stats(inode, NFSIOS_READPAGES, 1); | ||
7065 | |||
7066 | /* | ||
7067 | * Try to flush any pending writes to the file.. | ||
7068 | diff --git a/fs/nfs/write.c b/fs/nfs/write.c | ||
7069 | index 849ed784d6ac..41b3f1096d69 100644 | ||
7070 | --- a/fs/nfs/write.c | ||
7071 | +++ b/fs/nfs/write.c | ||
7072 | @@ -580,7 +580,7 @@ static int nfs_do_writepage(struct page *page, struct writeback_control *wbc, st | ||
7073 | int ret; | ||
7074 | |||
7075 | nfs_inc_stats(inode, NFSIOS_VFSWRITEPAGE); | ||
7076 | - nfs_inc_stats(inode, NFSIOS_WRITEPAGES); | ||
7077 | + nfs_add_stats(inode, NFSIOS_WRITEPAGES, 1); | ||
7078 | |||
7079 | nfs_pageio_cond_complete(pgio, page_file_index(page)); | ||
7080 | ret = nfs_page_async_flush(pgio, page, wbc->sync_mode == WB_SYNC_NONE); | ||
7081 | diff --git a/fs/nfsd/nfs4proc.c b/fs/nfsd/nfs4proc.c | ||
7082 | index 92b9d97aff4f..5416968b3fb3 100644 | ||
7083 | --- a/fs/nfsd/nfs4proc.c | ||
7084 | +++ b/fs/nfsd/nfs4proc.c | ||
7085 | @@ -1030,6 +1030,8 @@ nfsd4_fallocate(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate, | ||
7086 | dprintk("NFSD: nfsd4_fallocate: couldn't process stateid!\n"); | ||
7087 | return status; | ||
7088 | } | ||
7089 | + if (!file) | ||
7090 | + return nfserr_bad_stateid; | ||
7091 | |||
7092 | status = nfsd4_vfs_fallocate(rqstp, &cstate->current_fh, file, | ||
7093 | fallocate->falloc_offset, | ||
7094 | @@ -1069,6 +1071,8 @@ nfsd4_seek(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate, | ||
7095 | dprintk("NFSD: nfsd4_seek: couldn't process stateid!\n"); | ||
7096 | return status; | ||
7097 | } | ||
7098 | + if (!file) | ||
7099 | + return nfserr_bad_stateid; | ||
7100 | |||
7101 | switch (seek->seek_whence) { | ||
7102 | case NFS4_CONTENT_DATA: | ||
7103 | diff --git a/fs/nfsd/nfs4state.c b/fs/nfsd/nfs4state.c | ||
7104 | index 8ba1d888f1e6..ee1cccdb083a 100644 | ||
7105 | --- a/fs/nfsd/nfs4state.c | ||
7106 | +++ b/fs/nfsd/nfs4state.c | ||
7107 | @@ -1139,7 +1139,7 @@ hash_sessionid(struct nfs4_sessionid *sessionid) | ||
7108 | return sid->sequence % SESSION_HASH_SIZE; | ||
7109 | } | ||
7110 | |||
7111 | -#ifdef NFSD_DEBUG | ||
7112 | +#ifdef CONFIG_SUNRPC_DEBUG | ||
7113 | static inline void | ||
7114 | dump_sessionid(const char *fn, struct nfs4_sessionid *sessionid) | ||
7115 | { | ||
7116 | diff --git a/fs/nfsd/nfs4xdr.c b/fs/nfsd/nfs4xdr.c | ||
7117 | index 5fb7e78169a6..5b33ce1db616 100644 | ||
7118 | --- a/fs/nfsd/nfs4xdr.c | ||
7119 | +++ b/fs/nfsd/nfs4xdr.c | ||
7120 | @@ -3422,6 +3422,7 @@ nfsd4_encode_read(struct nfsd4_compoundres *resp, __be32 nfserr, | ||
7121 | unsigned long maxcount; | ||
7122 | struct xdr_stream *xdr = &resp->xdr; | ||
7123 | struct file *file = read->rd_filp; | ||
7124 | + struct svc_fh *fhp = read->rd_fhp; | ||
7125 | int starting_len = xdr->buf->len; | ||
7126 | struct raparms *ra; | ||
7127 | __be32 *p; | ||
7128 | @@ -3445,12 +3446,15 @@ nfsd4_encode_read(struct nfsd4_compoundres *resp, __be32 nfserr, | ||
7129 | maxcount = min_t(unsigned long, maxcount, (xdr->buf->buflen - xdr->buf->len)); | ||
7130 | maxcount = min_t(unsigned long, maxcount, read->rd_length); | ||
7131 | |||
7132 | - if (!read->rd_filp) { | ||
7133 | + if (read->rd_filp) | ||
7134 | + err = nfsd_permission(resp->rqstp, fhp->fh_export, | ||
7135 | + fhp->fh_dentry, | ||
7136 | + NFSD_MAY_READ|NFSD_MAY_OWNER_OVERRIDE); | ||
7137 | + else | ||
7138 | err = nfsd_get_tmp_read_open(resp->rqstp, read->rd_fhp, | ||
7139 | &file, &ra); | ||
7140 | - if (err) | ||
7141 | - goto err_truncate; | ||
7142 | - } | ||
7143 | + if (err) | ||
7144 | + goto err_truncate; | ||
7145 | |||
7146 | if (file->f_op->splice_read && test_bit(RQ_SPLICE_OK, &resp->rqstp->rq_flags)) | ||
7147 | err = nfsd4_encode_splice_read(resp, read, file, maxcount); | ||
7148 | diff --git a/fs/nfsd/nfsctl.c b/fs/nfsd/nfsctl.c | ||
7149 | index aa47d75ddb26..9690cb4dd588 100644 | ||
7150 | --- a/fs/nfsd/nfsctl.c | ||
7151 | +++ b/fs/nfsd/nfsctl.c | ||
7152 | @@ -1250,15 +1250,15 @@ static int __init init_nfsd(void) | ||
7153 | int retval; | ||
7154 | printk(KERN_INFO "Installing knfsd (copyright (C) 1996 okir@monad.swb.de).\n"); | ||
7155 | |||
7156 | - retval = register_cld_notifier(); | ||
7157 | - if (retval) | ||
7158 | - return retval; | ||
7159 | retval = register_pernet_subsys(&nfsd_net_ops); | ||
7160 | if (retval < 0) | ||
7161 | - goto out_unregister_notifier; | ||
7162 | - retval = nfsd4_init_slabs(); | ||
7163 | + return retval; | ||
7164 | + retval = register_cld_notifier(); | ||
7165 | if (retval) | ||
7166 | goto out_unregister_pernet; | ||
7167 | + retval = nfsd4_init_slabs(); | ||
7168 | + if (retval) | ||
7169 | + goto out_unregister_notifier; | ||
7170 | retval = nfsd4_init_pnfs(); | ||
7171 | if (retval) | ||
7172 | goto out_free_slabs; | ||
7173 | @@ -1290,10 +1290,10 @@ out_exit_pnfs: | ||
7174 | nfsd4_exit_pnfs(); | ||
7175 | out_free_slabs: | ||
7176 | nfsd4_free_slabs(); | ||
7177 | -out_unregister_pernet: | ||
7178 | - unregister_pernet_subsys(&nfsd_net_ops); | ||
7179 | out_unregister_notifier: | ||
7180 | unregister_cld_notifier(); | ||
7181 | +out_unregister_pernet: | ||
7182 | + unregister_pernet_subsys(&nfsd_net_ops); | ||
7183 | return retval; | ||
7184 | } | ||
7185 | |||
7186 | @@ -1308,8 +1308,8 @@ static void __exit exit_nfsd(void) | ||
7187 | nfsd4_exit_pnfs(); | ||
7188 | nfsd_fault_inject_cleanup(); | ||
7189 | unregister_filesystem(&nfsd_fs_type); | ||
7190 | - unregister_pernet_subsys(&nfsd_net_ops); | ||
7191 | unregister_cld_notifier(); | ||
7192 | + unregister_pernet_subsys(&nfsd_net_ops); | ||
7193 | } | ||
7194 | |||
7195 | MODULE_AUTHOR("Olaf Kirch <okir@monad.swb.de>"); | ||
7196 | diff --git a/fs/nfsd/nfsd.h b/fs/nfsd/nfsd.h | ||
7197 | index 565c4da1a9eb..cf980523898b 100644 | ||
7198 | --- a/fs/nfsd/nfsd.h | ||
7199 | +++ b/fs/nfsd/nfsd.h | ||
7200 | @@ -24,7 +24,7 @@ | ||
7201 | #include "export.h" | ||
7202 | |||
7203 | #undef ifdebug | ||
7204 | -#ifdef NFSD_DEBUG | ||
7205 | +#ifdef CONFIG_SUNRPC_DEBUG | ||
7206 | # define ifdebug(flag) if (nfsd_debug & NFSDDBG_##flag) | ||
7207 | #else | ||
7208 | # define ifdebug(flag) if (0) | ||
7209 | diff --git a/fs/open.c b/fs/open.c | ||
7210 | index 33f9cbf2610b..44a3be145bfe 100644 | ||
7211 | --- a/fs/open.c | ||
7212 | +++ b/fs/open.c | ||
7213 | @@ -570,6 +570,7 @@ static int chown_common(struct path *path, uid_t user, gid_t group) | ||
7214 | uid = make_kuid(current_user_ns(), user); | ||
7215 | gid = make_kgid(current_user_ns(), group); | ||
7216 | |||
7217 | +retry_deleg: | ||
7218 | newattrs.ia_valid = ATTR_CTIME; | ||
7219 | if (user != (uid_t) -1) { | ||
7220 | if (!uid_valid(uid)) | ||
7221 | @@ -586,7 +587,6 @@ static int chown_common(struct path *path, uid_t user, gid_t group) | ||
7222 | if (!S_ISDIR(inode->i_mode)) | ||
7223 | newattrs.ia_valid |= | ||
7224 | ATTR_KILL_SUID | ATTR_KILL_SGID | ATTR_KILL_PRIV; | ||
7225 | -retry_deleg: | ||
7226 | mutex_lock(&inode->i_mutex); | ||
7227 | error = security_path_chown(path, uid, gid); | ||
7228 | if (!error) | ||
7229 | diff --git a/fs/pnode.c b/fs/pnode.c | ||
7230 | index 260ac8f898a4..6367e1e435c6 100644 | ||
7231 | --- a/fs/pnode.c | ||
7232 | +++ b/fs/pnode.c | ||
7233 | @@ -362,6 +362,46 @@ int propagate_mount_busy(struct mount *mnt, int refcnt) | ||
7234 | } | ||
7235 | |||
7236 | /* | ||
7237 | + * Clear MNT_LOCKED when it can be shown to be safe. | ||
7238 | + * | ||
7239 | + * mount_lock lock must be held for write | ||
7240 | + */ | ||
7241 | +void propagate_mount_unlock(struct mount *mnt) | ||
7242 | +{ | ||
7243 | + struct mount *parent = mnt->mnt_parent; | ||
7244 | + struct mount *m, *child; | ||
7245 | + | ||
7246 | + BUG_ON(parent == mnt); | ||
7247 | + | ||
7248 | + for (m = propagation_next(parent, parent); m; | ||
7249 | + m = propagation_next(m, parent)) { | ||
7250 | + child = __lookup_mnt_last(&m->mnt, mnt->mnt_mountpoint); | ||
7251 | + if (child) | ||
7252 | + child->mnt.mnt_flags &= ~MNT_LOCKED; | ||
7253 | + } | ||
7254 | +} | ||
7255 | + | ||
7256 | +/* | ||
7257 | + * Mark all mounts that the MNT_LOCKED logic will allow to be unmounted. | ||
7258 | + */ | ||
7259 | +static void mark_umount_candidates(struct mount *mnt) | ||
7260 | +{ | ||
7261 | + struct mount *parent = mnt->mnt_parent; | ||
7262 | + struct mount *m; | ||
7263 | + | ||
7264 | + BUG_ON(parent == mnt); | ||
7265 | + | ||
7266 | + for (m = propagation_next(parent, parent); m; | ||
7267 | + m = propagation_next(m, parent)) { | ||
7268 | + struct mount *child = __lookup_mnt_last(&m->mnt, | ||
7269 | + mnt->mnt_mountpoint); | ||
7270 | + if (child && (!IS_MNT_LOCKED(child) || IS_MNT_MARKED(m))) { | ||
7271 | + SET_MNT_MARK(child); | ||
7272 | + } | ||
7273 | + } | ||
7274 | +} | ||
7275 | + | ||
7276 | +/* | ||
7277 | * NOTE: unmounting 'mnt' naturally propagates to all other mounts its | ||
7278 | * parent propagates to. | ||
7279 | */ | ||
7280 | @@ -378,13 +418,16 @@ static void __propagate_umount(struct mount *mnt) | ||
7281 | struct mount *child = __lookup_mnt_last(&m->mnt, | ||
7282 | mnt->mnt_mountpoint); | ||
7283 | /* | ||
7284 | - * umount the child only if the child has no | ||
7285 | - * other children | ||
7286 | + * umount the child only if the child has no children | ||
7287 | + * and the child is marked safe to unmount. | ||
7288 | */ | ||
7289 | - if (child && list_empty(&child->mnt_mounts)) { | ||
7290 | + if (!child || !IS_MNT_MARKED(child)) | ||
7291 | + continue; | ||
7292 | + CLEAR_MNT_MARK(child); | ||
7293 | + if (list_empty(&child->mnt_mounts)) { | ||
7294 | list_del_init(&child->mnt_child); | ||
7295 | - hlist_del_init_rcu(&child->mnt_hash); | ||
7296 | - hlist_add_before_rcu(&child->mnt_hash, &mnt->mnt_hash); | ||
7297 | + child->mnt.mnt_flags |= MNT_UMOUNT; | ||
7298 | + list_move_tail(&child->mnt_list, &mnt->mnt_list); | ||
7299 | } | ||
7300 | } | ||
7301 | } | ||
7302 | @@ -396,11 +439,14 @@ static void __propagate_umount(struct mount *mnt) | ||
7303 | * | ||
7304 | * vfsmount lock must be held for write | ||
7305 | */ | ||
7306 | -int propagate_umount(struct hlist_head *list) | ||
7307 | +int propagate_umount(struct list_head *list) | ||
7308 | { | ||
7309 | struct mount *mnt; | ||
7310 | |||
7311 | - hlist_for_each_entry(mnt, list, mnt_hash) | ||
7312 | + list_for_each_entry_reverse(mnt, list, mnt_list) | ||
7313 | + mark_umount_candidates(mnt); | ||
7314 | + | ||
7315 | + list_for_each_entry(mnt, list, mnt_list) | ||
7316 | __propagate_umount(mnt); | ||
7317 | return 0; | ||
7318 | } | ||
7319 | diff --git a/fs/pnode.h b/fs/pnode.h | ||
7320 | index 4a246358b031..7114ce6e6b9e 100644 | ||
7321 | --- a/fs/pnode.h | ||
7322 | +++ b/fs/pnode.h | ||
7323 | @@ -19,6 +19,9 @@ | ||
7324 | #define IS_MNT_MARKED(m) ((m)->mnt.mnt_flags & MNT_MARKED) | ||
7325 | #define SET_MNT_MARK(m) ((m)->mnt.mnt_flags |= MNT_MARKED) | ||
7326 | #define CLEAR_MNT_MARK(m) ((m)->mnt.mnt_flags &= ~MNT_MARKED) | ||
7327 | +#define IS_MNT_LOCKED(m) ((m)->mnt.mnt_flags & MNT_LOCKED) | ||
7328 | +#define IS_MNT_LOCKED_AND_LAZY(m) \ | ||
7329 | + (((m)->mnt.mnt_flags & (MNT_LOCKED|MNT_SYNC_UMOUNT)) == MNT_LOCKED) | ||
7330 | |||
7331 | #define CL_EXPIRE 0x01 | ||
7332 | #define CL_SLAVE 0x02 | ||
7333 | @@ -40,14 +43,14 @@ static inline void set_mnt_shared(struct mount *mnt) | ||
7334 | void change_mnt_propagation(struct mount *, int); | ||
7335 | int propagate_mnt(struct mount *, struct mountpoint *, struct mount *, | ||
7336 | struct hlist_head *); | ||
7337 | -int propagate_umount(struct hlist_head *); | ||
7338 | +int propagate_umount(struct list_head *); | ||
7339 | int propagate_mount_busy(struct mount *, int); | ||
7340 | +void propagate_mount_unlock(struct mount *); | ||
7341 | void mnt_release_group_id(struct mount *); | ||
7342 | int get_dominating_id(struct mount *mnt, const struct path *root); | ||
7343 | unsigned int mnt_get_count(struct mount *mnt); | ||
7344 | void mnt_set_mountpoint(struct mount *, struct mountpoint *, | ||
7345 | struct mount *); | ||
7346 | -void umount_tree(struct mount *, int); | ||
7347 | struct mount *copy_tree(struct mount *, struct dentry *, int); | ||
7348 | bool is_path_reachable(struct mount *, struct dentry *, | ||
7349 | const struct path *root); | ||
7350 | diff --git a/include/acpi/actypes.h b/include/acpi/actypes.h | ||
7351 | index b034f1068dfe..0d5852557f1c 100644 | ||
7352 | --- a/include/acpi/actypes.h | ||
7353 | +++ b/include/acpi/actypes.h | ||
7354 | @@ -199,9 +199,29 @@ typedef int s32; | ||
7355 | typedef s32 acpi_native_int; | ||
7356 | |||
7357 | typedef u32 acpi_size; | ||
7358 | + | ||
7359 | +#ifdef ACPI_32BIT_PHYSICAL_ADDRESS | ||
7360 | + | ||
7361 | +/* | ||
7362 | + * OSPMs can define this to shrink the size of the structures for 32-bit | ||
7363 | + * none PAE environment. ASL compiler may always define this to generate | ||
7364 | + * 32-bit OSPM compliant tables. | ||
7365 | + */ | ||
7366 | typedef u32 acpi_io_address; | ||
7367 | typedef u32 acpi_physical_address; | ||
7368 | |||
7369 | +#else /* ACPI_32BIT_PHYSICAL_ADDRESS */ | ||
7370 | + | ||
7371 | +/* | ||
7372 | + * It is reported that, after some calculations, the physical addresses can | ||
7373 | + * wrap over the 32-bit boundary on 32-bit PAE environment. | ||
7374 | + * https://bugzilla.kernel.org/show_bug.cgi?id=87971 | ||
7375 | + */ | ||
7376 | +typedef u64 acpi_io_address; | ||
7377 | +typedef u64 acpi_physical_address; | ||
7378 | + | ||
7379 | +#endif /* ACPI_32BIT_PHYSICAL_ADDRESS */ | ||
7380 | + | ||
7381 | #define ACPI_MAX_PTR ACPI_UINT32_MAX | ||
7382 | #define ACPI_SIZE_MAX ACPI_UINT32_MAX | ||
7383 | |||
7384 | @@ -736,10 +756,6 @@ typedef u32 acpi_event_status; | ||
7385 | #define ACPI_GPE_ENABLE 0 | ||
7386 | #define ACPI_GPE_DISABLE 1 | ||
7387 | #define ACPI_GPE_CONDITIONAL_ENABLE 2 | ||
7388 | -#define ACPI_GPE_SAVE_MASK 4 | ||
7389 | - | ||
7390 | -#define ACPI_GPE_ENABLE_SAVE (ACPI_GPE_ENABLE | ACPI_GPE_SAVE_MASK) | ||
7391 | -#define ACPI_GPE_DISABLE_SAVE (ACPI_GPE_DISABLE | ACPI_GPE_SAVE_MASK) | ||
7392 | |||
7393 | /* | ||
7394 | * GPE info flags - Per GPE | ||
7395 | diff --git a/include/acpi/platform/acenv.h b/include/acpi/platform/acenv.h | ||
7396 | index ad74dc51d5b7..ecdf9405dd3a 100644 | ||
7397 | --- a/include/acpi/platform/acenv.h | ||
7398 | +++ b/include/acpi/platform/acenv.h | ||
7399 | @@ -76,6 +76,7 @@ | ||
7400 | #define ACPI_LARGE_NAMESPACE_NODE | ||
7401 | #define ACPI_DATA_TABLE_DISASSEMBLY | ||
7402 | #define ACPI_SINGLE_THREADED | ||
7403 | +#define ACPI_32BIT_PHYSICAL_ADDRESS | ||
7404 | #endif | ||
7405 | |||
7406 | /* acpi_exec configuration. Multithreaded with full AML debugger */ | ||
7407 | diff --git a/include/dt-bindings/clock/tegra124-car-common.h b/include/dt-bindings/clock/tegra124-car-common.h | ||
7408 | index ae2eb17a1658..a2156090563f 100644 | ||
7409 | --- a/include/dt-bindings/clock/tegra124-car-common.h | ||
7410 | +++ b/include/dt-bindings/clock/tegra124-car-common.h | ||
7411 | @@ -297,7 +297,7 @@ | ||
7412 | #define TEGRA124_CLK_PLL_C4 270 | ||
7413 | #define TEGRA124_CLK_PLL_DP 271 | ||
7414 | #define TEGRA124_CLK_PLL_E_MUX 272 | ||
7415 | -#define TEGRA124_CLK_PLLD_DSI 273 | ||
7416 | +#define TEGRA124_CLK_PLL_D_DSI_OUT 273 | ||
7417 | /* 274 */ | ||
7418 | /* 275 */ | ||
7419 | /* 276 */ | ||
7420 | diff --git a/include/linux/bpf.h b/include/linux/bpf.h | ||
7421 | index bbfceb756452..33b52fb0e20f 100644 | ||
7422 | --- a/include/linux/bpf.h | ||
7423 | +++ b/include/linux/bpf.h | ||
7424 | @@ -48,7 +48,7 @@ struct bpf_map *bpf_map_get(struct fd f); | ||
7425 | |||
7426 | /* function argument constraints */ | ||
7427 | enum bpf_arg_type { | ||
7428 | - ARG_ANYTHING = 0, /* any argument is ok */ | ||
7429 | + ARG_DONTCARE = 0, /* unused argument in helper function */ | ||
7430 | |||
7431 | /* the following constraints used to prototype | ||
7432 | * bpf_map_lookup/update/delete_elem() functions | ||
7433 | @@ -62,6 +62,8 @@ enum bpf_arg_type { | ||
7434 | */ | ||
7435 | ARG_PTR_TO_STACK, /* any pointer to eBPF program stack */ | ||
7436 | ARG_CONST_STACK_SIZE, /* number of bytes accessed from stack */ | ||
7437 | + | ||
7438 | + ARG_ANYTHING, /* any (initialized) argument is ok */ | ||
7439 | }; | ||
7440 | |||
7441 | /* type of values returned from helper functions */ | ||
7442 | diff --git a/include/linux/mount.h b/include/linux/mount.h | ||
7443 | index c2c561dc0114..564beeec5d83 100644 | ||
7444 | --- a/include/linux/mount.h | ||
7445 | +++ b/include/linux/mount.h | ||
7446 | @@ -61,6 +61,7 @@ struct mnt_namespace; | ||
7447 | #define MNT_DOOMED 0x1000000 | ||
7448 | #define MNT_SYNC_UMOUNT 0x2000000 | ||
7449 | #define MNT_MARKED 0x4000000 | ||
7450 | +#define MNT_UMOUNT 0x8000000 | ||
7451 | |||
7452 | struct vfsmount { | ||
7453 | struct dentry *mnt_root; /* root of the mounted tree */ | ||
7454 | diff --git a/include/linux/sched.h b/include/linux/sched.h | ||
7455 | index a419b65770d6..51348f77e431 100644 | ||
7456 | --- a/include/linux/sched.h | ||
7457 | +++ b/include/linux/sched.h | ||
7458 | @@ -176,6 +176,14 @@ extern void get_iowait_load(unsigned long *nr_waiters, unsigned long *load); | ||
7459 | extern void calc_global_load(unsigned long ticks); | ||
7460 | extern void update_cpu_load_nohz(void); | ||
7461 | |||
7462 | +/* Notifier for when a task gets migrated to a new CPU */ | ||
7463 | +struct task_migration_notifier { | ||
7464 | + struct task_struct *task; | ||
7465 | + int from_cpu; | ||
7466 | + int to_cpu; | ||
7467 | +}; | ||
7468 | +extern void register_task_migration_notifier(struct notifier_block *n); | ||
7469 | + | ||
7470 | extern unsigned long get_parent_ip(unsigned long addr); | ||
7471 | |||
7472 | extern void dump_cpu_task(int cpu); | ||
7473 | diff --git a/include/linux/skbuff.h b/include/linux/skbuff.h | ||
7474 | index f54d6659713a..bdccc4b46f57 100644 | ||
7475 | --- a/include/linux/skbuff.h | ||
7476 | +++ b/include/linux/skbuff.h | ||
7477 | @@ -769,6 +769,7 @@ bool skb_try_coalesce(struct sk_buff *to, struct sk_buff *from, | ||
7478 | |||
7479 | struct sk_buff *__alloc_skb(unsigned int size, gfp_t priority, int flags, | ||
7480 | int node); | ||
7481 | +struct sk_buff *__build_skb(void *data, unsigned int frag_size); | ||
7482 | struct sk_buff *build_skb(void *data, unsigned int frag_size); | ||
7483 | static inline struct sk_buff *alloc_skb(unsigned int size, | ||
7484 | gfp_t priority) | ||
7485 | @@ -3013,6 +3014,18 @@ static inline bool __skb_checksum_validate_needed(struct sk_buff *skb, | ||
7486 | */ | ||
7487 | #define CHECKSUM_BREAK 76 | ||
7488 | |||
7489 | +/* Unset checksum-complete | ||
7490 | + * | ||
7491 | + * Unset checksum complete can be done when packet is being modified | ||
7492 | + * (uncompressed for instance) and checksum-complete value is | ||
7493 | + * invalidated. | ||
7494 | + */ | ||
7495 | +static inline void skb_checksum_complete_unset(struct sk_buff *skb) | ||
7496 | +{ | ||
7497 | + if (skb->ip_summed == CHECKSUM_COMPLETE) | ||
7498 | + skb->ip_summed = CHECKSUM_NONE; | ||
7499 | +} | ||
7500 | + | ||
7501 | /* Validate (init) checksum based on checksum complete. | ||
7502 | * | ||
7503 | * Return values: | ||
7504 | diff --git a/include/linux/usb.h b/include/linux/usb.h | ||
7505 | index 7ee1b5c3b4cb..447fe29b55b4 100644 | ||
7506 | --- a/include/linux/usb.h | ||
7507 | +++ b/include/linux/usb.h | ||
7508 | @@ -205,6 +205,32 @@ void usb_put_intf(struct usb_interface *intf); | ||
7509 | #define USB_MAXINTERFACES 32 | ||
7510 | #define USB_MAXIADS (USB_MAXINTERFACES/2) | ||
7511 | |||
7512 | +/* | ||
7513 | + * USB Resume Timer: Every Host controller driver should drive the resume | ||
7514 | + * signalling on the bus for the amount of time defined by this macro. | ||
7515 | + * | ||
7516 | + * That way we will have a 'stable' behavior among all HCDs supported by Linux. | ||
7517 | + * | ||
7518 | + * Note that the USB Specification states we should drive resume for *at least* | ||
7519 | + * 20 ms, but it doesn't give an upper bound. This creates two possible | ||
7520 | + * situations which we want to avoid: | ||
7521 | + * | ||
7522 | + * (a) sometimes an msleep(20) might expire slightly before 20 ms, which causes | ||
7523 | + * us to fail USB Electrical Tests, thus failing Certification | ||
7524 | + * | ||
7525 | + * (b) Some (many) devices actually need more than 20 ms of resume signalling, | ||
7526 | + * and while we can argue that's against the USB Specification, we don't have | ||
7527 | + * control over which devices a certification laboratory will be using for | ||
7528 | + * certification. If CertLab uses a device which was tested against Windows and | ||
7529 | + * that happens to have relaxed resume signalling rules, we might fall into | ||
7530 | + * situations where we fail interoperability and electrical tests. | ||
7531 | + * | ||
7532 | + * In order to avoid both conditions, we're using a 40 ms resume timeout, which | ||
7533 | + * should cope with both LPJ calibration errors and devices not following every | ||
7534 | + * detail of the USB Specification. | ||
7535 | + */ | ||
7536 | +#define USB_RESUME_TIMEOUT 40 /* ms */ | ||
7537 | + | ||
7538 | /** | ||
7539 | * struct usb_interface_cache - long-term representation of a device interface | ||
7540 | * @num_altsetting: number of altsettings defined. | ||
7541 | diff --git a/include/target/iscsi/iscsi_target_core.h b/include/target/iscsi/iscsi_target_core.h | ||
7542 | index d3583d3ee193..dd0f3abde75d 100644 | ||
7543 | --- a/include/target/iscsi/iscsi_target_core.h | ||
7544 | +++ b/include/target/iscsi/iscsi_target_core.h | ||
7545 | @@ -602,6 +602,11 @@ struct iscsi_conn { | ||
7546 | struct iscsi_session *sess; | ||
7547 | /* Pointer to thread_set in use for this conn's threads */ | ||
7548 | struct iscsi_thread_set *thread_set; | ||
7549 | + int bitmap_id; | ||
7550 | + int rx_thread_active; | ||
7551 | + struct task_struct *rx_thread; | ||
7552 | + int tx_thread_active; | ||
7553 | + struct task_struct *tx_thread; | ||
7554 | /* list_head for session connection list */ | ||
7555 | struct list_head conn_list; | ||
7556 | } ____cacheline_aligned; | ||
7557 | @@ -871,10 +876,12 @@ struct iscsit_global { | ||
7558 | /* Unique identifier used for the authentication daemon */ | ||
7559 | u32 auth_id; | ||
7560 | u32 inactive_ts; | ||
7561 | +#define ISCSIT_BITMAP_BITS 262144 | ||
7562 | /* Thread Set bitmap count */ | ||
7563 | int ts_bitmap_count; | ||
7564 | /* Thread Set bitmap pointer */ | ||
7565 | unsigned long *ts_bitmap; | ||
7566 | + spinlock_t ts_bitmap_lock; | ||
7567 | /* Used for iSCSI discovery session authentication */ | ||
7568 | struct iscsi_node_acl discovery_acl; | ||
7569 | struct iscsi_portal_group *discovery_tpg; | ||
7570 | diff --git a/include/target/target_core_base.h b/include/target/target_core_base.h | ||
7571 | index 672150b6aaf5..985ca4c907fe 100644 | ||
7572 | --- a/include/target/target_core_base.h | ||
7573 | +++ b/include/target/target_core_base.h | ||
7574 | @@ -524,7 +524,7 @@ struct se_cmd { | ||
7575 | sense_reason_t (*execute_cmd)(struct se_cmd *); | ||
7576 | sense_reason_t (*execute_rw)(struct se_cmd *, struct scatterlist *, | ||
7577 | u32, enum dma_data_direction); | ||
7578 | - sense_reason_t (*transport_complete_callback)(struct se_cmd *); | ||
7579 | + sense_reason_t (*transport_complete_callback)(struct se_cmd *, bool); | ||
7580 | |||
7581 | unsigned char *t_task_cdb; | ||
7582 | unsigned char __t_task_cdb[TCM_MAX_COMMAND_SIZE]; | ||
7583 | diff --git a/include/uapi/linux/nfsd/debug.h b/include/uapi/linux/nfsd/debug.h | ||
7584 | index 0bf130a1c58d..28ec6c9c421a 100644 | ||
7585 | --- a/include/uapi/linux/nfsd/debug.h | ||
7586 | +++ b/include/uapi/linux/nfsd/debug.h | ||
7587 | @@ -12,14 +12,6 @@ | ||
7588 | #include <linux/sunrpc/debug.h> | ||
7589 | |||
7590 | /* | ||
7591 | - * Enable debugging for nfsd. | ||
7592 | - * Requires RPC_DEBUG. | ||
7593 | - */ | ||
7594 | -#if IS_ENABLED(CONFIG_SUNRPC_DEBUG) | ||
7595 | -# define NFSD_DEBUG 1 | ||
7596 | -#endif | ||
7597 | - | ||
7598 | -/* | ||
7599 | * knfsd debug flags | ||
7600 | */ | ||
7601 | #define NFSDDBG_SOCK 0x0001 | ||
7602 | diff --git a/include/video/samsung_fimd.h b/include/video/samsung_fimd.h | ||
7603 | index a20e4a3a8b15..847a0a2b399c 100644 | ||
7604 | --- a/include/video/samsung_fimd.h | ||
7605 | +++ b/include/video/samsung_fimd.h | ||
7606 | @@ -436,6 +436,12 @@ | ||
7607 | #define BLENDCON_NEW_8BIT_ALPHA_VALUE (1 << 0) | ||
7608 | #define BLENDCON_NEW_4BIT_ALPHA_VALUE (0 << 0) | ||
7609 | |||
7610 | +/* Display port clock control */ | ||
7611 | +#define DP_MIE_CLKCON 0x27c | ||
7612 | +#define DP_MIE_CLK_DISABLE 0x0 | ||
7613 | +#define DP_MIE_CLK_DP_ENABLE 0x2 | ||
7614 | +#define DP_MIE_CLK_MIE_ENABLE 0x3 | ||
7615 | + | ||
7616 | /* Notes on per-window bpp settings | ||
7617 | * | ||
7618 | * Value Win0 Win1 Win2 Win3 Win 4 | ||
7619 | diff --git a/kernel/bpf/verifier.c b/kernel/bpf/verifier.c | ||
7620 | index 36508e69e92a..5d8ea3d8a897 100644 | ||
7621 | --- a/kernel/bpf/verifier.c | ||
7622 | +++ b/kernel/bpf/verifier.c | ||
7623 | @@ -755,7 +755,7 @@ static int check_func_arg(struct verifier_env *env, u32 regno, | ||
7624 | enum bpf_reg_type expected_type; | ||
7625 | int err = 0; | ||
7626 | |||
7627 | - if (arg_type == ARG_ANYTHING) | ||
7628 | + if (arg_type == ARG_DONTCARE) | ||
7629 | return 0; | ||
7630 | |||
7631 | if (reg->type == NOT_INIT) { | ||
7632 | @@ -763,6 +763,9 @@ static int check_func_arg(struct verifier_env *env, u32 regno, | ||
7633 | return -EACCES; | ||
7634 | } | ||
7635 | |||
7636 | + if (arg_type == ARG_ANYTHING) | ||
7637 | + return 0; | ||
7638 | + | ||
7639 | if (arg_type == ARG_PTR_TO_STACK || arg_type == ARG_PTR_TO_MAP_KEY || | ||
7640 | arg_type == ARG_PTR_TO_MAP_VALUE) { | ||
7641 | expected_type = PTR_TO_STACK; | ||
7642 | diff --git a/kernel/ptrace.c b/kernel/ptrace.c | ||
7643 | index 227fec36b12a..9a34bd80a745 100644 | ||
7644 | --- a/kernel/ptrace.c | ||
7645 | +++ b/kernel/ptrace.c | ||
7646 | @@ -697,6 +697,8 @@ static int ptrace_peek_siginfo(struct task_struct *child, | ||
7647 | static int ptrace_resume(struct task_struct *child, long request, | ||
7648 | unsigned long data) | ||
7649 | { | ||
7650 | + bool need_siglock; | ||
7651 | + | ||
7652 | if (!valid_signal(data)) | ||
7653 | return -EIO; | ||
7654 | |||
7655 | @@ -724,8 +726,26 @@ static int ptrace_resume(struct task_struct *child, long request, | ||
7656 | user_disable_single_step(child); | ||
7657 | } | ||
7658 | |||
7659 | + /* | ||
7660 | + * Change ->exit_code and ->state under siglock to avoid the race | ||
7661 | + * with wait_task_stopped() in between; a non-zero ->exit_code will | ||
7662 | + * wrongly look like another report from tracee. | ||
7663 | + * | ||
7664 | + * Note that we need siglock even if ->exit_code == data and/or this | ||
7665 | + * status was not reported yet, the new status must not be cleared by | ||
7666 | + * wait_task_stopped() after resume. | ||
7667 | + * | ||
7668 | + * If data == 0 we do not care if wait_task_stopped() reports the old | ||
7669 | + * status and clears the code too; this can't race with the tracee, it | ||
7670 | + * takes siglock after resume. | ||
7671 | + */ | ||
7672 | + need_siglock = data && !thread_group_empty(current); | ||
7673 | + if (need_siglock) | ||
7674 | + spin_lock_irq(&child->sighand->siglock); | ||
7675 | child->exit_code = data; | ||
7676 | wake_up_state(child, __TASK_TRACED); | ||
7677 | + if (need_siglock) | ||
7678 | + spin_unlock_irq(&child->sighand->siglock); | ||
7679 | |||
7680 | return 0; | ||
7681 | } | ||
7682 | diff --git a/kernel/sched/core.c b/kernel/sched/core.c | ||
7683 | index 62671f53202a..3d5f6f6d14c2 100644 | ||
7684 | --- a/kernel/sched/core.c | ||
7685 | +++ b/kernel/sched/core.c | ||
7686 | @@ -996,6 +996,13 @@ void check_preempt_curr(struct rq *rq, struct task_struct *p, int flags) | ||
7687 | rq_clock_skip_update(rq, true); | ||
7688 | } | ||
7689 | |||
7690 | +static ATOMIC_NOTIFIER_HEAD(task_migration_notifier); | ||
7691 | + | ||
7692 | +void register_task_migration_notifier(struct notifier_block *n) | ||
7693 | +{ | ||
7694 | + atomic_notifier_chain_register(&task_migration_notifier, n); | ||
7695 | +} | ||
7696 | + | ||
7697 | #ifdef CONFIG_SMP | ||
7698 | void set_task_cpu(struct task_struct *p, unsigned int new_cpu) | ||
7699 | { | ||
7700 | @@ -1026,10 +1033,18 @@ void set_task_cpu(struct task_struct *p, unsigned int new_cpu) | ||
7701 | trace_sched_migrate_task(p, new_cpu); | ||
7702 | |||
7703 | if (task_cpu(p) != new_cpu) { | ||
7704 | + struct task_migration_notifier tmn; | ||
7705 | + | ||
7706 | if (p->sched_class->migrate_task_rq) | ||
7707 | p->sched_class->migrate_task_rq(p, new_cpu); | ||
7708 | p->se.nr_migrations++; | ||
7709 | perf_sw_event_sched(PERF_COUNT_SW_CPU_MIGRATIONS, 1, 0); | ||
7710 | + | ||
7711 | + tmn.task = p; | ||
7712 | + tmn.from_cpu = task_cpu(p); | ||
7713 | + tmn.to_cpu = new_cpu; | ||
7714 | + | ||
7715 | + atomic_notifier_call_chain(&task_migration_notifier, 0, &tmn); | ||
7716 | } | ||
7717 | |||
7718 | __set_task_cpu(p, new_cpu); | ||
7719 | diff --git a/kernel/sched/deadline.c b/kernel/sched/deadline.c | ||
7720 | index 3fa8fa6d9403..f670cbb17f5d 100644 | ||
7721 | --- a/kernel/sched/deadline.c | ||
7722 | +++ b/kernel/sched/deadline.c | ||
7723 | @@ -514,7 +514,7 @@ static enum hrtimer_restart dl_task_timer(struct hrtimer *timer) | ||
7724 | unsigned long flags; | ||
7725 | struct rq *rq; | ||
7726 | |||
7727 | - rq = task_rq_lock(current, &flags); | ||
7728 | + rq = task_rq_lock(p, &flags); | ||
7729 | |||
7730 | /* | ||
7731 | * We need to take care of several possible races here: | ||
7732 | @@ -569,7 +569,7 @@ static enum hrtimer_restart dl_task_timer(struct hrtimer *timer) | ||
7733 | push_dl_task(rq); | ||
7734 | #endif | ||
7735 | unlock: | ||
7736 | - task_rq_unlock(rq, current, &flags); | ||
7737 | + task_rq_unlock(rq, p, &flags); | ||
7738 | |||
7739 | return HRTIMER_NORESTART; | ||
7740 | } | ||
7741 | diff --git a/kernel/trace/ring_buffer.c b/kernel/trace/ring_buffer.c | ||
7742 | index 5040d44fe5a3..922048a0f7ea 100644 | ||
7743 | --- a/kernel/trace/ring_buffer.c | ||
7744 | +++ b/kernel/trace/ring_buffer.c | ||
7745 | @@ -2679,7 +2679,7 @@ static DEFINE_PER_CPU(unsigned int, current_context); | ||
7746 | |||
7747 | static __always_inline int trace_recursive_lock(void) | ||
7748 | { | ||
7749 | - unsigned int val = this_cpu_read(current_context); | ||
7750 | + unsigned int val = __this_cpu_read(current_context); | ||
7751 | int bit; | ||
7752 | |||
7753 | if (in_interrupt()) { | ||
7754 | @@ -2696,18 +2696,17 @@ static __always_inline int trace_recursive_lock(void) | ||
7755 | return 1; | ||
7756 | |||
7757 | val |= (1 << bit); | ||
7758 | - this_cpu_write(current_context, val); | ||
7759 | + __this_cpu_write(current_context, val); | ||
7760 | |||
7761 | return 0; | ||
7762 | } | ||
7763 | |||
7764 | static __always_inline void trace_recursive_unlock(void) | ||
7765 | { | ||
7766 | - unsigned int val = this_cpu_read(current_context); | ||
7767 | + unsigned int val = __this_cpu_read(current_context); | ||
7768 | |||
7769 | - val--; | ||
7770 | - val &= this_cpu_read(current_context); | ||
7771 | - this_cpu_write(current_context, val); | ||
7772 | + val &= val & (val - 1); | ||
7773 | + __this_cpu_write(current_context, val); | ||
7774 | } | ||
7775 | |||
7776 | #else | ||
7777 | diff --git a/kernel/trace/trace_events.c b/kernel/trace/trace_events.c | ||
7778 | index db54dda10ccc..a9c10a3cf122 100644 | ||
7779 | --- a/kernel/trace/trace_events.c | ||
7780 | +++ b/kernel/trace/trace_events.c | ||
7781 | @@ -565,6 +565,7 @@ static int __ftrace_set_clr_event(struct trace_array *tr, const char *match, | ||
7782 | static int ftrace_set_clr_event(struct trace_array *tr, char *buf, int set) | ||
7783 | { | ||
7784 | char *event = NULL, *sub = NULL, *match; | ||
7785 | + int ret; | ||
7786 | |||
7787 | /* | ||
7788 | * The buf format can be <subsystem>:<event-name> | ||
7789 | @@ -590,7 +591,13 @@ static int ftrace_set_clr_event(struct trace_array *tr, char *buf, int set) | ||
7790 | event = NULL; | ||
7791 | } | ||
7792 | |||
7793 | - return __ftrace_set_clr_event(tr, match, sub, event, set); | ||
7794 | + ret = __ftrace_set_clr_event(tr, match, sub, event, set); | ||
7795 | + | ||
7796 | + /* Put back the colon to allow this to be called again */ | ||
7797 | + if (buf) | ||
7798 | + *(buf - 1) = ':'; | ||
7799 | + | ||
7800 | + return ret; | ||
7801 | } | ||
7802 | |||
7803 | /** | ||
7804 | diff --git a/kernel/trace/trace_functions_graph.c b/kernel/trace/trace_functions_graph.c | ||
7805 | index 2d25ad1526bb..b6fce365ef27 100644 | ||
7806 | --- a/kernel/trace/trace_functions_graph.c | ||
7807 | +++ b/kernel/trace/trace_functions_graph.c | ||
7808 | @@ -1309,15 +1309,19 @@ void graph_trace_open(struct trace_iterator *iter) | ||
7809 | { | ||
7810 | /* pid and depth on the last trace processed */ | ||
7811 | struct fgraph_data *data; | ||
7812 | + gfp_t gfpflags; | ||
7813 | int cpu; | ||
7814 | |||
7815 | iter->private = NULL; | ||
7816 | |||
7817 | - data = kzalloc(sizeof(*data), GFP_KERNEL); | ||
7818 | + /* We can be called in atomic context via ftrace_dump() */ | ||
7819 | + gfpflags = (in_atomic() || irqs_disabled()) ? GFP_ATOMIC : GFP_KERNEL; | ||
7820 | + | ||
7821 | + data = kzalloc(sizeof(*data), gfpflags); | ||
7822 | if (!data) | ||
7823 | goto out_err; | ||
7824 | |||
7825 | - data->cpu_data = alloc_percpu(struct fgraph_cpu_data); | ||
7826 | + data->cpu_data = alloc_percpu_gfp(struct fgraph_cpu_data, gfpflags); | ||
7827 | if (!data->cpu_data) | ||
7828 | goto out_err_free; | ||
7829 | |||
7830 | diff --git a/lib/string.c b/lib/string.c | ||
7831 | index ce81aaec3839..a5792019193c 100644 | ||
7832 | --- a/lib/string.c | ||
7833 | +++ b/lib/string.c | ||
7834 | @@ -607,7 +607,7 @@ EXPORT_SYMBOL(memset); | ||
7835 | void memzero_explicit(void *s, size_t count) | ||
7836 | { | ||
7837 | memset(s, 0, count); | ||
7838 | - OPTIMIZER_HIDE_VAR(s); | ||
7839 | + barrier(); | ||
7840 | } | ||
7841 | EXPORT_SYMBOL(memzero_explicit); | ||
7842 | |||
7843 | diff --git a/mm/huge_memory.c b/mm/huge_memory.c | ||
7844 | index 6817b0350c71..956d4dbe001d 100644 | ||
7845 | --- a/mm/huge_memory.c | ||
7846 | +++ b/mm/huge_memory.c | ||
7847 | @@ -2316,8 +2316,14 @@ static struct page | ||
7848 | struct vm_area_struct *vma, unsigned long address, | ||
7849 | int node) | ||
7850 | { | ||
7851 | + gfp_t flags; | ||
7852 | + | ||
7853 | VM_BUG_ON_PAGE(*hpage, *hpage); | ||
7854 | |||
7855 | + /* Only allocate from the target node */ | ||
7856 | + flags = alloc_hugepage_gfpmask(khugepaged_defrag(), __GFP_OTHER_NODE) | | ||
7857 | + __GFP_THISNODE; | ||
7858 | + | ||
7859 | /* | ||
7860 | * Before allocating the hugepage, release the mmap_sem read lock. | ||
7861 | * The allocation can take potentially a long time if it involves | ||
7862 | @@ -2326,8 +2332,7 @@ static struct page | ||
7863 | */ | ||
7864 | up_read(&mm->mmap_sem); | ||
7865 | |||
7866 | - *hpage = alloc_pages_exact_node(node, alloc_hugepage_gfpmask( | ||
7867 | - khugepaged_defrag(), __GFP_OTHER_NODE), HPAGE_PMD_ORDER); | ||
7868 | + *hpage = alloc_pages_exact_node(node, flags, HPAGE_PMD_ORDER); | ||
7869 | if (unlikely(!*hpage)) { | ||
7870 | count_vm_event(THP_COLLAPSE_ALLOC_FAILED); | ||
7871 | *hpage = ERR_PTR(-ENOMEM); | ||
7872 | diff --git a/mm/hugetlb.c b/mm/hugetlb.c | ||
7873 | index c41b2a0ee273..caad3c5a926f 100644 | ||
7874 | --- a/mm/hugetlb.c | ||
7875 | +++ b/mm/hugetlb.c | ||
7876 | @@ -3735,8 +3735,7 @@ retry: | ||
7877 | if (!pmd_huge(*pmd)) | ||
7878 | goto out; | ||
7879 | if (pmd_present(*pmd)) { | ||
7880 | - page = pte_page(*(pte_t *)pmd) + | ||
7881 | - ((address & ~PMD_MASK) >> PAGE_SHIFT); | ||
7882 | + page = pmd_page(*pmd) + ((address & ~PMD_MASK) >> PAGE_SHIFT); | ||
7883 | if (flags & FOLL_GET) | ||
7884 | get_page(page); | ||
7885 | } else { | ||
7886 | diff --git a/mm/mempolicy.c b/mm/mempolicy.c | ||
7887 | index 4721046a134a..de5dc5e12691 100644 | ||
7888 | --- a/mm/mempolicy.c | ||
7889 | +++ b/mm/mempolicy.c | ||
7890 | @@ -1985,7 +1985,8 @@ retry_cpuset: | ||
7891 | nmask = policy_nodemask(gfp, pol); | ||
7892 | if (!nmask || node_isset(node, *nmask)) { | ||
7893 | mpol_cond_put(pol); | ||
7894 | - page = alloc_pages_exact_node(node, gfp, order); | ||
7895 | + page = alloc_pages_exact_node(node, | ||
7896 | + gfp | __GFP_THISNODE, order); | ||
7897 | goto out; | ||
7898 | } | ||
7899 | } | ||
7900 | diff --git a/net/bridge/br_netfilter.c b/net/bridge/br_netfilter.c | ||
7901 | index 0ee453fad3de..f371cbff6d45 100644 | ||
7902 | --- a/net/bridge/br_netfilter.c | ||
7903 | +++ b/net/bridge/br_netfilter.c | ||
7904 | @@ -651,6 +651,13 @@ static int br_nf_forward_finish(struct sk_buff *skb) | ||
7905 | struct net_device *in; | ||
7906 | |||
7907 | if (!IS_ARP(skb) && !IS_VLAN_ARP(skb)) { | ||
7908 | + int frag_max_size; | ||
7909 | + | ||
7910 | + if (skb->protocol == htons(ETH_P_IP)) { | ||
7911 | + frag_max_size = IPCB(skb)->frag_max_size; | ||
7912 | + BR_INPUT_SKB_CB(skb)->frag_max_size = frag_max_size; | ||
7913 | + } | ||
7914 | + | ||
7915 | in = nf_bridge->physindev; | ||
7916 | if (nf_bridge->mask & BRNF_PKT_TYPE) { | ||
7917 | skb->pkt_type = PACKET_OTHERHOST; | ||
7918 | @@ -710,8 +717,14 @@ static unsigned int br_nf_forward_ip(const struct nf_hook_ops *ops, | ||
7919 | nf_bridge->mask |= BRNF_PKT_TYPE; | ||
7920 | } | ||
7921 | |||
7922 | - if (pf == NFPROTO_IPV4 && br_parse_ip_options(skb)) | ||
7923 | - return NF_DROP; | ||
7924 | + if (pf == NFPROTO_IPV4) { | ||
7925 | + int frag_max = BR_INPUT_SKB_CB(skb)->frag_max_size; | ||
7926 | + | ||
7927 | + if (br_parse_ip_options(skb)) | ||
7928 | + return NF_DROP; | ||
7929 | + | ||
7930 | + IPCB(skb)->frag_max_size = frag_max; | ||
7931 | + } | ||
7932 | |||
7933 | /* The physdev module checks on this */ | ||
7934 | nf_bridge->mask |= BRNF_BRIDGED; | ||
7935 | diff --git a/net/core/dev.c b/net/core/dev.c | ||
7936 | index 45109b70664e..22a53acdb5bb 100644 | ||
7937 | --- a/net/core/dev.c | ||
7938 | +++ b/net/core/dev.c | ||
7939 | @@ -3041,7 +3041,7 @@ static struct rps_dev_flow * | ||
7940 | set_rps_cpu(struct net_device *dev, struct sk_buff *skb, | ||
7941 | struct rps_dev_flow *rflow, u16 next_cpu) | ||
7942 | { | ||
7943 | - if (next_cpu != RPS_NO_CPU) { | ||
7944 | + if (next_cpu < nr_cpu_ids) { | ||
7945 | #ifdef CONFIG_RFS_ACCEL | ||
7946 | struct netdev_rx_queue *rxqueue; | ||
7947 | struct rps_dev_flow_table *flow_table; | ||
7948 | @@ -3146,7 +3146,7 @@ static int get_rps_cpu(struct net_device *dev, struct sk_buff *skb, | ||
7949 | * If the desired CPU (where last recvmsg was done) is | ||
7950 | * different from current CPU (one in the rx-queue flow | ||
7951 | * table entry), switch if one of the following holds: | ||
7952 | - * - Current CPU is unset (equal to RPS_NO_CPU). | ||
7953 | + * - Current CPU is unset (>= nr_cpu_ids). | ||
7954 | * - Current CPU is offline. | ||
7955 | * - The current CPU's queue tail has advanced beyond the | ||
7956 | * last packet that was enqueued using this table entry. | ||
7957 | @@ -3154,14 +3154,14 @@ static int get_rps_cpu(struct net_device *dev, struct sk_buff *skb, | ||
7958 | * have been dequeued, thus preserving in order delivery. | ||
7959 | */ | ||
7960 | if (unlikely(tcpu != next_cpu) && | ||
7961 | - (tcpu == RPS_NO_CPU || !cpu_online(tcpu) || | ||
7962 | + (tcpu >= nr_cpu_ids || !cpu_online(tcpu) || | ||
7963 | ((int)(per_cpu(softnet_data, tcpu).input_queue_head - | ||
7964 | rflow->last_qtail)) >= 0)) { | ||
7965 | tcpu = next_cpu; | ||
7966 | rflow = set_rps_cpu(dev, skb, rflow, next_cpu); | ||
7967 | } | ||
7968 | |||
7969 | - if (tcpu != RPS_NO_CPU && cpu_online(tcpu)) { | ||
7970 | + if (tcpu < nr_cpu_ids && cpu_online(tcpu)) { | ||
7971 | *rflowp = rflow; | ||
7972 | cpu = tcpu; | ||
7973 | goto done; | ||
7974 | @@ -3202,14 +3202,14 @@ bool rps_may_expire_flow(struct net_device *dev, u16 rxq_index, | ||
7975 | struct rps_dev_flow_table *flow_table; | ||
7976 | struct rps_dev_flow *rflow; | ||
7977 | bool expire = true; | ||
7978 | - int cpu; | ||
7979 | + unsigned int cpu; | ||
7980 | |||
7981 | rcu_read_lock(); | ||
7982 | flow_table = rcu_dereference(rxqueue->rps_flow_table); | ||
7983 | if (flow_table && flow_id <= flow_table->mask) { | ||
7984 | rflow = &flow_table->flows[flow_id]; | ||
7985 | cpu = ACCESS_ONCE(rflow->cpu); | ||
7986 | - if (rflow->filter == filter_id && cpu != RPS_NO_CPU && | ||
7987 | + if (rflow->filter == filter_id && cpu < nr_cpu_ids && | ||
7988 | ((int)(per_cpu(softnet_data, cpu).input_queue_head - | ||
7989 | rflow->last_qtail) < | ||
7990 | (int)(10 * flow_table->mask))) | ||
7991 | diff --git a/net/core/skbuff.c b/net/core/skbuff.c | ||
7992 | index 98d45fe72f51..e9f9a15fce4e 100644 | ||
7993 | --- a/net/core/skbuff.c | ||
7994 | +++ b/net/core/skbuff.c | ||
7995 | @@ -280,13 +280,14 @@ nodata: | ||
7996 | EXPORT_SYMBOL(__alloc_skb); | ||
7997 | |||
7998 | /** | ||
7999 | - * build_skb - build a network buffer | ||
8000 | + * __build_skb - build a network buffer | ||
8001 | * @data: data buffer provided by caller | ||
8002 | - * @frag_size: size of fragment, or 0 if head was kmalloced | ||
8003 | + * @frag_size: size of data, or 0 if head was kmalloced | ||
8004 | * | ||
8005 | * Allocate a new &sk_buff. Caller provides space holding head and | ||
8006 | * skb_shared_info. @data must have been allocated by kmalloc() only if | ||
8007 | - * @frag_size is 0, otherwise data should come from the page allocator. | ||
8008 | + * @frag_size is 0, otherwise data should come from the page allocator | ||
8009 | + * or vmalloc() | ||
8010 | * The return is the new skb buffer. | ||
8011 | * On a failure the return is %NULL, and @data is not freed. | ||
8012 | * Notes : | ||
8013 | @@ -297,7 +298,7 @@ EXPORT_SYMBOL(__alloc_skb); | ||
8014 | * before giving packet to stack. | ||
8015 | * RX rings only contains data buffers, not full skbs. | ||
8016 | */ | ||
8017 | -struct sk_buff *build_skb(void *data, unsigned int frag_size) | ||
8018 | +struct sk_buff *__build_skb(void *data, unsigned int frag_size) | ||
8019 | { | ||
8020 | struct skb_shared_info *shinfo; | ||
8021 | struct sk_buff *skb; | ||
8022 | @@ -311,7 +312,6 @@ struct sk_buff *build_skb(void *data, unsigned int frag_size) | ||
8023 | |||
8024 | memset(skb, 0, offsetof(struct sk_buff, tail)); | ||
8025 | skb->truesize = SKB_TRUESIZE(size); | ||
8026 | - skb->head_frag = frag_size != 0; | ||
8027 | atomic_set(&skb->users, 1); | ||
8028 | skb->head = data; | ||
8029 | skb->data = data; | ||
8030 | @@ -328,6 +328,23 @@ struct sk_buff *build_skb(void *data, unsigned int frag_size) | ||
8031 | |||
8032 | return skb; | ||
8033 | } | ||
8034 | + | ||
8035 | +/* build_skb() is wrapper over __build_skb(), that specifically | ||
8036 | + * takes care of skb->head and skb->pfmemalloc | ||
8037 | + * This means that if @frag_size is not zero, then @data must be backed | ||
8038 | + * by a page fragment, not kmalloc() or vmalloc() | ||
8039 | + */ | ||
8040 | +struct sk_buff *build_skb(void *data, unsigned int frag_size) | ||
8041 | +{ | ||
8042 | + struct sk_buff *skb = __build_skb(data, frag_size); | ||
8043 | + | ||
8044 | + if (skb && frag_size) { | ||
8045 | + skb->head_frag = 1; | ||
8046 | + if (virt_to_head_page(data)->pfmemalloc) | ||
8047 | + skb->pfmemalloc = 1; | ||
8048 | + } | ||
8049 | + return skb; | ||
8050 | +} | ||
8051 | EXPORT_SYMBOL(build_skb); | ||
8052 | |||
8053 | struct netdev_alloc_cache { | ||
8054 | @@ -348,7 +365,8 @@ static struct page *__page_frag_refill(struct netdev_alloc_cache *nc, | ||
8055 | gfp_t gfp = gfp_mask; | ||
8056 | |||
8057 | if (order) { | ||
8058 | - gfp_mask |= __GFP_COMP | __GFP_NOWARN | __GFP_NORETRY; | ||
8059 | + gfp_mask |= __GFP_COMP | __GFP_NOWARN | __GFP_NORETRY | | ||
8060 | + __GFP_NOMEMALLOC; | ||
8061 | page = alloc_pages_node(NUMA_NO_NODE, gfp_mask, order); | ||
8062 | nc->frag.size = PAGE_SIZE << (page ? order : 0); | ||
8063 | } | ||
8064 | diff --git a/net/ipv4/ip_forward.c b/net/ipv4/ip_forward.c | ||
8065 | index d9bc28ac5d1b..53bd53fbbee0 100644 | ||
8066 | --- a/net/ipv4/ip_forward.c | ||
8067 | +++ b/net/ipv4/ip_forward.c | ||
8068 | @@ -82,6 +82,9 @@ int ip_forward(struct sk_buff *skb) | ||
8069 | if (skb->pkt_type != PACKET_HOST) | ||
8070 | goto drop; | ||
8071 | |||
8072 | + if (unlikely(skb->sk)) | ||
8073 | + goto drop; | ||
8074 | + | ||
8075 | if (skb_warn_if_lro(skb)) | ||
8076 | goto drop; | ||
8077 | |||
8078 | diff --git a/net/ipv4/tcp_output.c b/net/ipv4/tcp_output.c | ||
8079 | index d520492ba698..9d48dc427a5a 100644 | ||
8080 | --- a/net/ipv4/tcp_output.c | ||
8081 | +++ b/net/ipv4/tcp_output.c | ||
8082 | @@ -2751,39 +2751,65 @@ begin_fwd: | ||
8083 | } | ||
8084 | } | ||
8085 | |||
8086 | -/* Send a fin. The caller locks the socket for us. This cannot be | ||
8087 | - * allowed to fail queueing a FIN frame under any circumstances. | ||
8088 | +/* We allow to exceed memory limits for FIN packets to expedite | ||
8089 | + * connection tear down and (memory) recovery. | ||
8090 | + * Otherwise tcp_send_fin() could be tempted to either delay FIN | ||
8091 | + * or even be forced to close flow without any FIN. | ||
8092 | + */ | ||
8093 | +static void sk_forced_wmem_schedule(struct sock *sk, int size) | ||
8094 | +{ | ||
8095 | + int amt, status; | ||
8096 | + | ||
8097 | + if (size <= sk->sk_forward_alloc) | ||
8098 | + return; | ||
8099 | + amt = sk_mem_pages(size); | ||
8100 | + sk->sk_forward_alloc += amt * SK_MEM_QUANTUM; | ||
8101 | + sk_memory_allocated_add(sk, amt, &status); | ||
8102 | +} | ||
8103 | + | ||
8104 | +/* Send a FIN. The caller locks the socket for us. | ||
8105 | + * We should try to send a FIN packet really hard, but eventually give up. | ||
8106 | */ | ||
8107 | void tcp_send_fin(struct sock *sk) | ||
8108 | { | ||
8109 | + struct sk_buff *skb, *tskb = tcp_write_queue_tail(sk); | ||
8110 | struct tcp_sock *tp = tcp_sk(sk); | ||
8111 | - struct sk_buff *skb = tcp_write_queue_tail(sk); | ||
8112 | - int mss_now; | ||
8113 | |||
8114 | - /* Optimization, tack on the FIN if we have a queue of | ||
8115 | - * unsent frames. But be careful about outgoing SACKS | ||
8116 | - * and IP options. | ||
8117 | + /* Optimization, tack on the FIN if we have one skb in write queue and | ||
8118 | + * this skb was not yet sent, or we are under memory pressure. | ||
8119 | + * Note: in the latter case, FIN packet will be sent after a timeout, | ||
8120 | + * as TCP stack thinks it has already been transmitted. | ||
8121 | */ | ||
8122 | - mss_now = tcp_current_mss(sk); | ||
8123 | - | ||
8124 | - if (tcp_send_head(sk) != NULL) { | ||
8125 | - TCP_SKB_CB(skb)->tcp_flags |= TCPHDR_FIN; | ||
8126 | - TCP_SKB_CB(skb)->end_seq++; | ||
8127 | + if (tskb && (tcp_send_head(sk) || sk_under_memory_pressure(sk))) { | ||
8128 | +coalesce: | ||
8129 | + TCP_SKB_CB(tskb)->tcp_flags |= TCPHDR_FIN; | ||
8130 | + TCP_SKB_CB(tskb)->end_seq++; | ||
8131 | tp->write_seq++; | ||
8132 | + if (!tcp_send_head(sk)) { | ||
8133 | + /* This means tskb was already sent. | ||
8134 | + * Pretend we included the FIN on previous transmit. | ||
8135 | + * We need to set tp->snd_nxt to the value it would have | ||
8136 | + * if FIN had been sent. This is because retransmit path | ||
8137 | + * does not change tp->snd_nxt. | ||
8138 | + */ | ||
8139 | + tp->snd_nxt++; | ||
8140 | + return; | ||
8141 | + } | ||
8142 | } else { | ||
8143 | - /* Socket is locked, keep trying until memory is available. */ | ||
8144 | - for (;;) { | ||
8145 | - skb = sk_stream_alloc_skb(sk, 0, sk->sk_allocation); | ||
8146 | - if (skb) | ||
8147 | - break; | ||
8148 | - yield(); | ||
8149 | + skb = alloc_skb_fclone(MAX_TCP_HEADER, sk->sk_allocation); | ||
8150 | + if (unlikely(!skb)) { | ||
8151 | + if (tskb) | ||
8152 | + goto coalesce; | ||
8153 | + return; | ||
8154 | } | ||
8155 | + skb_reserve(skb, MAX_TCP_HEADER); | ||
8156 | + sk_forced_wmem_schedule(sk, skb->truesize); | ||
8157 | /* FIN eats a sequence byte, write_seq advanced by tcp_queue_skb(). */ | ||
8158 | tcp_init_nondata_skb(skb, tp->write_seq, | ||
8159 | TCPHDR_ACK | TCPHDR_FIN); | ||
8160 | tcp_queue_skb(sk, skb); | ||
8161 | } | ||
8162 | - __tcp_push_pending_frames(sk, mss_now, TCP_NAGLE_OFF); | ||
8163 | + __tcp_push_pending_frames(sk, tcp_current_mss(sk), TCP_NAGLE_OFF); | ||
8164 | } | ||
8165 | |||
8166 | /* We get here when a process closes a file descriptor (either due to | ||
8167 | diff --git a/net/mac80211/mlme.c b/net/mac80211/mlme.c | ||
8168 | index 142f66aece18..0ca013d66492 100644 | ||
8169 | --- a/net/mac80211/mlme.c | ||
8170 | +++ b/net/mac80211/mlme.c | ||
8171 | @@ -2260,7 +2260,7 @@ static void ieee80211_mgd_probe_ap_send(struct ieee80211_sub_if_data *sdata) | ||
8172 | else | ||
8173 | ssid_len = ssid[1]; | ||
8174 | |||
8175 | - ieee80211_send_probe_req(sdata, sdata->vif.addr, NULL, | ||
8176 | + ieee80211_send_probe_req(sdata, sdata->vif.addr, dst, | ||
8177 | ssid + 2, ssid_len, NULL, | ||
8178 | 0, (u32) -1, true, 0, | ||
8179 | ifmgd->associated->channel, false); | ||
8180 | diff --git a/net/netlink/af_netlink.c b/net/netlink/af_netlink.c | ||
8181 | index 05919bf3f670..d1d7a8166f46 100644 | ||
8182 | --- a/net/netlink/af_netlink.c | ||
8183 | +++ b/net/netlink/af_netlink.c | ||
8184 | @@ -1616,13 +1616,11 @@ static struct sk_buff *netlink_alloc_large_skb(unsigned int size, | ||
8185 | if (data == NULL) | ||
8186 | return NULL; | ||
8187 | |||
8188 | - skb = build_skb(data, size); | ||
8189 | + skb = __build_skb(data, size); | ||
8190 | if (skb == NULL) | ||
8191 | vfree(data); | ||
8192 | - else { | ||
8193 | - skb->head_frag = 0; | ||
8194 | + else | ||
8195 | skb->destructor = netlink_skb_destructor; | ||
8196 | - } | ||
8197 | |||
8198 | return skb; | ||
8199 | } | ||
8200 | diff --git a/sound/pci/emu10k1/emuproc.c b/sound/pci/emu10k1/emuproc.c | ||
8201 | index 2ca9f2e93139..53745f4c2bf5 100644 | ||
8202 | --- a/sound/pci/emu10k1/emuproc.c | ||
8203 | +++ b/sound/pci/emu10k1/emuproc.c | ||
8204 | @@ -241,31 +241,22 @@ static void snd_emu10k1_proc_spdif_read(struct snd_info_entry *entry, | ||
8205 | struct snd_emu10k1 *emu = entry->private_data; | ||
8206 | u32 value; | ||
8207 | u32 value2; | ||
8208 | - unsigned long flags; | ||
8209 | u32 rate; | ||
8210 | |||
8211 | if (emu->card_capabilities->emu_model) { | ||
8212 | - spin_lock_irqsave(&emu->emu_lock, flags); | ||
8213 | snd_emu1010_fpga_read(emu, 0x38, &value); | ||
8214 | - spin_unlock_irqrestore(&emu->emu_lock, flags); | ||
8215 | if ((value & 0x1) == 0) { | ||
8216 | - spin_lock_irqsave(&emu->emu_lock, flags); | ||
8217 | snd_emu1010_fpga_read(emu, 0x2a, &value); | ||
8218 | snd_emu1010_fpga_read(emu, 0x2b, &value2); | ||
8219 | - spin_unlock_irqrestore(&emu->emu_lock, flags); | ||
8220 | rate = 0x1770000 / (((value << 5) | value2)+1); | ||
8221 | snd_iprintf(buffer, "ADAT Locked : %u\n", rate); | ||
8222 | } else { | ||
8223 | snd_iprintf(buffer, "ADAT Unlocked\n"); | ||
8224 | } | ||
8225 | - spin_lock_irqsave(&emu->emu_lock, flags); | ||
8226 | snd_emu1010_fpga_read(emu, 0x20, &value); | ||
8227 | - spin_unlock_irqrestore(&emu->emu_lock, flags); | ||
8228 | if ((value & 0x4) == 0) { | ||
8229 | - spin_lock_irqsave(&emu->emu_lock, flags); | ||
8230 | snd_emu1010_fpga_read(emu, 0x28, &value); | ||
8231 | snd_emu1010_fpga_read(emu, 0x29, &value2); | ||
8232 | - spin_unlock_irqrestore(&emu->emu_lock, flags); | ||
8233 | rate = 0x1770000 / (((value << 5) | value2)+1); | ||
8234 | snd_iprintf(buffer, "SPDIF Locked : %d\n", rate); | ||
8235 | } else { | ||
8236 | @@ -410,14 +401,11 @@ static void snd_emu_proc_emu1010_reg_read(struct snd_info_entry *entry, | ||
8237 | { | ||
8238 | struct snd_emu10k1 *emu = entry->private_data; | ||
8239 | u32 value; | ||
8240 | - unsigned long flags; | ||
8241 | int i; | ||
8242 | snd_iprintf(buffer, "EMU1010 Registers:\n\n"); | ||
8243 | |||
8244 | for(i = 0; i < 0x40; i+=1) { | ||
8245 | - spin_lock_irqsave(&emu->emu_lock, flags); | ||
8246 | snd_emu1010_fpga_read(emu, i, &value); | ||
8247 | - spin_unlock_irqrestore(&emu->emu_lock, flags); | ||
8248 | snd_iprintf(buffer, "%02X: %08X, %02X\n", i, value, (value >> 8) & 0x7f); | ||
8249 | } | ||
8250 | } | ||
8251 | diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c | ||
8252 | index f9d12c0a7e5a..2fd490b1764b 100644 | ||
8253 | --- a/sound/pci/hda/patch_realtek.c | ||
8254 | +++ b/sound/pci/hda/patch_realtek.c | ||
8255 | @@ -5047,12 +5047,14 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = { | ||
8256 | SND_PCI_QUIRK(0x17aa, 0x2212, "Thinkpad T440", ALC292_FIXUP_TPT440_DOCK), | ||
8257 | SND_PCI_QUIRK(0x17aa, 0x2214, "Thinkpad X240", ALC292_FIXUP_TPT440_DOCK), | ||
8258 | SND_PCI_QUIRK(0x17aa, 0x2215, "Thinkpad", ALC269_FIXUP_LIMIT_INT_MIC_BOOST), | ||
8259 | + SND_PCI_QUIRK(0x17aa, 0x2226, "ThinkPad X250", ALC292_FIXUP_TPT440_DOCK), | ||
8260 | SND_PCI_QUIRK(0x17aa, 0x3977, "IdeaPad S210", ALC283_FIXUP_INT_MIC), | ||
8261 | SND_PCI_QUIRK(0x17aa, 0x3978, "IdeaPad Y410P", ALC269_FIXUP_NO_SHUTUP), | ||
8262 | SND_PCI_QUIRK(0x17aa, 0x5013, "Thinkpad", ALC269_FIXUP_LIMIT_INT_MIC_BOOST), | ||
8263 | SND_PCI_QUIRK(0x17aa, 0x501a, "Thinkpad", ALC283_FIXUP_INT_MIC), | ||
8264 | SND_PCI_QUIRK(0x17aa, 0x501e, "Thinkpad L440", ALC292_FIXUP_TPT440_DOCK), | ||
8265 | SND_PCI_QUIRK(0x17aa, 0x5026, "Thinkpad", ALC269_FIXUP_LIMIT_INT_MIC_BOOST), | ||
8266 | + SND_PCI_QUIRK(0x17aa, 0x5034, "Thinkpad T450", ALC292_FIXUP_TPT440_DOCK), | ||
8267 | SND_PCI_QUIRK(0x17aa, 0x5036, "Thinkpad T450s", ALC292_FIXUP_TPT440_DOCK), | ||
8268 | SND_PCI_QUIRK(0x17aa, 0x5109, "Thinkpad", ALC269_FIXUP_LIMIT_INT_MIC_BOOST), | ||
8269 | SND_PCI_QUIRK(0x17aa, 0x3bf8, "Quanta FL1", ALC269_FIXUP_PCM_44K), | ||
8270 | @@ -5142,6 +5144,16 @@ static const struct hda_model_fixup alc269_fixup_models[] = { | ||
8271 | {0x1b, 0x411111f0}, \ | ||
8272 | {0x1e, 0x411111f0} | ||
8273 | |||
8274 | +#define ALC256_STANDARD_PINS \ | ||
8275 | + {0x12, 0x90a60140}, \ | ||
8276 | + {0x14, 0x90170110}, \ | ||
8277 | + {0x19, 0x411111f0}, \ | ||
8278 | + {0x1a, 0x411111f0}, \ | ||
8279 | + {0x1b, 0x411111f0}, \ | ||
8280 | + {0x1d, 0x40700001}, \ | ||
8281 | + {0x1e, 0x411111f0}, \ | ||
8282 | + {0x21, 0x02211020} | ||
8283 | + | ||
8284 | #define ALC282_STANDARD_PINS \ | ||
8285 | {0x14, 0x90170110}, \ | ||
8286 | {0x18, 0x411111f0}, \ | ||
8287 | @@ -5235,15 +5247,11 @@ static const struct snd_hda_pin_quirk alc269_pin_fixup_tbl[] = { | ||
8288 | {0x1d, 0x40700001}, | ||
8289 | {0x21, 0x02211050}), | ||
8290 | SND_HDA_PIN_QUIRK(0x10ec0256, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE, | ||
8291 | - {0x12, 0x90a60140}, | ||
8292 | - {0x13, 0x40000000}, | ||
8293 | - {0x14, 0x90170110}, | ||
8294 | - {0x19, 0x411111f0}, | ||
8295 | - {0x1a, 0x411111f0}, | ||
8296 | - {0x1b, 0x411111f0}, | ||
8297 | - {0x1d, 0x40700001}, | ||
8298 | - {0x1e, 0x411111f0}, | ||
8299 | - {0x21, 0x02211020}), | ||
8300 | + ALC256_STANDARD_PINS, | ||
8301 | + {0x13, 0x40000000}), | ||
8302 | + SND_HDA_PIN_QUIRK(0x10ec0256, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE, | ||
8303 | + ALC256_STANDARD_PINS, | ||
8304 | + {0x13, 0x411111f0}), | ||
8305 | SND_HDA_PIN_QUIRK(0x10ec0280, 0x103c, "HP", ALC280_FIXUP_HP_GPIO4, | ||
8306 | {0x12, 0x90a60130}, | ||
8307 | {0x13, 0x40000000}, | ||
8308 | @@ -5563,6 +5571,8 @@ static int patch_alc269(struct hda_codec *codec) | ||
8309 | break; | ||
8310 | case 0x10ec0256: | ||
8311 | spec->codec_variant = ALC269_TYPE_ALC256; | ||
8312 | + spec->gen.mixer_nid = 0; /* ALC256 does not have any loopback mixer path */ | ||
8313 | + alc_update_coef_idx(codec, 0x36, 1 << 13, 1 << 5); /* Switch pcbeep path to Line in path*/ | ||
8314 | break; | ||
8315 | } | ||
8316 | |||
8317 | @@ -5576,8 +5586,8 @@ static int patch_alc269(struct hda_codec *codec) | ||
8318 | if (err < 0) | ||
8319 | goto error; | ||
8320 | |||
8321 | - if (!spec->gen.no_analog && spec->gen.beep_nid) | ||
8322 | - set_beep_amp(spec, 0x0b, 0x04, HDA_INPUT); | ||
8323 | + if (!spec->gen.no_analog && spec->gen.beep_nid && spec->gen.mixer_nid) | ||
8324 | + set_beep_amp(spec, spec->gen.mixer_nid, 0x04, HDA_INPUT); | ||
8325 | |||
8326 | codec->patch_ops = alc_patch_ops; | ||
8327 | #ifdef CONFIG_PM | ||
8328 | diff --git a/sound/soc/codecs/cs4271.c b/sound/soc/codecs/cs4271.c | ||
8329 | index 7d3a6accaf9a..e770ee6f36da 100644 | ||
8330 | --- a/sound/soc/codecs/cs4271.c | ||
8331 | +++ b/sound/soc/codecs/cs4271.c | ||
8332 | @@ -561,10 +561,10 @@ static int cs4271_codec_probe(struct snd_soc_codec *codec) | ||
8333 | if (gpio_is_valid(cs4271->gpio_nreset)) { | ||
8334 | /* Reset codec */ | ||
8335 | gpio_direction_output(cs4271->gpio_nreset, 0); | ||
8336 | - udelay(1); | ||
8337 | + mdelay(1); | ||
8338 | gpio_set_value(cs4271->gpio_nreset, 1); | ||
8339 | /* Give the codec time to wake up */ | ||
8340 | - udelay(1); | ||
8341 | + mdelay(1); | ||
8342 | } | ||
8343 | |||
8344 | ret = regmap_update_bits(cs4271->regmap, CS4271_MODE2, | ||
8345 | diff --git a/sound/soc/codecs/pcm512x.c b/sound/soc/codecs/pcm512x.c | ||
8346 | index 474cae82a874..8c09e3ffdcaa 100644 | ||
8347 | --- a/sound/soc/codecs/pcm512x.c | ||
8348 | +++ b/sound/soc/codecs/pcm512x.c | ||
8349 | @@ -304,9 +304,9 @@ static const struct soc_enum pcm512x_veds = | ||
8350 | static const struct snd_kcontrol_new pcm512x_controls[] = { | ||
8351 | SOC_DOUBLE_R_TLV("Digital Playback Volume", PCM512x_DIGITAL_VOLUME_2, | ||
8352 | PCM512x_DIGITAL_VOLUME_3, 0, 255, 1, digital_tlv), | ||
8353 | -SOC_DOUBLE_TLV("Playback Volume", PCM512x_ANALOG_GAIN_CTRL, | ||
8354 | +SOC_DOUBLE_TLV("Analogue Playback Volume", PCM512x_ANALOG_GAIN_CTRL, | ||
8355 | PCM512x_LAGN_SHIFT, PCM512x_RAGN_SHIFT, 1, 1, analog_tlv), | ||
8356 | -SOC_DOUBLE_TLV("Playback Boost Volume", PCM512x_ANALOG_GAIN_BOOST, | ||
8357 | +SOC_DOUBLE_TLV("Analogue Playback Boost Volume", PCM512x_ANALOG_GAIN_BOOST, | ||
8358 | PCM512x_AGBL_SHIFT, PCM512x_AGBR_SHIFT, 1, 0, boost_tlv), | ||
8359 | SOC_DOUBLE("Digital Playback Switch", PCM512x_MUTE, PCM512x_RQML_SHIFT, | ||
8360 | PCM512x_RQMR_SHIFT, 1, 1), | ||
8361 | @@ -576,8 +576,8 @@ static int pcm512x_find_pll_coeff(struct snd_soc_dai *dai, | ||
8362 | |||
8363 | /* pllin_rate / P (or here, den) cannot be greater than 20 MHz */ | ||
8364 | if (pllin_rate / den > 20000000 && num < 8) { | ||
8365 | - num *= 20000000 / (pllin_rate / den); | ||
8366 | - den *= 20000000 / (pllin_rate / den); | ||
8367 | + num *= DIV_ROUND_UP(pllin_rate / den, 20000000); | ||
8368 | + den *= DIV_ROUND_UP(pllin_rate / den, 20000000); | ||
8369 | } | ||
8370 | dev_dbg(dev, "num / den = %lu / %lu\n", num, den); | ||
8371 | |||
8372 | diff --git a/sound/soc/codecs/wm8741.c b/sound/soc/codecs/wm8741.c | ||
8373 | index 31bb4801a005..9e71c768966f 100644 | ||
8374 | --- a/sound/soc/codecs/wm8741.c | ||
8375 | +++ b/sound/soc/codecs/wm8741.c | ||
8376 | @@ -123,7 +123,7 @@ static struct { | ||
8377 | }; | ||
8378 | |||
8379 | static const unsigned int rates_11289[] = { | ||
8380 | - 44100, 88235, | ||
8381 | + 44100, 88200, | ||
8382 | }; | ||
8383 | |||
8384 | static const struct snd_pcm_hw_constraint_list constraints_11289 = { | ||
8385 | @@ -150,7 +150,7 @@ static const struct snd_pcm_hw_constraint_list constraints_16384 = { | ||
8386 | }; | ||
8387 | |||
8388 | static const unsigned int rates_16934[] = { | ||
8389 | - 44100, 88235, | ||
8390 | + 44100, 88200, | ||
8391 | }; | ||
8392 | |||
8393 | static const struct snd_pcm_hw_constraint_list constraints_16934 = { | ||
8394 | @@ -168,7 +168,7 @@ static const struct snd_pcm_hw_constraint_list constraints_18432 = { | ||
8395 | }; | ||
8396 | |||
8397 | static const unsigned int rates_22579[] = { | ||
8398 | - 44100, 88235, 1764000 | ||
8399 | + 44100, 88200, 176400 | ||
8400 | }; | ||
8401 | |||
8402 | static const struct snd_pcm_hw_constraint_list constraints_22579 = { | ||
8403 | @@ -186,7 +186,7 @@ static const struct snd_pcm_hw_constraint_list constraints_24576 = { | ||
8404 | }; | ||
8405 | |||
8406 | static const unsigned int rates_36864[] = { | ||
8407 | - 48000, 96000, 19200 | ||
8408 | + 48000, 96000, 192000 | ||
8409 | }; | ||
8410 | |||
8411 | static const struct snd_pcm_hw_constraint_list constraints_36864 = { | ||
8412 | diff --git a/sound/soc/davinci/davinci-evm.c b/sound/soc/davinci/davinci-evm.c | ||
8413 | index b6bb5947a8a8..8c2b9be80a9a 100644 | ||
8414 | --- a/sound/soc/davinci/davinci-evm.c | ||
8415 | +++ b/sound/soc/davinci/davinci-evm.c | ||
8416 | @@ -425,18 +425,8 @@ static int davinci_evm_probe(struct platform_device *pdev) | ||
8417 | return ret; | ||
8418 | } | ||
8419 | |||
8420 | -static int davinci_evm_remove(struct platform_device *pdev) | ||
8421 | -{ | ||
8422 | - struct snd_soc_card *card = platform_get_drvdata(pdev); | ||
8423 | - | ||
8424 | - snd_soc_unregister_card(card); | ||
8425 | - | ||
8426 | - return 0; | ||
8427 | -} | ||
8428 | - | ||
8429 | static struct platform_driver davinci_evm_driver = { | ||
8430 | .probe = davinci_evm_probe, | ||
8431 | - .remove = davinci_evm_remove, | ||
8432 | .driver = { | ||
8433 | .name = "davinci_evm", | ||
8434 | .pm = &snd_soc_pm_ops, | ||
8435 | diff --git a/sound/usb/quirks.c b/sound/usb/quirks.c | ||
8436 | index 9a28365126f9..32631a86078b 100644 | ||
8437 | --- a/sound/usb/quirks.c | ||
8438 | +++ b/sound/usb/quirks.c | ||
8439 | @@ -1115,6 +1115,7 @@ bool snd_usb_get_sample_rate_quirk(struct snd_usb_audio *chip) | ||
8440 | { | ||
8441 | /* devices which do not support reading the sample rate. */ | ||
8442 | switch (chip->usb_id) { | ||
8443 | + case USB_ID(0x045E, 0x075D): /* MS Lifecam Cinema */ | ||
8444 | case USB_ID(0x045E, 0x076D): /* MS Lifecam HD-5000 */ | ||
8445 | case USB_ID(0x04D8, 0xFEEA): /* Benchmark DAC1 Pre */ | ||
8446 | return true; | ||
8447 | diff --git a/tools/lib/traceevent/kbuffer-parse.c b/tools/lib/traceevent/kbuffer-parse.c | ||
8448 | index dcc665228c71..deb3569ab004 100644 | ||
8449 | --- a/tools/lib/traceevent/kbuffer-parse.c | ||
8450 | +++ b/tools/lib/traceevent/kbuffer-parse.c | ||
8451 | @@ -372,7 +372,6 @@ translate_data(struct kbuffer *kbuf, void *data, void **rptr, | ||
8452 | switch (type_len) { | ||
8453 | case KBUFFER_TYPE_PADDING: | ||
8454 | *length = read_4(kbuf, data); | ||
8455 | - data += *length; | ||
8456 | break; | ||
8457 | |||
8458 | case KBUFFER_TYPE_TIME_EXTEND: | ||
8459 | diff --git a/tools/perf/config/Makefile b/tools/perf/config/Makefile | ||
8460 | index cc224080b525..0884d31ae12e 100644 | ||
8461 | --- a/tools/perf/config/Makefile | ||
8462 | +++ b/tools/perf/config/Makefile | ||
8463 | @@ -651,7 +651,7 @@ ifeq (${IS_64_BIT}, 1) | ||
8464 | NO_PERF_READ_VDSO32 := 1 | ||
8465 | endif | ||
8466 | endif | ||
8467 | - ifneq (${IS_X86_64}, 1) | ||
8468 | + ifneq ($(ARCH), x86) | ||
8469 | NO_PERF_READ_VDSOX32 := 1 | ||
8470 | endif | ||
8471 | ifndef NO_PERF_READ_VDSOX32 | ||
8472 | @@ -699,7 +699,7 @@ sysconfdir = $(prefix)/etc | ||
8473 | ETC_PERFCONFIG = etc/perfconfig | ||
8474 | endif | ||
8475 | ifndef lib | ||
8476 | -ifeq ($(IS_X86_64),1) | ||
8477 | +ifeq ($(ARCH)$(IS_64_BIT), x861) | ||
8478 | lib = lib64 | ||
8479 | else | ||
8480 | lib = lib | ||
8481 | diff --git a/tools/perf/tests/make b/tools/perf/tests/make | ||
8482 | index 75709d2b17b4..bff85324f799 100644 | ||
8483 | --- a/tools/perf/tests/make | ||
8484 | +++ b/tools/perf/tests/make | ||
8485 | @@ -5,7 +5,7 @@ include config/Makefile.arch | ||
8486 | |||
8487 | # FIXME looks like x86 is the only arch running tests ;-) | ||
8488 | # we need some IS_(32/64) flag to make this generic | ||
8489 | -ifeq ($(IS_X86_64),1) | ||
8490 | +ifeq ($(ARCH)$(IS_64_BIT), x861) | ||
8491 | lib = lib64 | ||
8492 | else | ||
8493 | lib = lib | ||
8494 | diff --git a/tools/perf/util/cloexec.c b/tools/perf/util/cloexec.c | ||
8495 | index 6da965bdbc2c..85b523885f9d 100644 | ||
8496 | --- a/tools/perf/util/cloexec.c | ||
8497 | +++ b/tools/perf/util/cloexec.c | ||
8498 | @@ -7,6 +7,12 @@ | ||
8499 | |||
8500 | static unsigned long flag = PERF_FLAG_FD_CLOEXEC; | ||
8501 | |||
8502 | +int __weak sched_getcpu(void) | ||
8503 | +{ | ||
8504 | + errno = ENOSYS; | ||
8505 | + return -1; | ||
8506 | +} | ||
8507 | + | ||
8508 | static int perf_flag_probe(void) | ||
8509 | { | ||
8510 | /* use 'safest' configuration as used in perf_evsel__fallback() */ | ||
8511 | diff --git a/tools/perf/util/cloexec.h b/tools/perf/util/cloexec.h | ||
8512 | index 94a5a7d829d5..68888c29b04a 100644 | ||
8513 | --- a/tools/perf/util/cloexec.h | ||
8514 | +++ b/tools/perf/util/cloexec.h | ||
8515 | @@ -3,4 +3,10 @@ | ||
8516 | |||
8517 | unsigned long perf_event_open_cloexec_flag(void); | ||
8518 | |||
8519 | +#ifdef __GLIBC_PREREQ | ||
8520 | +#if !__GLIBC_PREREQ(2, 6) | ||
8521 | +extern int sched_getcpu(void) __THROW; | ||
8522 | +#endif | ||
8523 | +#endif | ||
8524 | + | ||
8525 | #endif /* __PERF_CLOEXEC_H */ | ||
8526 | diff --git a/tools/perf/util/symbol-elf.c b/tools/perf/util/symbol-elf.c | ||
8527 | index 33b7a2aef713..9bdf007d243a 100644 | ||
8528 | --- a/tools/perf/util/symbol-elf.c | ||
8529 | +++ b/tools/perf/util/symbol-elf.c | ||
8530 | @@ -74,6 +74,10 @@ static inline uint8_t elf_sym__type(const GElf_Sym *sym) | ||
8531 | return GELF_ST_TYPE(sym->st_info); | ||
8532 | } | ||
8533 | |||
8534 | +#ifndef STT_GNU_IFUNC | ||
8535 | +#define STT_GNU_IFUNC 10 | ||
8536 | +#endif | ||
8537 | + | ||
8538 | static inline int elf_sym__is_function(const GElf_Sym *sym) | ||
8539 | { | ||
8540 | return (elf_sym__type(sym) == STT_FUNC || | ||
8541 | diff --git a/tools/power/x86/turbostat/Makefile b/tools/power/x86/turbostat/Makefile | ||
8542 | index d1b3a361e526..4039854560d0 100644 | ||
8543 | --- a/tools/power/x86/turbostat/Makefile | ||
8544 | +++ b/tools/power/x86/turbostat/Makefile | ||
8545 | @@ -1,8 +1,12 @@ | ||
8546 | CC = $(CROSS_COMPILE)gcc | ||
8547 | -BUILD_OUTPUT := $(PWD) | ||
8548 | +BUILD_OUTPUT := $(CURDIR) | ||
8549 | PREFIX := /usr | ||
8550 | DESTDIR := | ||
8551 | |||
8552 | +ifeq ("$(origin O)", "command line") | ||
8553 | + BUILD_OUTPUT := $(O) | ||
8554 | +endif | ||
8555 | + | ||
8556 | turbostat : turbostat.c | ||
8557 | CFLAGS += -Wall | ||
8558 | CFLAGS += -DMSRHEADER='"../../../../arch/x86/include/uapi/asm/msr-index.h"' | ||
8559 | diff --git a/virt/kvm/arm/vgic.c b/virt/kvm/arm/vgic.c | ||
8560 | index c9f60f524588..e5abe7cb2990 100644 | ||
8561 | --- a/virt/kvm/arm/vgic.c | ||
8562 | +++ b/virt/kvm/arm/vgic.c | ||
8563 | @@ -1371,6 +1371,9 @@ int kvm_vgic_inject_irq(struct kvm *kvm, int cpuid, unsigned int irq_num, | ||
8564 | goto out; | ||
8565 | } | ||
8566 | |||
8567 | + if (irq_num >= kvm->arch.vgic.nr_irqs) | ||
8568 | + return -EINVAL; | ||
8569 | + | ||
8570 | vcpu_id = vgic_update_irq_pending(kvm, cpuid, irq_num, level); | ||
8571 | if (vcpu_id >= 0) { | ||
8572 | /* kick the specified vcpu */ | ||
8573 | diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c | ||
8574 | index cc6a25d95fbf..f8f3f5fe53d3 100644 | ||
8575 | --- a/virt/kvm/kvm_main.c | ||
8576 | +++ b/virt/kvm/kvm_main.c | ||
8577 | @@ -1653,8 +1653,8 @@ int kvm_gfn_to_hva_cache_init(struct kvm *kvm, struct gfn_to_hva_cache *ghc, | ||
8578 | ghc->generation = slots->generation; | ||
8579 | ghc->len = len; | ||
8580 | ghc->memslot = gfn_to_memslot(kvm, start_gfn); | ||
8581 | - ghc->hva = gfn_to_hva_many(ghc->memslot, start_gfn, &nr_pages_avail); | ||
8582 | - if (!kvm_is_error_hva(ghc->hva) && nr_pages_avail >= nr_pages_needed) { | ||
8583 | + ghc->hva = gfn_to_hva_many(ghc->memslot, start_gfn, NULL); | ||
8584 | + if (!kvm_is_error_hva(ghc->hva) && nr_pages_needed <= 1) { | ||
8585 | ghc->hva += offset; | ||
8586 | } else { | ||
8587 | /* |