Annotation of /trunk/kernel-alx/patches-4.4/0105-4.4.6-all-fixes.patch
Parent Directory | Revision Log
Revision 2797 -
(hide annotations)
(download)
Mon May 30 12:45:49 2016 UTC (8 years, 3 months ago) by niro
File size: 62189 byte(s)
Mon May 30 12:45:49 2016 UTC (8 years, 3 months ago) by niro
File size: 62189 byte(s)
-linux-4.4.6
1 | niro | 2797 | diff --git a/Documentation/devicetree/bindings/arm/omap/omap.txt b/Documentation/devicetree/bindings/arm/omap/omap.txt |
2 | index 9f4e5136e568..12af302bca6a 100644 | ||
3 | --- a/Documentation/devicetree/bindings/arm/omap/omap.txt | ||
4 | +++ b/Documentation/devicetree/bindings/arm/omap/omap.txt | ||
5 | @@ -23,6 +23,7 @@ Optional properties: | ||
6 | during suspend. | ||
7 | - ti,no-reset-on-init: When present, the module should not be reset at init | ||
8 | - ti,no-idle-on-init: When present, the module should not be idled at init | ||
9 | +- ti,no-idle: When present, the module is never allowed to idle. | ||
10 | |||
11 | Example: | ||
12 | |||
13 | diff --git a/Documentation/virtual/kvm/mmu.txt b/Documentation/virtual/kvm/mmu.txt | ||
14 | index 3a4d681c3e98..b653641d4261 100644 | ||
15 | --- a/Documentation/virtual/kvm/mmu.txt | ||
16 | +++ b/Documentation/virtual/kvm/mmu.txt | ||
17 | @@ -358,7 +358,8 @@ In the first case there are two additional complications: | ||
18 | - if CR4.SMEP is enabled: since we've turned the page into a kernel page, | ||
19 | the kernel may now execute it. We handle this by also setting spte.nx. | ||
20 | If we get a user fetch or read fault, we'll change spte.u=1 and | ||
21 | - spte.nx=gpte.nx back. | ||
22 | + spte.nx=gpte.nx back. For this to work, KVM forces EFER.NX to 1 when | ||
23 | + shadow paging is in use. | ||
24 | - if CR4.SMAP is disabled: since the page has been changed to a kernel | ||
25 | page, it can not be reused when CR4.SMAP is enabled. We set | ||
26 | CR4.SMAP && !CR0.WP into shadow page's role to avoid this case. Note, | ||
27 | diff --git a/Makefile b/Makefile | ||
28 | index d13322ade3a0..87d12b44ab66 100644 | ||
29 | --- a/Makefile | ||
30 | +++ b/Makefile | ||
31 | @@ -1,6 +1,6 @@ | ||
32 | VERSION = 4 | ||
33 | PATCHLEVEL = 4 | ||
34 | -SUBLEVEL = 5 | ||
35 | +SUBLEVEL = 6 | ||
36 | EXTRAVERSION = | ||
37 | NAME = Blurry Fish Butt | ||
38 | |||
39 | diff --git a/arch/arm/boot/dts/armada-xp-axpwifiap.dts b/arch/arm/boot/dts/armada-xp-axpwifiap.dts | ||
40 | index 23fc670c0427..5c21b236721f 100644 | ||
41 | --- a/arch/arm/boot/dts/armada-xp-axpwifiap.dts | ||
42 | +++ b/arch/arm/boot/dts/armada-xp-axpwifiap.dts | ||
43 | @@ -70,8 +70,8 @@ | ||
44 | soc { | ||
45 | ranges = <MBUS_ID(0xf0, 0x01) 0 0 0xf1000000 0x100000 | ||
46 | MBUS_ID(0x01, 0x1d) 0 0 0xfff00000 0x100000 | ||
47 | - MBUS_ID(0x09, 0x09) 0 0 0xf8100000 0x10000 | ||
48 | - MBUS_ID(0x09, 0x05) 0 0 0xf8110000 0x10000>; | ||
49 | + MBUS_ID(0x09, 0x09) 0 0 0xf1100000 0x10000 | ||
50 | + MBUS_ID(0x09, 0x05) 0 0 0xf1110000 0x10000>; | ||
51 | |||
52 | pcie-controller { | ||
53 | status = "okay"; | ||
54 | diff --git a/arch/arm/boot/dts/armada-xp-db.dts b/arch/arm/boot/dts/armada-xp-db.dts | ||
55 | index f774101416a5..ebe1d267406d 100644 | ||
56 | --- a/arch/arm/boot/dts/armada-xp-db.dts | ||
57 | +++ b/arch/arm/boot/dts/armada-xp-db.dts | ||
58 | @@ -76,8 +76,8 @@ | ||
59 | ranges = <MBUS_ID(0xf0, 0x01) 0 0 0xf1000000 0x100000 | ||
60 | MBUS_ID(0x01, 0x1d) 0 0 0xfff00000 0x100000 | ||
61 | MBUS_ID(0x01, 0x2f) 0 0 0xf0000000 0x1000000 | ||
62 | - MBUS_ID(0x09, 0x09) 0 0 0xf8100000 0x10000 | ||
63 | - MBUS_ID(0x09, 0x05) 0 0 0xf8110000 0x10000>; | ||
64 | + MBUS_ID(0x09, 0x09) 0 0 0xf1100000 0x10000 | ||
65 | + MBUS_ID(0x09, 0x05) 0 0 0xf1110000 0x10000>; | ||
66 | |||
67 | devbus-bootcs { | ||
68 | status = "okay"; | ||
69 | diff --git a/arch/arm/boot/dts/armada-xp-gp.dts b/arch/arm/boot/dts/armada-xp-gp.dts | ||
70 | index 4878d7353069..5730b875c4f5 100644 | ||
71 | --- a/arch/arm/boot/dts/armada-xp-gp.dts | ||
72 | +++ b/arch/arm/boot/dts/armada-xp-gp.dts | ||
73 | @@ -95,8 +95,8 @@ | ||
74 | ranges = <MBUS_ID(0xf0, 0x01) 0 0 0xf1000000 0x100000 | ||
75 | MBUS_ID(0x01, 0x1d) 0 0 0xfff00000 0x100000 | ||
76 | MBUS_ID(0x01, 0x2f) 0 0 0xf0000000 0x1000000 | ||
77 | - MBUS_ID(0x09, 0x09) 0 0 0xf8100000 0x10000 | ||
78 | - MBUS_ID(0x09, 0x05) 0 0 0xf8110000 0x10000>; | ||
79 | + MBUS_ID(0x09, 0x09) 0 0 0xf1100000 0x10000 | ||
80 | + MBUS_ID(0x09, 0x05) 0 0 0xf1110000 0x10000>; | ||
81 | |||
82 | devbus-bootcs { | ||
83 | status = "okay"; | ||
84 | diff --git a/arch/arm/boot/dts/armada-xp-lenovo-ix4-300d.dts b/arch/arm/boot/dts/armada-xp-lenovo-ix4-300d.dts | ||
85 | index 58b500873bfd..d960fef77ca1 100644 | ||
86 | --- a/arch/arm/boot/dts/armada-xp-lenovo-ix4-300d.dts | ||
87 | +++ b/arch/arm/boot/dts/armada-xp-lenovo-ix4-300d.dts | ||
88 | @@ -65,8 +65,8 @@ | ||
89 | soc { | ||
90 | ranges = <MBUS_ID(0xf0, 0x01) 0 0 0xd0000000 0x100000 | ||
91 | MBUS_ID(0x01, 0x1d) 0 0 0xfff00000 0x100000 | ||
92 | - MBUS_ID(0x09, 0x09) 0 0 0xf8100000 0x10000 | ||
93 | - MBUS_ID(0x09, 0x05) 0 0 0xf8110000 0x10000>; | ||
94 | + MBUS_ID(0x09, 0x09) 0 0 0xf1100000 0x10000 | ||
95 | + MBUS_ID(0x09, 0x05) 0 0 0xf1110000 0x10000>; | ||
96 | |||
97 | pcie-controller { | ||
98 | status = "okay"; | ||
99 | diff --git a/arch/arm/boot/dts/armada-xp-linksys-mamba.dts b/arch/arm/boot/dts/armada-xp-linksys-mamba.dts | ||
100 | index 6e9820e141f8..b89e6cf1271a 100644 | ||
101 | --- a/arch/arm/boot/dts/armada-xp-linksys-mamba.dts | ||
102 | +++ b/arch/arm/boot/dts/armada-xp-linksys-mamba.dts | ||
103 | @@ -70,8 +70,8 @@ | ||
104 | soc { | ||
105 | ranges = <MBUS_ID(0xf0, 0x01) 0 0 0xf1000000 0x100000 | ||
106 | MBUS_ID(0x01, 0x1d) 0 0 0xfff00000 0x100000 | ||
107 | - MBUS_ID(0x09, 0x09) 0 0 0xf8100000 0x10000 | ||
108 | - MBUS_ID(0x09, 0x05) 0 0 0xf8110000 0x10000>; | ||
109 | + MBUS_ID(0x09, 0x09) 0 0 0xf1100000 0x10000 | ||
110 | + MBUS_ID(0x09, 0x05) 0 0 0xf1110000 0x10000>; | ||
111 | |||
112 | pcie-controller { | ||
113 | status = "okay"; | ||
114 | diff --git a/arch/arm/boot/dts/armada-xp-matrix.dts b/arch/arm/boot/dts/armada-xp-matrix.dts | ||
115 | index 6ab33837a2b6..6522b04f4a8e 100644 | ||
116 | --- a/arch/arm/boot/dts/armada-xp-matrix.dts | ||
117 | +++ b/arch/arm/boot/dts/armada-xp-matrix.dts | ||
118 | @@ -68,8 +68,8 @@ | ||
119 | soc { | ||
120 | ranges = <MBUS_ID(0xf0, 0x01) 0 0 0xf1000000 0x100000 | ||
121 | MBUS_ID(0x01, 0x1d) 0 0 0xfff00000 0x100000 | ||
122 | - MBUS_ID(0x09, 0x09) 0 0 0xf8100000 0x10000 | ||
123 | - MBUS_ID(0x09, 0x05) 0 0 0xf8110000 0x10000>; | ||
124 | + MBUS_ID(0x09, 0x09) 0 0 0xf1100000 0x10000 | ||
125 | + MBUS_ID(0x09, 0x05) 0 0 0xf1110000 0x10000>; | ||
126 | |||
127 | internal-regs { | ||
128 | serial@12000 { | ||
129 | diff --git a/arch/arm/boot/dts/armada-xp-netgear-rn2120.dts b/arch/arm/boot/dts/armada-xp-netgear-rn2120.dts | ||
130 | index 6fe8972de0a2..db54c7158a36 100644 | ||
131 | --- a/arch/arm/boot/dts/armada-xp-netgear-rn2120.dts | ||
132 | +++ b/arch/arm/boot/dts/armada-xp-netgear-rn2120.dts | ||
133 | @@ -64,8 +64,8 @@ | ||
134 | soc { | ||
135 | ranges = <MBUS_ID(0xf0, 0x01) 0 0 0xd0000000 0x100000 | ||
136 | MBUS_ID(0x01, 0x1d) 0 0 0xfff00000 0x100000 | ||
137 | - MBUS_ID(0x09, 0x09) 0 0 0xf8100000 0x10000 | ||
138 | - MBUS_ID(0x09, 0x05) 0 0 0xf8110000 0x10000>; | ||
139 | + MBUS_ID(0x09, 0x09) 0 0 0xf1100000 0x10000 | ||
140 | + MBUS_ID(0x09, 0x05) 0 0 0xf1110000 0x10000>; | ||
141 | |||
142 | pcie-controller { | ||
143 | status = "okay"; | ||
144 | diff --git a/arch/arm/boot/dts/armada-xp-openblocks-ax3-4.dts b/arch/arm/boot/dts/armada-xp-openblocks-ax3-4.dts | ||
145 | index a5db17782e08..853bd392a4fe 100644 | ||
146 | --- a/arch/arm/boot/dts/armada-xp-openblocks-ax3-4.dts | ||
147 | +++ b/arch/arm/boot/dts/armada-xp-openblocks-ax3-4.dts | ||
148 | @@ -65,9 +65,9 @@ | ||
149 | soc { | ||
150 | ranges = <MBUS_ID(0xf0, 0x01) 0 0 0xd0000000 0x100000 | ||
151 | MBUS_ID(0x01, 0x1d) 0 0 0xfff00000 0x100000 | ||
152 | - MBUS_ID(0x01, 0x2f) 0 0 0xf0000000 0x8000000 | ||
153 | - MBUS_ID(0x09, 0x09) 0 0 0xf8100000 0x10000 | ||
154 | - MBUS_ID(0x09, 0x05) 0 0 0xf8110000 0x10000>; | ||
155 | + MBUS_ID(0x01, 0x2f) 0 0 0xe8000000 0x8000000 | ||
156 | + MBUS_ID(0x09, 0x09) 0 0 0xf1100000 0x10000 | ||
157 | + MBUS_ID(0x09, 0x05) 0 0 0xf1110000 0x10000>; | ||
158 | |||
159 | devbus-bootcs { | ||
160 | status = "okay"; | ||
161 | diff --git a/arch/arm/boot/dts/armada-xp-synology-ds414.dts b/arch/arm/boot/dts/armada-xp-synology-ds414.dts | ||
162 | index 2391b11dc546..d17dab0a6f51 100644 | ||
163 | --- a/arch/arm/boot/dts/armada-xp-synology-ds414.dts | ||
164 | +++ b/arch/arm/boot/dts/armada-xp-synology-ds414.dts | ||
165 | @@ -78,8 +78,8 @@ | ||
166 | soc { | ||
167 | ranges = <MBUS_ID(0xf0, 0x01) 0 0 0xf1000000 0x100000 | ||
168 | MBUS_ID(0x01, 0x1d) 0 0 0xfff00000 0x100000 | ||
169 | - MBUS_ID(0x09, 0x09) 0 0 0xf8100000 0x10000 | ||
170 | - MBUS_ID(0x09, 0x05) 0 0 0xf8110000 0x10000>; | ||
171 | + MBUS_ID(0x09, 0x09) 0 0 0xf1100000 0x10000 | ||
172 | + MBUS_ID(0x09, 0x05) 0 0 0xf1110000 0x10000>; | ||
173 | |||
174 | pcie-controller { | ||
175 | status = "okay"; | ||
176 | diff --git a/arch/arm/boot/dts/dra7.dtsi b/arch/arm/boot/dts/dra7.dtsi | ||
177 | index fe99231cbde5..c2a03c740e79 100644 | ||
178 | --- a/arch/arm/boot/dts/dra7.dtsi | ||
179 | +++ b/arch/arm/boot/dts/dra7.dtsi | ||
180 | @@ -1497,6 +1497,16 @@ | ||
181 | 0x48485200 0x2E00>; | ||
182 | #address-cells = <1>; | ||
183 | #size-cells = <1>; | ||
184 | + | ||
185 | + /* | ||
186 | + * Do not allow gating of cpsw clock as workaround | ||
187 | + * for errata i877. Keeping internal clock disabled | ||
188 | + * causes the device switching characteristics | ||
189 | + * to degrade over time and eventually fail to meet | ||
190 | + * the data manual delay time/skew specs. | ||
191 | + */ | ||
192 | + ti,no-idle; | ||
193 | + | ||
194 | /* | ||
195 | * rx_thresh_pend | ||
196 | * rx_pend | ||
197 | diff --git a/arch/arm/mach-omap2/omap_hwmod.c b/arch/arm/mach-omap2/omap_hwmod.c | ||
198 | index 48495ad82aba..8e0bd5939e5a 100644 | ||
199 | --- a/arch/arm/mach-omap2/omap_hwmod.c | ||
200 | +++ b/arch/arm/mach-omap2/omap_hwmod.c | ||
201 | @@ -2200,6 +2200,11 @@ static int _enable(struct omap_hwmod *oh) | ||
202 | */ | ||
203 | static int _idle(struct omap_hwmod *oh) | ||
204 | { | ||
205 | + if (oh->flags & HWMOD_NO_IDLE) { | ||
206 | + oh->_int_flags |= _HWMOD_SKIP_ENABLE; | ||
207 | + return 0; | ||
208 | + } | ||
209 | + | ||
210 | pr_debug("omap_hwmod: %s: idling\n", oh->name); | ||
211 | |||
212 | if (oh->_state != _HWMOD_STATE_ENABLED) { | ||
213 | @@ -2504,6 +2509,8 @@ static int __init _init(struct omap_hwmod *oh, void *data) | ||
214 | oh->flags |= HWMOD_INIT_NO_RESET; | ||
215 | if (of_find_property(np, "ti,no-idle-on-init", NULL)) | ||
216 | oh->flags |= HWMOD_INIT_NO_IDLE; | ||
217 | + if (of_find_property(np, "ti,no-idle", NULL)) | ||
218 | + oh->flags |= HWMOD_NO_IDLE; | ||
219 | } | ||
220 | |||
221 | oh->_state = _HWMOD_STATE_INITIALIZED; | ||
222 | @@ -2630,7 +2637,7 @@ static void __init _setup_postsetup(struct omap_hwmod *oh) | ||
223 | * XXX HWMOD_INIT_NO_IDLE does not belong in hwmod data - | ||
224 | * it should be set by the core code as a runtime flag during startup | ||
225 | */ | ||
226 | - if ((oh->flags & HWMOD_INIT_NO_IDLE) && | ||
227 | + if ((oh->flags & (HWMOD_INIT_NO_IDLE | HWMOD_NO_IDLE)) && | ||
228 | (postsetup_state == _HWMOD_STATE_IDLE)) { | ||
229 | oh->_int_flags |= _HWMOD_SKIP_ENABLE; | ||
230 | postsetup_state = _HWMOD_STATE_ENABLED; | ||
231 | diff --git a/arch/arm/mach-omap2/omap_hwmod.h b/arch/arm/mach-omap2/omap_hwmod.h | ||
232 | index 76bce11c85a4..7c7a31169475 100644 | ||
233 | --- a/arch/arm/mach-omap2/omap_hwmod.h | ||
234 | +++ b/arch/arm/mach-omap2/omap_hwmod.h | ||
235 | @@ -525,6 +525,8 @@ struct omap_hwmod_omap4_prcm { | ||
236 | * or idled. | ||
237 | * HWMOD_OPT_CLKS_NEEDED: The optional clocks are needed for the module to | ||
238 | * operate and they need to be handled at the same time as the main_clk. | ||
239 | + * HWMOD_NO_IDLE: Do not idle the hwmod at all. Useful to handle certain | ||
240 | + * IPs like CPSW on DRA7, where clocks to this module cannot be disabled. | ||
241 | */ | ||
242 | #define HWMOD_SWSUP_SIDLE (1 << 0) | ||
243 | #define HWMOD_SWSUP_MSTANDBY (1 << 1) | ||
244 | @@ -541,6 +543,7 @@ struct omap_hwmod_omap4_prcm { | ||
245 | #define HWMOD_SWSUP_SIDLE_ACT (1 << 12) | ||
246 | #define HWMOD_RECONFIG_IO_CHAIN (1 << 13) | ||
247 | #define HWMOD_OPT_CLKS_NEEDED (1 << 14) | ||
248 | +#define HWMOD_NO_IDLE (1 << 15) | ||
249 | |||
250 | /* | ||
251 | * omap_hwmod._int_flags definitions | ||
252 | diff --git a/arch/arm64/include/asm/pgtable.h b/arch/arm64/include/asm/pgtable.h | ||
253 | index fc9f7ef2f4ab..eaa9cabf4066 100644 | ||
254 | --- a/arch/arm64/include/asm/pgtable.h | ||
255 | +++ b/arch/arm64/include/asm/pgtable.h | ||
256 | @@ -40,7 +40,7 @@ | ||
257 | * VMALLOC_END: extends to the available space below vmmemmap, PCI I/O space, | ||
258 | * fixed mappings and modules | ||
259 | */ | ||
260 | -#define VMEMMAP_SIZE ALIGN((1UL << (VA_BITS - PAGE_SHIFT - 1)) * sizeof(struct page), PUD_SIZE) | ||
261 | +#define VMEMMAP_SIZE ALIGN((1UL << (VA_BITS - PAGE_SHIFT)) * sizeof(struct page), PUD_SIZE) | ||
262 | |||
263 | #ifndef CONFIG_KASAN | ||
264 | #define VMALLOC_START (VA_START) | ||
265 | @@ -52,7 +52,8 @@ | ||
266 | #define VMALLOC_END (PAGE_OFFSET - PUD_SIZE - VMEMMAP_SIZE - SZ_64K) | ||
267 | |||
268 | #define VMEMMAP_START (VMALLOC_END + SZ_64K) | ||
269 | -#define vmemmap ((struct page *)VMEMMAP_START - (memstart_addr >> PAGE_SHIFT)) | ||
270 | +#define vmemmap ((struct page *)VMEMMAP_START - \ | ||
271 | + SECTION_ALIGN_DOWN(memstart_addr >> PAGE_SHIFT)) | ||
272 | |||
273 | #define FIRST_USER_ADDRESS 0UL | ||
274 | |||
275 | diff --git a/arch/mips/Kconfig b/arch/mips/Kconfig | ||
276 | index 71683a853372..db459612de44 100644 | ||
277 | --- a/arch/mips/Kconfig | ||
278 | +++ b/arch/mips/Kconfig | ||
279 | @@ -2155,7 +2155,7 @@ config MIPS_MT_SMP | ||
280 | select CPU_MIPSR2_IRQ_VI | ||
281 | select CPU_MIPSR2_IRQ_EI | ||
282 | select SYNC_R4K | ||
283 | - select MIPS_GIC_IPI | ||
284 | + select MIPS_GIC_IPI if MIPS_GIC | ||
285 | select MIPS_MT | ||
286 | select SMP | ||
287 | select SMP_UP | ||
288 | @@ -2253,7 +2253,7 @@ config MIPS_VPE_APSP_API_MT | ||
289 | config MIPS_CMP | ||
290 | bool "MIPS CMP framework support (DEPRECATED)" | ||
291 | depends on SYS_SUPPORTS_MIPS_CMP && !CPU_MIPSR6 | ||
292 | - select MIPS_GIC_IPI | ||
293 | + select MIPS_GIC_IPI if MIPS_GIC | ||
294 | select SMP | ||
295 | select SYNC_R4K | ||
296 | select SYS_SUPPORTS_SMP | ||
297 | @@ -2273,7 +2273,7 @@ config MIPS_CPS | ||
298 | select MIPS_CM | ||
299 | select MIPS_CPC | ||
300 | select MIPS_CPS_PM if HOTPLUG_CPU | ||
301 | - select MIPS_GIC_IPI | ||
302 | + select MIPS_GIC_IPI if MIPS_GIC | ||
303 | select SMP | ||
304 | select SYNC_R4K if (CEVT_R4K || CSRC_R4K) | ||
305 | select SYS_SUPPORTS_HOTPLUG_CPU | ||
306 | @@ -2292,6 +2292,7 @@ config MIPS_CPS_PM | ||
307 | bool | ||
308 | |||
309 | config MIPS_GIC_IPI | ||
310 | + depends on MIPS_GIC | ||
311 | bool | ||
312 | |||
313 | config MIPS_CM | ||
314 | diff --git a/arch/mips/kernel/smp.c b/arch/mips/kernel/smp.c | ||
315 | index bd4385a8e6e8..2b521e07b860 100644 | ||
316 | --- a/arch/mips/kernel/smp.c | ||
317 | +++ b/arch/mips/kernel/smp.c | ||
318 | @@ -121,6 +121,7 @@ static inline void calculate_cpu_foreign_map(void) | ||
319 | cpumask_t temp_foreign_map; | ||
320 | |||
321 | /* Re-calculate the mask */ | ||
322 | + cpumask_clear(&temp_foreign_map); | ||
323 | for_each_online_cpu(i) { | ||
324 | core_present = 0; | ||
325 | for_each_cpu(k, &temp_foreign_map) | ||
326 | diff --git a/arch/powerpc/include/asm/opal-api.h b/arch/powerpc/include/asm/opal-api.h | ||
327 | index 8374afed9d0a..f8faaaeeca1e 100644 | ||
328 | --- a/arch/powerpc/include/asm/opal-api.h | ||
329 | +++ b/arch/powerpc/include/asm/opal-api.h | ||
330 | @@ -157,7 +157,8 @@ | ||
331 | #define OPAL_LEDS_GET_INDICATOR 114 | ||
332 | #define OPAL_LEDS_SET_INDICATOR 115 | ||
333 | #define OPAL_CEC_REBOOT2 116 | ||
334 | -#define OPAL_LAST 116 | ||
335 | +#define OPAL_CONSOLE_FLUSH 117 | ||
336 | +#define OPAL_LAST 117 | ||
337 | |||
338 | /* Device tree flags */ | ||
339 | |||
340 | diff --git a/arch/powerpc/include/asm/opal.h b/arch/powerpc/include/asm/opal.h | ||
341 | index 800115910e43..07a99e638449 100644 | ||
342 | --- a/arch/powerpc/include/asm/opal.h | ||
343 | +++ b/arch/powerpc/include/asm/opal.h | ||
344 | @@ -35,6 +35,7 @@ int64_t opal_console_read(int64_t term_number, __be64 *length, | ||
345 | uint8_t *buffer); | ||
346 | int64_t opal_console_write_buffer_space(int64_t term_number, | ||
347 | __be64 *length); | ||
348 | +int64_t opal_console_flush(int64_t term_number); | ||
349 | int64_t opal_rtc_read(__be32 *year_month_day, | ||
350 | __be64 *hour_minute_second_millisecond); | ||
351 | int64_t opal_rtc_write(uint32_t year_month_day, | ||
352 | @@ -262,6 +263,8 @@ extern int opal_resync_timebase(void); | ||
353 | |||
354 | extern void opal_lpc_init(void); | ||
355 | |||
356 | +extern void opal_kmsg_init(void); | ||
357 | + | ||
358 | extern int opal_event_request(unsigned int opal_event_nr); | ||
359 | |||
360 | struct opal_sg_list *opal_vmalloc_to_sg_list(void *vmalloc_addr, | ||
361 | diff --git a/arch/powerpc/kernel/module_64.c b/arch/powerpc/kernel/module_64.c | ||
362 | index 59663af9315f..e4f7d4eed20c 100644 | ||
363 | --- a/arch/powerpc/kernel/module_64.c | ||
364 | +++ b/arch/powerpc/kernel/module_64.c | ||
365 | @@ -335,7 +335,7 @@ static void dedotify(Elf64_Sym *syms, unsigned int numsyms, char *strtab) | ||
366 | if (syms[i].st_shndx == SHN_UNDEF) { | ||
367 | char *name = strtab + syms[i].st_name; | ||
368 | if (name[0] == '.') | ||
369 | - memmove(name, name+1, strlen(name)); | ||
370 | + syms[i].st_name++; | ||
371 | } | ||
372 | } | ||
373 | } | ||
374 | diff --git a/arch/powerpc/kvm/book3s_hv_rmhandlers.S b/arch/powerpc/kvm/book3s_hv_rmhandlers.S | ||
375 | index e57cc383e5da..463af88c95a2 100644 | ||
376 | --- a/arch/powerpc/kvm/book3s_hv_rmhandlers.S | ||
377 | +++ b/arch/powerpc/kvm/book3s_hv_rmhandlers.S | ||
378 | @@ -1370,6 +1370,20 @@ END_FTR_SECTION_IFCLR(CPU_FTR_ARCH_207S) | ||
379 | std r6, VCPU_ACOP(r9) | ||
380 | stw r7, VCPU_GUEST_PID(r9) | ||
381 | std r8, VCPU_WORT(r9) | ||
382 | + /* | ||
383 | + * Restore various registers to 0, where non-zero values | ||
384 | + * set by the guest could disrupt the host. | ||
385 | + */ | ||
386 | + li r0, 0 | ||
387 | + mtspr SPRN_IAMR, r0 | ||
388 | + mtspr SPRN_CIABR, r0 | ||
389 | + mtspr SPRN_DAWRX, r0 | ||
390 | + mtspr SPRN_TCSCR, r0 | ||
391 | + mtspr SPRN_WORT, r0 | ||
392 | + /* Set MMCRS to 1<<31 to freeze and disable the SPMC counters */ | ||
393 | + li r0, 1 | ||
394 | + sldi r0, r0, 31 | ||
395 | + mtspr SPRN_MMCRS, r0 | ||
396 | 8: | ||
397 | |||
398 | /* Save and reset AMR and UAMOR before turning on the MMU */ | ||
399 | diff --git a/arch/powerpc/platforms/powernv/Makefile b/arch/powerpc/platforms/powernv/Makefile | ||
400 | index 1c8cdb6250e7..b9de7ef48849 100644 | ||
401 | --- a/arch/powerpc/platforms/powernv/Makefile | ||
402 | +++ b/arch/powerpc/platforms/powernv/Makefile | ||
403 | @@ -2,6 +2,7 @@ obj-y += setup.o opal-wrappers.o opal.o opal-async.o idle.o | ||
404 | obj-y += opal-rtc.o opal-nvram.o opal-lpc.o opal-flash.o | ||
405 | obj-y += rng.o opal-elog.o opal-dump.o opal-sysparam.o opal-sensor.o | ||
406 | obj-y += opal-msglog.o opal-hmi.o opal-power.o opal-irqchip.o | ||
407 | +obj-y += opal-kmsg.o | ||
408 | |||
409 | obj-$(CONFIG_SMP) += smp.o subcore.o subcore-asm.o | ||
410 | obj-$(CONFIG_PCI) += pci.o pci-p5ioc2.o pci-ioda.o | ||
411 | diff --git a/arch/powerpc/platforms/powernv/opal-kmsg.c b/arch/powerpc/platforms/powernv/opal-kmsg.c | ||
412 | new file mode 100644 | ||
413 | index 000000000000..6f1214d4de92 | ||
414 | --- /dev/null | ||
415 | +++ b/arch/powerpc/platforms/powernv/opal-kmsg.c | ||
416 | @@ -0,0 +1,75 @@ | ||
417 | +/* | ||
418 | + * kmsg dumper that ensures the OPAL console fully flushes panic messages | ||
419 | + * | ||
420 | + * Author: Russell Currey <ruscur@russell.cc> | ||
421 | + * | ||
422 | + * Copyright 2015 IBM Corporation. | ||
423 | + * | ||
424 | + * This program is free software; you can redistribute it and/or modify it | ||
425 | + * under the terms of the GNU General Public License as published by the | ||
426 | + * Free Software Foundation; either version 2 of the License, or (at your | ||
427 | + * option) any later version. | ||
428 | + */ | ||
429 | + | ||
430 | +#include <linux/kmsg_dump.h> | ||
431 | + | ||
432 | +#include <asm/opal.h> | ||
433 | +#include <asm/opal-api.h> | ||
434 | + | ||
435 | +/* | ||
436 | + * Console output is controlled by OPAL firmware. The kernel regularly calls | ||
437 | + * OPAL_POLL_EVENTS, which flushes some console output. In a panic state, | ||
438 | + * however, the kernel no longer calls OPAL_POLL_EVENTS and the panic message | ||
439 | + * may not be completely printed. This function does not actually dump the | ||
440 | + * message, it just ensures that OPAL completely flushes the console buffer. | ||
441 | + */ | ||
442 | +static void force_opal_console_flush(struct kmsg_dumper *dumper, | ||
443 | + enum kmsg_dump_reason reason) | ||
444 | +{ | ||
445 | + int i; | ||
446 | + int64_t ret; | ||
447 | + | ||
448 | + /* | ||
449 | + * Outside of a panic context the pollers will continue to run, | ||
450 | + * so we don't need to do any special flushing. | ||
451 | + */ | ||
452 | + if (reason != KMSG_DUMP_PANIC) | ||
453 | + return; | ||
454 | + | ||
455 | + if (opal_check_token(OPAL_CONSOLE_FLUSH)) { | ||
456 | + ret = opal_console_flush(0); | ||
457 | + | ||
458 | + if (ret == OPAL_UNSUPPORTED || ret == OPAL_PARAMETER) | ||
459 | + return; | ||
460 | + | ||
461 | + /* Incrementally flush until there's nothing left */ | ||
462 | + while (opal_console_flush(0) != OPAL_SUCCESS); | ||
463 | + } else { | ||
464 | + /* | ||
465 | + * If OPAL_CONSOLE_FLUSH is not implemented in the firmware, | ||
466 | + * the console can still be flushed by calling the polling | ||
467 | + * function enough times to flush the buffer. We don't know | ||
468 | + * how much output still needs to be flushed, but we can be | ||
469 | + * generous since the kernel is in panic and doesn't need | ||
470 | + * to do much else. | ||
471 | + */ | ||
472 | + printk(KERN_NOTICE "opal: OPAL_CONSOLE_FLUSH missing.\n"); | ||
473 | + for (i = 0; i < 1024; i++) { | ||
474 | + opal_poll_events(NULL); | ||
475 | + } | ||
476 | + } | ||
477 | +} | ||
478 | + | ||
479 | +static struct kmsg_dumper opal_kmsg_dumper = { | ||
480 | + .dump = force_opal_console_flush | ||
481 | +}; | ||
482 | + | ||
483 | +void __init opal_kmsg_init(void) | ||
484 | +{ | ||
485 | + int rc; | ||
486 | + | ||
487 | + /* Add our dumper to the list */ | ||
488 | + rc = kmsg_dump_register(&opal_kmsg_dumper); | ||
489 | + if (rc != 0) | ||
490 | + pr_err("opal: kmsg_dump_register failed; returned %d\n", rc); | ||
491 | +} | ||
492 | diff --git a/arch/powerpc/platforms/powernv/opal-wrappers.S b/arch/powerpc/platforms/powernv/opal-wrappers.S | ||
493 | index b7a464fef7a7..e45b88a5d7e0 100644 | ||
494 | --- a/arch/powerpc/platforms/powernv/opal-wrappers.S | ||
495 | +++ b/arch/powerpc/platforms/powernv/opal-wrappers.S | ||
496 | @@ -301,3 +301,4 @@ OPAL_CALL(opal_flash_erase, OPAL_FLASH_ERASE); | ||
497 | OPAL_CALL(opal_prd_msg, OPAL_PRD_MSG); | ||
498 | OPAL_CALL(opal_leds_get_ind, OPAL_LEDS_GET_INDICATOR); | ||
499 | OPAL_CALL(opal_leds_set_ind, OPAL_LEDS_SET_INDICATOR); | ||
500 | +OPAL_CALL(opal_console_flush, OPAL_CONSOLE_FLUSH); | ||
501 | diff --git a/arch/powerpc/platforms/powernv/opal.c b/arch/powerpc/platforms/powernv/opal.c | ||
502 | index 57cffb80bc36..ae29eaf85e9e 100644 | ||
503 | --- a/arch/powerpc/platforms/powernv/opal.c | ||
504 | +++ b/arch/powerpc/platforms/powernv/opal.c | ||
505 | @@ -758,6 +758,9 @@ static int __init opal_init(void) | ||
506 | opal_pdev_init(opal_node, "ibm,opal-flash"); | ||
507 | opal_pdev_init(opal_node, "ibm,opal-prd"); | ||
508 | |||
509 | + /* Initialise OPAL kmsg dumper for flushing console on panic */ | ||
510 | + opal_kmsg_init(); | ||
511 | + | ||
512 | return 0; | ||
513 | } | ||
514 | machine_subsys_initcall(powernv, opal_init); | ||
515 | diff --git a/arch/s390/include/asm/mmu_context.h b/arch/s390/include/asm/mmu_context.h | ||
516 | index fb1b93ea3e3f..e485817f7b1a 100644 | ||
517 | --- a/arch/s390/include/asm/mmu_context.h | ||
518 | +++ b/arch/s390/include/asm/mmu_context.h | ||
519 | @@ -15,17 +15,25 @@ | ||
520 | static inline int init_new_context(struct task_struct *tsk, | ||
521 | struct mm_struct *mm) | ||
522 | { | ||
523 | + spin_lock_init(&mm->context.list_lock); | ||
524 | + INIT_LIST_HEAD(&mm->context.pgtable_list); | ||
525 | + INIT_LIST_HEAD(&mm->context.gmap_list); | ||
526 | cpumask_clear(&mm->context.cpu_attach_mask); | ||
527 | atomic_set(&mm->context.attach_count, 0); | ||
528 | mm->context.flush_mm = 0; | ||
529 | - mm->context.asce_bits = _ASCE_TABLE_LENGTH | _ASCE_USER_BITS; | ||
530 | - mm->context.asce_bits |= _ASCE_TYPE_REGION3; | ||
531 | #ifdef CONFIG_PGSTE | ||
532 | mm->context.alloc_pgste = page_table_allocate_pgste; | ||
533 | mm->context.has_pgste = 0; | ||
534 | mm->context.use_skey = 0; | ||
535 | #endif | ||
536 | - mm->context.asce_limit = STACK_TOP_MAX; | ||
537 | + if (mm->context.asce_limit == 0) { | ||
538 | + /* context created by exec, set asce limit to 4TB */ | ||
539 | + mm->context.asce_bits = _ASCE_TABLE_LENGTH | | ||
540 | + _ASCE_USER_BITS | _ASCE_TYPE_REGION3; | ||
541 | + mm->context.asce_limit = STACK_TOP_MAX; | ||
542 | + } else if (mm->context.asce_limit == (1UL << 31)) { | ||
543 | + mm_inc_nr_pmds(mm); | ||
544 | + } | ||
545 | crst_table_init((unsigned long *) mm->pgd, pgd_entry_type(mm)); | ||
546 | return 0; | ||
547 | } | ||
548 | @@ -111,8 +119,6 @@ static inline void activate_mm(struct mm_struct *prev, | ||
549 | static inline void arch_dup_mmap(struct mm_struct *oldmm, | ||
550 | struct mm_struct *mm) | ||
551 | { | ||
552 | - if (oldmm->context.asce_limit < mm->context.asce_limit) | ||
553 | - crst_table_downgrade(mm, oldmm->context.asce_limit); | ||
554 | } | ||
555 | |||
556 | static inline void arch_exit_mmap(struct mm_struct *mm) | ||
557 | diff --git a/arch/s390/include/asm/pgalloc.h b/arch/s390/include/asm/pgalloc.h | ||
558 | index 7b7858f158b4..d7cc79fb6191 100644 | ||
559 | --- a/arch/s390/include/asm/pgalloc.h | ||
560 | +++ b/arch/s390/include/asm/pgalloc.h | ||
561 | @@ -100,12 +100,26 @@ static inline void pud_populate(struct mm_struct *mm, pud_t *pud, pmd_t *pmd) | ||
562 | |||
563 | static inline pgd_t *pgd_alloc(struct mm_struct *mm) | ||
564 | { | ||
565 | - spin_lock_init(&mm->context.list_lock); | ||
566 | - INIT_LIST_HEAD(&mm->context.pgtable_list); | ||
567 | - INIT_LIST_HEAD(&mm->context.gmap_list); | ||
568 | - return (pgd_t *) crst_table_alloc(mm); | ||
569 | + unsigned long *table = crst_table_alloc(mm); | ||
570 | + | ||
571 | + if (!table) | ||
572 | + return NULL; | ||
573 | + if (mm->context.asce_limit == (1UL << 31)) { | ||
574 | + /* Forking a compat process with 2 page table levels */ | ||
575 | + if (!pgtable_pmd_page_ctor(virt_to_page(table))) { | ||
576 | + crst_table_free(mm, table); | ||
577 | + return NULL; | ||
578 | + } | ||
579 | + } | ||
580 | + return (pgd_t *) table; | ||
581 | +} | ||
582 | + | ||
583 | +static inline void pgd_free(struct mm_struct *mm, pgd_t *pgd) | ||
584 | +{ | ||
585 | + if (mm->context.asce_limit == (1UL << 31)) | ||
586 | + pgtable_pmd_page_dtor(virt_to_page(pgd)); | ||
587 | + crst_table_free(mm, (unsigned long *) pgd); | ||
588 | } | ||
589 | -#define pgd_free(mm, pgd) crst_table_free(mm, (unsigned long *) pgd) | ||
590 | |||
591 | static inline void pmd_populate(struct mm_struct *mm, | ||
592 | pmd_t *pmd, pgtable_t pte) | ||
593 | diff --git a/arch/s390/kvm/kvm-s390.c b/arch/s390/kvm/kvm-s390.c | ||
594 | index a08d0afd5ff6..575dc123bda2 100644 | ||
595 | --- a/arch/s390/kvm/kvm-s390.c | ||
596 | +++ b/arch/s390/kvm/kvm-s390.c | ||
597 | @@ -2249,7 +2249,7 @@ int kvm_s390_store_status_unloaded(struct kvm_vcpu *vcpu, unsigned long gpa) | ||
598 | |||
599 | /* manually convert vector registers if necessary */ | ||
600 | if (MACHINE_HAS_VX) { | ||
601 | - convert_vx_to_fp(fprs, current->thread.fpu.vxrs); | ||
602 | + convert_vx_to_fp(fprs, (__vector128 *) vcpu->run->s.regs.vrs); | ||
603 | rc = write_guest_abs(vcpu, gpa + __LC_FPREGS_SAVE_AREA, | ||
604 | fprs, 128); | ||
605 | } else { | ||
606 | diff --git a/arch/x86/kvm/mmu.c b/arch/x86/kvm/mmu.c | ||
607 | index e7c2c1428a69..8eb8a934b531 100644 | ||
608 | --- a/arch/x86/kvm/mmu.c | ||
609 | +++ b/arch/x86/kvm/mmu.c | ||
610 | @@ -3754,13 +3754,15 @@ static void reset_rsvds_bits_mask_ept(struct kvm_vcpu *vcpu, | ||
611 | void | ||
612 | reset_shadow_zero_bits_mask(struct kvm_vcpu *vcpu, struct kvm_mmu *context) | ||
613 | { | ||
614 | + bool uses_nx = context->nx || context->base_role.smep_andnot_wp; | ||
615 | + | ||
616 | /* | ||
617 | * Passing "true" to the last argument is okay; it adds a check | ||
618 | * on bit 8 of the SPTEs which KVM doesn't use anyway. | ||
619 | */ | ||
620 | __reset_rsvds_bits_mask(vcpu, &context->shadow_zero_check, | ||
621 | boot_cpu_data.x86_phys_bits, | ||
622 | - context->shadow_root_level, context->nx, | ||
623 | + context->shadow_root_level, uses_nx, | ||
624 | guest_cpuid_has_gbpages(vcpu), is_pse(vcpu), | ||
625 | true); | ||
626 | } | ||
627 | diff --git a/arch/x86/kvm/vmx.c b/arch/x86/kvm/vmx.c | ||
628 | index 5fd846cd6e0e..0958fa2b7cb7 100644 | ||
629 | --- a/arch/x86/kvm/vmx.c | ||
630 | +++ b/arch/x86/kvm/vmx.c | ||
631 | @@ -1748,6 +1748,13 @@ static void add_atomic_switch_msr(struct vcpu_vmx *vmx, unsigned msr, | ||
632 | return; | ||
633 | } | ||
634 | break; | ||
635 | + case MSR_IA32_PEBS_ENABLE: | ||
636 | + /* PEBS needs a quiescent period after being disabled (to write | ||
637 | + * a record). Disabling PEBS through VMX MSR swapping doesn't | ||
638 | + * provide that period, so a CPU could write host's record into | ||
639 | + * guest's memory. | ||
640 | + */ | ||
641 | + wrmsrl(MSR_IA32_PEBS_ENABLE, 0); | ||
642 | } | ||
643 | |||
644 | for (i = 0; i < m->nr; ++i) | ||
645 | @@ -1785,26 +1792,31 @@ static void reload_tss(void) | ||
646 | |||
647 | static bool update_transition_efer(struct vcpu_vmx *vmx, int efer_offset) | ||
648 | { | ||
649 | - u64 guest_efer; | ||
650 | - u64 ignore_bits; | ||
651 | + u64 guest_efer = vmx->vcpu.arch.efer; | ||
652 | + u64 ignore_bits = 0; | ||
653 | |||
654 | - guest_efer = vmx->vcpu.arch.efer; | ||
655 | + if (!enable_ept) { | ||
656 | + /* | ||
657 | + * NX is needed to handle CR0.WP=1, CR4.SMEP=1. Testing | ||
658 | + * host CPUID is more efficient than testing guest CPUID | ||
659 | + * or CR4. Host SMEP is anyway a requirement for guest SMEP. | ||
660 | + */ | ||
661 | + if (boot_cpu_has(X86_FEATURE_SMEP)) | ||
662 | + guest_efer |= EFER_NX; | ||
663 | + else if (!(guest_efer & EFER_NX)) | ||
664 | + ignore_bits |= EFER_NX; | ||
665 | + } | ||
666 | |||
667 | /* | ||
668 | - * NX is emulated; LMA and LME handled by hardware; SCE meaningless | ||
669 | - * outside long mode | ||
670 | + * LMA and LME handled by hardware; SCE meaningless outside long mode. | ||
671 | */ | ||
672 | - ignore_bits = EFER_NX | EFER_SCE; | ||
673 | + ignore_bits |= EFER_SCE; | ||
674 | #ifdef CONFIG_X86_64 | ||
675 | ignore_bits |= EFER_LMA | EFER_LME; | ||
676 | /* SCE is meaningful only in long mode on Intel */ | ||
677 | if (guest_efer & EFER_LMA) | ||
678 | ignore_bits &= ~(u64)EFER_SCE; | ||
679 | #endif | ||
680 | - guest_efer &= ~ignore_bits; | ||
681 | - guest_efer |= host_efer & ignore_bits; | ||
682 | - vmx->guest_msrs[efer_offset].data = guest_efer; | ||
683 | - vmx->guest_msrs[efer_offset].mask = ~ignore_bits; | ||
684 | |||
685 | clear_atomic_switch_msr(vmx, MSR_EFER); | ||
686 | |||
687 | @@ -1815,16 +1827,21 @@ static bool update_transition_efer(struct vcpu_vmx *vmx, int efer_offset) | ||
688 | */ | ||
689 | if (cpu_has_load_ia32_efer || | ||
690 | (enable_ept && ((vmx->vcpu.arch.efer ^ host_efer) & EFER_NX))) { | ||
691 | - guest_efer = vmx->vcpu.arch.efer; | ||
692 | if (!(guest_efer & EFER_LMA)) | ||
693 | guest_efer &= ~EFER_LME; | ||
694 | if (guest_efer != host_efer) | ||
695 | add_atomic_switch_msr(vmx, MSR_EFER, | ||
696 | guest_efer, host_efer); | ||
697 | return false; | ||
698 | - } | ||
699 | + } else { | ||
700 | + guest_efer &= ~ignore_bits; | ||
701 | + guest_efer |= host_efer & ignore_bits; | ||
702 | |||
703 | - return true; | ||
704 | + vmx->guest_msrs[efer_offset].data = guest_efer; | ||
705 | + vmx->guest_msrs[efer_offset].mask = ~ignore_bits; | ||
706 | + | ||
707 | + return true; | ||
708 | + } | ||
709 | } | ||
710 | |||
711 | static unsigned long segment_base(u16 selector) | ||
712 | diff --git a/arch/x86/mm/pageattr.c b/arch/x86/mm/pageattr.c | ||
713 | index db20ee9a413a..b599a780a5a9 100644 | ||
714 | --- a/arch/x86/mm/pageattr.c | ||
715 | +++ b/arch/x86/mm/pageattr.c | ||
716 | @@ -414,24 +414,30 @@ pmd_t *lookup_pmd_address(unsigned long address) | ||
717 | phys_addr_t slow_virt_to_phys(void *__virt_addr) | ||
718 | { | ||
719 | unsigned long virt_addr = (unsigned long)__virt_addr; | ||
720 | - unsigned long phys_addr, offset; | ||
721 | + phys_addr_t phys_addr; | ||
722 | + unsigned long offset; | ||
723 | enum pg_level level; | ||
724 | pte_t *pte; | ||
725 | |||
726 | pte = lookup_address(virt_addr, &level); | ||
727 | BUG_ON(!pte); | ||
728 | |||
729 | + /* | ||
730 | + * pXX_pfn() returns unsigned long, which must be cast to phys_addr_t | ||
731 | + * before being left-shifted PAGE_SHIFT bits -- this trick is to | ||
732 | + * make 32-PAE kernel work correctly. | ||
733 | + */ | ||
734 | switch (level) { | ||
735 | case PG_LEVEL_1G: | ||
736 | - phys_addr = pud_pfn(*(pud_t *)pte) << PAGE_SHIFT; | ||
737 | + phys_addr = (phys_addr_t)pud_pfn(*(pud_t *)pte) << PAGE_SHIFT; | ||
738 | offset = virt_addr & ~PUD_PAGE_MASK; | ||
739 | break; | ||
740 | case PG_LEVEL_2M: | ||
741 | - phys_addr = pmd_pfn(*(pmd_t *)pte) << PAGE_SHIFT; | ||
742 | + phys_addr = (phys_addr_t)pmd_pfn(*(pmd_t *)pte) << PAGE_SHIFT; | ||
743 | offset = virt_addr & ~PMD_PAGE_MASK; | ||
744 | break; | ||
745 | default: | ||
746 | - phys_addr = pte_pfn(*pte) << PAGE_SHIFT; | ||
747 | + phys_addr = (phys_addr_t)pte_pfn(*pte) << PAGE_SHIFT; | ||
748 | offset = virt_addr & ~PAGE_MASK; | ||
749 | } | ||
750 | |||
751 | diff --git a/drivers/dma/at_xdmac.c b/drivers/dma/at_xdmac.c | ||
752 | index fa00f3a186da..02f9aa4ebe05 100644 | ||
753 | --- a/drivers/dma/at_xdmac.c | ||
754 | +++ b/drivers/dma/at_xdmac.c | ||
755 | @@ -176,6 +176,7 @@ | ||
756 | #define AT_XDMAC_MAX_CHAN 0x20 | ||
757 | #define AT_XDMAC_MAX_CSIZE 16 /* 16 data */ | ||
758 | #define AT_XDMAC_MAX_DWIDTH 8 /* 64 bits */ | ||
759 | +#define AT_XDMAC_RESIDUE_MAX_RETRIES 5 | ||
760 | |||
761 | #define AT_XDMAC_DMA_BUSWIDTHS\ | ||
762 | (BIT(DMA_SLAVE_BUSWIDTH_UNDEFINED) |\ | ||
763 | @@ -1383,8 +1384,8 @@ at_xdmac_tx_status(struct dma_chan *chan, dma_cookie_t cookie, | ||
764 | struct at_xdmac_desc *desc, *_desc; | ||
765 | struct list_head *descs_list; | ||
766 | enum dma_status ret; | ||
767 | - int residue; | ||
768 | - u32 cur_nda, mask, value; | ||
769 | + int residue, retry; | ||
770 | + u32 cur_nda, check_nda, cur_ubc, mask, value; | ||
771 | u8 dwidth = 0; | ||
772 | unsigned long flags; | ||
773 | |||
774 | @@ -1421,7 +1422,42 @@ at_xdmac_tx_status(struct dma_chan *chan, dma_cookie_t cookie, | ||
775 | cpu_relax(); | ||
776 | } | ||
777 | |||
778 | + /* | ||
779 | + * When processing the residue, we need to read two registers but we | ||
780 | + * can't do it in an atomic way. AT_XDMAC_CNDA is used to find where | ||
781 | + * we stand in the descriptor list and AT_XDMAC_CUBC is used | ||
782 | + * to know how many data are remaining for the current descriptor. | ||
783 | + * Since the dma channel is not paused to not loose data, between the | ||
784 | + * AT_XDMAC_CNDA and AT_XDMAC_CUBC read, we may have change of | ||
785 | + * descriptor. | ||
786 | + * For that reason, after reading AT_XDMAC_CUBC, we check if we are | ||
787 | + * still using the same descriptor by reading a second time | ||
788 | + * AT_XDMAC_CNDA. If AT_XDMAC_CNDA has changed, it means we have to | ||
789 | + * read again AT_XDMAC_CUBC. | ||
790 | + * Memory barriers are used to ensure the read order of the registers. | ||
791 | + * A max number of retries is set because unlikely it can never ends if | ||
792 | + * we are transferring a lot of data with small buffers. | ||
793 | + */ | ||
794 | cur_nda = at_xdmac_chan_read(atchan, AT_XDMAC_CNDA) & 0xfffffffc; | ||
795 | + rmb(); | ||
796 | + cur_ubc = at_xdmac_chan_read(atchan, AT_XDMAC_CUBC); | ||
797 | + for (retry = 0; retry < AT_XDMAC_RESIDUE_MAX_RETRIES; retry++) { | ||
798 | + rmb(); | ||
799 | + check_nda = at_xdmac_chan_read(atchan, AT_XDMAC_CNDA) & 0xfffffffc; | ||
800 | + | ||
801 | + if (likely(cur_nda == check_nda)) | ||
802 | + break; | ||
803 | + | ||
804 | + cur_nda = check_nda; | ||
805 | + rmb(); | ||
806 | + cur_ubc = at_xdmac_chan_read(atchan, AT_XDMAC_CUBC); | ||
807 | + } | ||
808 | + | ||
809 | + if (unlikely(retry >= AT_XDMAC_RESIDUE_MAX_RETRIES)) { | ||
810 | + ret = DMA_ERROR; | ||
811 | + goto spin_unlock; | ||
812 | + } | ||
813 | + | ||
814 | /* | ||
815 | * Remove size of all microblocks already transferred and the current | ||
816 | * one. Then add the remaining size to transfer of the current | ||
817 | @@ -1434,7 +1470,7 @@ at_xdmac_tx_status(struct dma_chan *chan, dma_cookie_t cookie, | ||
818 | if ((desc->lld.mbr_nda & 0xfffffffc) == cur_nda) | ||
819 | break; | ||
820 | } | ||
821 | - residue += at_xdmac_chan_read(atchan, AT_XDMAC_CUBC) << dwidth; | ||
822 | + residue += cur_ubc << dwidth; | ||
823 | |||
824 | dma_set_residue(txstate, residue); | ||
825 | |||
826 | diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_display.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_display.c | ||
827 | index 0c713a908304..82903ca78529 100644 | ||
828 | --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_display.c | ||
829 | +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_display.c | ||
830 | @@ -96,7 +96,7 @@ static void amdgpu_flip_work_func(struct work_struct *__work) | ||
831 | * In practice this won't execute very often unless on very fast | ||
832 | * machines because the time window for this to happen is very small. | ||
833 | */ | ||
834 | - while (amdgpuCrtc->enabled && repcnt--) { | ||
835 | + while (amdgpuCrtc->enabled && --repcnt) { | ||
836 | /* GET_DISTANCE_TO_VBLANKSTART returns distance to real vblank | ||
837 | * start in hpos, and to the "fudged earlier" vblank start in | ||
838 | * vpos. | ||
839 | @@ -112,13 +112,13 @@ static void amdgpu_flip_work_func(struct work_struct *__work) | ||
840 | break; | ||
841 | |||
842 | /* Sleep at least until estimated real start of hw vblank */ | ||
843 | - spin_unlock_irqrestore(&crtc->dev->event_lock, flags); | ||
844 | min_udelay = (-hpos + 1) * max(vblank->linedur_ns / 1000, 5); | ||
845 | if (min_udelay > vblank->framedur_ns / 2000) { | ||
846 | /* Don't wait ridiculously long - something is wrong */ | ||
847 | repcnt = 0; | ||
848 | break; | ||
849 | } | ||
850 | + spin_unlock_irqrestore(&crtc->dev->event_lock, flags); | ||
851 | usleep_range(min_udelay, 2 * min_udelay); | ||
852 | spin_lock_irqsave(&crtc->dev->event_lock, flags); | ||
853 | }; | ||
854 | diff --git a/drivers/gpu/drm/radeon/radeon_device.c b/drivers/gpu/drm/radeon/radeon_device.c | ||
855 | index d690df545b4d..c566993a2ec3 100644 | ||
856 | --- a/drivers/gpu/drm/radeon/radeon_device.c | ||
857 | +++ b/drivers/gpu/drm/radeon/radeon_device.c | ||
858 | @@ -1744,7 +1744,6 @@ int radeon_resume_kms(struct drm_device *dev, bool resume, bool fbcon) | ||
859 | } | ||
860 | |||
861 | drm_kms_helper_poll_enable(dev); | ||
862 | - drm_helper_hpd_irq_event(dev); | ||
863 | |||
864 | /* set the power state here in case we are a PX system or headless */ | ||
865 | if ((rdev->pm.pm_method == PM_METHOD_DPM) && rdev->pm.dpm_enabled) | ||
866 | diff --git a/drivers/gpu/drm/radeon/radeon_display.c b/drivers/gpu/drm/radeon/radeon_display.c | ||
867 | index 13767d21835f..3645b223aa37 100644 | ||
868 | --- a/drivers/gpu/drm/radeon/radeon_display.c | ||
869 | +++ b/drivers/gpu/drm/radeon/radeon_display.c | ||
870 | @@ -455,7 +455,7 @@ static void radeon_flip_work_func(struct work_struct *__work) | ||
871 | * In practice this won't execute very often unless on very fast | ||
872 | * machines because the time window for this to happen is very small. | ||
873 | */ | ||
874 | - while (radeon_crtc->enabled && repcnt--) { | ||
875 | + while (radeon_crtc->enabled && --repcnt) { | ||
876 | /* GET_DISTANCE_TO_VBLANKSTART returns distance to real vblank | ||
877 | * start in hpos, and to the "fudged earlier" vblank start in | ||
878 | * vpos. | ||
879 | @@ -471,13 +471,13 @@ static void radeon_flip_work_func(struct work_struct *__work) | ||
880 | break; | ||
881 | |||
882 | /* Sleep at least until estimated real start of hw vblank */ | ||
883 | - spin_unlock_irqrestore(&crtc->dev->event_lock, flags); | ||
884 | min_udelay = (-hpos + 1) * max(vblank->linedur_ns / 1000, 5); | ||
885 | if (min_udelay > vblank->framedur_ns / 2000) { | ||
886 | /* Don't wait ridiculously long - something is wrong */ | ||
887 | repcnt = 0; | ||
888 | break; | ||
889 | } | ||
890 | + spin_unlock_irqrestore(&crtc->dev->event_lock, flags); | ||
891 | usleep_range(min_udelay, 2 * min_udelay); | ||
892 | spin_lock_irqsave(&crtc->dev->event_lock, flags); | ||
893 | }; | ||
894 | diff --git a/drivers/gpu/drm/radeon/radeon_pm.c b/drivers/gpu/drm/radeon/radeon_pm.c | ||
895 | index 1fa81215cea1..60ab31517153 100644 | ||
896 | --- a/drivers/gpu/drm/radeon/radeon_pm.c | ||
897 | +++ b/drivers/gpu/drm/radeon/radeon_pm.c | ||
898 | @@ -1075,6 +1075,8 @@ force: | ||
899 | |||
900 | /* update display watermarks based on new power state */ | ||
901 | radeon_bandwidth_update(rdev); | ||
902 | + /* update displays */ | ||
903 | + radeon_dpm_display_configuration_changed(rdev); | ||
904 | |||
905 | /* wait for the rings to drain */ | ||
906 | for (i = 0; i < RADEON_NUM_RINGS; i++) { | ||
907 | @@ -1091,9 +1093,6 @@ force: | ||
908 | |||
909 | radeon_dpm_post_set_power_state(rdev); | ||
910 | |||
911 | - /* update displays */ | ||
912 | - radeon_dpm_display_configuration_changed(rdev); | ||
913 | - | ||
914 | rdev->pm.dpm.current_active_crtcs = rdev->pm.dpm.new_active_crtcs; | ||
915 | rdev->pm.dpm.current_active_crtc_count = rdev->pm.dpm.new_active_crtc_count; | ||
916 | rdev->pm.dpm.single_display = single_display; | ||
917 | diff --git a/drivers/gpu/ipu-v3/ipu-common.c b/drivers/gpu/ipu-v3/ipu-common.c | ||
918 | index f2e13eb8339f..a0e28f3a278d 100644 | ||
919 | --- a/drivers/gpu/ipu-v3/ipu-common.c | ||
920 | +++ b/drivers/gpu/ipu-v3/ipu-common.c | ||
921 | @@ -1050,6 +1050,17 @@ static int ipu_add_client_devices(struct ipu_soc *ipu, unsigned long ipu_base) | ||
922 | for (i = 0; i < ARRAY_SIZE(client_reg); i++) { | ||
923 | const struct ipu_platform_reg *reg = &client_reg[i]; | ||
924 | struct platform_device *pdev; | ||
925 | + struct device_node *of_node; | ||
926 | + | ||
927 | + /* Associate subdevice with the corresponding port node */ | ||
928 | + of_node = of_graph_get_port_by_id(dev->of_node, i); | ||
929 | + if (!of_node) { | ||
930 | + dev_info(dev, | ||
931 | + "no port@%d node in %s, not using %s%d\n", | ||
932 | + i, dev->of_node->full_name, | ||
933 | + (i / 2) ? "DI" : "CSI", i % 2); | ||
934 | + continue; | ||
935 | + } | ||
936 | |||
937 | pdev = platform_device_alloc(reg->name, id++); | ||
938 | if (!pdev) { | ||
939 | @@ -1057,17 +1068,9 @@ static int ipu_add_client_devices(struct ipu_soc *ipu, unsigned long ipu_base) | ||
940 | goto err_register; | ||
941 | } | ||
942 | |||
943 | + pdev->dev.of_node = of_node; | ||
944 | pdev->dev.parent = dev; | ||
945 | |||
946 | - /* Associate subdevice with the corresponding port node */ | ||
947 | - pdev->dev.of_node = of_graph_get_port_by_id(dev->of_node, i); | ||
948 | - if (!pdev->dev.of_node) { | ||
949 | - dev_err(dev, "missing port@%d node in %s\n", i, | ||
950 | - dev->of_node->full_name); | ||
951 | - ret = -ENODEV; | ||
952 | - goto err_register; | ||
953 | - } | ||
954 | - | ||
955 | ret = platform_device_add_data(pdev, ®->pdata, | ||
956 | sizeof(reg->pdata)); | ||
957 | if (!ret) | ||
958 | diff --git a/drivers/net/can/usb/gs_usb.c b/drivers/net/can/usb/gs_usb.c | ||
959 | index 5eee62badf45..cbc99d5649af 100644 | ||
960 | --- a/drivers/net/can/usb/gs_usb.c | ||
961 | +++ b/drivers/net/can/usb/gs_usb.c | ||
962 | @@ -826,9 +826,8 @@ static struct gs_can *gs_make_candev(unsigned int channel, struct usb_interface | ||
963 | static void gs_destroy_candev(struct gs_can *dev) | ||
964 | { | ||
965 | unregister_candev(dev->netdev); | ||
966 | - free_candev(dev->netdev); | ||
967 | usb_kill_anchored_urbs(&dev->tx_submitted); | ||
968 | - kfree(dev); | ||
969 | + free_candev(dev->netdev); | ||
970 | } | ||
971 | |||
972 | static int gs_usb_probe(struct usb_interface *intf, const struct usb_device_id *id) | ||
973 | @@ -913,12 +912,15 @@ static int gs_usb_probe(struct usb_interface *intf, const struct usb_device_id * | ||
974 | for (i = 0; i < icount; i++) { | ||
975 | dev->canch[i] = gs_make_candev(i, intf); | ||
976 | if (IS_ERR_OR_NULL(dev->canch[i])) { | ||
977 | + /* save error code to return later */ | ||
978 | + rc = PTR_ERR(dev->canch[i]); | ||
979 | + | ||
980 | /* on failure destroy previously created candevs */ | ||
981 | icount = i; | ||
982 | - for (i = 0; i < icount; i++) { | ||
983 | + for (i = 0; i < icount; i++) | ||
984 | gs_destroy_candev(dev->canch[i]); | ||
985 | - dev->canch[i] = NULL; | ||
986 | - } | ||
987 | + | ||
988 | + usb_kill_anchored_urbs(&dev->rx_submitted); | ||
989 | kfree(dev); | ||
990 | return rc; | ||
991 | } | ||
992 | @@ -939,16 +941,12 @@ static void gs_usb_disconnect(struct usb_interface *intf) | ||
993 | return; | ||
994 | } | ||
995 | |||
996 | - for (i = 0; i < GS_MAX_INTF; i++) { | ||
997 | - struct gs_can *can = dev->canch[i]; | ||
998 | - | ||
999 | - if (!can) | ||
1000 | - continue; | ||
1001 | - | ||
1002 | - gs_destroy_candev(can); | ||
1003 | - } | ||
1004 | + for (i = 0; i < GS_MAX_INTF; i++) | ||
1005 | + if (dev->canch[i]) | ||
1006 | + gs_destroy_candev(dev->canch[i]); | ||
1007 | |||
1008 | usb_kill_anchored_urbs(&dev->rx_submitted); | ||
1009 | + kfree(dev); | ||
1010 | } | ||
1011 | |||
1012 | static const struct usb_device_id gs_usb_table[] = { | ||
1013 | diff --git a/drivers/net/wireless/iwlwifi/mvm/tx.c b/drivers/net/wireless/iwlwifi/mvm/tx.c | ||
1014 | index c652a66be803..6743edf43aa8 100644 | ||
1015 | --- a/drivers/net/wireless/iwlwifi/mvm/tx.c | ||
1016 | +++ b/drivers/net/wireless/iwlwifi/mvm/tx.c | ||
1017 | @@ -421,6 +421,15 @@ int iwl_mvm_tx_skb_non_sta(struct iwl_mvm *mvm, struct sk_buff *skb) | ||
1018 | return -1; | ||
1019 | } | ||
1020 | |||
1021 | + /* | ||
1022 | + * Increase the pending frames counter, so that later when a reply comes | ||
1023 | + * in and the counter is decreased - we don't start getting negative | ||
1024 | + * values. | ||
1025 | + * Note that we don't need to make sure it isn't agg'd, since we're | ||
1026 | + * TXing non-sta | ||
1027 | + */ | ||
1028 | + atomic_inc(&mvm->pending_frames[sta_id]); | ||
1029 | + | ||
1030 | return 0; | ||
1031 | } | ||
1032 | |||
1033 | diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c | ||
1034 | index 314db8c1047a..42d8617352ae 100644 | ||
1035 | --- a/drivers/pci/pci.c | ||
1036 | +++ b/drivers/pci/pci.c | ||
1037 | @@ -4772,8 +4772,10 @@ int pci_get_new_domain_nr(void) | ||
1038 | void pci_bus_assign_domain_nr(struct pci_bus *bus, struct device *parent) | ||
1039 | { | ||
1040 | static int use_dt_domains = -1; | ||
1041 | - int domain = of_get_pci_domain_nr(parent->of_node); | ||
1042 | + int domain = -1; | ||
1043 | |||
1044 | + if (parent) | ||
1045 | + domain = of_get_pci_domain_nr(parent->of_node); | ||
1046 | /* | ||
1047 | * Check DT domain and use_dt_domains values. | ||
1048 | * | ||
1049 | diff --git a/drivers/s390/block/dasd_diag.c b/drivers/s390/block/dasd_diag.c | ||
1050 | index cb61f300f8b5..277b5c8c825c 100644 | ||
1051 | --- a/drivers/s390/block/dasd_diag.c | ||
1052 | +++ b/drivers/s390/block/dasd_diag.c | ||
1053 | @@ -67,7 +67,7 @@ static const u8 DASD_DIAG_CMS1[] = { 0xc3, 0xd4, 0xe2, 0xf1 };/* EBCDIC CMS1 */ | ||
1054 | * and function code cmd. | ||
1055 | * In case of an exception return 3. Otherwise return result of bitwise OR of | ||
1056 | * resulting condition code and DIAG return code. */ | ||
1057 | -static inline int dia250(void *iob, int cmd) | ||
1058 | +static inline int __dia250(void *iob, int cmd) | ||
1059 | { | ||
1060 | register unsigned long reg2 asm ("2") = (unsigned long) iob; | ||
1061 | typedef union { | ||
1062 | @@ -77,7 +77,6 @@ static inline int dia250(void *iob, int cmd) | ||
1063 | int rc; | ||
1064 | |||
1065 | rc = 3; | ||
1066 | - diag_stat_inc(DIAG_STAT_X250); | ||
1067 | asm volatile( | ||
1068 | " diag 2,%2,0x250\n" | ||
1069 | "0: ipm %0\n" | ||
1070 | @@ -91,6 +90,12 @@ static inline int dia250(void *iob, int cmd) | ||
1071 | return rc; | ||
1072 | } | ||
1073 | |||
1074 | +static inline int dia250(void *iob, int cmd) | ||
1075 | +{ | ||
1076 | + diag_stat_inc(DIAG_STAT_X250); | ||
1077 | + return __dia250(iob, cmd); | ||
1078 | +} | ||
1079 | + | ||
1080 | /* Initialize block I/O to DIAG device using the specified blocksize and | ||
1081 | * block offset. On success, return zero and set end_block to contain the | ||
1082 | * number of blocks on the device minus the specified offset. Return non-zero | ||
1083 | diff --git a/drivers/target/target_core_tmr.c b/drivers/target/target_core_tmr.c | ||
1084 | index 88029cc6de5e..46b1991fbb50 100644 | ||
1085 | --- a/drivers/target/target_core_tmr.c | ||
1086 | +++ b/drivers/target/target_core_tmr.c | ||
1087 | @@ -177,7 +177,6 @@ void core_tmr_abort_task( | ||
1088 | |||
1089 | if (!__target_check_io_state(se_cmd, se_sess, 0)) { | ||
1090 | spin_unlock_irqrestore(&se_sess->sess_cmd_lock, flags); | ||
1091 | - target_put_sess_cmd(se_cmd); | ||
1092 | goto out; | ||
1093 | } | ||
1094 | list_del_init(&se_cmd->se_cmd_list); | ||
1095 | diff --git a/fs/jffs2/dir.c b/fs/jffs2/dir.c | ||
1096 | index d211b8e18566..30c4c9ebb693 100644 | ||
1097 | --- a/fs/jffs2/dir.c | ||
1098 | +++ b/fs/jffs2/dir.c | ||
1099 | @@ -843,9 +843,14 @@ static int jffs2_rename (struct inode *old_dir_i, struct dentry *old_dentry, | ||
1100 | |||
1101 | pr_notice("%s(): Link succeeded, unlink failed (err %d). You now have a hard link\n", | ||
1102 | __func__, ret); | ||
1103 | - /* Might as well let the VFS know */ | ||
1104 | - d_instantiate(new_dentry, d_inode(old_dentry)); | ||
1105 | - ihold(d_inode(old_dentry)); | ||
1106 | + /* | ||
1107 | + * We can't keep the target in dcache after that. | ||
1108 | + * For one thing, we can't afford dentry aliases for directories. | ||
1109 | + * For another, if there was a victim, we _can't_ set new inode | ||
1110 | + * for that sucker and we have to trigger mount eviction - the | ||
1111 | + * caller won't do it on its own since we are returning an error. | ||
1112 | + */ | ||
1113 | + d_invalidate(new_dentry); | ||
1114 | new_dir_i->i_mtime = new_dir_i->i_ctime = ITIME(now); | ||
1115 | return ret; | ||
1116 | } | ||
1117 | diff --git a/fs/ncpfs/dir.c b/fs/ncpfs/dir.c | ||
1118 | index f0e3e9e747dd..03446c5a3ec1 100644 | ||
1119 | --- a/fs/ncpfs/dir.c | ||
1120 | +++ b/fs/ncpfs/dir.c | ||
1121 | @@ -633,7 +633,7 @@ ncp_fill_cache(struct file *file, struct dir_context *ctx, | ||
1122 | d_rehash(newdent); | ||
1123 | } else { | ||
1124 | spin_lock(&dentry->d_lock); | ||
1125 | - NCP_FINFO(inode)->flags &= ~NCPI_DIR_CACHE; | ||
1126 | + NCP_FINFO(dir)->flags &= ~NCPI_DIR_CACHE; | ||
1127 | spin_unlock(&dentry->d_lock); | ||
1128 | } | ||
1129 | } else { | ||
1130 | diff --git a/fs/overlayfs/dir.c b/fs/overlayfs/dir.c | ||
1131 | index 692ceda3bc21..a2b1d7ce3e1a 100644 | ||
1132 | --- a/fs/overlayfs/dir.c | ||
1133 | +++ b/fs/overlayfs/dir.c | ||
1134 | @@ -618,7 +618,8 @@ static int ovl_remove_upper(struct dentry *dentry, bool is_dir) | ||
1135 | * sole user of this dentry. Too tricky... Just unhash for | ||
1136 | * now. | ||
1137 | */ | ||
1138 | - d_drop(dentry); | ||
1139 | + if (!err) | ||
1140 | + d_drop(dentry); | ||
1141 | mutex_unlock(&dir->i_mutex); | ||
1142 | |||
1143 | return err; | ||
1144 | @@ -903,6 +904,13 @@ static int ovl_rename2(struct inode *olddir, struct dentry *old, | ||
1145 | if (!overwrite && new_is_dir && !old_opaque && new_opaque) | ||
1146 | ovl_remove_opaque(newdentry); | ||
1147 | |||
1148 | + /* | ||
1149 | + * Old dentry now lives in different location. Dentries in | ||
1150 | + * lowerstack are stale. We cannot drop them here because | ||
1151 | + * access to them is lockless. This could be only pure upper | ||
1152 | + * or opaque directory - numlower is zero. Or upper non-dir | ||
1153 | + * entry - its pureness is tracked by flag opaque. | ||
1154 | + */ | ||
1155 | if (old_opaque != new_opaque) { | ||
1156 | ovl_dentry_set_opaque(old, new_opaque); | ||
1157 | if (!overwrite) | ||
1158 | diff --git a/fs/overlayfs/inode.c b/fs/overlayfs/inode.c | ||
1159 | index b29036aa8d7c..05ac9a95e881 100644 | ||
1160 | --- a/fs/overlayfs/inode.c | ||
1161 | +++ b/fs/overlayfs/inode.c | ||
1162 | @@ -65,6 +65,8 @@ int ovl_setattr(struct dentry *dentry, struct iattr *attr) | ||
1163 | |||
1164 | mutex_lock(&upperdentry->d_inode->i_mutex); | ||
1165 | err = notify_change(upperdentry, attr, NULL); | ||
1166 | + if (!err) | ||
1167 | + ovl_copyattr(upperdentry->d_inode, dentry->d_inode); | ||
1168 | mutex_unlock(&upperdentry->d_inode->i_mutex); | ||
1169 | } | ||
1170 | ovl_drop_write(dentry); | ||
1171 | diff --git a/fs/overlayfs/super.c b/fs/overlayfs/super.c | ||
1172 | index f42c9407fbad..000b2ed05c29 100644 | ||
1173 | --- a/fs/overlayfs/super.c | ||
1174 | +++ b/fs/overlayfs/super.c | ||
1175 | @@ -76,12 +76,14 @@ enum ovl_path_type ovl_path_type(struct dentry *dentry) | ||
1176 | if (oe->__upperdentry) { | ||
1177 | type = __OVL_PATH_UPPER; | ||
1178 | |||
1179 | - if (oe->numlower) { | ||
1180 | - if (S_ISDIR(dentry->d_inode->i_mode)) | ||
1181 | - type |= __OVL_PATH_MERGE; | ||
1182 | - } else if (!oe->opaque) { | ||
1183 | + /* | ||
1184 | + * Non-dir dentry can hold lower dentry from previous | ||
1185 | + * location. Its purity depends only on opaque flag. | ||
1186 | + */ | ||
1187 | + if (oe->numlower && S_ISDIR(dentry->d_inode->i_mode)) | ||
1188 | + type |= __OVL_PATH_MERGE; | ||
1189 | + else if (!oe->opaque) | ||
1190 | type |= __OVL_PATH_PURE; | ||
1191 | - } | ||
1192 | } else { | ||
1193 | if (oe->numlower > 1) | ||
1194 | type |= __OVL_PATH_MERGE; | ||
1195 | @@ -322,6 +324,7 @@ static const struct dentry_operations ovl_dentry_operations = { | ||
1196 | |||
1197 | static const struct dentry_operations ovl_reval_dentry_operations = { | ||
1198 | .d_release = ovl_dentry_release, | ||
1199 | + .d_select_inode = ovl_d_select_inode, | ||
1200 | .d_revalidate = ovl_dentry_revalidate, | ||
1201 | .d_weak_revalidate = ovl_dentry_weak_revalidate, | ||
1202 | }; | ||
1203 | diff --git a/fs/userfaultfd.c b/fs/userfaultfd.c | ||
1204 | index 50311703135b..66cdb44616d5 100644 | ||
1205 | --- a/fs/userfaultfd.c | ||
1206 | +++ b/fs/userfaultfd.c | ||
1207 | @@ -287,6 +287,12 @@ int handle_userfault(struct vm_area_struct *vma, unsigned long address, | ||
1208 | goto out; | ||
1209 | |||
1210 | /* | ||
1211 | + * We don't do userfault handling for the final child pid update. | ||
1212 | + */ | ||
1213 | + if (current->flags & PF_EXITING) | ||
1214 | + goto out; | ||
1215 | + | ||
1216 | + /* | ||
1217 | * Check that we can return VM_FAULT_RETRY. | ||
1218 | * | ||
1219 | * NOTE: it should become possible to return VM_FAULT_RETRY | ||
1220 | diff --git a/include/linux/bio.h b/include/linux/bio.h | ||
1221 | index 79cfaeef1b0d..fbe47bc700bd 100644 | ||
1222 | --- a/include/linux/bio.h | ||
1223 | +++ b/include/linux/bio.h | ||
1224 | @@ -320,11 +320,6 @@ static inline void bio_get_last_bvec(struct bio *bio, struct bio_vec *bv) | ||
1225 | struct bvec_iter iter = bio->bi_iter; | ||
1226 | int idx; | ||
1227 | |||
1228 | - if (!bio_flagged(bio, BIO_CLONED)) { | ||
1229 | - *bv = bio->bi_io_vec[bio->bi_vcnt - 1]; | ||
1230 | - return; | ||
1231 | - } | ||
1232 | - | ||
1233 | if (unlikely(!bio_multiple_segments(bio))) { | ||
1234 | *bv = bio_iovec(bio); | ||
1235 | return; | ||
1236 | diff --git a/include/linux/tracepoint.h b/include/linux/tracepoint.h | ||
1237 | index 03c7efb60c91..27e32b2b602f 100644 | ||
1238 | --- a/include/linux/tracepoint.h | ||
1239 | +++ b/include/linux/tracepoint.h | ||
1240 | @@ -148,9 +148,6 @@ extern void syscall_unregfunc(void); | ||
1241 | void *it_func; \ | ||
1242 | void *__data; \ | ||
1243 | \ | ||
1244 | - if (!cpu_online(raw_smp_processor_id())) \ | ||
1245 | - return; \ | ||
1246 | - \ | ||
1247 | if (!(cond)) \ | ||
1248 | return; \ | ||
1249 | prercu; \ | ||
1250 | @@ -357,15 +354,19 @@ extern void syscall_unregfunc(void); | ||
1251 | * "void *__data, proto" as the callback prototype. | ||
1252 | */ | ||
1253 | #define DECLARE_TRACE_NOARGS(name) \ | ||
1254 | - __DECLARE_TRACE(name, void, , 1, void *__data, __data) | ||
1255 | + __DECLARE_TRACE(name, void, , \ | ||
1256 | + cpu_online(raw_smp_processor_id()), \ | ||
1257 | + void *__data, __data) | ||
1258 | |||
1259 | #define DECLARE_TRACE(name, proto, args) \ | ||
1260 | - __DECLARE_TRACE(name, PARAMS(proto), PARAMS(args), 1, \ | ||
1261 | - PARAMS(void *__data, proto), \ | ||
1262 | - PARAMS(__data, args)) | ||
1263 | + __DECLARE_TRACE(name, PARAMS(proto), PARAMS(args), \ | ||
1264 | + cpu_online(raw_smp_processor_id()), \ | ||
1265 | + PARAMS(void *__data, proto), \ | ||
1266 | + PARAMS(__data, args)) | ||
1267 | |||
1268 | #define DECLARE_TRACE_CONDITION(name, proto, args, cond) \ | ||
1269 | - __DECLARE_TRACE(name, PARAMS(proto), PARAMS(args), PARAMS(cond), \ | ||
1270 | + __DECLARE_TRACE(name, PARAMS(proto), PARAMS(args), \ | ||
1271 | + cpu_online(raw_smp_processor_id()) && (PARAMS(cond)), \ | ||
1272 | PARAMS(void *__data, proto), \ | ||
1273 | PARAMS(__data, args)) | ||
1274 | |||
1275 | diff --git a/include/net/iw_handler.h b/include/net/iw_handler.h | ||
1276 | index 8f81bbbc38fc..e0f4109e64c6 100644 | ||
1277 | --- a/include/net/iw_handler.h | ||
1278 | +++ b/include/net/iw_handler.h | ||
1279 | @@ -439,6 +439,12 @@ int dev_get_wireless_info(char *buffer, char **start, off_t offset, int length); | ||
1280 | /* Send a single event to user space */ | ||
1281 | void wireless_send_event(struct net_device *dev, unsigned int cmd, | ||
1282 | union iwreq_data *wrqu, const char *extra); | ||
1283 | +#ifdef CONFIG_WEXT_CORE | ||
1284 | +/* flush all previous wext events - if work is done from netdev notifiers */ | ||
1285 | +void wireless_nlevent_flush(void); | ||
1286 | +#else | ||
1287 | +static inline void wireless_nlevent_flush(void) {} | ||
1288 | +#endif | ||
1289 | |||
1290 | /* We may need a function to send a stream of events to user space. | ||
1291 | * More on that later... */ | ||
1292 | diff --git a/net/mac80211/agg-rx.c b/net/mac80211/agg-rx.c | ||
1293 | index 10ad4ac1fa0b..367784be5df2 100644 | ||
1294 | --- a/net/mac80211/agg-rx.c | ||
1295 | +++ b/net/mac80211/agg-rx.c | ||
1296 | @@ -291,7 +291,7 @@ void __ieee80211_start_rx_ba_session(struct sta_info *sta, | ||
1297 | } | ||
1298 | |||
1299 | /* prepare A-MPDU MLME for Rx aggregation */ | ||
1300 | - tid_agg_rx = kmalloc(sizeof(struct tid_ampdu_rx), GFP_KERNEL); | ||
1301 | + tid_agg_rx = kzalloc(sizeof(*tid_agg_rx), GFP_KERNEL); | ||
1302 | if (!tid_agg_rx) | ||
1303 | goto end; | ||
1304 | |||
1305 | diff --git a/net/mac80211/ieee80211_i.h b/net/mac80211/ieee80211_i.h | ||
1306 | index 5322b4c71630..6837a46ca4a2 100644 | ||
1307 | --- a/net/mac80211/ieee80211_i.h | ||
1308 | +++ b/net/mac80211/ieee80211_i.h | ||
1309 | @@ -92,7 +92,7 @@ struct ieee80211_fragment_entry { | ||
1310 | u16 extra_len; | ||
1311 | u16 last_frag; | ||
1312 | u8 rx_queue; | ||
1313 | - bool ccmp; /* Whether fragments were encrypted with CCMP */ | ||
1314 | + bool check_sequential_pn; /* needed for CCMP/GCMP */ | ||
1315 | u8 last_pn[6]; /* PN of the last fragment if CCMP was used */ | ||
1316 | }; | ||
1317 | |||
1318 | diff --git a/net/mac80211/rc80211_minstrel.c b/net/mac80211/rc80211_minstrel.c | ||
1319 | index 3ece7d1034c8..b54f398cda5d 100644 | ||
1320 | --- a/net/mac80211/rc80211_minstrel.c | ||
1321 | +++ b/net/mac80211/rc80211_minstrel.c | ||
1322 | @@ -711,7 +711,7 @@ static u32 minstrel_get_expected_throughput(void *priv_sta) | ||
1323 | * computing cur_tp | ||
1324 | */ | ||
1325 | tmp_mrs = &mi->r[idx].stats; | ||
1326 | - tmp_cur_tp = minstrel_get_tp_avg(&mi->r[idx], tmp_mrs->prob_ewma); | ||
1327 | + tmp_cur_tp = minstrel_get_tp_avg(&mi->r[idx], tmp_mrs->prob_ewma) * 10; | ||
1328 | tmp_cur_tp = tmp_cur_tp * 1200 * 8 / 1024; | ||
1329 | |||
1330 | return tmp_cur_tp; | ||
1331 | diff --git a/net/mac80211/rc80211_minstrel_ht.c b/net/mac80211/rc80211_minstrel_ht.c | ||
1332 | index 3928dbd24e25..239ed6e92b89 100644 | ||
1333 | --- a/net/mac80211/rc80211_minstrel_ht.c | ||
1334 | +++ b/net/mac80211/rc80211_minstrel_ht.c | ||
1335 | @@ -691,7 +691,7 @@ minstrel_aggr_check(struct ieee80211_sta *pubsta, struct sk_buff *skb) | ||
1336 | if (likely(sta->ampdu_mlme.tid_tx[tid])) | ||
1337 | return; | ||
1338 | |||
1339 | - ieee80211_start_tx_ba_session(pubsta, tid, 5000); | ||
1340 | + ieee80211_start_tx_ba_session(pubsta, tid, 0); | ||
1341 | } | ||
1342 | |||
1343 | static void | ||
1344 | @@ -871,7 +871,7 @@ minstrel_ht_set_rate(struct minstrel_priv *mp, struct minstrel_ht_sta *mi, | ||
1345 | * - if station is in dynamic SMPS (and streams > 1) | ||
1346 | * - for fallback rates, to increase chances of getting through | ||
1347 | */ | ||
1348 | - if (offset > 0 && | ||
1349 | + if (offset > 0 || | ||
1350 | (mi->sta->smps_mode == IEEE80211_SMPS_DYNAMIC && | ||
1351 | group->streams > 1)) { | ||
1352 | ratetbl->rate[offset].count = ratetbl->rate[offset].count_rts; | ||
1353 | @@ -1334,7 +1334,8 @@ static u32 minstrel_ht_get_expected_throughput(void *priv_sta) | ||
1354 | prob = mi->groups[i].rates[j].prob_ewma; | ||
1355 | |||
1356 | /* convert tp_avg from pkt per second in kbps */ | ||
1357 | - tp_avg = minstrel_ht_get_tp_avg(mi, i, j, prob) * AVG_PKT_SIZE * 8 / 1024; | ||
1358 | + tp_avg = minstrel_ht_get_tp_avg(mi, i, j, prob) * 10; | ||
1359 | + tp_avg = tp_avg * AVG_PKT_SIZE * 8 / 1024; | ||
1360 | |||
1361 | return tp_avg; | ||
1362 | } | ||
1363 | diff --git a/net/mac80211/rx.c b/net/mac80211/rx.c | ||
1364 | index 82af407fea7a..4cbf36cae806 100644 | ||
1365 | --- a/net/mac80211/rx.c | ||
1366 | +++ b/net/mac80211/rx.c | ||
1367 | @@ -1754,7 +1754,7 @@ ieee80211_reassemble_add(struct ieee80211_sub_if_data *sdata, | ||
1368 | entry->seq = seq; | ||
1369 | entry->rx_queue = rx_queue; | ||
1370 | entry->last_frag = frag; | ||
1371 | - entry->ccmp = 0; | ||
1372 | + entry->check_sequential_pn = false; | ||
1373 | entry->extra_len = 0; | ||
1374 | |||
1375 | return entry; | ||
1376 | @@ -1850,15 +1850,27 @@ ieee80211_rx_h_defragment(struct ieee80211_rx_data *rx) | ||
1377 | rx->seqno_idx, &(rx->skb)); | ||
1378 | if (rx->key && | ||
1379 | (rx->key->conf.cipher == WLAN_CIPHER_SUITE_CCMP || | ||
1380 | - rx->key->conf.cipher == WLAN_CIPHER_SUITE_CCMP_256) && | ||
1381 | + rx->key->conf.cipher == WLAN_CIPHER_SUITE_CCMP_256 || | ||
1382 | + rx->key->conf.cipher == WLAN_CIPHER_SUITE_GCMP || | ||
1383 | + rx->key->conf.cipher == WLAN_CIPHER_SUITE_GCMP_256) && | ||
1384 | ieee80211_has_protected(fc)) { | ||
1385 | int queue = rx->security_idx; | ||
1386 | - /* Store CCMP PN so that we can verify that the next | ||
1387 | - * fragment has a sequential PN value. */ | ||
1388 | - entry->ccmp = 1; | ||
1389 | + | ||
1390 | + /* Store CCMP/GCMP PN so that we can verify that the | ||
1391 | + * next fragment has a sequential PN value. | ||
1392 | + */ | ||
1393 | + entry->check_sequential_pn = true; | ||
1394 | memcpy(entry->last_pn, | ||
1395 | rx->key->u.ccmp.rx_pn[queue], | ||
1396 | IEEE80211_CCMP_PN_LEN); | ||
1397 | + BUILD_BUG_ON(offsetof(struct ieee80211_key, | ||
1398 | + u.ccmp.rx_pn) != | ||
1399 | + offsetof(struct ieee80211_key, | ||
1400 | + u.gcmp.rx_pn)); | ||
1401 | + BUILD_BUG_ON(sizeof(rx->key->u.ccmp.rx_pn[queue]) != | ||
1402 | + sizeof(rx->key->u.gcmp.rx_pn[queue])); | ||
1403 | + BUILD_BUG_ON(IEEE80211_CCMP_PN_LEN != | ||
1404 | + IEEE80211_GCMP_PN_LEN); | ||
1405 | } | ||
1406 | return RX_QUEUED; | ||
1407 | } | ||
1408 | @@ -1873,15 +1885,21 @@ ieee80211_rx_h_defragment(struct ieee80211_rx_data *rx) | ||
1409 | return RX_DROP_MONITOR; | ||
1410 | } | ||
1411 | |||
1412 | - /* Verify that MPDUs within one MSDU have sequential PN values. | ||
1413 | - * (IEEE 802.11i, 8.3.3.4.5) */ | ||
1414 | - if (entry->ccmp) { | ||
1415 | + /* "The receiver shall discard MSDUs and MMPDUs whose constituent | ||
1416 | + * MPDU PN values are not incrementing in steps of 1." | ||
1417 | + * see IEEE P802.11-REVmc/D5.0, 12.5.3.4.4, item d (for CCMP) | ||
1418 | + * and IEEE P802.11-REVmc/D5.0, 12.5.5.4.4, item d (for GCMP) | ||
1419 | + */ | ||
1420 | + if (entry->check_sequential_pn) { | ||
1421 | int i; | ||
1422 | u8 pn[IEEE80211_CCMP_PN_LEN], *rpn; | ||
1423 | int queue; | ||
1424 | + | ||
1425 | if (!rx->key || | ||
1426 | (rx->key->conf.cipher != WLAN_CIPHER_SUITE_CCMP && | ||
1427 | - rx->key->conf.cipher != WLAN_CIPHER_SUITE_CCMP_256)) | ||
1428 | + rx->key->conf.cipher != WLAN_CIPHER_SUITE_CCMP_256 && | ||
1429 | + rx->key->conf.cipher != WLAN_CIPHER_SUITE_GCMP && | ||
1430 | + rx->key->conf.cipher != WLAN_CIPHER_SUITE_GCMP_256)) | ||
1431 | return RX_DROP_UNUSABLE; | ||
1432 | memcpy(pn, entry->last_pn, IEEE80211_CCMP_PN_LEN); | ||
1433 | for (i = IEEE80211_CCMP_PN_LEN - 1; i >= 0; i--) { | ||
1434 | @@ -3367,6 +3385,7 @@ static bool ieee80211_accept_frame(struct ieee80211_rx_data *rx) | ||
1435 | return false; | ||
1436 | /* ignore action frames to TDLS-peers */ | ||
1437 | if (ieee80211_is_action(hdr->frame_control) && | ||
1438 | + !is_broadcast_ether_addr(bssid) && | ||
1439 | !ether_addr_equal(bssid, hdr->addr1)) | ||
1440 | return false; | ||
1441 | } | ||
1442 | diff --git a/net/wireless/core.c b/net/wireless/core.c | ||
1443 | index b0915515640e..8f0bac7e03c4 100644 | ||
1444 | --- a/net/wireless/core.c | ||
1445 | +++ b/net/wireless/core.c | ||
1446 | @@ -1147,6 +1147,8 @@ static int cfg80211_netdev_notifier_call(struct notifier_block *nb, | ||
1447 | return NOTIFY_DONE; | ||
1448 | } | ||
1449 | |||
1450 | + wireless_nlevent_flush(); | ||
1451 | + | ||
1452 | return NOTIFY_OK; | ||
1453 | } | ||
1454 | |||
1455 | diff --git a/net/wireless/wext-core.c b/net/wireless/wext-core.c | ||
1456 | index c8717c1d082e..b50ee5d622e1 100644 | ||
1457 | --- a/net/wireless/wext-core.c | ||
1458 | +++ b/net/wireless/wext-core.c | ||
1459 | @@ -342,6 +342,40 @@ static const int compat_event_type_size[] = { | ||
1460 | |||
1461 | /* IW event code */ | ||
1462 | |||
1463 | +void wireless_nlevent_flush(void) | ||
1464 | +{ | ||
1465 | + struct sk_buff *skb; | ||
1466 | + struct net *net; | ||
1467 | + | ||
1468 | + ASSERT_RTNL(); | ||
1469 | + | ||
1470 | + for_each_net(net) { | ||
1471 | + while ((skb = skb_dequeue(&net->wext_nlevents))) | ||
1472 | + rtnl_notify(skb, net, 0, RTNLGRP_LINK, NULL, | ||
1473 | + GFP_KERNEL); | ||
1474 | + } | ||
1475 | +} | ||
1476 | +EXPORT_SYMBOL_GPL(wireless_nlevent_flush); | ||
1477 | + | ||
1478 | +static int wext_netdev_notifier_call(struct notifier_block *nb, | ||
1479 | + unsigned long state, void *ptr) | ||
1480 | +{ | ||
1481 | + /* | ||
1482 | + * When a netdev changes state in any way, flush all pending messages | ||
1483 | + * to avoid them going out in a strange order, e.g. RTM_NEWLINK after | ||
1484 | + * RTM_DELLINK, or with IFF_UP after without IFF_UP during dev_close() | ||
1485 | + * or similar - all of which could otherwise happen due to delays from | ||
1486 | + * schedule_work(). | ||
1487 | + */ | ||
1488 | + wireless_nlevent_flush(); | ||
1489 | + | ||
1490 | + return NOTIFY_OK; | ||
1491 | +} | ||
1492 | + | ||
1493 | +static struct notifier_block wext_netdev_notifier = { | ||
1494 | + .notifier_call = wext_netdev_notifier_call, | ||
1495 | +}; | ||
1496 | + | ||
1497 | static int __net_init wext_pernet_init(struct net *net) | ||
1498 | { | ||
1499 | skb_queue_head_init(&net->wext_nlevents); | ||
1500 | @@ -360,7 +394,12 @@ static struct pernet_operations wext_pernet_ops = { | ||
1501 | |||
1502 | static int __init wireless_nlevent_init(void) | ||
1503 | { | ||
1504 | - return register_pernet_subsys(&wext_pernet_ops); | ||
1505 | + int err = register_pernet_subsys(&wext_pernet_ops); | ||
1506 | + | ||
1507 | + if (err) | ||
1508 | + return err; | ||
1509 | + | ||
1510 | + return register_netdevice_notifier(&wext_netdev_notifier); | ||
1511 | } | ||
1512 | |||
1513 | subsys_initcall(wireless_nlevent_init); | ||
1514 | @@ -368,17 +407,8 @@ subsys_initcall(wireless_nlevent_init); | ||
1515 | /* Process events generated by the wireless layer or the driver. */ | ||
1516 | static void wireless_nlevent_process(struct work_struct *work) | ||
1517 | { | ||
1518 | - struct sk_buff *skb; | ||
1519 | - struct net *net; | ||
1520 | - | ||
1521 | rtnl_lock(); | ||
1522 | - | ||
1523 | - for_each_net(net) { | ||
1524 | - while ((skb = skb_dequeue(&net->wext_nlevents))) | ||
1525 | - rtnl_notify(skb, net, 0, RTNLGRP_LINK, NULL, | ||
1526 | - GFP_KERNEL); | ||
1527 | - } | ||
1528 | - | ||
1529 | + wireless_nlevent_flush(); | ||
1530 | rtnl_unlock(); | ||
1531 | } | ||
1532 | |||
1533 | diff --git a/scripts/ld-version.sh b/scripts/ld-version.sh | ||
1534 | index 198580d245e0..1659b409ef10 100755 | ||
1535 | --- a/scripts/ld-version.sh | ||
1536 | +++ b/scripts/ld-version.sh | ||
1537 | @@ -1,7 +1,7 @@ | ||
1538 | #!/usr/bin/awk -f | ||
1539 | # extract linker version number from stdin and turn into single number | ||
1540 | { | ||
1541 | - gsub(".*)", ""); | ||
1542 | + gsub(".*\\)", ""); | ||
1543 | split($1,a, "."); | ||
1544 | print a[1]*10000000 + a[2]*100000 + a[3]*10000 + a[4]*100 + a[5]; | ||
1545 | exit | ||
1546 | diff --git a/sound/soc/codecs/wm8958-dsp2.c b/sound/soc/codecs/wm8958-dsp2.c | ||
1547 | index c799cca5abeb..6b864c0fc2b6 100644 | ||
1548 | --- a/sound/soc/codecs/wm8958-dsp2.c | ||
1549 | +++ b/sound/soc/codecs/wm8958-dsp2.c | ||
1550 | @@ -459,7 +459,7 @@ static int wm8958_put_mbc_enum(struct snd_kcontrol *kcontrol, | ||
1551 | struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); | ||
1552 | struct wm8994_priv *wm8994 = snd_soc_codec_get_drvdata(codec); | ||
1553 | struct wm8994 *control = wm8994->wm8994; | ||
1554 | - int value = ucontrol->value.integer.value[0]; | ||
1555 | + int value = ucontrol->value.enumerated.item[0]; | ||
1556 | int reg; | ||
1557 | |||
1558 | /* Don't allow on the fly reconfiguration */ | ||
1559 | @@ -549,7 +549,7 @@ static int wm8958_put_vss_enum(struct snd_kcontrol *kcontrol, | ||
1560 | struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); | ||
1561 | struct wm8994_priv *wm8994 = snd_soc_codec_get_drvdata(codec); | ||
1562 | struct wm8994 *control = wm8994->wm8994; | ||
1563 | - int value = ucontrol->value.integer.value[0]; | ||
1564 | + int value = ucontrol->value.enumerated.item[0]; | ||
1565 | int reg; | ||
1566 | |||
1567 | /* Don't allow on the fly reconfiguration */ | ||
1568 | @@ -582,7 +582,7 @@ static int wm8958_put_vss_hpf_enum(struct snd_kcontrol *kcontrol, | ||
1569 | struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); | ||
1570 | struct wm8994_priv *wm8994 = snd_soc_codec_get_drvdata(codec); | ||
1571 | struct wm8994 *control = wm8994->wm8994; | ||
1572 | - int value = ucontrol->value.integer.value[0]; | ||
1573 | + int value = ucontrol->value.enumerated.item[0]; | ||
1574 | int reg; | ||
1575 | |||
1576 | /* Don't allow on the fly reconfiguration */ | ||
1577 | @@ -749,7 +749,7 @@ static int wm8958_put_enh_eq_enum(struct snd_kcontrol *kcontrol, | ||
1578 | struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); | ||
1579 | struct wm8994_priv *wm8994 = snd_soc_codec_get_drvdata(codec); | ||
1580 | struct wm8994 *control = wm8994->wm8994; | ||
1581 | - int value = ucontrol->value.integer.value[0]; | ||
1582 | + int value = ucontrol->value.enumerated.item[0]; | ||
1583 | int reg; | ||
1584 | |||
1585 | /* Don't allow on the fly reconfiguration */ | ||
1586 | diff --git a/sound/soc/codecs/wm8994.c b/sound/soc/codecs/wm8994.c | ||
1587 | index 2ccbb322df77..a18aecb49935 100644 | ||
1588 | --- a/sound/soc/codecs/wm8994.c | ||
1589 | +++ b/sound/soc/codecs/wm8994.c | ||
1590 | @@ -362,7 +362,7 @@ static int wm8994_put_drc_enum(struct snd_kcontrol *kcontrol, | ||
1591 | struct wm8994 *control = wm8994->wm8994; | ||
1592 | struct wm8994_pdata *pdata = &control->pdata; | ||
1593 | int drc = wm8994_get_drc(kcontrol->id.name); | ||
1594 | - int value = ucontrol->value.integer.value[0]; | ||
1595 | + int value = ucontrol->value.enumerated.item[0]; | ||
1596 | |||
1597 | if (drc < 0) | ||
1598 | return drc; | ||
1599 | @@ -469,7 +469,7 @@ static int wm8994_put_retune_mobile_enum(struct snd_kcontrol *kcontrol, | ||
1600 | struct wm8994 *control = wm8994->wm8994; | ||
1601 | struct wm8994_pdata *pdata = &control->pdata; | ||
1602 | int block = wm8994_get_retune_mobile_block(kcontrol->id.name); | ||
1603 | - int value = ucontrol->value.integer.value[0]; | ||
1604 | + int value = ucontrol->value.enumerated.item[0]; | ||
1605 | |||
1606 | if (block < 0) | ||
1607 | return block; | ||
1608 | diff --git a/sound/soc/samsung/i2s.c b/sound/soc/samsung/i2s.c | ||
1609 | index ea4ab374a223..7dbf899b2af2 100644 | ||
1610 | --- a/sound/soc/samsung/i2s.c | ||
1611 | +++ b/sound/soc/samsung/i2s.c | ||
1612 | @@ -480,10 +480,11 @@ static int i2s_set_sysclk(struct snd_soc_dai *dai, | ||
1613 | unsigned int cdcon_mask = 1 << i2s_regs->cdclkcon_off; | ||
1614 | unsigned int rsrc_mask = 1 << i2s_regs->rclksrc_off; | ||
1615 | u32 mod, mask, val = 0; | ||
1616 | + unsigned long flags; | ||
1617 | |||
1618 | - spin_lock(i2s->lock); | ||
1619 | + spin_lock_irqsave(i2s->lock, flags); | ||
1620 | mod = readl(i2s->addr + I2SMOD); | ||
1621 | - spin_unlock(i2s->lock); | ||
1622 | + spin_unlock_irqrestore(i2s->lock, flags); | ||
1623 | |||
1624 | switch (clk_id) { | ||
1625 | case SAMSUNG_I2S_OPCLK: | ||
1626 | @@ -574,11 +575,11 @@ static int i2s_set_sysclk(struct snd_soc_dai *dai, | ||
1627 | return -EINVAL; | ||
1628 | } | ||
1629 | |||
1630 | - spin_lock(i2s->lock); | ||
1631 | + spin_lock_irqsave(i2s->lock, flags); | ||
1632 | mod = readl(i2s->addr + I2SMOD); | ||
1633 | mod = (mod & ~mask) | val; | ||
1634 | writel(mod, i2s->addr + I2SMOD); | ||
1635 | - spin_unlock(i2s->lock); | ||
1636 | + spin_unlock_irqrestore(i2s->lock, flags); | ||
1637 | |||
1638 | return 0; | ||
1639 | } | ||
1640 | @@ -589,6 +590,7 @@ static int i2s_set_fmt(struct snd_soc_dai *dai, | ||
1641 | struct i2s_dai *i2s = to_info(dai); | ||
1642 | int lrp_shift, sdf_shift, sdf_mask, lrp_rlow, mod_slave; | ||
1643 | u32 mod, tmp = 0; | ||
1644 | + unsigned long flags; | ||
1645 | |||
1646 | lrp_shift = i2s->variant_regs->lrp_off; | ||
1647 | sdf_shift = i2s->variant_regs->sdf_off; | ||
1648 | @@ -648,7 +650,7 @@ static int i2s_set_fmt(struct snd_soc_dai *dai, | ||
1649 | return -EINVAL; | ||
1650 | } | ||
1651 | |||
1652 | - spin_lock(i2s->lock); | ||
1653 | + spin_lock_irqsave(i2s->lock, flags); | ||
1654 | mod = readl(i2s->addr + I2SMOD); | ||
1655 | /* | ||
1656 | * Don't change the I2S mode if any controller is active on this | ||
1657 | @@ -656,7 +658,7 @@ static int i2s_set_fmt(struct snd_soc_dai *dai, | ||
1658 | */ | ||
1659 | if (any_active(i2s) && | ||
1660 | ((mod & (sdf_mask | lrp_rlow | mod_slave)) != tmp)) { | ||
1661 | - spin_unlock(i2s->lock); | ||
1662 | + spin_unlock_irqrestore(i2s->lock, flags); | ||
1663 | dev_err(&i2s->pdev->dev, | ||
1664 | "%s:%d Other DAI busy\n", __func__, __LINE__); | ||
1665 | return -EAGAIN; | ||
1666 | @@ -665,7 +667,7 @@ static int i2s_set_fmt(struct snd_soc_dai *dai, | ||
1667 | mod &= ~(sdf_mask | lrp_rlow | mod_slave); | ||
1668 | mod |= tmp; | ||
1669 | writel(mod, i2s->addr + I2SMOD); | ||
1670 | - spin_unlock(i2s->lock); | ||
1671 | + spin_unlock_irqrestore(i2s->lock, flags); | ||
1672 | |||
1673 | return 0; | ||
1674 | } | ||
1675 | @@ -675,6 +677,7 @@ static int i2s_hw_params(struct snd_pcm_substream *substream, | ||
1676 | { | ||
1677 | struct i2s_dai *i2s = to_info(dai); | ||
1678 | u32 mod, mask = 0, val = 0; | ||
1679 | + unsigned long flags; | ||
1680 | |||
1681 | if (!is_secondary(i2s)) | ||
1682 | mask |= (MOD_DC2_EN | MOD_DC1_EN); | ||
1683 | @@ -743,11 +746,11 @@ static int i2s_hw_params(struct snd_pcm_substream *substream, | ||
1684 | return -EINVAL; | ||
1685 | } | ||
1686 | |||
1687 | - spin_lock(i2s->lock); | ||
1688 | + spin_lock_irqsave(i2s->lock, flags); | ||
1689 | mod = readl(i2s->addr + I2SMOD); | ||
1690 | mod = (mod & ~mask) | val; | ||
1691 | writel(mod, i2s->addr + I2SMOD); | ||
1692 | - spin_unlock(i2s->lock); | ||
1693 | + spin_unlock_irqrestore(i2s->lock, flags); | ||
1694 | |||
1695 | samsung_asoc_init_dma_data(dai, &i2s->dma_playback, &i2s->dma_capture); | ||
1696 | |||
1697 | diff --git a/sound/soc/soc-dapm.c b/sound/soc/soc-dapm.c | ||
1698 | index 7d009428934a..416514fe9e63 100644 | ||
1699 | --- a/sound/soc/soc-dapm.c | ||
1700 | +++ b/sound/soc/soc-dapm.c | ||
1701 | @@ -3568,7 +3568,7 @@ static int snd_soc_dapm_dai_link_get(struct snd_kcontrol *kcontrol, | ||
1702 | { | ||
1703 | struct snd_soc_dapm_widget *w = snd_kcontrol_chip(kcontrol); | ||
1704 | |||
1705 | - ucontrol->value.integer.value[0] = w->params_select; | ||
1706 | + ucontrol->value.enumerated.item[0] = w->params_select; | ||
1707 | |||
1708 | return 0; | ||
1709 | } | ||
1710 | @@ -3582,13 +3582,13 @@ static int snd_soc_dapm_dai_link_put(struct snd_kcontrol *kcontrol, | ||
1711 | if (w->power) | ||
1712 | return -EBUSY; | ||
1713 | |||
1714 | - if (ucontrol->value.integer.value[0] == w->params_select) | ||
1715 | + if (ucontrol->value.enumerated.item[0] == w->params_select) | ||
1716 | return 0; | ||
1717 | |||
1718 | - if (ucontrol->value.integer.value[0] >= w->num_params) | ||
1719 | + if (ucontrol->value.enumerated.item[0] >= w->num_params) | ||
1720 | return -EINVAL; | ||
1721 | |||
1722 | - w->params_select = ucontrol->value.integer.value[0]; | ||
1723 | + w->params_select = ucontrol->value.enumerated.item[0]; | ||
1724 | |||
1725 | return 0; | ||
1726 | } | ||
1727 | diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c | ||
1728 | index 484079efea5b..7338e30421d8 100644 | ||
1729 | --- a/virt/kvm/kvm_main.c | ||
1730 | +++ b/virt/kvm/kvm_main.c | ||
1731 | @@ -1961,6 +1961,9 @@ static void grow_halt_poll_ns(struct kvm_vcpu *vcpu) | ||
1732 | else | ||
1733 | val *= halt_poll_ns_grow; | ||
1734 | |||
1735 | + if (val > halt_poll_ns) | ||
1736 | + val = halt_poll_ns; | ||
1737 | + | ||
1738 | vcpu->halt_poll_ns = val; | ||
1739 | trace_kvm_halt_poll_ns_grow(vcpu->vcpu_id, val, old); | ||
1740 | } |