Annotation of /trunk/kernel-magellan/patches-3.12/0106-3.12.7-all-fixes.patch
Parent Directory | Revision Log
Revision 2387 -
(hide annotations)
(download)
Tue Jan 28 08:29:14 2014 UTC (10 years, 8 months ago) by niro
File size: 176498 byte(s)
Tue Jan 28 08:29:14 2014 UTC (10 years, 8 months ago) by niro
File size: 176498 byte(s)
-linux-3.12.7
1 | niro | 2387 | diff --git a/Documentation/kernel-parameters.txt b/Documentation/kernel-parameters.txt |
2 | index fcbb736d55fe..4f7c57cb6022 100644 | ||
3 | --- a/Documentation/kernel-parameters.txt | ||
4 | +++ b/Documentation/kernel-parameters.txt | ||
5 | @@ -1515,6 +1515,8 @@ bytes respectively. Such letter suffixes can also be entirely omitted. | ||
6 | |||
7 | * atapi_dmadir: Enable ATAPI DMADIR bridge support | ||
8 | |||
9 | + * disable: Disable this device. | ||
10 | + | ||
11 | If there are multiple matching configurations changing | ||
12 | the same attribute, the last one is used. | ||
13 | |||
14 | diff --git a/Makefile b/Makefile | ||
15 | index 2b23383311ff..c2f0b7985b41 100644 | ||
16 | --- a/Makefile | ||
17 | +++ b/Makefile | ||
18 | @@ -1,6 +1,6 @@ | ||
19 | VERSION = 3 | ||
20 | PATCHLEVEL = 12 | ||
21 | -SUBLEVEL = 6 | ||
22 | +SUBLEVEL = 7 | ||
23 | EXTRAVERSION = | ||
24 | NAME = One Giant Leap for Frogkind | ||
25 | |||
26 | diff --git a/arch/arm/boot/dts/r8a7790.dtsi b/arch/arm/boot/dts/r8a7790.dtsi | ||
27 | index 413b4c29e782..8a01060f421a 100644 | ||
28 | --- a/arch/arm/boot/dts/r8a7790.dtsi | ||
29 | +++ b/arch/arm/boot/dts/r8a7790.dtsi | ||
30 | @@ -152,7 +152,7 @@ | ||
31 | |||
32 | sdhi0: sdhi@ee100000 { | ||
33 | compatible = "renesas,sdhi-r8a7790"; | ||
34 | - reg = <0 0xee100000 0 0x100>; | ||
35 | + reg = <0 0xee100000 0 0x200>; | ||
36 | interrupt-parent = <&gic>; | ||
37 | interrupts = <0 165 4>; | ||
38 | cap-sd-highspeed; | ||
39 | @@ -161,7 +161,7 @@ | ||
40 | |||
41 | sdhi1: sdhi@ee120000 { | ||
42 | compatible = "renesas,sdhi-r8a7790"; | ||
43 | - reg = <0 0xee120000 0 0x100>; | ||
44 | + reg = <0 0xee120000 0 0x200>; | ||
45 | interrupt-parent = <&gic>; | ||
46 | interrupts = <0 166 4>; | ||
47 | cap-sd-highspeed; | ||
48 | diff --git a/arch/arm/boot/dts/sun7i-a20.dtsi b/arch/arm/boot/dts/sun7i-a20.dtsi | ||
49 | index 80559cbdbc87..aad69ba7503f 100644 | ||
50 | --- a/arch/arm/boot/dts/sun7i-a20.dtsi | ||
51 | +++ b/arch/arm/boot/dts/sun7i-a20.dtsi | ||
52 | @@ -170,7 +170,7 @@ | ||
53 | emac: ethernet@01c0b000 { | ||
54 | compatible = "allwinner,sun4i-emac"; | ||
55 | reg = <0x01c0b000 0x1000>; | ||
56 | - interrupts = <0 55 1>; | ||
57 | + interrupts = <0 55 4>; | ||
58 | clocks = <&ahb_gates 17>; | ||
59 | status = "disabled"; | ||
60 | }; | ||
61 | @@ -186,7 +186,7 @@ | ||
62 | pio: pinctrl@01c20800 { | ||
63 | compatible = "allwinner,sun7i-a20-pinctrl"; | ||
64 | reg = <0x01c20800 0x400>; | ||
65 | - interrupts = <0 28 1>; | ||
66 | + interrupts = <0 28 4>; | ||
67 | clocks = <&apb0_gates 5>; | ||
68 | gpio-controller; | ||
69 | interrupt-controller; | ||
70 | @@ -230,12 +230,12 @@ | ||
71 | timer@01c20c00 { | ||
72 | compatible = "allwinner,sun4i-timer"; | ||
73 | reg = <0x01c20c00 0x90>; | ||
74 | - interrupts = <0 22 1>, | ||
75 | - <0 23 1>, | ||
76 | - <0 24 1>, | ||
77 | - <0 25 1>, | ||
78 | - <0 67 1>, | ||
79 | - <0 68 1>; | ||
80 | + interrupts = <0 22 4>, | ||
81 | + <0 23 4>, | ||
82 | + <0 24 4>, | ||
83 | + <0 25 4>, | ||
84 | + <0 67 4>, | ||
85 | + <0 68 4>; | ||
86 | clocks = <&osc24M>; | ||
87 | }; | ||
88 | |||
89 | @@ -247,7 +247,7 @@ | ||
90 | uart0: serial@01c28000 { | ||
91 | compatible = "snps,dw-apb-uart"; | ||
92 | reg = <0x01c28000 0x400>; | ||
93 | - interrupts = <0 1 1>; | ||
94 | + interrupts = <0 1 4>; | ||
95 | reg-shift = <2>; | ||
96 | reg-io-width = <4>; | ||
97 | clocks = <&apb1_gates 16>; | ||
98 | @@ -257,7 +257,7 @@ | ||
99 | uart1: serial@01c28400 { | ||
100 | compatible = "snps,dw-apb-uart"; | ||
101 | reg = <0x01c28400 0x400>; | ||
102 | - interrupts = <0 2 1>; | ||
103 | + interrupts = <0 2 4>; | ||
104 | reg-shift = <2>; | ||
105 | reg-io-width = <4>; | ||
106 | clocks = <&apb1_gates 17>; | ||
107 | @@ -267,7 +267,7 @@ | ||
108 | uart2: serial@01c28800 { | ||
109 | compatible = "snps,dw-apb-uart"; | ||
110 | reg = <0x01c28800 0x400>; | ||
111 | - interrupts = <0 3 1>; | ||
112 | + interrupts = <0 3 4>; | ||
113 | reg-shift = <2>; | ||
114 | reg-io-width = <4>; | ||
115 | clocks = <&apb1_gates 18>; | ||
116 | @@ -277,7 +277,7 @@ | ||
117 | uart3: serial@01c28c00 { | ||
118 | compatible = "snps,dw-apb-uart"; | ||
119 | reg = <0x01c28c00 0x400>; | ||
120 | - interrupts = <0 4 1>; | ||
121 | + interrupts = <0 4 4>; | ||
122 | reg-shift = <2>; | ||
123 | reg-io-width = <4>; | ||
124 | clocks = <&apb1_gates 19>; | ||
125 | @@ -287,7 +287,7 @@ | ||
126 | uart4: serial@01c29000 { | ||
127 | compatible = "snps,dw-apb-uart"; | ||
128 | reg = <0x01c29000 0x400>; | ||
129 | - interrupts = <0 17 1>; | ||
130 | + interrupts = <0 17 4>; | ||
131 | reg-shift = <2>; | ||
132 | reg-io-width = <4>; | ||
133 | clocks = <&apb1_gates 20>; | ||
134 | @@ -297,7 +297,7 @@ | ||
135 | uart5: serial@01c29400 { | ||
136 | compatible = "snps,dw-apb-uart"; | ||
137 | reg = <0x01c29400 0x400>; | ||
138 | - interrupts = <0 18 1>; | ||
139 | + interrupts = <0 18 4>; | ||
140 | reg-shift = <2>; | ||
141 | reg-io-width = <4>; | ||
142 | clocks = <&apb1_gates 21>; | ||
143 | @@ -307,7 +307,7 @@ | ||
144 | uart6: serial@01c29800 { | ||
145 | compatible = "snps,dw-apb-uart"; | ||
146 | reg = <0x01c29800 0x400>; | ||
147 | - interrupts = <0 19 1>; | ||
148 | + interrupts = <0 19 4>; | ||
149 | reg-shift = <2>; | ||
150 | reg-io-width = <4>; | ||
151 | clocks = <&apb1_gates 22>; | ||
152 | @@ -317,7 +317,7 @@ | ||
153 | uart7: serial@01c29c00 { | ||
154 | compatible = "snps,dw-apb-uart"; | ||
155 | reg = <0x01c29c00 0x400>; | ||
156 | - interrupts = <0 20 1>; | ||
157 | + interrupts = <0 20 4>; | ||
158 | reg-shift = <2>; | ||
159 | reg-io-width = <4>; | ||
160 | clocks = <&apb1_gates 23>; | ||
161 | diff --git a/arch/arm/mach-omap2/board-ldp.c b/arch/arm/mach-omap2/board-ldp.c | ||
162 | index dd8da2c5399f..ba1cba94c31d 100644 | ||
163 | --- a/arch/arm/mach-omap2/board-ldp.c | ||
164 | +++ b/arch/arm/mach-omap2/board-ldp.c | ||
165 | @@ -243,12 +243,18 @@ static void __init ldp_display_init(void) | ||
166 | |||
167 | static int ldp_twl_gpio_setup(struct device *dev, unsigned gpio, unsigned ngpio) | ||
168 | { | ||
169 | + int res; | ||
170 | + | ||
171 | /* LCD enable GPIO */ | ||
172 | ldp_lcd_pdata.enable_gpio = gpio + 7; | ||
173 | |||
174 | /* Backlight enable GPIO */ | ||
175 | ldp_lcd_pdata.backlight_gpio = gpio + 15; | ||
176 | |||
177 | + res = platform_device_register(&ldp_lcd_device); | ||
178 | + if (res) | ||
179 | + pr_err("Unable to register LCD: %d\n", res); | ||
180 | + | ||
181 | return 0; | ||
182 | } | ||
183 | |||
184 | @@ -347,7 +353,6 @@ static struct omap2_hsmmc_info mmc[] __initdata = { | ||
185 | |||
186 | static struct platform_device *ldp_devices[] __initdata = { | ||
187 | &ldp_gpio_keys_device, | ||
188 | - &ldp_lcd_device, | ||
189 | }; | ||
190 | |||
191 | #ifdef CONFIG_OMAP_MUX | ||
192 | diff --git a/arch/arm/mach-omap2/omap_hwmod_2xxx_ipblock_data.c b/arch/arm/mach-omap2/omap_hwmod_2xxx_ipblock_data.c | ||
193 | index 56cebb05509e..d23c77fadb31 100644 | ||
194 | --- a/arch/arm/mach-omap2/omap_hwmod_2xxx_ipblock_data.c | ||
195 | +++ b/arch/arm/mach-omap2/omap_hwmod_2xxx_ipblock_data.c | ||
196 | @@ -796,7 +796,7 @@ struct omap_hwmod omap2xxx_counter_32k_hwmod = { | ||
197 | |||
198 | /* gpmc */ | ||
199 | static struct omap_hwmod_irq_info omap2xxx_gpmc_irqs[] = { | ||
200 | - { .irq = 20 }, | ||
201 | + { .irq = 20 + OMAP_INTC_START, }, | ||
202 | { .irq = -1 } | ||
203 | }; | ||
204 | |||
205 | @@ -841,7 +841,7 @@ static struct omap_hwmod_class omap2_rng_hwmod_class = { | ||
206 | }; | ||
207 | |||
208 | static struct omap_hwmod_irq_info omap2_rng_mpu_irqs[] = { | ||
209 | - { .irq = 52 }, | ||
210 | + { .irq = 52 + OMAP_INTC_START, }, | ||
211 | { .irq = -1 } | ||
212 | }; | ||
213 | |||
214 | diff --git a/arch/arm/mach-omap2/omap_hwmod_3xxx_data.c b/arch/arm/mach-omap2/omap_hwmod_3xxx_data.c | ||
215 | index f234cbec0cb9..60f23440082e 100644 | ||
216 | --- a/arch/arm/mach-omap2/omap_hwmod_3xxx_data.c | ||
217 | +++ b/arch/arm/mach-omap2/omap_hwmod_3xxx_data.c | ||
218 | @@ -2165,7 +2165,7 @@ static struct omap_hwmod_class omap3xxx_gpmc_hwmod_class = { | ||
219 | }; | ||
220 | |||
221 | static struct omap_hwmod_irq_info omap3xxx_gpmc_irqs[] = { | ||
222 | - { .irq = 20 }, | ||
223 | + { .irq = 20 + OMAP_INTC_START, }, | ||
224 | { .irq = -1 } | ||
225 | }; | ||
226 | |||
227 | @@ -2999,7 +2999,7 @@ static struct omap_mmu_dev_attr mmu_isp_dev_attr = { | ||
228 | |||
229 | static struct omap_hwmod omap3xxx_mmu_isp_hwmod; | ||
230 | static struct omap_hwmod_irq_info omap3xxx_mmu_isp_irqs[] = { | ||
231 | - { .irq = 24 }, | ||
232 | + { .irq = 24 + OMAP_INTC_START, }, | ||
233 | { .irq = -1 } | ||
234 | }; | ||
235 | |||
236 | @@ -3041,7 +3041,7 @@ static struct omap_mmu_dev_attr mmu_iva_dev_attr = { | ||
237 | |||
238 | static struct omap_hwmod omap3xxx_mmu_iva_hwmod; | ||
239 | static struct omap_hwmod_irq_info omap3xxx_mmu_iva_irqs[] = { | ||
240 | - { .irq = 28 }, | ||
241 | + { .irq = 28 + OMAP_INTC_START, }, | ||
242 | { .irq = -1 } | ||
243 | }; | ||
244 | |||
245 | diff --git a/arch/arm/mach-omap2/omap_hwmod_7xx_data.c b/arch/arm/mach-omap2/omap_hwmod_7xx_data.c | ||
246 | index db32d5380b11..18f333c440db 100644 | ||
247 | --- a/arch/arm/mach-omap2/omap_hwmod_7xx_data.c | ||
248 | +++ b/arch/arm/mach-omap2/omap_hwmod_7xx_data.c | ||
249 | @@ -1637,7 +1637,7 @@ static struct omap_hwmod dra7xx_uart1_hwmod = { | ||
250 | .class = &dra7xx_uart_hwmod_class, | ||
251 | .clkdm_name = "l4per_clkdm", | ||
252 | .main_clk = "uart1_gfclk_mux", | ||
253 | - .flags = HWMOD_SWSUP_SIDLE_ACT, | ||
254 | + .flags = HWMOD_SWSUP_SIDLE_ACT | DEBUG_OMAP2UART1_FLAGS, | ||
255 | .prcm = { | ||
256 | .omap4 = { | ||
257 | .clkctrl_offs = DRA7XX_CM_L4PER_UART1_CLKCTRL_OFFSET, | ||
258 | diff --git a/arch/arm64/kernel/ptrace.c b/arch/arm64/kernel/ptrace.c | ||
259 | index fecdbf7de82e..c484d5625ffb 100644 | ||
260 | --- a/arch/arm64/kernel/ptrace.c | ||
261 | +++ b/arch/arm64/kernel/ptrace.c | ||
262 | @@ -214,31 +214,29 @@ static int ptrace_hbp_fill_attr_ctrl(unsigned int note_type, | ||
263 | { | ||
264 | int err, len, type, disabled = !ctrl.enabled; | ||
265 | |||
266 | - if (disabled) { | ||
267 | - len = 0; | ||
268 | - type = HW_BREAKPOINT_EMPTY; | ||
269 | - } else { | ||
270 | - err = arch_bp_generic_fields(ctrl, &len, &type); | ||
271 | - if (err) | ||
272 | - return err; | ||
273 | - | ||
274 | - switch (note_type) { | ||
275 | - case NT_ARM_HW_BREAK: | ||
276 | - if ((type & HW_BREAKPOINT_X) != type) | ||
277 | - return -EINVAL; | ||
278 | - break; | ||
279 | - case NT_ARM_HW_WATCH: | ||
280 | - if ((type & HW_BREAKPOINT_RW) != type) | ||
281 | - return -EINVAL; | ||
282 | - break; | ||
283 | - default: | ||
284 | + attr->disabled = disabled; | ||
285 | + if (disabled) | ||
286 | + return 0; | ||
287 | + | ||
288 | + err = arch_bp_generic_fields(ctrl, &len, &type); | ||
289 | + if (err) | ||
290 | + return err; | ||
291 | + | ||
292 | + switch (note_type) { | ||
293 | + case NT_ARM_HW_BREAK: | ||
294 | + if ((type & HW_BREAKPOINT_X) != type) | ||
295 | return -EINVAL; | ||
296 | - } | ||
297 | + break; | ||
298 | + case NT_ARM_HW_WATCH: | ||
299 | + if ((type & HW_BREAKPOINT_RW) != type) | ||
300 | + return -EINVAL; | ||
301 | + break; | ||
302 | + default: | ||
303 | + return -EINVAL; | ||
304 | } | ||
305 | |||
306 | attr->bp_len = len; | ||
307 | attr->bp_type = type; | ||
308 | - attr->disabled = disabled; | ||
309 | |||
310 | return 0; | ||
311 | } | ||
312 | diff --git a/arch/powerpc/include/asm/exception-64s.h b/arch/powerpc/include/asm/exception-64s.h | ||
313 | index cca12f084842..9cf9635e8f44 100644 | ||
314 | --- a/arch/powerpc/include/asm/exception-64s.h | ||
315 | +++ b/arch/powerpc/include/asm/exception-64s.h | ||
316 | @@ -265,7 +265,7 @@ do_kvm_##n: \ | ||
317 | subi r1,r1,INT_FRAME_SIZE; /* alloc frame on kernel stack */ \ | ||
318 | beq- 1f; \ | ||
319 | ld r1,PACAKSAVE(r13); /* kernel stack to use */ \ | ||
320 | -1: cmpdi cr1,r1,0; /* check if r1 is in userspace */ \ | ||
321 | +1: cmpdi cr1,r1,-INT_FRAME_SIZE; /* check if r1 is in userspace */ \ | ||
322 | blt+ cr1,3f; /* abort if it is */ \ | ||
323 | li r1,(n); /* will be reloaded later */ \ | ||
324 | sth r1,PACA_TRAP_SAVE(r13); \ | ||
325 | diff --git a/arch/powerpc/kernel/head_64.S b/arch/powerpc/kernel/head_64.S | ||
326 | index 3d11d8038dee..9141e894c89b 100644 | ||
327 | --- a/arch/powerpc/kernel/head_64.S | ||
328 | +++ b/arch/powerpc/kernel/head_64.S | ||
329 | @@ -467,6 +467,7 @@ _STATIC(__after_prom_start) | ||
330 | mtctr r8 | ||
331 | bctr | ||
332 | |||
333 | +.balign 8 | ||
334 | p_end: .llong _end - _stext | ||
335 | |||
336 | 4: /* Now copy the rest of the kernel up to _end */ | ||
337 | diff --git a/arch/powerpc/kvm/book3s_64_mmu_hv.c b/arch/powerpc/kvm/book3s_64_mmu_hv.c | ||
338 | index 043eec8461e7..46ff25149282 100644 | ||
339 | --- a/arch/powerpc/kvm/book3s_64_mmu_hv.c | ||
340 | +++ b/arch/powerpc/kvm/book3s_64_mmu_hv.c | ||
341 | @@ -473,11 +473,14 @@ static int kvmppc_mmu_book3s_64_hv_xlate(struct kvm_vcpu *vcpu, gva_t eaddr, | ||
342 | slb_v = vcpu->kvm->arch.vrma_slb_v; | ||
343 | } | ||
344 | |||
345 | + preempt_disable(); | ||
346 | /* Find the HPTE in the hash table */ | ||
347 | index = kvmppc_hv_find_lock_hpte(kvm, eaddr, slb_v, | ||
348 | HPTE_V_VALID | HPTE_V_ABSENT); | ||
349 | - if (index < 0) | ||
350 | + if (index < 0) { | ||
351 | + preempt_enable(); | ||
352 | return -ENOENT; | ||
353 | + } | ||
354 | hptep = (unsigned long *)(kvm->arch.hpt_virt + (index << 4)); | ||
355 | v = hptep[0] & ~HPTE_V_HVLOCK; | ||
356 | gr = kvm->arch.revmap[index].guest_rpte; | ||
357 | @@ -485,6 +488,7 @@ static int kvmppc_mmu_book3s_64_hv_xlate(struct kvm_vcpu *vcpu, gva_t eaddr, | ||
358 | /* Unlock the HPTE */ | ||
359 | asm volatile("lwsync" : : : "memory"); | ||
360 | hptep[0] = v; | ||
361 | + preempt_enable(); | ||
362 | |||
363 | gpte->eaddr = eaddr; | ||
364 | gpte->vpage = ((v & HPTE_V_AVPN) << 4) | ((eaddr >> 12) & 0xfff); | ||
365 | diff --git a/arch/powerpc/kvm/book3s_hv_rm_mmu.c b/arch/powerpc/kvm/book3s_hv_rm_mmu.c | ||
366 | index 9c515440ad1a..ea17b3067233 100644 | ||
367 | --- a/arch/powerpc/kvm/book3s_hv_rm_mmu.c | ||
368 | +++ b/arch/powerpc/kvm/book3s_hv_rm_mmu.c | ||
369 | @@ -749,6 +749,10 @@ static int slb_base_page_shift[4] = { | ||
370 | 20, /* 1M, unsupported */ | ||
371 | }; | ||
372 | |||
373 | +/* When called from virtmode, this func should be protected by | ||
374 | + * preempt_disable(), otherwise, the holding of HPTE_V_HVLOCK | ||
375 | + * can trigger deadlock issue. | ||
376 | + */ | ||
377 | long kvmppc_hv_find_lock_hpte(struct kvm *kvm, gva_t eaddr, unsigned long slb_v, | ||
378 | unsigned long valid) | ||
379 | { | ||
380 | diff --git a/arch/sh/kernel/sh_ksyms_32.c b/arch/sh/kernel/sh_ksyms_32.c | ||
381 | index 2a0a596ebf67..d77f2f6c7ff0 100644 | ||
382 | --- a/arch/sh/kernel/sh_ksyms_32.c | ||
383 | +++ b/arch/sh/kernel/sh_ksyms_32.c | ||
384 | @@ -20,6 +20,11 @@ EXPORT_SYMBOL(csum_partial_copy_generic); | ||
385 | EXPORT_SYMBOL(copy_page); | ||
386 | EXPORT_SYMBOL(__clear_user); | ||
387 | EXPORT_SYMBOL(empty_zero_page); | ||
388 | +#ifdef CONFIG_FLATMEM | ||
389 | +/* need in pfn_valid macro */ | ||
390 | +EXPORT_SYMBOL(min_low_pfn); | ||
391 | +EXPORT_SYMBOL(max_low_pfn); | ||
392 | +#endif | ||
393 | |||
394 | #define DECLARE_EXPORT(name) \ | ||
395 | extern void name(void);EXPORT_SYMBOL(name) | ||
396 | diff --git a/arch/sh/lib/Makefile b/arch/sh/lib/Makefile | ||
397 | index 7b95f29e3174..3baff31e58cf 100644 | ||
398 | --- a/arch/sh/lib/Makefile | ||
399 | +++ b/arch/sh/lib/Makefile | ||
400 | @@ -6,7 +6,7 @@ lib-y = delay.o memmove.o memchr.o \ | ||
401 | checksum.o strlen.o div64.o div64-generic.o | ||
402 | |||
403 | # Extracted from libgcc | ||
404 | -lib-y += movmem.o ashldi3.o ashrdi3.o lshrdi3.o \ | ||
405 | +obj-y += movmem.o ashldi3.o ashrdi3.o lshrdi3.o \ | ||
406 | ashlsi3.o ashrsi3.o ashiftrt.o lshrsi3.o \ | ||
407 | udiv_qrnnd.o | ||
408 | |||
409 | diff --git a/arch/sparc/include/asm/pgtable_64.h b/arch/sparc/include/asm/pgtable_64.h | ||
410 | index 36760317814f..90f289f0ec8e 100644 | ||
411 | --- a/arch/sparc/include/asm/pgtable_64.h | ||
412 | +++ b/arch/sparc/include/asm/pgtable_64.h | ||
413 | @@ -616,7 +616,7 @@ static inline unsigned long pte_present(pte_t pte) | ||
414 | } | ||
415 | |||
416 | #define pte_accessible pte_accessible | ||
417 | -static inline unsigned long pte_accessible(pte_t a) | ||
418 | +static inline unsigned long pte_accessible(struct mm_struct *mm, pte_t a) | ||
419 | { | ||
420 | return pte_val(a) & _PAGE_VALID; | ||
421 | } | ||
422 | @@ -806,7 +806,7 @@ static inline void __set_pte_at(struct mm_struct *mm, unsigned long addr, | ||
423 | * SUN4V NOTE: _PAGE_VALID is the same value in both the SUN4U | ||
424 | * and SUN4V pte layout, so this inline test is fine. | ||
425 | */ | ||
426 | - if (likely(mm != &init_mm) && pte_accessible(orig)) | ||
427 | + if (likely(mm != &init_mm) && pte_accessible(mm, orig)) | ||
428 | tlb_batch_add(mm, addr, ptep, orig, fullmm); | ||
429 | } | ||
430 | |||
431 | diff --git a/arch/x86/include/asm/pgtable.h b/arch/x86/include/asm/pgtable.h | ||
432 | index 3d1999458709..bbc8b12fa443 100644 | ||
433 | --- a/arch/x86/include/asm/pgtable.h | ||
434 | +++ b/arch/x86/include/asm/pgtable.h | ||
435 | @@ -452,9 +452,16 @@ static inline int pte_present(pte_t a) | ||
436 | } | ||
437 | |||
438 | #define pte_accessible pte_accessible | ||
439 | -static inline int pte_accessible(pte_t a) | ||
440 | +static inline bool pte_accessible(struct mm_struct *mm, pte_t a) | ||
441 | { | ||
442 | - return pte_flags(a) & _PAGE_PRESENT; | ||
443 | + if (pte_flags(a) & _PAGE_PRESENT) | ||
444 | + return true; | ||
445 | + | ||
446 | + if ((pte_flags(a) & (_PAGE_PROTNONE | _PAGE_NUMA)) && | ||
447 | + mm_tlb_flush_pending(mm)) | ||
448 | + return true; | ||
449 | + | ||
450 | + return false; | ||
451 | } | ||
452 | |||
453 | static inline int pte_hidden(pte_t pte) | ||
454 | diff --git a/arch/x86/kernel/cpu/intel.c b/arch/x86/kernel/cpu/intel.c | ||
455 | index ec7299566f79..a51efc90b534 100644 | ||
456 | --- a/arch/x86/kernel/cpu/intel.c | ||
457 | +++ b/arch/x86/kernel/cpu/intel.c | ||
458 | @@ -387,7 +387,8 @@ static void init_intel(struct cpuinfo_x86 *c) | ||
459 | set_cpu_cap(c, X86_FEATURE_PEBS); | ||
460 | } | ||
461 | |||
462 | - if (c->x86 == 6 && c->x86_model == 29 && cpu_has_clflush) | ||
463 | + if (c->x86 == 6 && cpu_has_clflush && | ||
464 | + (c->x86_model == 29 || c->x86_model == 46 || c->x86_model == 47)) | ||
465 | set_cpu_cap(c, X86_FEATURE_CLFLUSH_MONITOR); | ||
466 | |||
467 | #ifdef CONFIG_X86_64 | ||
468 | diff --git a/arch/x86/kvm/lapic.c b/arch/x86/kvm/lapic.c | ||
469 | index dec48bfaddb8..1673940cf9c3 100644 | ||
470 | --- a/arch/x86/kvm/lapic.c | ||
471 | +++ b/arch/x86/kvm/lapic.c | ||
472 | @@ -1350,6 +1350,10 @@ void kvm_lapic_set_base(struct kvm_vcpu *vcpu, u64 value) | ||
473 | return; | ||
474 | } | ||
475 | |||
476 | + if (!kvm_vcpu_is_bsp(apic->vcpu)) | ||
477 | + value &= ~MSR_IA32_APICBASE_BSP; | ||
478 | + vcpu->arch.apic_base = value; | ||
479 | + | ||
480 | /* update jump label if enable bit changes */ | ||
481 | if ((vcpu->arch.apic_base ^ value) & MSR_IA32_APICBASE_ENABLE) { | ||
482 | if (value & MSR_IA32_APICBASE_ENABLE) | ||
483 | @@ -1359,10 +1363,6 @@ void kvm_lapic_set_base(struct kvm_vcpu *vcpu, u64 value) | ||
484 | recalculate_apic_map(vcpu->kvm); | ||
485 | } | ||
486 | |||
487 | - if (!kvm_vcpu_is_bsp(apic->vcpu)) | ||
488 | - value &= ~MSR_IA32_APICBASE_BSP; | ||
489 | - | ||
490 | - vcpu->arch.apic_base = value; | ||
491 | if ((old_value ^ value) & X2APIC_ENABLE) { | ||
492 | if (value & X2APIC_ENABLE) { | ||
493 | u32 id = kvm_apic_id(apic); | ||
494 | diff --git a/arch/x86/kvm/vmx.c b/arch/x86/kvm/vmx.c | ||
495 | index 2b2fce1b2009..6128914ee873 100644 | ||
496 | --- a/arch/x86/kvm/vmx.c | ||
497 | +++ b/arch/x86/kvm/vmx.c | ||
498 | @@ -8218,8 +8218,7 @@ static void load_vmcs12_host_state(struct kvm_vcpu *vcpu, | ||
499 | vcpu->arch.cr4_guest_owned_bits = ~vmcs_readl(CR4_GUEST_HOST_MASK); | ||
500 | kvm_set_cr4(vcpu, vmcs12->host_cr4); | ||
501 | |||
502 | - if (nested_cpu_has_ept(vmcs12)) | ||
503 | - nested_ept_uninit_mmu_context(vcpu); | ||
504 | + nested_ept_uninit_mmu_context(vcpu); | ||
505 | |||
506 | kvm_set_cr3(vcpu, vmcs12->host_cr3); | ||
507 | kvm_mmu_reset_context(vcpu); | ||
508 | diff --git a/arch/x86/mm/gup.c b/arch/x86/mm/gup.c | ||
509 | index dd74e46828c0..0596e8e0cc19 100644 | ||
510 | --- a/arch/x86/mm/gup.c | ||
511 | +++ b/arch/x86/mm/gup.c | ||
512 | @@ -83,6 +83,12 @@ static noinline int gup_pte_range(pmd_t pmd, unsigned long addr, | ||
513 | pte_t pte = gup_get_pte(ptep); | ||
514 | struct page *page; | ||
515 | |||
516 | + /* Similar to the PMD case, NUMA hinting must take slow path */ | ||
517 | + if (pte_numa(pte)) { | ||
518 | + pte_unmap(ptep); | ||
519 | + return 0; | ||
520 | + } | ||
521 | + | ||
522 | if ((pte_flags(pte) & (mask | _PAGE_SPECIAL)) != mask) { | ||
523 | pte_unmap(ptep); | ||
524 | return 0; | ||
525 | @@ -167,6 +173,13 @@ static int gup_pmd_range(pud_t pud, unsigned long addr, unsigned long end, | ||
526 | if (pmd_none(pmd) || pmd_trans_splitting(pmd)) | ||
527 | return 0; | ||
528 | if (unlikely(pmd_large(pmd))) { | ||
529 | + /* | ||
530 | + * NUMA hinting faults need to be handled in the GUP | ||
531 | + * slowpath for accounting purposes and so that they | ||
532 | + * can be serialised against THP migration. | ||
533 | + */ | ||
534 | + if (pmd_numa(pmd)) | ||
535 | + return 0; | ||
536 | if (!gup_huge_pmd(pmd, addr, next, write, pages, nr)) | ||
537 | return 0; | ||
538 | } else { | ||
539 | diff --git a/drivers/acpi/acpi_lpss.c b/drivers/acpi/acpi_lpss.c | ||
540 | index fb78bb9ad8f6..ab19263baf39 100644 | ||
541 | --- a/drivers/acpi/acpi_lpss.c | ||
542 | +++ b/drivers/acpi/acpi_lpss.c | ||
543 | @@ -156,6 +156,7 @@ static const struct acpi_device_id acpi_lpss_device_ids[] = { | ||
544 | { "80860F14", (unsigned long)&byt_sdio_dev_desc }, | ||
545 | { "80860F41", (unsigned long)&byt_i2c_dev_desc }, | ||
546 | { "INT33B2", }, | ||
547 | + { "INT33FC", }, | ||
548 | |||
549 | { } | ||
550 | }; | ||
551 | diff --git a/drivers/acpi/bus.c b/drivers/acpi/bus.c | ||
552 | index b587ec8257b2..661a5b7f5104 100644 | ||
553 | --- a/drivers/acpi/bus.c | ||
554 | +++ b/drivers/acpi/bus.c | ||
555 | @@ -156,6 +156,16 @@ int acpi_bus_get_private_data(acpi_handle handle, void **data) | ||
556 | } | ||
557 | EXPORT_SYMBOL(acpi_bus_get_private_data); | ||
558 | |||
559 | +void acpi_bus_no_hotplug(acpi_handle handle) | ||
560 | +{ | ||
561 | + struct acpi_device *adev = NULL; | ||
562 | + | ||
563 | + acpi_bus_get_device(handle, &adev); | ||
564 | + if (adev) | ||
565 | + adev->flags.no_hotplug = true; | ||
566 | +} | ||
567 | +EXPORT_SYMBOL_GPL(acpi_bus_no_hotplug); | ||
568 | + | ||
569 | static void acpi_print_osc_error(acpi_handle handle, | ||
570 | struct acpi_osc_context *context, char *error) | ||
571 | { | ||
572 | diff --git a/drivers/ata/ahci_imx.c b/drivers/ata/ahci_imx.c | ||
573 | index 58debb0acc3a..566cca4f9dc2 100644 | ||
574 | --- a/drivers/ata/ahci_imx.c | ||
575 | +++ b/drivers/ata/ahci_imx.c | ||
576 | @@ -60,7 +60,7 @@ static int imx6q_sata_init(struct device *dev, void __iomem *mmio) | ||
577 | /* | ||
578 | * set PHY Paremeters, two steps to configure the GPR13, | ||
579 | * one write for rest of parameters, mask of first write | ||
580 | - * is 0x07fffffd, and the other one write for setting | ||
581 | + * is 0x07ffffff, and the other one write for setting | ||
582 | * the mpll_clk_en. | ||
583 | */ | ||
584 | regmap_update_bits(imxpriv->gpr, 0x34, IMX6Q_GPR13_SATA_RX_EQ_VAL_MASK | ||
585 | @@ -71,6 +71,7 @@ static int imx6q_sata_init(struct device *dev, void __iomem *mmio) | ||
586 | | IMX6Q_GPR13_SATA_TX_ATTEN_MASK | ||
587 | | IMX6Q_GPR13_SATA_TX_BOOST_MASK | ||
588 | | IMX6Q_GPR13_SATA_TX_LVL_MASK | ||
589 | + | IMX6Q_GPR13_SATA_MPLL_CLK_EN | ||
590 | | IMX6Q_GPR13_SATA_TX_EDGE_RATE | ||
591 | , IMX6Q_GPR13_SATA_RX_EQ_VAL_3_0_DB | ||
592 | | IMX6Q_GPR13_SATA_RX_LOS_LVL_SATA2M | ||
593 | diff --git a/drivers/ata/libata-core.c b/drivers/ata/libata-core.c | ||
594 | index 81a94a3919db..2c2780a19609 100644 | ||
595 | --- a/drivers/ata/libata-core.c | ||
596 | +++ b/drivers/ata/libata-core.c | ||
597 | @@ -2149,9 +2149,16 @@ static int ata_dev_config_ncq(struct ata_device *dev, | ||
598 | "failed to get NCQ Send/Recv Log Emask 0x%x\n", | ||
599 | err_mask); | ||
600 | } else { | ||
601 | + u8 *cmds = dev->ncq_send_recv_cmds; | ||
602 | + | ||
603 | dev->flags |= ATA_DFLAG_NCQ_SEND_RECV; | ||
604 | - memcpy(dev->ncq_send_recv_cmds, ap->sector_buf, | ||
605 | - ATA_LOG_NCQ_SEND_RECV_SIZE); | ||
606 | + memcpy(cmds, ap->sector_buf, ATA_LOG_NCQ_SEND_RECV_SIZE); | ||
607 | + | ||
608 | + if (dev->horkage & ATA_HORKAGE_NO_NCQ_TRIM) { | ||
609 | + ata_dev_dbg(dev, "disabling queued TRIM support\n"); | ||
610 | + cmds[ATA_LOG_NCQ_SEND_RECV_DSM_OFFSET] &= | ||
611 | + ~ATA_LOG_NCQ_SEND_RECV_DSM_TRIM; | ||
612 | + } | ||
613 | } | ||
614 | } | ||
615 | |||
616 | @@ -4156,6 +4163,9 @@ static const struct ata_blacklist_entry ata_device_blacklist [] = { | ||
617 | { "ST3320[68]13AS", "SD1[5-9]", ATA_HORKAGE_NONCQ | | ||
618 | ATA_HORKAGE_FIRMWARE_WARN }, | ||
619 | |||
620 | + /* Seagate Momentus SpinPoint M8 seem to have FPMDA_AA issues */ | ||
621 | + { "ST1000LM024 HN-M101MBB", "2AR10001", ATA_HORKAGE_BROKEN_FPDMA_AA }, | ||
622 | + | ||
623 | /* Blacklist entries taken from Silicon Image 3124/3132 | ||
624 | Windows driver .inf file - also several Linux problem reports */ | ||
625 | { "HTS541060G9SA00", "MB3OC60D", ATA_HORKAGE_NONCQ, }, | ||
626 | @@ -4202,6 +4212,10 @@ static const struct ata_blacklist_entry ata_device_blacklist [] = { | ||
627 | { "PIONEER DVD-RW DVR-212D", NULL, ATA_HORKAGE_NOSETXFER }, | ||
628 | { "PIONEER DVD-RW DVR-216D", NULL, ATA_HORKAGE_NOSETXFER }, | ||
629 | |||
630 | + /* devices that don't properly handle queued TRIM commands */ | ||
631 | + { "Micron_M500*", NULL, ATA_HORKAGE_NO_NCQ_TRIM, }, | ||
632 | + { "Crucial_CT???M500SSD1", NULL, ATA_HORKAGE_NO_NCQ_TRIM, }, | ||
633 | + | ||
634 | /* End Marker */ | ||
635 | { } | ||
636 | }; | ||
637 | @@ -6520,6 +6534,7 @@ static int __init ata_parse_force_one(char **cur, | ||
638 | { "norst", .lflags = ATA_LFLAG_NO_HRST | ATA_LFLAG_NO_SRST }, | ||
639 | { "rstonce", .lflags = ATA_LFLAG_RST_ONCE }, | ||
640 | { "atapi_dmadir", .horkage_on = ATA_HORKAGE_ATAPI_DMADIR }, | ||
641 | + { "disable", .horkage_on = ATA_HORKAGE_DISABLE }, | ||
642 | }; | ||
643 | char *start = *cur, *p = *cur; | ||
644 | char *id, *val, *endp; | ||
645 | diff --git a/drivers/ata/libata-scsi.c b/drivers/ata/libata-scsi.c | ||
646 | index ab58556d347c..377eb889f555 100644 | ||
647 | --- a/drivers/ata/libata-scsi.c | ||
648 | +++ b/drivers/ata/libata-scsi.c | ||
649 | @@ -3872,6 +3872,27 @@ void ata_scsi_hotplug(struct work_struct *work) | ||
650 | return; | ||
651 | } | ||
652 | |||
653 | + /* | ||
654 | + * XXX - UGLY HACK | ||
655 | + * | ||
656 | + * The block layer suspend/resume path is fundamentally broken due | ||
657 | + * to freezable kthreads and workqueue and may deadlock if a block | ||
658 | + * device gets removed while resume is in progress. I don't know | ||
659 | + * what the solution is short of removing freezable kthreads and | ||
660 | + * workqueues altogether. | ||
661 | + * | ||
662 | + * The following is an ugly hack to avoid kicking off device | ||
663 | + * removal while freezer is active. This is a joke but does avoid | ||
664 | + * this particular deadlock scenario. | ||
665 | + * | ||
666 | + * https://bugzilla.kernel.org/show_bug.cgi?id=62801 | ||
667 | + * http://marc.info/?l=linux-kernel&m=138695698516487 | ||
668 | + */ | ||
669 | +#ifdef CONFIG_FREEZER | ||
670 | + while (pm_freezing) | ||
671 | + msleep(10); | ||
672 | +#endif | ||
673 | + | ||
674 | DPRINTK("ENTER\n"); | ||
675 | mutex_lock(&ap->scsi_scan_mutex); | ||
676 | |||
677 | diff --git a/drivers/clocksource/dw_apb_timer_of.c b/drivers/clocksource/dw_apb_timer_of.c | ||
678 | index 4cbae4f762b1..b386be6018d7 100644 | ||
679 | --- a/drivers/clocksource/dw_apb_timer_of.c | ||
680 | +++ b/drivers/clocksource/dw_apb_timer_of.c | ||
681 | @@ -108,12 +108,11 @@ static void add_clocksource(struct device_node *source_timer) | ||
682 | |||
683 | static u32 read_sched_clock(void) | ||
684 | { | ||
685 | - return __raw_readl(sched_io_base); | ||
686 | + return ~__raw_readl(sched_io_base); | ||
687 | } | ||
688 | |||
689 | static const struct of_device_id sptimer_ids[] __initconst = { | ||
690 | { .compatible = "picochip,pc3x2-rtc" }, | ||
691 | - { .compatible = "snps,dw-apb-timer-sp" }, | ||
692 | { /* Sentinel */ }, | ||
693 | }; | ||
694 | |||
695 | @@ -153,4 +152,6 @@ static void __init dw_apb_timer_init(struct device_node *timer) | ||
696 | num_called++; | ||
697 | } | ||
698 | CLOCKSOURCE_OF_DECLARE(pc3x2_timer, "picochip,pc3x2-timer", dw_apb_timer_init); | ||
699 | -CLOCKSOURCE_OF_DECLARE(apb_timer, "snps,dw-apb-timer-osc", dw_apb_timer_init); | ||
700 | +CLOCKSOURCE_OF_DECLARE(apb_timer_osc, "snps,dw-apb-timer-osc", dw_apb_timer_init); | ||
701 | +CLOCKSOURCE_OF_DECLARE(apb_timer_sp, "snps,dw-apb-timer-sp", dw_apb_timer_init); | ||
702 | +CLOCKSOURCE_OF_DECLARE(apb_timer, "snps,dw-apb-timer", dw_apb_timer_init); | ||
703 | diff --git a/drivers/cpufreq/intel_pstate.c b/drivers/cpufreq/intel_pstate.c | ||
704 | index eb3fdc755000..99d8ab548a34 100644 | ||
705 | --- a/drivers/cpufreq/intel_pstate.c | ||
706 | +++ b/drivers/cpufreq/intel_pstate.c | ||
707 | @@ -550,6 +550,11 @@ static int intel_pstate_init_cpu(unsigned int cpunum) | ||
708 | cpu = all_cpu_data[cpunum]; | ||
709 | |||
710 | intel_pstate_get_cpu_pstates(cpu); | ||
711 | + if (!cpu->pstate.current_pstate) { | ||
712 | + all_cpu_data[cpunum] = NULL; | ||
713 | + kfree(cpu); | ||
714 | + return -ENODATA; | ||
715 | + } | ||
716 | |||
717 | cpu->cpu = cpunum; | ||
718 | cpu->pstate_policy = | ||
719 | diff --git a/drivers/dma/Kconfig b/drivers/dma/Kconfig | ||
720 | index f238cfd33847..b61c5fc64dc3 100644 | ||
721 | --- a/drivers/dma/Kconfig | ||
722 | +++ b/drivers/dma/Kconfig | ||
723 | @@ -339,6 +339,7 @@ config NET_DMA | ||
724 | bool "Network: TCP receive copy offload" | ||
725 | depends on DMA_ENGINE && NET | ||
726 | default (INTEL_IOATDMA || FSL_DMA) | ||
727 | + depends on BROKEN | ||
728 | help | ||
729 | This enables the use of DMA engines in the network stack to | ||
730 | offload receive copy-to-user operations, freeing CPU cycles. | ||
731 | diff --git a/drivers/firewire/sbp2.c b/drivers/firewire/sbp2.c | ||
732 | index b0bb056458a3..281029daf98c 100644 | ||
733 | --- a/drivers/firewire/sbp2.c | ||
734 | +++ b/drivers/firewire/sbp2.c | ||
735 | @@ -1623,7 +1623,6 @@ static struct scsi_host_template scsi_driver_template = { | ||
736 | .cmd_per_lun = 1, | ||
737 | .can_queue = 1, | ||
738 | .sdev_attrs = sbp2_scsi_sysfs_attrs, | ||
739 | - .no_write_same = 1, | ||
740 | }; | ||
741 | |||
742 | MODULE_AUTHOR("Kristian Hoegsberg <krh@bitplanet.net>"); | ||
743 | diff --git a/drivers/gpio/gpio-msm-v2.c b/drivers/gpio/gpio-msm-v2.c | ||
744 | index 7b37300973db..2baf0ddf7e02 100644 | ||
745 | --- a/drivers/gpio/gpio-msm-v2.c | ||
746 | +++ b/drivers/gpio/gpio-msm-v2.c | ||
747 | @@ -252,7 +252,7 @@ static void msm_gpio_irq_mask(struct irq_data *d) | ||
748 | |||
749 | spin_lock_irqsave(&tlmm_lock, irq_flags); | ||
750 | writel(TARGET_PROC_NONE, GPIO_INTR_CFG_SU(gpio)); | ||
751 | - clear_gpio_bits(INTR_RAW_STATUS_EN | INTR_ENABLE, GPIO_INTR_CFG(gpio)); | ||
752 | + clear_gpio_bits(BIT(INTR_RAW_STATUS_EN) | BIT(INTR_ENABLE), GPIO_INTR_CFG(gpio)); | ||
753 | __clear_bit(gpio, msm_gpio.enabled_irqs); | ||
754 | spin_unlock_irqrestore(&tlmm_lock, irq_flags); | ||
755 | } | ||
756 | @@ -264,7 +264,7 @@ static void msm_gpio_irq_unmask(struct irq_data *d) | ||
757 | |||
758 | spin_lock_irqsave(&tlmm_lock, irq_flags); | ||
759 | __set_bit(gpio, msm_gpio.enabled_irqs); | ||
760 | - set_gpio_bits(INTR_RAW_STATUS_EN | INTR_ENABLE, GPIO_INTR_CFG(gpio)); | ||
761 | + set_gpio_bits(BIT(INTR_RAW_STATUS_EN) | BIT(INTR_ENABLE), GPIO_INTR_CFG(gpio)); | ||
762 | writel(TARGET_PROC_SCORPION, GPIO_INTR_CFG_SU(gpio)); | ||
763 | spin_unlock_irqrestore(&tlmm_lock, irq_flags); | ||
764 | } | ||
765 | diff --git a/drivers/gpio/gpio-twl4030.c b/drivers/gpio/gpio-twl4030.c | ||
766 | index db2de1a2dbcf..77d805a3321a 100644 | ||
767 | --- a/drivers/gpio/gpio-twl4030.c | ||
768 | +++ b/drivers/gpio/gpio-twl4030.c | ||
769 | @@ -300,7 +300,7 @@ static int twl_direction_in(struct gpio_chip *chip, unsigned offset) | ||
770 | if (offset < TWL4030_GPIO_MAX) | ||
771 | ret = twl4030_set_gpio_direction(offset, 1); | ||
772 | else | ||
773 | - ret = -EINVAL; | ||
774 | + ret = -EINVAL; /* LED outputs can't be set as input */ | ||
775 | |||
776 | if (!ret) | ||
777 | priv->direction &= ~BIT(offset); | ||
778 | @@ -354,11 +354,20 @@ static void twl_set(struct gpio_chip *chip, unsigned offset, int value) | ||
779 | static int twl_direction_out(struct gpio_chip *chip, unsigned offset, int value) | ||
780 | { | ||
781 | struct gpio_twl4030_priv *priv = to_gpio_twl4030(chip); | ||
782 | - int ret = -EINVAL; | ||
783 | + int ret = 0; | ||
784 | |||
785 | mutex_lock(&priv->mutex); | ||
786 | - if (offset < TWL4030_GPIO_MAX) | ||
787 | + if (offset < TWL4030_GPIO_MAX) { | ||
788 | ret = twl4030_set_gpio_direction(offset, 0); | ||
789 | + if (ret) { | ||
790 | + mutex_unlock(&priv->mutex); | ||
791 | + return ret; | ||
792 | + } | ||
793 | + } | ||
794 | + | ||
795 | + /* | ||
796 | + * LED gpios i.e. offset >= TWL4030_GPIO_MAX are always output | ||
797 | + */ | ||
798 | |||
799 | priv->direction |= BIT(offset); | ||
800 | mutex_unlock(&priv->mutex); | ||
801 | diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c | ||
802 | index 830f7501cb4d..d0d3eae05a1a 100644 | ||
803 | --- a/drivers/gpu/drm/drm_edid.c | ||
804 | +++ b/drivers/gpu/drm/drm_edid.c | ||
805 | @@ -68,6 +68,8 @@ | ||
806 | #define EDID_QUIRK_DETAILED_SYNC_PP (1 << 6) | ||
807 | /* Force reduced-blanking timings for detailed modes */ | ||
808 | #define EDID_QUIRK_FORCE_REDUCED_BLANKING (1 << 7) | ||
809 | +/* Force 8bpc */ | ||
810 | +#define EDID_QUIRK_FORCE_8BPC (1 << 8) | ||
811 | |||
812 | struct detailed_mode_closure { | ||
813 | struct drm_connector *connector; | ||
814 | @@ -128,6 +130,9 @@ static struct edid_quirk { | ||
815 | |||
816 | /* Medion MD 30217 PG */ | ||
817 | { "MED", 0x7b8, EDID_QUIRK_PREFER_LARGE_75 }, | ||
818 | + | ||
819 | + /* Panel in Samsung NP700G7A-S01PL notebook reports 6bpc */ | ||
820 | + { "SEC", 0xd033, EDID_QUIRK_FORCE_8BPC }, | ||
821 | }; | ||
822 | |||
823 | /* | ||
824 | @@ -3236,6 +3241,9 @@ int drm_add_edid_modes(struct drm_connector *connector, struct edid *edid) | ||
825 | |||
826 | drm_add_display_info(edid, &connector->display_info); | ||
827 | |||
828 | + if (quirks & EDID_QUIRK_FORCE_8BPC) | ||
829 | + connector->display_info.bpc = 8; | ||
830 | + | ||
831 | return num_modes; | ||
832 | } | ||
833 | EXPORT_SYMBOL(drm_add_edid_modes); | ||
834 | diff --git a/drivers/gpu/drm/i915/i915_dma.c b/drivers/gpu/drm/i915/i915_dma.c | ||
835 | index d5c784d48671..5a25f2476c3b 100644 | ||
836 | --- a/drivers/gpu/drm/i915/i915_dma.c | ||
837 | +++ b/drivers/gpu/drm/i915/i915_dma.c | ||
838 | @@ -83,6 +83,14 @@ void i915_update_dri1_breadcrumb(struct drm_device *dev) | ||
839 | drm_i915_private_t *dev_priv = dev->dev_private; | ||
840 | struct drm_i915_master_private *master_priv; | ||
841 | |||
842 | + /* | ||
843 | + * The dri breadcrumb update races against the drm master disappearing. | ||
844 | + * Instead of trying to fix this (this is by far not the only ums issue) | ||
845 | + * just don't do the update in kms mode. | ||
846 | + */ | ||
847 | + if (drm_core_check_feature(dev, DRIVER_MODESET)) | ||
848 | + return; | ||
849 | + | ||
850 | if (dev->primary->master) { | ||
851 | master_priv = dev->primary->master->driver_priv; | ||
852 | if (master_priv->sarea_priv) | ||
853 | @@ -1848,8 +1856,10 @@ void i915_driver_lastclose(struct drm_device * dev) | ||
854 | |||
855 | void i915_driver_preclose(struct drm_device * dev, struct drm_file *file_priv) | ||
856 | { | ||
857 | + mutex_lock(&dev->struct_mutex); | ||
858 | i915_gem_context_close(dev, file_priv); | ||
859 | i915_gem_release(dev, file_priv); | ||
860 | + mutex_unlock(&dev->struct_mutex); | ||
861 | } | ||
862 | |||
863 | void i915_driver_postclose(struct drm_device *dev, struct drm_file *file) | ||
864 | diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c | ||
865 | index cdfb9da0e4ce..b00b32c992b0 100644 | ||
866 | --- a/drivers/gpu/drm/i915/i915_gem.c | ||
867 | +++ b/drivers/gpu/drm/i915/i915_gem.c | ||
868 | @@ -2278,15 +2278,24 @@ static void i915_gem_free_request(struct drm_i915_gem_request *request) | ||
869 | kfree(request); | ||
870 | } | ||
871 | |||
872 | -static void i915_gem_reset_ring_lists(struct drm_i915_private *dev_priv, | ||
873 | - struct intel_ring_buffer *ring) | ||
874 | +static void i915_gem_reset_ring_status(struct drm_i915_private *dev_priv, | ||
875 | + struct intel_ring_buffer *ring) | ||
876 | { | ||
877 | - u32 completed_seqno; | ||
878 | - u32 acthd; | ||
879 | + u32 completed_seqno = ring->get_seqno(ring, false); | ||
880 | + u32 acthd = intel_ring_get_active_head(ring); | ||
881 | + struct drm_i915_gem_request *request; | ||
882 | + | ||
883 | + list_for_each_entry(request, &ring->request_list, list) { | ||
884 | + if (i915_seqno_passed(completed_seqno, request->seqno)) | ||
885 | + continue; | ||
886 | |||
887 | - acthd = intel_ring_get_active_head(ring); | ||
888 | - completed_seqno = ring->get_seqno(ring, false); | ||
889 | + i915_set_reset_status(ring, request, acthd); | ||
890 | + } | ||
891 | +} | ||
892 | |||
893 | +static void i915_gem_reset_ring_cleanup(struct drm_i915_private *dev_priv, | ||
894 | + struct intel_ring_buffer *ring) | ||
895 | +{ | ||
896 | while (!list_empty(&ring->request_list)) { | ||
897 | struct drm_i915_gem_request *request; | ||
898 | |||
899 | @@ -2294,9 +2303,6 @@ static void i915_gem_reset_ring_lists(struct drm_i915_private *dev_priv, | ||
900 | struct drm_i915_gem_request, | ||
901 | list); | ||
902 | |||
903 | - if (request->seqno > completed_seqno) | ||
904 | - i915_set_reset_status(ring, request, acthd); | ||
905 | - | ||
906 | i915_gem_free_request(request); | ||
907 | } | ||
908 | |||
909 | @@ -2338,8 +2344,16 @@ void i915_gem_reset(struct drm_device *dev) | ||
910 | struct intel_ring_buffer *ring; | ||
911 | int i; | ||
912 | |||
913 | + /* | ||
914 | + * Before we free the objects from the requests, we need to inspect | ||
915 | + * them for finding the guilty party. As the requests only borrow | ||
916 | + * their reference to the objects, the inspection must be done first. | ||
917 | + */ | ||
918 | + for_each_ring(ring, dev_priv, i) | ||
919 | + i915_gem_reset_ring_status(dev_priv, ring); | ||
920 | + | ||
921 | for_each_ring(ring, dev_priv, i) | ||
922 | - i915_gem_reset_ring_lists(dev_priv, ring); | ||
923 | + i915_gem_reset_ring_cleanup(dev_priv, ring); | ||
924 | |||
925 | i915_gem_restore_fences(dev); | ||
926 | } | ||
927 | diff --git a/drivers/gpu/drm/i915/i915_gem_context.c b/drivers/gpu/drm/i915/i915_gem_context.c | ||
928 | index 403309c2a7d6..bb6eecb3551c 100644 | ||
929 | --- a/drivers/gpu/drm/i915/i915_gem_context.c | ||
930 | +++ b/drivers/gpu/drm/i915/i915_gem_context.c | ||
931 | @@ -328,10 +328,8 @@ void i915_gem_context_close(struct drm_device *dev, struct drm_file *file) | ||
932 | { | ||
933 | struct drm_i915_file_private *file_priv = file->driver_priv; | ||
934 | |||
935 | - mutex_lock(&dev->struct_mutex); | ||
936 | idr_for_each(&file_priv->context_idr, context_idr_cleanup, NULL); | ||
937 | idr_destroy(&file_priv->context_idr); | ||
938 | - mutex_unlock(&dev->struct_mutex); | ||
939 | } | ||
940 | |||
941 | static struct i915_hw_context * | ||
942 | @@ -404,11 +402,21 @@ static int do_switch(struct i915_hw_context *to) | ||
943 | if (ret) | ||
944 | return ret; | ||
945 | |||
946 | - /* Clear this page out of any CPU caches for coherent swap-in/out. Note | ||
947 | + /* | ||
948 | + * Pin can switch back to the default context if we end up calling into | ||
949 | + * evict_everything - as a last ditch gtt defrag effort that also | ||
950 | + * switches to the default context. Hence we need to reload from here. | ||
951 | + */ | ||
952 | + from = ring->last_context; | ||
953 | + | ||
954 | + /* | ||
955 | + * Clear this page out of any CPU caches for coherent swap-in/out. Note | ||
956 | * that thanks to write = false in this call and us not setting any gpu | ||
957 | * write domains when putting a context object onto the active list | ||
958 | * (when switching away from it), this won't block. | ||
959 | - * XXX: We need a real interface to do this instead of trickery. */ | ||
960 | + * | ||
961 | + * XXX: We need a real interface to do this instead of trickery. | ||
962 | + */ | ||
963 | ret = i915_gem_object_set_to_gtt_domain(to->obj, false); | ||
964 | if (ret) { | ||
965 | i915_gem_object_unpin(to->obj); | ||
966 | diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c | ||
967 | index f535670b42d1..aad6f7bfc589 100644 | ||
968 | --- a/drivers/gpu/drm/i915/intel_display.c | ||
969 | +++ b/drivers/gpu/drm/i915/intel_display.c | ||
970 | @@ -6009,7 +6009,7 @@ static void assert_can_disable_lcpll(struct drm_i915_private *dev_priv) | ||
971 | uint32_t val; | ||
972 | |||
973 | list_for_each_entry(crtc, &dev->mode_config.crtc_list, base.head) | ||
974 | - WARN(crtc->base.enabled, "CRTC for pipe %c enabled\n", | ||
975 | + WARN(crtc->active, "CRTC for pipe %c enabled\n", | ||
976 | pipe_name(crtc->pipe)); | ||
977 | |||
978 | WARN(I915_READ(HSW_PWR_WELL_DRIVER), "Power well on\n"); | ||
979 | @@ -10592,7 +10592,9 @@ void intel_modeset_gem_init(struct drm_device *dev) | ||
980 | |||
981 | intel_setup_overlay(dev); | ||
982 | |||
983 | + drm_modeset_lock_all(dev); | ||
984 | intel_modeset_setup_hw_state(dev, false); | ||
985 | + drm_modeset_unlock_all(dev); | ||
986 | } | ||
987 | |||
988 | void intel_modeset_cleanup(struct drm_device *dev) | ||
989 | @@ -10666,14 +10668,15 @@ void intel_connector_attach_encoder(struct intel_connector *connector, | ||
990 | int intel_modeset_vga_set_state(struct drm_device *dev, bool state) | ||
991 | { | ||
992 | struct drm_i915_private *dev_priv = dev->dev_private; | ||
993 | + unsigned reg = INTEL_INFO(dev)->gen >= 6 ? SNB_GMCH_CTRL : INTEL_GMCH_CTRL; | ||
994 | u16 gmch_ctrl; | ||
995 | |||
996 | - pci_read_config_word(dev_priv->bridge_dev, INTEL_GMCH_CTRL, &gmch_ctrl); | ||
997 | + pci_read_config_word(dev_priv->bridge_dev, reg, &gmch_ctrl); | ||
998 | if (state) | ||
999 | gmch_ctrl &= ~INTEL_GMCH_VGA_DISABLE; | ||
1000 | else | ||
1001 | gmch_ctrl |= INTEL_GMCH_VGA_DISABLE; | ||
1002 | - pci_write_config_word(dev_priv->bridge_dev, INTEL_GMCH_CTRL, gmch_ctrl); | ||
1003 | + pci_write_config_word(dev_priv->bridge_dev, reg, gmch_ctrl); | ||
1004 | return 0; | ||
1005 | } | ||
1006 | |||
1007 | diff --git a/drivers/gpu/drm/nouveau/nouveau_acpi.c b/drivers/gpu/drm/nouveau/nouveau_acpi.c | ||
1008 | index dd7d2e182719..8160fbddbcfe 100644 | ||
1009 | --- a/drivers/gpu/drm/nouveau/nouveau_acpi.c | ||
1010 | +++ b/drivers/gpu/drm/nouveau/nouveau_acpi.c | ||
1011 | @@ -51,6 +51,7 @@ static struct nouveau_dsm_priv { | ||
1012 | bool dsm_detected; | ||
1013 | bool optimus_detected; | ||
1014 | acpi_handle dhandle; | ||
1015 | + acpi_handle other_handle; | ||
1016 | acpi_handle rom_handle; | ||
1017 | } nouveau_dsm_priv; | ||
1018 | |||
1019 | @@ -253,19 +254,17 @@ static struct vga_switcheroo_handler nouveau_dsm_handler = { | ||
1020 | |||
1021 | static int nouveau_dsm_pci_probe(struct pci_dev *pdev) | ||
1022 | { | ||
1023 | - acpi_handle dhandle, nvidia_handle; | ||
1024 | - acpi_status status; | ||
1025 | + acpi_handle dhandle; | ||
1026 | int retval = 0; | ||
1027 | |||
1028 | dhandle = DEVICE_ACPI_HANDLE(&pdev->dev); | ||
1029 | if (!dhandle) | ||
1030 | return false; | ||
1031 | |||
1032 | - status = acpi_get_handle(dhandle, "_DSM", &nvidia_handle); | ||
1033 | - if (ACPI_FAILURE(status)) { | ||
1034 | + if (!acpi_has_method(dhandle, "_DSM")) { | ||
1035 | + nouveau_dsm_priv.other_handle = dhandle; | ||
1036 | return false; | ||
1037 | } | ||
1038 | - | ||
1039 | if (nouveau_test_dsm(dhandle, nouveau_dsm, NOUVEAU_DSM_POWER)) | ||
1040 | retval |= NOUVEAU_DSM_HAS_MUX; | ||
1041 | |||
1042 | @@ -331,6 +330,16 @@ static bool nouveau_dsm_detect(void) | ||
1043 | printk(KERN_INFO "VGA switcheroo: detected DSM switching method %s handle\n", | ||
1044 | acpi_method_name); | ||
1045 | nouveau_dsm_priv.dsm_detected = true; | ||
1046 | + /* | ||
1047 | + * On some systems hotplug events are generated for the device | ||
1048 | + * being switched off when _DSM is executed. They cause ACPI | ||
1049 | + * hotplug to trigger and attempt to remove the device from | ||
1050 | + * the system, which causes it to break down. Prevent that from | ||
1051 | + * happening by setting the no_hotplug flag for the involved | ||
1052 | + * ACPI device objects. | ||
1053 | + */ | ||
1054 | + acpi_bus_no_hotplug(nouveau_dsm_priv.dhandle); | ||
1055 | + acpi_bus_no_hotplug(nouveau_dsm_priv.other_handle); | ||
1056 | ret = true; | ||
1057 | } | ||
1058 | |||
1059 | diff --git a/drivers/gpu/drm/nouveau/nouveau_drm.c b/drivers/gpu/drm/nouveau/nouveau_drm.c | ||
1060 | index e893c5362402..32c6b0a60fb3 100644 | ||
1061 | --- a/drivers/gpu/drm/nouveau/nouveau_drm.c | ||
1062 | +++ b/drivers/gpu/drm/nouveau/nouveau_drm.c | ||
1063 | @@ -879,6 +879,12 @@ static int nouveau_pmops_runtime_suspend(struct device *dev) | ||
1064 | if (nouveau_runtime_pm == 0) | ||
1065 | return -EINVAL; | ||
1066 | |||
1067 | + /* are we optimus enabled? */ | ||
1068 | + if (nouveau_runtime_pm == -1 && !nouveau_is_optimus() && !nouveau_is_v1_dsm()) { | ||
1069 | + DRM_DEBUG_DRIVER("failing to power off - not optimus\n"); | ||
1070 | + return -EINVAL; | ||
1071 | + } | ||
1072 | + | ||
1073 | drm_kms_helper_poll_disable(drm_dev); | ||
1074 | vga_switcheroo_set_dynamic_switch(pdev, VGA_SWITCHEROO_OFF); | ||
1075 | nouveau_switcheroo_optimus_dsm(); | ||
1076 | diff --git a/drivers/gpu/drm/radeon/atombios_crtc.c b/drivers/gpu/drm/radeon/atombios_crtc.c | ||
1077 | index 86d9ee08b13f..368e1b84f429 100644 | ||
1078 | --- a/drivers/gpu/drm/radeon/atombios_crtc.c | ||
1079 | +++ b/drivers/gpu/drm/radeon/atombios_crtc.c | ||
1080 | @@ -1180,23 +1180,18 @@ static int dce4_crtc_do_set_base(struct drm_crtc *crtc, | ||
1081 | fb_format |= EVERGREEN_GRPH_ARRAY_MODE(EVERGREEN_GRPH_ARRAY_1D_TILED_THIN1); | ||
1082 | |||
1083 | if (rdev->family >= CHIP_BONAIRE) { | ||
1084 | - u32 num_pipe_configs = rdev->config.cik.max_tile_pipes; | ||
1085 | - u32 num_rb = rdev->config.cik.max_backends_per_se; | ||
1086 | - if (num_pipe_configs > 8) | ||
1087 | - num_pipe_configs = 8; | ||
1088 | - if (num_pipe_configs == 8) | ||
1089 | - fb_format |= CIK_GRPH_PIPE_CONFIG(CIK_ADDR_SURF_P8_32x32_16x16); | ||
1090 | - else if (num_pipe_configs == 4) { | ||
1091 | - if (num_rb == 4) | ||
1092 | - fb_format |= CIK_GRPH_PIPE_CONFIG(CIK_ADDR_SURF_P4_16x16); | ||
1093 | - else if (num_rb < 4) | ||
1094 | - fb_format |= CIK_GRPH_PIPE_CONFIG(CIK_ADDR_SURF_P4_8x16); | ||
1095 | - } else if (num_pipe_configs == 2) | ||
1096 | - fb_format |= CIK_GRPH_PIPE_CONFIG(CIK_ADDR_SURF_P2); | ||
1097 | + /* Read the pipe config from the 2D TILED SCANOUT mode. | ||
1098 | + * It should be the same for the other modes too, but not all | ||
1099 | + * modes set the pipe config field. */ | ||
1100 | + u32 pipe_config = (rdev->config.cik.tile_mode_array[10] >> 6) & 0x1f; | ||
1101 | + | ||
1102 | + fb_format |= CIK_GRPH_PIPE_CONFIG(pipe_config); | ||
1103 | } else if ((rdev->family == CHIP_TAHITI) || | ||
1104 | (rdev->family == CHIP_PITCAIRN)) | ||
1105 | fb_format |= SI_GRPH_PIPE_CONFIG(SI_ADDR_SURF_P8_32x32_8x16); | ||
1106 | - else if (rdev->family == CHIP_VERDE) | ||
1107 | + else if ((rdev->family == CHIP_VERDE) || | ||
1108 | + (rdev->family == CHIP_OLAND) || | ||
1109 | + (rdev->family == CHIP_HAINAN)) /* for completeness. HAINAN has no display hw */ | ||
1110 | fb_format |= SI_GRPH_PIPE_CONFIG(SI_ADDR_SURF_P4_8x16); | ||
1111 | |||
1112 | switch (radeon_crtc->crtc_id) { | ||
1113 | diff --git a/drivers/gpu/drm/radeon/cik.c b/drivers/gpu/drm/radeon/cik.c | ||
1114 | index 9cd2bc989ac7..31f5f0e88328 100644 | ||
1115 | --- a/drivers/gpu/drm/radeon/cik.c | ||
1116 | +++ b/drivers/gpu/drm/radeon/cik.c | ||
1117 | @@ -2608,7 +2608,7 @@ static u32 cik_create_bitmask(u32 bit_width) | ||
1118 | * Returns the disabled RB bitmask. | ||
1119 | */ | ||
1120 | static u32 cik_get_rb_disabled(struct radeon_device *rdev, | ||
1121 | - u32 max_rb_num, u32 se_num, | ||
1122 | + u32 max_rb_num_per_se, | ||
1123 | u32 sh_per_se) | ||
1124 | { | ||
1125 | u32 data, mask; | ||
1126 | @@ -2622,7 +2622,7 @@ static u32 cik_get_rb_disabled(struct radeon_device *rdev, | ||
1127 | |||
1128 | data >>= BACKEND_DISABLE_SHIFT; | ||
1129 | |||
1130 | - mask = cik_create_bitmask(max_rb_num / se_num / sh_per_se); | ||
1131 | + mask = cik_create_bitmask(max_rb_num_per_se / sh_per_se); | ||
1132 | |||
1133 | return data & mask; | ||
1134 | } | ||
1135 | @@ -2639,7 +2639,7 @@ static u32 cik_get_rb_disabled(struct radeon_device *rdev, | ||
1136 | */ | ||
1137 | static void cik_setup_rb(struct radeon_device *rdev, | ||
1138 | u32 se_num, u32 sh_per_se, | ||
1139 | - u32 max_rb_num) | ||
1140 | + u32 max_rb_num_per_se) | ||
1141 | { | ||
1142 | int i, j; | ||
1143 | u32 data, mask; | ||
1144 | @@ -2649,19 +2649,21 @@ static void cik_setup_rb(struct radeon_device *rdev, | ||
1145 | for (i = 0; i < se_num; i++) { | ||
1146 | for (j = 0; j < sh_per_se; j++) { | ||
1147 | cik_select_se_sh(rdev, i, j); | ||
1148 | - data = cik_get_rb_disabled(rdev, max_rb_num, se_num, sh_per_se); | ||
1149 | + data = cik_get_rb_disabled(rdev, max_rb_num_per_se, sh_per_se); | ||
1150 | disabled_rbs |= data << ((i * sh_per_se + j) * CIK_RB_BITMAP_WIDTH_PER_SH); | ||
1151 | } | ||
1152 | } | ||
1153 | cik_select_se_sh(rdev, 0xffffffff, 0xffffffff); | ||
1154 | |||
1155 | mask = 1; | ||
1156 | - for (i = 0; i < max_rb_num; i++) { | ||
1157 | + for (i = 0; i < max_rb_num_per_se * se_num; i++) { | ||
1158 | if (!(disabled_rbs & mask)) | ||
1159 | enabled_rbs |= mask; | ||
1160 | mask <<= 1; | ||
1161 | } | ||
1162 | |||
1163 | + rdev->config.cik.backend_enable_mask = enabled_rbs; | ||
1164 | + | ||
1165 | for (i = 0; i < se_num; i++) { | ||
1166 | cik_select_se_sh(rdev, i, 0xffffffff); | ||
1167 | data = 0; | ||
1168 | diff --git a/drivers/gpu/drm/radeon/cik_sdma.c b/drivers/gpu/drm/radeon/cik_sdma.c | ||
1169 | index b6286068e111..aaf7ffce8b5b 100644 | ||
1170 | --- a/drivers/gpu/drm/radeon/cik_sdma.c | ||
1171 | +++ b/drivers/gpu/drm/radeon/cik_sdma.c | ||
1172 | @@ -468,7 +468,7 @@ int cik_copy_dma(struct radeon_device *rdev, | ||
1173 | radeon_ring_write(ring, 0); /* src/dst endian swap */ | ||
1174 | radeon_ring_write(ring, src_offset & 0xffffffff); | ||
1175 | radeon_ring_write(ring, upper_32_bits(src_offset) & 0xffffffff); | ||
1176 | - radeon_ring_write(ring, dst_offset & 0xfffffffc); | ||
1177 | + radeon_ring_write(ring, dst_offset & 0xffffffff); | ||
1178 | radeon_ring_write(ring, upper_32_bits(dst_offset) & 0xffffffff); | ||
1179 | src_offset += cur_size_in_bytes; | ||
1180 | dst_offset += cur_size_in_bytes; | ||
1181 | diff --git a/drivers/gpu/drm/radeon/dce6_afmt.c b/drivers/gpu/drm/radeon/dce6_afmt.c | ||
1182 | index 9fcd338c0fcf..86ee09783925 100644 | ||
1183 | --- a/drivers/gpu/drm/radeon/dce6_afmt.c | ||
1184 | +++ b/drivers/gpu/drm/radeon/dce6_afmt.c | ||
1185 | @@ -132,7 +132,7 @@ void dce6_afmt_write_speaker_allocation(struct drm_encoder *encoder) | ||
1186 | } | ||
1187 | |||
1188 | sad_count = drm_edid_to_speaker_allocation(radeon_connector->edid, &sadb); | ||
1189 | - if (sad_count < 0) { | ||
1190 | + if (sad_count <= 0) { | ||
1191 | DRM_ERROR("Couldn't read Speaker Allocation Data Block: %d\n", sad_count); | ||
1192 | return; | ||
1193 | } | ||
1194 | @@ -193,7 +193,7 @@ void dce6_afmt_write_sad_regs(struct drm_encoder *encoder) | ||
1195 | } | ||
1196 | |||
1197 | sad_count = drm_edid_to_sad(radeon_connector->edid, &sads); | ||
1198 | - if (sad_count < 0) { | ||
1199 | + if (sad_count <= 0) { | ||
1200 | DRM_ERROR("Couldn't read SADs: %d\n", sad_count); | ||
1201 | return; | ||
1202 | } | ||
1203 | diff --git a/drivers/gpu/drm/radeon/evergreen_hdmi.c b/drivers/gpu/drm/radeon/evergreen_hdmi.c | ||
1204 | index 57fcc4b16a52..b347fffa4519 100644 | ||
1205 | --- a/drivers/gpu/drm/radeon/evergreen_hdmi.c | ||
1206 | +++ b/drivers/gpu/drm/radeon/evergreen_hdmi.c | ||
1207 | @@ -81,7 +81,7 @@ static void dce4_afmt_write_speaker_allocation(struct drm_encoder *encoder) | ||
1208 | } | ||
1209 | |||
1210 | sad_count = drm_edid_to_speaker_allocation(radeon_connector->edid, &sadb); | ||
1211 | - if (sad_count < 0) { | ||
1212 | + if (sad_count <= 0) { | ||
1213 | DRM_ERROR("Couldn't read Speaker Allocation Data Block: %d\n", sad_count); | ||
1214 | return; | ||
1215 | } | ||
1216 | @@ -134,7 +134,7 @@ static void evergreen_hdmi_write_sad_regs(struct drm_encoder *encoder) | ||
1217 | } | ||
1218 | |||
1219 | sad_count = drm_edid_to_sad(radeon_connector->edid, &sads); | ||
1220 | - if (sad_count < 0) { | ||
1221 | + if (sad_count <= 0) { | ||
1222 | DRM_ERROR("Couldn't read SADs: %d\n", sad_count); | ||
1223 | return; | ||
1224 | } | ||
1225 | diff --git a/drivers/gpu/drm/radeon/ni.c b/drivers/gpu/drm/radeon/ni.c | ||
1226 | index cac2866d79da..954eb9afbe71 100644 | ||
1227 | --- a/drivers/gpu/drm/radeon/ni.c | ||
1228 | +++ b/drivers/gpu/drm/radeon/ni.c | ||
1229 | @@ -900,6 +900,10 @@ static void cayman_gpu_init(struct radeon_device *rdev) | ||
1230 | (rdev->pdev->device == 0x999C)) { | ||
1231 | rdev->config.cayman.max_simds_per_se = 6; | ||
1232 | rdev->config.cayman.max_backends_per_se = 2; | ||
1233 | + rdev->config.cayman.max_hw_contexts = 8; | ||
1234 | + rdev->config.cayman.sx_max_export_size = 256; | ||
1235 | + rdev->config.cayman.sx_max_export_pos_size = 64; | ||
1236 | + rdev->config.cayman.sx_max_export_smx_size = 192; | ||
1237 | } else if ((rdev->pdev->device == 0x9903) || | ||
1238 | (rdev->pdev->device == 0x9904) || | ||
1239 | (rdev->pdev->device == 0x990A) || | ||
1240 | @@ -910,6 +914,10 @@ static void cayman_gpu_init(struct radeon_device *rdev) | ||
1241 | (rdev->pdev->device == 0x999D)) { | ||
1242 | rdev->config.cayman.max_simds_per_se = 4; | ||
1243 | rdev->config.cayman.max_backends_per_se = 2; | ||
1244 | + rdev->config.cayman.max_hw_contexts = 8; | ||
1245 | + rdev->config.cayman.sx_max_export_size = 256; | ||
1246 | + rdev->config.cayman.sx_max_export_pos_size = 64; | ||
1247 | + rdev->config.cayman.sx_max_export_smx_size = 192; | ||
1248 | } else if ((rdev->pdev->device == 0x9919) || | ||
1249 | (rdev->pdev->device == 0x9990) || | ||
1250 | (rdev->pdev->device == 0x9991) || | ||
1251 | @@ -920,9 +928,17 @@ static void cayman_gpu_init(struct radeon_device *rdev) | ||
1252 | (rdev->pdev->device == 0x99A0)) { | ||
1253 | rdev->config.cayman.max_simds_per_se = 3; | ||
1254 | rdev->config.cayman.max_backends_per_se = 1; | ||
1255 | + rdev->config.cayman.max_hw_contexts = 4; | ||
1256 | + rdev->config.cayman.sx_max_export_size = 128; | ||
1257 | + rdev->config.cayman.sx_max_export_pos_size = 32; | ||
1258 | + rdev->config.cayman.sx_max_export_smx_size = 96; | ||
1259 | } else { | ||
1260 | rdev->config.cayman.max_simds_per_se = 2; | ||
1261 | rdev->config.cayman.max_backends_per_se = 1; | ||
1262 | + rdev->config.cayman.max_hw_contexts = 4; | ||
1263 | + rdev->config.cayman.sx_max_export_size = 128; | ||
1264 | + rdev->config.cayman.sx_max_export_pos_size = 32; | ||
1265 | + rdev->config.cayman.sx_max_export_smx_size = 96; | ||
1266 | } | ||
1267 | rdev->config.cayman.max_texture_channel_caches = 2; | ||
1268 | rdev->config.cayman.max_gprs = 256; | ||
1269 | @@ -930,10 +946,6 @@ static void cayman_gpu_init(struct radeon_device *rdev) | ||
1270 | rdev->config.cayman.max_gs_threads = 32; | ||
1271 | rdev->config.cayman.max_stack_entries = 512; | ||
1272 | rdev->config.cayman.sx_num_of_sets = 8; | ||
1273 | - rdev->config.cayman.sx_max_export_size = 256; | ||
1274 | - rdev->config.cayman.sx_max_export_pos_size = 64; | ||
1275 | - rdev->config.cayman.sx_max_export_smx_size = 192; | ||
1276 | - rdev->config.cayman.max_hw_contexts = 8; | ||
1277 | rdev->config.cayman.sq_num_cf_insts = 2; | ||
1278 | |||
1279 | rdev->config.cayman.sc_prim_fifo_size = 0x40; | ||
1280 | diff --git a/drivers/gpu/drm/radeon/radeon.h b/drivers/gpu/drm/radeon/radeon.h | ||
1281 | index 24f4960f59ee..f44ca5853ff2 100644 | ||
1282 | --- a/drivers/gpu/drm/radeon/radeon.h | ||
1283 | +++ b/drivers/gpu/drm/radeon/radeon.h | ||
1284 | @@ -1930,7 +1930,7 @@ struct si_asic { | ||
1285 | unsigned sc_earlyz_tile_fifo_size; | ||
1286 | |||
1287 | unsigned num_tile_pipes; | ||
1288 | - unsigned num_backends_per_se; | ||
1289 | + unsigned backend_enable_mask; | ||
1290 | unsigned backend_disable_mask_per_asic; | ||
1291 | unsigned backend_map; | ||
1292 | unsigned num_texture_channel_caches; | ||
1293 | @@ -1960,7 +1960,7 @@ struct cik_asic { | ||
1294 | unsigned sc_earlyz_tile_fifo_size; | ||
1295 | |||
1296 | unsigned num_tile_pipes; | ||
1297 | - unsigned num_backends_per_se; | ||
1298 | + unsigned backend_enable_mask; | ||
1299 | unsigned backend_disable_mask_per_asic; | ||
1300 | unsigned backend_map; | ||
1301 | unsigned num_texture_channel_caches; | ||
1302 | diff --git a/drivers/gpu/drm/radeon/radeon_atpx_handler.c b/drivers/gpu/drm/radeon/radeon_atpx_handler.c | ||
1303 | index d96070bf8388..d7e7c25feaaf 100644 | ||
1304 | --- a/drivers/gpu/drm/radeon/radeon_atpx_handler.c | ||
1305 | +++ b/drivers/gpu/drm/radeon/radeon_atpx_handler.c | ||
1306 | @@ -34,6 +34,7 @@ static struct radeon_atpx_priv { | ||
1307 | bool atpx_detected; | ||
1308 | /* handle for device - and atpx */ | ||
1309 | acpi_handle dhandle; | ||
1310 | + acpi_handle other_handle; | ||
1311 | struct radeon_atpx atpx; | ||
1312 | } radeon_atpx_priv; | ||
1313 | |||
1314 | @@ -448,9 +449,10 @@ static bool radeon_atpx_pci_probe_handle(struct pci_dev *pdev) | ||
1315 | return false; | ||
1316 | |||
1317 | status = acpi_get_handle(dhandle, "ATPX", &atpx_handle); | ||
1318 | - if (ACPI_FAILURE(status)) | ||
1319 | + if (ACPI_FAILURE(status)) { | ||
1320 | + radeon_atpx_priv.other_handle = dhandle; | ||
1321 | return false; | ||
1322 | - | ||
1323 | + } | ||
1324 | radeon_atpx_priv.dhandle = dhandle; | ||
1325 | radeon_atpx_priv.atpx.handle = atpx_handle; | ||
1326 | return true; | ||
1327 | @@ -527,6 +529,16 @@ static bool radeon_atpx_detect(void) | ||
1328 | printk(KERN_INFO "VGA switcheroo: detected switching method %s handle\n", | ||
1329 | acpi_method_name); | ||
1330 | radeon_atpx_priv.atpx_detected = true; | ||
1331 | + /* | ||
1332 | + * On some systems hotplug events are generated for the device | ||
1333 | + * being switched off when ATPX is executed. They cause ACPI | ||
1334 | + * hotplug to trigger and attempt to remove the device from | ||
1335 | + * the system, which causes it to break down. Prevent that from | ||
1336 | + * happening by setting the no_hotplug flag for the involved | ||
1337 | + * ACPI device objects. | ||
1338 | + */ | ||
1339 | + acpi_bus_no_hotplug(radeon_atpx_priv.dhandle); | ||
1340 | + acpi_bus_no_hotplug(radeon_atpx_priv.other_handle); | ||
1341 | return true; | ||
1342 | } | ||
1343 | return false; | ||
1344 | diff --git a/drivers/gpu/drm/radeon/radeon_kms.c b/drivers/gpu/drm/radeon/radeon_kms.c | ||
1345 | index 61580ddc4eb2..4a3b3c55a568 100644 | ||
1346 | --- a/drivers/gpu/drm/radeon/radeon_kms.c | ||
1347 | +++ b/drivers/gpu/drm/radeon/radeon_kms.c | ||
1348 | @@ -436,6 +436,15 @@ int radeon_info_ioctl(struct drm_device *dev, void *data, struct drm_file *filp) | ||
1349 | case RADEON_INFO_SI_CP_DMA_COMPUTE: | ||
1350 | *value = 1; | ||
1351 | break; | ||
1352 | + case RADEON_INFO_SI_BACKEND_ENABLED_MASK: | ||
1353 | + if (rdev->family >= CHIP_BONAIRE) { | ||
1354 | + *value = rdev->config.cik.backend_enable_mask; | ||
1355 | + } else if (rdev->family >= CHIP_TAHITI) { | ||
1356 | + *value = rdev->config.si.backend_enable_mask; | ||
1357 | + } else { | ||
1358 | + DRM_DEBUG_KMS("BACKEND_ENABLED_MASK is si+ only!\n"); | ||
1359 | + } | ||
1360 | + break; | ||
1361 | default: | ||
1362 | DRM_DEBUG_KMS("Invalid request %d\n", info->request); | ||
1363 | return -EINVAL; | ||
1364 | diff --git a/drivers/gpu/drm/radeon/radeon_uvd.c b/drivers/gpu/drm/radeon/radeon_uvd.c | ||
1365 | index ab0a17248d55..1d029ccf428b 100644 | ||
1366 | --- a/drivers/gpu/drm/radeon/radeon_uvd.c | ||
1367 | +++ b/drivers/gpu/drm/radeon/radeon_uvd.c | ||
1368 | @@ -472,7 +472,7 @@ static int radeon_uvd_cs_reloc(struct radeon_cs_parser *p, | ||
1369 | return -EINVAL; | ||
1370 | } | ||
1371 | |||
1372 | - if ((start >> 28) != (end >> 28)) { | ||
1373 | + if ((start >> 28) != ((end - 1) >> 28)) { | ||
1374 | DRM_ERROR("reloc %LX-%LX crossing 256MB boundary!\n", | ||
1375 | start, end); | ||
1376 | return -EINVAL; | ||
1377 | diff --git a/drivers/gpu/drm/radeon/rs690.c b/drivers/gpu/drm/radeon/rs690.c | ||
1378 | index 1447d794c22a..3c38f0af78fb 100644 | ||
1379 | --- a/drivers/gpu/drm/radeon/rs690.c | ||
1380 | +++ b/drivers/gpu/drm/radeon/rs690.c | ||
1381 | @@ -162,6 +162,16 @@ static void rs690_mc_init(struct radeon_device *rdev) | ||
1382 | base = RREG32_MC(R_000100_MCCFG_FB_LOCATION); | ||
1383 | base = G_000100_MC_FB_START(base) << 16; | ||
1384 | rdev->mc.igp_sideport_enabled = radeon_atombios_sideport_present(rdev); | ||
1385 | + /* Some boards seem to be configured for 128MB of sideport memory, | ||
1386 | + * but really only have 64MB. Just skip the sideport and use | ||
1387 | + * UMA memory. | ||
1388 | + */ | ||
1389 | + if (rdev->mc.igp_sideport_enabled && | ||
1390 | + (rdev->mc.real_vram_size == (384 * 1024 * 1024))) { | ||
1391 | + base += 128 * 1024 * 1024; | ||
1392 | + rdev->mc.real_vram_size -= 128 * 1024 * 1024; | ||
1393 | + rdev->mc.mc_vram_size = rdev->mc.real_vram_size; | ||
1394 | + } | ||
1395 | |||
1396 | /* Use K8 direct mapping for fast fb access. */ | ||
1397 | rdev->fastfb_working = false; | ||
1398 | diff --git a/drivers/gpu/drm/radeon/rv770_dpm.c b/drivers/gpu/drm/radeon/rv770_dpm.c | ||
1399 | index 913b025ae9b3..374499db20c7 100644 | ||
1400 | --- a/drivers/gpu/drm/radeon/rv770_dpm.c | ||
1401 | +++ b/drivers/gpu/drm/radeon/rv770_dpm.c | ||
1402 | @@ -2328,6 +2328,12 @@ void rv770_get_engine_memory_ss(struct radeon_device *rdev) | ||
1403 | pi->mclk_ss = radeon_atombios_get_asic_ss_info(rdev, &ss, | ||
1404 | ASIC_INTERNAL_MEMORY_SS, 0); | ||
1405 | |||
1406 | + /* disable ss, causes hangs on some cayman boards */ | ||
1407 | + if (rdev->family == CHIP_CAYMAN) { | ||
1408 | + pi->sclk_ss = false; | ||
1409 | + pi->mclk_ss = false; | ||
1410 | + } | ||
1411 | + | ||
1412 | if (pi->sclk_ss || pi->mclk_ss) | ||
1413 | pi->dynamic_ss = true; | ||
1414 | else | ||
1415 | diff --git a/drivers/gpu/drm/radeon/si.c b/drivers/gpu/drm/radeon/si.c | ||
1416 | index fe0ec2cb2084..37acf938b779 100644 | ||
1417 | --- a/drivers/gpu/drm/radeon/si.c | ||
1418 | +++ b/drivers/gpu/drm/radeon/si.c | ||
1419 | @@ -2816,7 +2816,7 @@ static void si_setup_spi(struct radeon_device *rdev, | ||
1420 | } | ||
1421 | |||
1422 | static u32 si_get_rb_disabled(struct radeon_device *rdev, | ||
1423 | - u32 max_rb_num, u32 se_num, | ||
1424 | + u32 max_rb_num_per_se, | ||
1425 | u32 sh_per_se) | ||
1426 | { | ||
1427 | u32 data, mask; | ||
1428 | @@ -2830,14 +2830,14 @@ static u32 si_get_rb_disabled(struct radeon_device *rdev, | ||
1429 | |||
1430 | data >>= BACKEND_DISABLE_SHIFT; | ||
1431 | |||
1432 | - mask = si_create_bitmask(max_rb_num / se_num / sh_per_se); | ||
1433 | + mask = si_create_bitmask(max_rb_num_per_se / sh_per_se); | ||
1434 | |||
1435 | return data & mask; | ||
1436 | } | ||
1437 | |||
1438 | static void si_setup_rb(struct radeon_device *rdev, | ||
1439 | u32 se_num, u32 sh_per_se, | ||
1440 | - u32 max_rb_num) | ||
1441 | + u32 max_rb_num_per_se) | ||
1442 | { | ||
1443 | int i, j; | ||
1444 | u32 data, mask; | ||
1445 | @@ -2847,19 +2847,21 @@ static void si_setup_rb(struct radeon_device *rdev, | ||
1446 | for (i = 0; i < se_num; i++) { | ||
1447 | for (j = 0; j < sh_per_se; j++) { | ||
1448 | si_select_se_sh(rdev, i, j); | ||
1449 | - data = si_get_rb_disabled(rdev, max_rb_num, se_num, sh_per_se); | ||
1450 | + data = si_get_rb_disabled(rdev, max_rb_num_per_se, sh_per_se); | ||
1451 | disabled_rbs |= data << ((i * sh_per_se + j) * TAHITI_RB_BITMAP_WIDTH_PER_SH); | ||
1452 | } | ||
1453 | } | ||
1454 | si_select_se_sh(rdev, 0xffffffff, 0xffffffff); | ||
1455 | |||
1456 | mask = 1; | ||
1457 | - for (i = 0; i < max_rb_num; i++) { | ||
1458 | + for (i = 0; i < max_rb_num_per_se * se_num; i++) { | ||
1459 | if (!(disabled_rbs & mask)) | ||
1460 | enabled_rbs |= mask; | ||
1461 | mask <<= 1; | ||
1462 | } | ||
1463 | |||
1464 | + rdev->config.si.backend_enable_mask = enabled_rbs; | ||
1465 | + | ||
1466 | for (i = 0; i < se_num; i++) { | ||
1467 | si_select_se_sh(rdev, i, 0xffffffff); | ||
1468 | data = 0; | ||
1469 | diff --git a/drivers/gpu/drm/ttm/ttm_bo_vm.c b/drivers/gpu/drm/ttm/ttm_bo_vm.c | ||
1470 | index 1006c15445e9..97f07aab1c36 100644 | ||
1471 | --- a/drivers/gpu/drm/ttm/ttm_bo_vm.c | ||
1472 | +++ b/drivers/gpu/drm/ttm/ttm_bo_vm.c | ||
1473 | @@ -116,9 +116,9 @@ static int ttm_bo_vm_fault(struct vm_area_struct *vma, struct vm_fault *vmf) | ||
1474 | } | ||
1475 | |||
1476 | page_offset = ((address - vma->vm_start) >> PAGE_SHIFT) + | ||
1477 | - drm_vma_node_start(&bo->vma_node) - vma->vm_pgoff; | ||
1478 | - page_last = vma_pages(vma) + | ||
1479 | - drm_vma_node_start(&bo->vma_node) - vma->vm_pgoff; | ||
1480 | + vma->vm_pgoff - drm_vma_node_start(&bo->vma_node); | ||
1481 | + page_last = vma_pages(vma) + vma->vm_pgoff - | ||
1482 | + drm_vma_node_start(&bo->vma_node); | ||
1483 | |||
1484 | if (unlikely(page_offset >= bo->num_pages)) { | ||
1485 | retval = VM_FAULT_SIGBUS; | ||
1486 | diff --git a/drivers/idle/intel_idle.c b/drivers/idle/intel_idle.c | ||
1487 | index f116d664b473..d47bb0f267f7 100644 | ||
1488 | --- a/drivers/idle/intel_idle.c | ||
1489 | +++ b/drivers/idle/intel_idle.c | ||
1490 | @@ -361,6 +361,9 @@ static int intel_idle(struct cpuidle_device *dev, | ||
1491 | |||
1492 | if (!current_set_polling_and_test()) { | ||
1493 | |||
1494 | + if (this_cpu_has(X86_FEATURE_CLFLUSH_MONITOR)) | ||
1495 | + clflush((void *)¤t_thread_info()->flags); | ||
1496 | + | ||
1497 | __monitor((void *)¤t_thread_info()->flags, 0, 0); | ||
1498 | smp_mb(); | ||
1499 | if (!need_resched()) | ||
1500 | diff --git a/drivers/iio/adc/ad7887.c b/drivers/iio/adc/ad7887.c | ||
1501 | index 9dd077b78759..df393b4f7bf2 100644 | ||
1502 | --- a/drivers/iio/adc/ad7887.c | ||
1503 | +++ b/drivers/iio/adc/ad7887.c | ||
1504 | @@ -211,7 +211,13 @@ static const struct ad7887_chip_info ad7887_chip_info_tbl[] = { | ||
1505 | .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE), | ||
1506 | .address = 1, | ||
1507 | .scan_index = 1, | ||
1508 | - .scan_type = IIO_ST('u', 12, 16, 0), | ||
1509 | + .scan_type = { | ||
1510 | + .sign = 'u', | ||
1511 | + .realbits = 12, | ||
1512 | + .storagebits = 16, | ||
1513 | + .shift = 0, | ||
1514 | + .endianness = IIO_BE, | ||
1515 | + }, | ||
1516 | }, | ||
1517 | .channel[1] = { | ||
1518 | .type = IIO_VOLTAGE, | ||
1519 | @@ -221,7 +227,13 @@ static const struct ad7887_chip_info ad7887_chip_info_tbl[] = { | ||
1520 | .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE), | ||
1521 | .address = 0, | ||
1522 | .scan_index = 0, | ||
1523 | - .scan_type = IIO_ST('u', 12, 16, 0), | ||
1524 | + .scan_type = { | ||
1525 | + .sign = 'u', | ||
1526 | + .realbits = 12, | ||
1527 | + .storagebits = 16, | ||
1528 | + .shift = 0, | ||
1529 | + .endianness = IIO_BE, | ||
1530 | + }, | ||
1531 | }, | ||
1532 | .channel[2] = IIO_CHAN_SOFT_TIMESTAMP(2), | ||
1533 | .int_vref_mv = 2500, | ||
1534 | diff --git a/drivers/iio/imu/adis16400_core.c b/drivers/iio/imu/adis16400_core.c | ||
1535 | index 3fb7757a1028..368660dfe135 100644 | ||
1536 | --- a/drivers/iio/imu/adis16400_core.c | ||
1537 | +++ b/drivers/iio/imu/adis16400_core.c | ||
1538 | @@ -651,7 +651,12 @@ static const struct iio_chan_spec adis16448_channels[] = { | ||
1539 | .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE), | ||
1540 | .address = ADIS16448_BARO_OUT, | ||
1541 | .scan_index = ADIS16400_SCAN_BARO, | ||
1542 | - .scan_type = IIO_ST('s', 16, 16, 0), | ||
1543 | + .scan_type = { | ||
1544 | + .sign = 's', | ||
1545 | + .realbits = 16, | ||
1546 | + .storagebits = 16, | ||
1547 | + .endianness = IIO_BE, | ||
1548 | + }, | ||
1549 | }, | ||
1550 | ADIS16400_TEMP_CHAN(ADIS16448_TEMP_OUT, 12), | ||
1551 | IIO_CHAN_SOFT_TIMESTAMP(11) | ||
1552 | diff --git a/drivers/infiniband/ulp/isert/ib_isert.c b/drivers/infiniband/ulp/isert/ib_isert.c | ||
1553 | index db5d0a316d0b..ea7051ee1493 100644 | ||
1554 | --- a/drivers/infiniband/ulp/isert/ib_isert.c | ||
1555 | +++ b/drivers/infiniband/ulp/isert/ib_isert.c | ||
1556 | @@ -206,7 +206,9 @@ isert_free_rx_descriptors(struct isert_conn *isert_conn) | ||
1557 | isert_conn->conn_rx_descs = NULL; | ||
1558 | } | ||
1559 | |||
1560 | +static void isert_cq_tx_work(struct work_struct *); | ||
1561 | static void isert_cq_tx_callback(struct ib_cq *, void *); | ||
1562 | +static void isert_cq_rx_work(struct work_struct *); | ||
1563 | static void isert_cq_rx_callback(struct ib_cq *, void *); | ||
1564 | |||
1565 | static int | ||
1566 | @@ -258,26 +260,36 @@ isert_create_device_ib_res(struct isert_device *device) | ||
1567 | cq_desc[i].device = device; | ||
1568 | cq_desc[i].cq_index = i; | ||
1569 | |||
1570 | + INIT_WORK(&cq_desc[i].cq_rx_work, isert_cq_rx_work); | ||
1571 | device->dev_rx_cq[i] = ib_create_cq(device->ib_device, | ||
1572 | isert_cq_rx_callback, | ||
1573 | isert_cq_event_callback, | ||
1574 | (void *)&cq_desc[i], | ||
1575 | ISER_MAX_RX_CQ_LEN, i); | ||
1576 | - if (IS_ERR(device->dev_rx_cq[i])) | ||
1577 | + if (IS_ERR(device->dev_rx_cq[i])) { | ||
1578 | + ret = PTR_ERR(device->dev_rx_cq[i]); | ||
1579 | + device->dev_rx_cq[i] = NULL; | ||
1580 | goto out_cq; | ||
1581 | + } | ||
1582 | |||
1583 | + INIT_WORK(&cq_desc[i].cq_tx_work, isert_cq_tx_work); | ||
1584 | device->dev_tx_cq[i] = ib_create_cq(device->ib_device, | ||
1585 | isert_cq_tx_callback, | ||
1586 | isert_cq_event_callback, | ||
1587 | (void *)&cq_desc[i], | ||
1588 | ISER_MAX_TX_CQ_LEN, i); | ||
1589 | - if (IS_ERR(device->dev_tx_cq[i])) | ||
1590 | + if (IS_ERR(device->dev_tx_cq[i])) { | ||
1591 | + ret = PTR_ERR(device->dev_tx_cq[i]); | ||
1592 | + device->dev_tx_cq[i] = NULL; | ||
1593 | goto out_cq; | ||
1594 | + } | ||
1595 | |||
1596 | - if (ib_req_notify_cq(device->dev_rx_cq[i], IB_CQ_NEXT_COMP)) | ||
1597 | + ret = ib_req_notify_cq(device->dev_rx_cq[i], IB_CQ_NEXT_COMP); | ||
1598 | + if (ret) | ||
1599 | goto out_cq; | ||
1600 | |||
1601 | - if (ib_req_notify_cq(device->dev_tx_cq[i], IB_CQ_NEXT_COMP)) | ||
1602 | + ret = ib_req_notify_cq(device->dev_tx_cq[i], IB_CQ_NEXT_COMP); | ||
1603 | + if (ret) | ||
1604 | goto out_cq; | ||
1605 | } | ||
1606 | |||
1607 | @@ -1686,7 +1698,6 @@ isert_cq_tx_callback(struct ib_cq *cq, void *context) | ||
1608 | { | ||
1609 | struct isert_cq_desc *cq_desc = (struct isert_cq_desc *)context; | ||
1610 | |||
1611 | - INIT_WORK(&cq_desc->cq_tx_work, isert_cq_tx_work); | ||
1612 | queue_work(isert_comp_wq, &cq_desc->cq_tx_work); | ||
1613 | } | ||
1614 | |||
1615 | @@ -1730,7 +1741,6 @@ isert_cq_rx_callback(struct ib_cq *cq, void *context) | ||
1616 | { | ||
1617 | struct isert_cq_desc *cq_desc = (struct isert_cq_desc *)context; | ||
1618 | |||
1619 | - INIT_WORK(&cq_desc->cq_rx_work, isert_cq_rx_work); | ||
1620 | queue_work(isert_rx_wq, &cq_desc->cq_rx_work); | ||
1621 | } | ||
1622 | |||
1623 | diff --git a/drivers/input/input.c b/drivers/input/input.c | ||
1624 | index e75d015024a1..74f47980117b 100644 | ||
1625 | --- a/drivers/input/input.c | ||
1626 | +++ b/drivers/input/input.c | ||
1627 | @@ -1871,6 +1871,10 @@ void input_set_capability(struct input_dev *dev, unsigned int type, unsigned int | ||
1628 | break; | ||
1629 | |||
1630 | case EV_ABS: | ||
1631 | + input_alloc_absinfo(dev); | ||
1632 | + if (!dev->absinfo) | ||
1633 | + return; | ||
1634 | + | ||
1635 | __set_bit(code, dev->absbit); | ||
1636 | break; | ||
1637 | |||
1638 | diff --git a/drivers/net/can/usb/peak_usb/pcan_usb_pro.c b/drivers/net/can/usb/peak_usb/pcan_usb_pro.c | ||
1639 | index 8ee9d1556e6e..263dd921edc4 100644 | ||
1640 | --- a/drivers/net/can/usb/peak_usb/pcan_usb_pro.c | ||
1641 | +++ b/drivers/net/can/usb/peak_usb/pcan_usb_pro.c | ||
1642 | @@ -927,6 +927,9 @@ static int pcan_usb_pro_init(struct peak_usb_device *dev) | ||
1643 | /* set LED in default state (end of init phase) */ | ||
1644 | pcan_usb_pro_set_led(dev, 0, 1); | ||
1645 | |||
1646 | + kfree(bi); | ||
1647 | + kfree(fi); | ||
1648 | + | ||
1649 | return 0; | ||
1650 | |||
1651 | err_out: | ||
1652 | diff --git a/drivers/net/ethernet/broadcom/tg3.c b/drivers/net/ethernet/broadcom/tg3.c | ||
1653 | index cd76d2a6e014..a82229fe1c7f 100644 | ||
1654 | --- a/drivers/net/ethernet/broadcom/tg3.c | ||
1655 | +++ b/drivers/net/ethernet/broadcom/tg3.c | ||
1656 | @@ -7608,7 +7608,7 @@ static inline int tg3_4g_overflow_test(dma_addr_t mapping, int len) | ||
1657 | { | ||
1658 | u32 base = (u32) mapping & 0xffffffff; | ||
1659 | |||
1660 | - return (base > 0xffffdcc0) && (base + len + 8 < base); | ||
1661 | + return base + len + 8 < base; | ||
1662 | } | ||
1663 | |||
1664 | /* Test for TSO DMA buffers that cross into regions which are within MSS bytes | ||
1665 | diff --git a/drivers/net/usb/dm9601.c b/drivers/net/usb/dm9601.c | ||
1666 | index c6867f926cff..c0bfc818c701 100644 | ||
1667 | --- a/drivers/net/usb/dm9601.c | ||
1668 | +++ b/drivers/net/usb/dm9601.c | ||
1669 | @@ -364,7 +364,12 @@ static int dm9601_bind(struct usbnet *dev, struct usb_interface *intf) | ||
1670 | dev->net->ethtool_ops = &dm9601_ethtool_ops; | ||
1671 | dev->net->hard_header_len += DM_TX_OVERHEAD; | ||
1672 | dev->hard_mtu = dev->net->mtu + dev->net->hard_header_len; | ||
1673 | - dev->rx_urb_size = dev->net->mtu + ETH_HLEN + DM_RX_OVERHEAD; | ||
1674 | + | ||
1675 | + /* dm9620/21a require room for 4 byte padding, even in dm9601 | ||
1676 | + * mode, so we need +1 to be able to receive full size | ||
1677 | + * ethernet frames. | ||
1678 | + */ | ||
1679 | + dev->rx_urb_size = dev->net->mtu + ETH_HLEN + DM_RX_OVERHEAD + 1; | ||
1680 | |||
1681 | dev->mii.dev = dev->net; | ||
1682 | dev->mii.mdio_read = dm9601_mdio_read; | ||
1683 | @@ -468,7 +473,7 @@ static int dm9601_rx_fixup(struct usbnet *dev, struct sk_buff *skb) | ||
1684 | static struct sk_buff *dm9601_tx_fixup(struct usbnet *dev, struct sk_buff *skb, | ||
1685 | gfp_t flags) | ||
1686 | { | ||
1687 | - int len; | ||
1688 | + int len, pad; | ||
1689 | |||
1690 | /* format: | ||
1691 | b1: packet length low | ||
1692 | @@ -476,12 +481,23 @@ static struct sk_buff *dm9601_tx_fixup(struct usbnet *dev, struct sk_buff *skb, | ||
1693 | b3..n: packet data | ||
1694 | */ | ||
1695 | |||
1696 | - len = skb->len; | ||
1697 | + len = skb->len + DM_TX_OVERHEAD; | ||
1698 | |||
1699 | - if (skb_headroom(skb) < DM_TX_OVERHEAD) { | ||
1700 | + /* workaround for dm962x errata with tx fifo getting out of | ||
1701 | + * sync if a USB bulk transfer retry happens right after a | ||
1702 | + * packet with odd / maxpacket length by adding up to 3 bytes | ||
1703 | + * padding. | ||
1704 | + */ | ||
1705 | + while ((len & 1) || !(len % dev->maxpacket)) | ||
1706 | + len++; | ||
1707 | + | ||
1708 | + len -= DM_TX_OVERHEAD; /* hw header doesn't count as part of length */ | ||
1709 | + pad = len - skb->len; | ||
1710 | + | ||
1711 | + if (skb_headroom(skb) < DM_TX_OVERHEAD || skb_tailroom(skb) < pad) { | ||
1712 | struct sk_buff *skb2; | ||
1713 | |||
1714 | - skb2 = skb_copy_expand(skb, DM_TX_OVERHEAD, 0, flags); | ||
1715 | + skb2 = skb_copy_expand(skb, DM_TX_OVERHEAD, pad, flags); | ||
1716 | dev_kfree_skb_any(skb); | ||
1717 | skb = skb2; | ||
1718 | if (!skb) | ||
1719 | @@ -490,10 +506,10 @@ static struct sk_buff *dm9601_tx_fixup(struct usbnet *dev, struct sk_buff *skb, | ||
1720 | |||
1721 | __skb_push(skb, DM_TX_OVERHEAD); | ||
1722 | |||
1723 | - /* usbnet adds padding if length is a multiple of packet size | ||
1724 | - if so, adjust length value in header */ | ||
1725 | - if ((skb->len % dev->maxpacket) == 0) | ||
1726 | - len++; | ||
1727 | + if (pad) { | ||
1728 | + memset(skb->data + skb->len, 0, pad); | ||
1729 | + __skb_put(skb, pad); | ||
1730 | + } | ||
1731 | |||
1732 | skb->data[0] = len; | ||
1733 | skb->data[1] = len >> 8; | ||
1734 | diff --git a/drivers/net/wireless/ath/ath9k/ar9002_mac.c b/drivers/net/wireless/ath/ath9k/ar9002_mac.c | ||
1735 | index 8d78253c26ce..a366d6b4626f 100644 | ||
1736 | --- a/drivers/net/wireless/ath/ath9k/ar9002_mac.c | ||
1737 | +++ b/drivers/net/wireless/ath/ath9k/ar9002_mac.c | ||
1738 | @@ -76,9 +76,16 @@ static bool ar9002_hw_get_isr(struct ath_hw *ah, enum ath9k_int *masked) | ||
1739 | mask2 |= ATH9K_INT_CST; | ||
1740 | if (isr2 & AR_ISR_S2_TSFOOR) | ||
1741 | mask2 |= ATH9K_INT_TSFOOR; | ||
1742 | + | ||
1743 | + if (!(pCap->hw_caps & ATH9K_HW_CAP_RAC_SUPPORTED)) { | ||
1744 | + REG_WRITE(ah, AR_ISR_S2, isr2); | ||
1745 | + isr &= ~AR_ISR_BCNMISC; | ||
1746 | + } | ||
1747 | } | ||
1748 | |||
1749 | - isr = REG_READ(ah, AR_ISR_RAC); | ||
1750 | + if (pCap->hw_caps & ATH9K_HW_CAP_RAC_SUPPORTED) | ||
1751 | + isr = REG_READ(ah, AR_ISR_RAC); | ||
1752 | + | ||
1753 | if (isr == 0xffffffff) { | ||
1754 | *masked = 0; | ||
1755 | return false; | ||
1756 | @@ -97,11 +104,23 @@ static bool ar9002_hw_get_isr(struct ath_hw *ah, enum ath9k_int *masked) | ||
1757 | |||
1758 | *masked |= ATH9K_INT_TX; | ||
1759 | |||
1760 | - s0_s = REG_READ(ah, AR_ISR_S0_S); | ||
1761 | + if (pCap->hw_caps & ATH9K_HW_CAP_RAC_SUPPORTED) { | ||
1762 | + s0_s = REG_READ(ah, AR_ISR_S0_S); | ||
1763 | + s1_s = REG_READ(ah, AR_ISR_S1_S); | ||
1764 | + } else { | ||
1765 | + s0_s = REG_READ(ah, AR_ISR_S0); | ||
1766 | + REG_WRITE(ah, AR_ISR_S0, s0_s); | ||
1767 | + s1_s = REG_READ(ah, AR_ISR_S1); | ||
1768 | + REG_WRITE(ah, AR_ISR_S1, s1_s); | ||
1769 | + | ||
1770 | + isr &= ~(AR_ISR_TXOK | | ||
1771 | + AR_ISR_TXDESC | | ||
1772 | + AR_ISR_TXERR | | ||
1773 | + AR_ISR_TXEOL); | ||
1774 | + } | ||
1775 | + | ||
1776 | ah->intr_txqs |= MS(s0_s, AR_ISR_S0_QCU_TXOK); | ||
1777 | ah->intr_txqs |= MS(s0_s, AR_ISR_S0_QCU_TXDESC); | ||
1778 | - | ||
1779 | - s1_s = REG_READ(ah, AR_ISR_S1_S); | ||
1780 | ah->intr_txqs |= MS(s1_s, AR_ISR_S1_QCU_TXERR); | ||
1781 | ah->intr_txqs |= MS(s1_s, AR_ISR_S1_QCU_TXEOL); | ||
1782 | } | ||
1783 | @@ -114,13 +133,15 @@ static bool ar9002_hw_get_isr(struct ath_hw *ah, enum ath9k_int *masked) | ||
1784 | *masked |= mask2; | ||
1785 | } | ||
1786 | |||
1787 | - if (AR_SREV_9100(ah)) | ||
1788 | - return true; | ||
1789 | - | ||
1790 | - if (isr & AR_ISR_GENTMR) { | ||
1791 | + if (!AR_SREV_9100(ah) && (isr & AR_ISR_GENTMR)) { | ||
1792 | u32 s5_s; | ||
1793 | |||
1794 | - s5_s = REG_READ(ah, AR_ISR_S5_S); | ||
1795 | + if (pCap->hw_caps & ATH9K_HW_CAP_RAC_SUPPORTED) { | ||
1796 | + s5_s = REG_READ(ah, AR_ISR_S5_S); | ||
1797 | + } else { | ||
1798 | + s5_s = REG_READ(ah, AR_ISR_S5); | ||
1799 | + } | ||
1800 | + | ||
1801 | ah->intr_gen_timer_trigger = | ||
1802 | MS(s5_s, AR_ISR_S5_GENTIMER_TRIG); | ||
1803 | |||
1804 | @@ -133,8 +154,21 @@ static bool ar9002_hw_get_isr(struct ath_hw *ah, enum ath9k_int *masked) | ||
1805 | if ((s5_s & AR_ISR_S5_TIM_TIMER) && | ||
1806 | !(pCap->hw_caps & ATH9K_HW_CAP_AUTOSLEEP)) | ||
1807 | *masked |= ATH9K_INT_TIM_TIMER; | ||
1808 | + | ||
1809 | + if (!(pCap->hw_caps & ATH9K_HW_CAP_RAC_SUPPORTED)) { | ||
1810 | + REG_WRITE(ah, AR_ISR_S5, s5_s); | ||
1811 | + isr &= ~AR_ISR_GENTMR; | ||
1812 | + } | ||
1813 | } | ||
1814 | |||
1815 | + if (!(pCap->hw_caps & ATH9K_HW_CAP_RAC_SUPPORTED)) { | ||
1816 | + REG_WRITE(ah, AR_ISR, isr); | ||
1817 | + REG_READ(ah, AR_ISR); | ||
1818 | + } | ||
1819 | + | ||
1820 | + if (AR_SREV_9100(ah)) | ||
1821 | + return true; | ||
1822 | + | ||
1823 | if (sync_cause) { | ||
1824 | ath9k_debug_sync_cause(common, sync_cause); | ||
1825 | fatal_int = | ||
1826 | diff --git a/drivers/net/wireless/ath/ath9k/htc_drv_main.c b/drivers/net/wireless/ath/ath9k/htc_drv_main.c | ||
1827 | index d44258172c0f..79d67c35299b 100644 | ||
1828 | --- a/drivers/net/wireless/ath/ath9k/htc_drv_main.c | ||
1829 | +++ b/drivers/net/wireless/ath/ath9k/htc_drv_main.c | ||
1830 | @@ -147,21 +147,26 @@ static void ath9k_htc_bssid_iter(void *data, u8 *mac, struct ieee80211_vif *vif) | ||
1831 | struct ath9k_vif_iter_data *iter_data = data; | ||
1832 | int i; | ||
1833 | |||
1834 | - for (i = 0; i < ETH_ALEN; i++) | ||
1835 | - iter_data->mask[i] &= ~(iter_data->hw_macaddr[i] ^ mac[i]); | ||
1836 | + if (iter_data->hw_macaddr != NULL) { | ||
1837 | + for (i = 0; i < ETH_ALEN; i++) | ||
1838 | + iter_data->mask[i] &= ~(iter_data->hw_macaddr[i] ^ mac[i]); | ||
1839 | + } else { | ||
1840 | + iter_data->hw_macaddr = mac; | ||
1841 | + } | ||
1842 | } | ||
1843 | |||
1844 | -static void ath9k_htc_set_bssid_mask(struct ath9k_htc_priv *priv, | ||
1845 | +static void ath9k_htc_set_mac_bssid_mask(struct ath9k_htc_priv *priv, | ||
1846 | struct ieee80211_vif *vif) | ||
1847 | { | ||
1848 | struct ath_common *common = ath9k_hw_common(priv->ah); | ||
1849 | struct ath9k_vif_iter_data iter_data; | ||
1850 | |||
1851 | /* | ||
1852 | - * Use the hardware MAC address as reference, the hardware uses it | ||
1853 | - * together with the BSSID mask when matching addresses. | ||
1854 | + * Pick the MAC address of the first interface as the new hardware | ||
1855 | + * MAC address. The hardware will use it together with the BSSID mask | ||
1856 | + * when matching addresses. | ||
1857 | */ | ||
1858 | - iter_data.hw_macaddr = common->macaddr; | ||
1859 | + iter_data.hw_macaddr = NULL; | ||
1860 | memset(&iter_data.mask, 0xff, ETH_ALEN); | ||
1861 | |||
1862 | if (vif) | ||
1863 | @@ -173,6 +178,10 @@ static void ath9k_htc_set_bssid_mask(struct ath9k_htc_priv *priv, | ||
1864 | ath9k_htc_bssid_iter, &iter_data); | ||
1865 | |||
1866 | memcpy(common->bssidmask, iter_data.mask, ETH_ALEN); | ||
1867 | + | ||
1868 | + if (iter_data.hw_macaddr) | ||
1869 | + memcpy(common->macaddr, iter_data.hw_macaddr, ETH_ALEN); | ||
1870 | + | ||
1871 | ath_hw_setbssidmask(common); | ||
1872 | } | ||
1873 | |||
1874 | @@ -1083,7 +1092,7 @@ static int ath9k_htc_add_interface(struct ieee80211_hw *hw, | ||
1875 | goto out; | ||
1876 | } | ||
1877 | |||
1878 | - ath9k_htc_set_bssid_mask(priv, vif); | ||
1879 | + ath9k_htc_set_mac_bssid_mask(priv, vif); | ||
1880 | |||
1881 | priv->vif_slot |= (1 << avp->index); | ||
1882 | priv->nvifs++; | ||
1883 | @@ -1148,7 +1157,7 @@ static void ath9k_htc_remove_interface(struct ieee80211_hw *hw, | ||
1884 | |||
1885 | ath9k_htc_set_opmode(priv); | ||
1886 | |||
1887 | - ath9k_htc_set_bssid_mask(priv, vif); | ||
1888 | + ath9k_htc_set_mac_bssid_mask(priv, vif); | ||
1889 | |||
1890 | /* | ||
1891 | * Stop ANI only if there are no associated station interfaces. | ||
1892 | diff --git a/drivers/net/wireless/ath/ath9k/main.c b/drivers/net/wireless/ath/ath9k/main.c | ||
1893 | index 709301f88dcd..5ba0da9d1959 100644 | ||
1894 | --- a/drivers/net/wireless/ath/ath9k/main.c | ||
1895 | +++ b/drivers/net/wireless/ath/ath9k/main.c | ||
1896 | @@ -885,8 +885,9 @@ void ath9k_calculate_iter_data(struct ieee80211_hw *hw, | ||
1897 | struct ath_common *common = ath9k_hw_common(ah); | ||
1898 | |||
1899 | /* | ||
1900 | - * Use the hardware MAC address as reference, the hardware uses it | ||
1901 | - * together with the BSSID mask when matching addresses. | ||
1902 | + * Pick the MAC address of the first interface as the new hardware | ||
1903 | + * MAC address. The hardware will use it together with the BSSID mask | ||
1904 | + * when matching addresses. | ||
1905 | */ | ||
1906 | memset(iter_data, 0, sizeof(*iter_data)); | ||
1907 | memset(&iter_data->mask, 0xff, ETH_ALEN); | ||
1908 | diff --git a/drivers/net/wireless/rtlwifi/pci.c b/drivers/net/wireless/rtlwifi/pci.c | ||
1909 | index 703f839af6ca..bb3b72ebf667 100644 | ||
1910 | --- a/drivers/net/wireless/rtlwifi/pci.c | ||
1911 | +++ b/drivers/net/wireless/rtlwifi/pci.c | ||
1912 | @@ -741,6 +741,8 @@ static void _rtl_pci_rx_interrupt(struct ieee80211_hw *hw) | ||
1913 | }; | ||
1914 | int index = rtlpci->rx_ring[rx_queue_idx].idx; | ||
1915 | |||
1916 | + if (rtlpci->driver_is_goingto_unload) | ||
1917 | + return; | ||
1918 | /*RX NORMAL PKT */ | ||
1919 | while (count--) { | ||
1920 | /*rx descriptor */ | ||
1921 | @@ -1637,6 +1639,7 @@ static void rtl_pci_stop(struct ieee80211_hw *hw) | ||
1922 | */ | ||
1923 | set_hal_stop(rtlhal); | ||
1924 | |||
1925 | + rtlpci->driver_is_goingto_unload = true; | ||
1926 | rtlpriv->cfg->ops->disable_interrupt(hw); | ||
1927 | cancel_work_sync(&rtlpriv->works.lps_change_work); | ||
1928 | |||
1929 | @@ -1654,7 +1657,6 @@ static void rtl_pci_stop(struct ieee80211_hw *hw) | ||
1930 | ppsc->rfchange_inprogress = true; | ||
1931 | spin_unlock_irqrestore(&rtlpriv->locks.rf_ps_lock, flags); | ||
1932 | |||
1933 | - rtlpci->driver_is_goingto_unload = true; | ||
1934 | rtlpriv->cfg->ops->hw_disable(hw); | ||
1935 | /* some things are not needed if firmware not available */ | ||
1936 | if (!rtlpriv->max_fw_size) | ||
1937 | diff --git a/drivers/of/address.c b/drivers/of/address.c | ||
1938 | index b55c21890760..3c4b2af51611 100644 | ||
1939 | --- a/drivers/of/address.c | ||
1940 | +++ b/drivers/of/address.c | ||
1941 | @@ -69,14 +69,6 @@ static u64 of_bus_default_map(__be32 *addr, const __be32 *range, | ||
1942 | (unsigned long long)cp, (unsigned long long)s, | ||
1943 | (unsigned long long)da); | ||
1944 | |||
1945 | - /* | ||
1946 | - * If the number of address cells is larger than 2 we assume the | ||
1947 | - * mapping doesn't specify a physical address. Rather, the address | ||
1948 | - * specifies an identifier that must match exactly. | ||
1949 | - */ | ||
1950 | - if (na > 2 && memcmp(range, addr, na * 4) != 0) | ||
1951 | - return OF_BAD_ADDR; | ||
1952 | - | ||
1953 | if (da < cp || da >= (cp + s)) | ||
1954 | return OF_BAD_ADDR; | ||
1955 | return da - cp; | ||
1956 | diff --git a/drivers/pci/hotplug/acpiphp_glue.c b/drivers/pci/hotplug/acpiphp_glue.c | ||
1957 | index 1ea75236a15f..be5cba52a09c 100644 | ||
1958 | --- a/drivers/pci/hotplug/acpiphp_glue.c | ||
1959 | +++ b/drivers/pci/hotplug/acpiphp_glue.c | ||
1960 | @@ -279,7 +279,9 @@ static acpi_status register_slot(acpi_handle handle, u32 lvl, void *data, | ||
1961 | |||
1962 | status = acpi_evaluate_integer(handle, "_ADR", NULL, &adr); | ||
1963 | if (ACPI_FAILURE(status)) { | ||
1964 | - acpi_handle_warn(handle, "can't evaluate _ADR (%#x)\n", status); | ||
1965 | + if (status != AE_NOT_FOUND) | ||
1966 | + acpi_handle_warn(handle, | ||
1967 | + "can't evaluate _ADR (%#x)\n", status); | ||
1968 | return AE_OK; | ||
1969 | } | ||
1970 | |||
1971 | @@ -643,6 +645,24 @@ static void disable_slot(struct acpiphp_slot *slot) | ||
1972 | slot->flags &= (~SLOT_ENABLED); | ||
1973 | } | ||
1974 | |||
1975 | +static bool acpiphp_no_hotplug(acpi_handle handle) | ||
1976 | +{ | ||
1977 | + struct acpi_device *adev = NULL; | ||
1978 | + | ||
1979 | + acpi_bus_get_device(handle, &adev); | ||
1980 | + return adev && adev->flags.no_hotplug; | ||
1981 | +} | ||
1982 | + | ||
1983 | +static bool slot_no_hotplug(struct acpiphp_slot *slot) | ||
1984 | +{ | ||
1985 | + struct acpiphp_func *func; | ||
1986 | + | ||
1987 | + list_for_each_entry(func, &slot->funcs, sibling) | ||
1988 | + if (acpiphp_no_hotplug(func_to_handle(func))) | ||
1989 | + return true; | ||
1990 | + | ||
1991 | + return false; | ||
1992 | +} | ||
1993 | |||
1994 | /** | ||
1995 | * get_slot_status - get ACPI slot status | ||
1996 | @@ -701,7 +721,8 @@ static void trim_stale_devices(struct pci_dev *dev) | ||
1997 | unsigned long long sta; | ||
1998 | |||
1999 | status = acpi_evaluate_integer(handle, "_STA", NULL, &sta); | ||
2000 | - alive = ACPI_SUCCESS(status) && sta == ACPI_STA_ALL; | ||
2001 | + alive = (ACPI_SUCCESS(status) && sta == ACPI_STA_ALL) | ||
2002 | + || acpiphp_no_hotplug(handle); | ||
2003 | } | ||
2004 | if (!alive) { | ||
2005 | u32 v; | ||
2006 | @@ -741,8 +762,9 @@ static void acpiphp_check_bridge(struct acpiphp_bridge *bridge) | ||
2007 | struct pci_dev *dev, *tmp; | ||
2008 | |||
2009 | mutex_lock(&slot->crit_sect); | ||
2010 | - /* wake up all functions */ | ||
2011 | - if (get_slot_status(slot) == ACPI_STA_ALL) { | ||
2012 | + if (slot_no_hotplug(slot)) { | ||
2013 | + ; /* do nothing */ | ||
2014 | + } else if (get_slot_status(slot) == ACPI_STA_ALL) { | ||
2015 | /* remove stale devices if any */ | ||
2016 | list_for_each_entry_safe(dev, tmp, &bus->devices, | ||
2017 | bus_list) | ||
2018 | diff --git a/drivers/pinctrl/pinctrl-baytrail.c b/drivers/pinctrl/pinctrl-baytrail.c | ||
2019 | index 2832576d8b12..114f5ef4b73a 100644 | ||
2020 | --- a/drivers/pinctrl/pinctrl-baytrail.c | ||
2021 | +++ b/drivers/pinctrl/pinctrl-baytrail.c | ||
2022 | @@ -512,6 +512,7 @@ static const struct dev_pm_ops byt_gpio_pm_ops = { | ||
2023 | |||
2024 | static const struct acpi_device_id byt_gpio_acpi_match[] = { | ||
2025 | { "INT33B2", 0 }, | ||
2026 | + { "INT33FC", 0 }, | ||
2027 | { } | ||
2028 | }; | ||
2029 | MODULE_DEVICE_TABLE(acpi, byt_gpio_acpi_match); | ||
2030 | diff --git a/drivers/pinctrl/sh-pfc/sh_pfc.h b/drivers/pinctrl/sh-pfc/sh_pfc.h | ||
2031 | index 11bd0d970a52..e2142956a8e5 100644 | ||
2032 | --- a/drivers/pinctrl/sh-pfc/sh_pfc.h | ||
2033 | +++ b/drivers/pinctrl/sh-pfc/sh_pfc.h | ||
2034 | @@ -254,7 +254,7 @@ struct sh_pfc_soc_info { | ||
2035 | #define PINMUX_GPIO(_pin) \ | ||
2036 | [GPIO_##_pin] = { \ | ||
2037 | .pin = (u16)-1, \ | ||
2038 | - .name = __stringify(name), \ | ||
2039 | + .name = __stringify(GPIO_##_pin), \ | ||
2040 | .enum_id = _pin##_DATA, \ | ||
2041 | } | ||
2042 | |||
2043 | diff --git a/drivers/power/power_supply_core.c b/drivers/power/power_supply_core.c | ||
2044 | index 00e667296360..557af943b2f5 100644 | ||
2045 | --- a/drivers/power/power_supply_core.c | ||
2046 | +++ b/drivers/power/power_supply_core.c | ||
2047 | @@ -511,6 +511,10 @@ int power_supply_register(struct device *parent, struct power_supply *psy) | ||
2048 | dev_set_drvdata(dev, psy); | ||
2049 | psy->dev = dev; | ||
2050 | |||
2051 | + rc = dev_set_name(dev, "%s", psy->name); | ||
2052 | + if (rc) | ||
2053 | + goto dev_set_name_failed; | ||
2054 | + | ||
2055 | INIT_WORK(&psy->changed_work, power_supply_changed_work); | ||
2056 | |||
2057 | rc = power_supply_check_supplies(psy); | ||
2058 | @@ -524,10 +528,6 @@ int power_supply_register(struct device *parent, struct power_supply *psy) | ||
2059 | if (rc) | ||
2060 | goto wakeup_init_failed; | ||
2061 | |||
2062 | - rc = kobject_set_name(&dev->kobj, "%s", psy->name); | ||
2063 | - if (rc) | ||
2064 | - goto kobject_set_name_failed; | ||
2065 | - | ||
2066 | rc = device_add(dev); | ||
2067 | if (rc) | ||
2068 | goto device_add_failed; | ||
2069 | @@ -553,11 +553,11 @@ create_triggers_failed: | ||
2070 | register_cooler_failed: | ||
2071 | psy_unregister_thermal(psy); | ||
2072 | register_thermal_failed: | ||
2073 | -wakeup_init_failed: | ||
2074 | device_del(dev); | ||
2075 | -kobject_set_name_failed: | ||
2076 | device_add_failed: | ||
2077 | +wakeup_init_failed: | ||
2078 | check_supplies_failed: | ||
2079 | +dev_set_name_failed: | ||
2080 | put_device(dev); | ||
2081 | success: | ||
2082 | return rc; | ||
2083 | diff --git a/drivers/s390/char/tty3270.c b/drivers/s390/char/tty3270.c | ||
2084 | index 3f4ca4e09a4c..34629ea913d4 100644 | ||
2085 | --- a/drivers/s390/char/tty3270.c | ||
2086 | +++ b/drivers/s390/char/tty3270.c | ||
2087 | @@ -942,7 +942,7 @@ static int tty3270_install(struct tty_driver *driver, struct tty_struct *tty) | ||
2088 | return rc; | ||
2089 | } | ||
2090 | |||
2091 | - tp->screen = tty3270_alloc_screen(tp->view.cols, tp->view.rows); | ||
2092 | + tp->screen = tty3270_alloc_screen(tp->view.rows, tp->view.cols); | ||
2093 | if (IS_ERR(tp->screen)) { | ||
2094 | rc = PTR_ERR(tp->screen); | ||
2095 | raw3270_put_view(&tp->view); | ||
2096 | diff --git a/drivers/scsi/qla2xxx/qla_target.c b/drivers/scsi/qla2xxx/qla_target.c | ||
2097 | index 596480022b0a..3bb0a1d1622a 100644 | ||
2098 | --- a/drivers/scsi/qla2xxx/qla_target.c | ||
2099 | +++ b/drivers/scsi/qla2xxx/qla_target.c | ||
2100 | @@ -471,7 +471,7 @@ static void qlt_schedule_sess_for_deletion(struct qla_tgt_sess *sess, | ||
2101 | schedule_delayed_work(&tgt->sess_del_work, 0); | ||
2102 | else | ||
2103 | schedule_delayed_work(&tgt->sess_del_work, | ||
2104 | - jiffies - sess->expires); | ||
2105 | + sess->expires - jiffies); | ||
2106 | } | ||
2107 | |||
2108 | /* ha->hardware_lock supposed to be held on entry */ | ||
2109 | @@ -550,13 +550,14 @@ static void qlt_del_sess_work_fn(struct delayed_work *work) | ||
2110 | struct scsi_qla_host *vha = tgt->vha; | ||
2111 | struct qla_hw_data *ha = vha->hw; | ||
2112 | struct qla_tgt_sess *sess; | ||
2113 | - unsigned long flags; | ||
2114 | + unsigned long flags, elapsed; | ||
2115 | |||
2116 | spin_lock_irqsave(&ha->hardware_lock, flags); | ||
2117 | while (!list_empty(&tgt->del_sess_list)) { | ||
2118 | sess = list_entry(tgt->del_sess_list.next, typeof(*sess), | ||
2119 | del_list_entry); | ||
2120 | - if (time_after_eq(jiffies, sess->expires)) { | ||
2121 | + elapsed = jiffies; | ||
2122 | + if (time_after_eq(elapsed, sess->expires)) { | ||
2123 | qlt_undelete_sess(sess); | ||
2124 | |||
2125 | ql_dbg(ql_dbg_tgt_mgt, vha, 0xf004, | ||
2126 | @@ -566,7 +567,7 @@ static void qlt_del_sess_work_fn(struct delayed_work *work) | ||
2127 | ha->tgt.tgt_ops->put_sess(sess); | ||
2128 | } else { | ||
2129 | schedule_delayed_work(&tgt->sess_del_work, | ||
2130 | - jiffies - sess->expires); | ||
2131 | + sess->expires - elapsed); | ||
2132 | break; | ||
2133 | } | ||
2134 | } | ||
2135 | diff --git a/drivers/staging/comedi/drivers.c b/drivers/staging/comedi/drivers.c | ||
2136 | index 317a821b7906..316c44401372 100644 | ||
2137 | --- a/drivers/staging/comedi/drivers.c | ||
2138 | +++ b/drivers/staging/comedi/drivers.c | ||
2139 | @@ -417,7 +417,7 @@ int comedi_load_firmware(struct comedi_device *dev, | ||
2140 | release_firmware(fw); | ||
2141 | } | ||
2142 | |||
2143 | - return ret; | ||
2144 | + return ret < 0 ? ret : 0; | ||
2145 | } | ||
2146 | EXPORT_SYMBOL_GPL(comedi_load_firmware); | ||
2147 | |||
2148 | diff --git a/drivers/staging/comedi/drivers/8255_pci.c b/drivers/staging/comedi/drivers/8255_pci.c | ||
2149 | index 432e3f9c3301..c55f234b29e6 100644 | ||
2150 | --- a/drivers/staging/comedi/drivers/8255_pci.c | ||
2151 | +++ b/drivers/staging/comedi/drivers/8255_pci.c | ||
2152 | @@ -63,7 +63,8 @@ enum pci_8255_boardid { | ||
2153 | BOARD_ADLINK_PCI7296, | ||
2154 | BOARD_CB_PCIDIO24, | ||
2155 | BOARD_CB_PCIDIO24H, | ||
2156 | - BOARD_CB_PCIDIO48H, | ||
2157 | + BOARD_CB_PCIDIO48H_OLD, | ||
2158 | + BOARD_CB_PCIDIO48H_NEW, | ||
2159 | BOARD_CB_PCIDIO96H, | ||
2160 | BOARD_NI_PCIDIO96, | ||
2161 | BOARD_NI_PCIDIO96B, | ||
2162 | @@ -106,11 +107,16 @@ static const struct pci_8255_boardinfo pci_8255_boards[] = { | ||
2163 | .dio_badr = 2, | ||
2164 | .n_8255 = 1, | ||
2165 | }, | ||
2166 | - [BOARD_CB_PCIDIO48H] = { | ||
2167 | + [BOARD_CB_PCIDIO48H_OLD] = { | ||
2168 | .name = "cb_pci-dio48h", | ||
2169 | .dio_badr = 1, | ||
2170 | .n_8255 = 2, | ||
2171 | }, | ||
2172 | + [BOARD_CB_PCIDIO48H_NEW] = { | ||
2173 | + .name = "cb_pci-dio48h", | ||
2174 | + .dio_badr = 2, | ||
2175 | + .n_8255 = 2, | ||
2176 | + }, | ||
2177 | [BOARD_CB_PCIDIO96H] = { | ||
2178 | .name = "cb_pci-dio96h", | ||
2179 | .dio_badr = 2, | ||
2180 | @@ -263,7 +269,10 @@ static DEFINE_PCI_DEVICE_TABLE(pci_8255_pci_table) = { | ||
2181 | { PCI_VDEVICE(ADLINK, 0x7296), BOARD_ADLINK_PCI7296 }, | ||
2182 | { PCI_VDEVICE(CB, 0x0028), BOARD_CB_PCIDIO24 }, | ||
2183 | { PCI_VDEVICE(CB, 0x0014), BOARD_CB_PCIDIO24H }, | ||
2184 | - { PCI_VDEVICE(CB, 0x000b), BOARD_CB_PCIDIO48H }, | ||
2185 | + { PCI_DEVICE_SUB(PCI_VENDOR_ID_CB, 0x000b, 0x0000, 0x0000), | ||
2186 | + .driver_data = BOARD_CB_PCIDIO48H_OLD }, | ||
2187 | + { PCI_DEVICE_SUB(PCI_VENDOR_ID_CB, 0x000b, PCI_VENDOR_ID_CB, 0x000b), | ||
2188 | + .driver_data = BOARD_CB_PCIDIO48H_NEW }, | ||
2189 | { PCI_VDEVICE(CB, 0x0017), BOARD_CB_PCIDIO96H }, | ||
2190 | { PCI_VDEVICE(NI, 0x0160), BOARD_NI_PCIDIO96 }, | ||
2191 | { PCI_VDEVICE(NI, 0x1630), BOARD_NI_PCIDIO96B }, | ||
2192 | diff --git a/drivers/target/iscsi/iscsi_target.c b/drivers/target/iscsi/iscsi_target.c | ||
2193 | index 38e44b9abf0f..d5c724b317aa 100644 | ||
2194 | --- a/drivers/target/iscsi/iscsi_target.c | ||
2195 | +++ b/drivers/target/iscsi/iscsi_target.c | ||
2196 | @@ -465,6 +465,7 @@ int iscsit_del_np(struct iscsi_np *np) | ||
2197 | */ | ||
2198 | send_sig(SIGINT, np->np_thread, 1); | ||
2199 | kthread_stop(np->np_thread); | ||
2200 | + np->np_thread = NULL; | ||
2201 | } | ||
2202 | |||
2203 | np->np_transport->iscsit_free_np(np); | ||
2204 | @@ -830,24 +831,22 @@ int iscsit_setup_scsi_cmd(struct iscsi_conn *conn, struct iscsi_cmd *cmd, | ||
2205 | if (((hdr->flags & ISCSI_FLAG_CMD_READ) || | ||
2206 | (hdr->flags & ISCSI_FLAG_CMD_WRITE)) && !hdr->data_length) { | ||
2207 | /* | ||
2208 | - * Vmware ESX v3.0 uses a modified Cisco Initiator (v3.4.2) | ||
2209 | - * that adds support for RESERVE/RELEASE. There is a bug | ||
2210 | - * add with this new functionality that sets R/W bits when | ||
2211 | - * neither CDB carries any READ or WRITE datapayloads. | ||
2212 | + * From RFC-3720 Section 10.3.1: | ||
2213 | + * | ||
2214 | + * "Either or both of R and W MAY be 1 when either the | ||
2215 | + * Expected Data Transfer Length and/or Bidirectional Read | ||
2216 | + * Expected Data Transfer Length are 0" | ||
2217 | + * | ||
2218 | + * For this case, go ahead and clear the unnecssary bits | ||
2219 | + * to avoid any confusion with ->data_direction. | ||
2220 | */ | ||
2221 | - if ((hdr->cdb[0] == 0x16) || (hdr->cdb[0] == 0x17)) { | ||
2222 | - hdr->flags &= ~ISCSI_FLAG_CMD_READ; | ||
2223 | - hdr->flags &= ~ISCSI_FLAG_CMD_WRITE; | ||
2224 | - goto done; | ||
2225 | - } | ||
2226 | + hdr->flags &= ~ISCSI_FLAG_CMD_READ; | ||
2227 | + hdr->flags &= ~ISCSI_FLAG_CMD_WRITE; | ||
2228 | |||
2229 | - pr_err("ISCSI_FLAG_CMD_READ or ISCSI_FLAG_CMD_WRITE" | ||
2230 | + pr_warn("ISCSI_FLAG_CMD_READ or ISCSI_FLAG_CMD_WRITE" | ||
2231 | " set when Expected Data Transfer Length is 0 for" | ||
2232 | - " CDB: 0x%02x. Bad iSCSI Initiator.\n", hdr->cdb[0]); | ||
2233 | - return iscsit_add_reject_cmd(cmd, | ||
2234 | - ISCSI_REASON_BOOKMARK_INVALID, buf); | ||
2235 | + " CDB: 0x%02x, Fixing up flags\n", hdr->cdb[0]); | ||
2236 | } | ||
2237 | -done: | ||
2238 | |||
2239 | if (!(hdr->flags & ISCSI_FLAG_CMD_READ) && | ||
2240 | !(hdr->flags & ISCSI_FLAG_CMD_WRITE) && (hdr->data_length != 0)) { | ||
2241 | diff --git a/drivers/target/iscsi/iscsi_target_login.c b/drivers/target/iscsi/iscsi_target_login.c | ||
2242 | index 1794c753954a..f442a9c93403 100644 | ||
2243 | --- a/drivers/target/iscsi/iscsi_target_login.c | ||
2244 | +++ b/drivers/target/iscsi/iscsi_target_login.c | ||
2245 | @@ -1404,11 +1404,6 @@ old_sess_out: | ||
2246 | |||
2247 | out: | ||
2248 | stop = kthread_should_stop(); | ||
2249 | - if (!stop && signal_pending(current)) { | ||
2250 | - spin_lock_bh(&np->np_thread_lock); | ||
2251 | - stop = (np->np_thread_state == ISCSI_NP_THREAD_SHUTDOWN); | ||
2252 | - spin_unlock_bh(&np->np_thread_lock); | ||
2253 | - } | ||
2254 | /* Wait for another socket.. */ | ||
2255 | if (!stop) | ||
2256 | return 1; | ||
2257 | @@ -1416,7 +1411,6 @@ exit: | ||
2258 | iscsi_stop_login_thread_timer(np); | ||
2259 | spin_lock_bh(&np->np_thread_lock); | ||
2260 | np->np_thread_state = ISCSI_NP_THREAD_EXIT; | ||
2261 | - np->np_thread = NULL; | ||
2262 | spin_unlock_bh(&np->np_thread_lock); | ||
2263 | |||
2264 | return 0; | ||
2265 | diff --git a/drivers/target/target_core_device.c b/drivers/target/target_core_device.c | ||
2266 | index d90dbb0f1a69..e5e39658034c 100644 | ||
2267 | --- a/drivers/target/target_core_device.c | ||
2268 | +++ b/drivers/target/target_core_device.c | ||
2269 | @@ -1107,6 +1107,11 @@ int se_dev_set_block_size(struct se_device *dev, u32 block_size) | ||
2270 | dev->dev_attrib.block_size = block_size; | ||
2271 | pr_debug("dev[%p]: SE Device block_size changed to %u\n", | ||
2272 | dev, block_size); | ||
2273 | + | ||
2274 | + if (dev->dev_attrib.max_bytes_per_io) | ||
2275 | + dev->dev_attrib.hw_max_sectors = | ||
2276 | + dev->dev_attrib.max_bytes_per_io / block_size; | ||
2277 | + | ||
2278 | return 0; | ||
2279 | } | ||
2280 | |||
2281 | diff --git a/drivers/target/target_core_file.c b/drivers/target/target_core_file.c | ||
2282 | index b662f89dedac..55725f5f56a2 100644 | ||
2283 | --- a/drivers/target/target_core_file.c | ||
2284 | +++ b/drivers/target/target_core_file.c | ||
2285 | @@ -66,9 +66,8 @@ static int fd_attach_hba(struct se_hba *hba, u32 host_id) | ||
2286 | pr_debug("CORE_HBA[%d] - TCM FILEIO HBA Driver %s on Generic" | ||
2287 | " Target Core Stack %s\n", hba->hba_id, FD_VERSION, | ||
2288 | TARGET_CORE_MOD_VERSION); | ||
2289 | - pr_debug("CORE_HBA[%d] - Attached FILEIO HBA: %u to Generic" | ||
2290 | - " MaxSectors: %u\n", | ||
2291 | - hba->hba_id, fd_host->fd_host_id, FD_MAX_SECTORS); | ||
2292 | + pr_debug("CORE_HBA[%d] - Attached FILEIO HBA: %u to Generic\n", | ||
2293 | + hba->hba_id, fd_host->fd_host_id); | ||
2294 | |||
2295 | return 0; | ||
2296 | } | ||
2297 | @@ -220,7 +219,8 @@ static int fd_configure_device(struct se_device *dev) | ||
2298 | } | ||
2299 | |||
2300 | dev->dev_attrib.hw_block_size = fd_dev->fd_block_size; | ||
2301 | - dev->dev_attrib.hw_max_sectors = FD_MAX_SECTORS; | ||
2302 | + dev->dev_attrib.max_bytes_per_io = FD_MAX_BYTES; | ||
2303 | + dev->dev_attrib.hw_max_sectors = FD_MAX_BYTES / fd_dev->fd_block_size; | ||
2304 | dev->dev_attrib.hw_queue_depth = FD_MAX_DEVICE_QUEUE_DEPTH; | ||
2305 | |||
2306 | if (fd_dev->fbd_flags & FDBD_HAS_BUFFERED_IO_WCE) { | ||
2307 | diff --git a/drivers/target/target_core_file.h b/drivers/target/target_core_file.h | ||
2308 | index 37ffc5bd2399..d7772c167685 100644 | ||
2309 | --- a/drivers/target/target_core_file.h | ||
2310 | +++ b/drivers/target/target_core_file.h | ||
2311 | @@ -7,7 +7,10 @@ | ||
2312 | #define FD_DEVICE_QUEUE_DEPTH 32 | ||
2313 | #define FD_MAX_DEVICE_QUEUE_DEPTH 128 | ||
2314 | #define FD_BLOCKSIZE 512 | ||
2315 | -#define FD_MAX_SECTORS 2048 | ||
2316 | +/* | ||
2317 | + * Limited by the number of iovecs (2048) per vfs_[writev,readv] call | ||
2318 | + */ | ||
2319 | +#define FD_MAX_BYTES 8388608 | ||
2320 | |||
2321 | #define RRF_EMULATE_CDB 0x01 | ||
2322 | #define RRF_GOT_LBA 0x02 | ||
2323 | diff --git a/drivers/tty/n_tty.c b/drivers/tty/n_tty.c | ||
2324 | index 4d6f430087d0..d4a89db511b5 100644 | ||
2325 | --- a/drivers/tty/n_tty.c | ||
2326 | +++ b/drivers/tty/n_tty.c | ||
2327 | @@ -93,6 +93,7 @@ struct n_tty_data { | ||
2328 | size_t canon_head; | ||
2329 | size_t echo_head; | ||
2330 | size_t echo_commit; | ||
2331 | + size_t echo_mark; | ||
2332 | DECLARE_BITMAP(char_map, 256); | ||
2333 | |||
2334 | /* private to n_tty_receive_overrun (single-threaded) */ | ||
2335 | @@ -336,6 +337,7 @@ static void reset_buffer_flags(struct n_tty_data *ldata) | ||
2336 | { | ||
2337 | ldata->read_head = ldata->canon_head = ldata->read_tail = 0; | ||
2338 | ldata->echo_head = ldata->echo_tail = ldata->echo_commit = 0; | ||
2339 | + ldata->echo_mark = 0; | ||
2340 | ldata->line_start = 0; | ||
2341 | |||
2342 | ldata->erasing = 0; | ||
2343 | @@ -787,6 +789,7 @@ static void commit_echoes(struct tty_struct *tty) | ||
2344 | size_t head; | ||
2345 | |||
2346 | head = ldata->echo_head; | ||
2347 | + ldata->echo_mark = head; | ||
2348 | old = ldata->echo_commit - ldata->echo_tail; | ||
2349 | |||
2350 | /* Process committed echoes if the accumulated # of bytes | ||
2351 | @@ -811,10 +814,11 @@ static void process_echoes(struct tty_struct *tty) | ||
2352 | size_t echoed; | ||
2353 | |||
2354 | if ((!L_ECHO(tty) && !L_ECHONL(tty)) || | ||
2355 | - ldata->echo_commit == ldata->echo_tail) | ||
2356 | + ldata->echo_mark == ldata->echo_tail) | ||
2357 | return; | ||
2358 | |||
2359 | mutex_lock(&ldata->output_lock); | ||
2360 | + ldata->echo_commit = ldata->echo_mark; | ||
2361 | echoed = __process_echoes(tty); | ||
2362 | mutex_unlock(&ldata->output_lock); | ||
2363 | |||
2364 | @@ -822,6 +826,7 @@ static void process_echoes(struct tty_struct *tty) | ||
2365 | tty->ops->flush_chars(tty); | ||
2366 | } | ||
2367 | |||
2368 | +/* NB: echo_mark and echo_head should be equivalent here */ | ||
2369 | static void flush_echoes(struct tty_struct *tty) | ||
2370 | { | ||
2371 | struct n_tty_data *ldata = tty->disc_data; | ||
2372 | diff --git a/drivers/tty/serial/8250/8250_dw.c b/drivers/tty/serial/8250/8250_dw.c | ||
2373 | index daf710f5c3fc..8b2accbad3d1 100644 | ||
2374 | --- a/drivers/tty/serial/8250/8250_dw.c | ||
2375 | +++ b/drivers/tty/serial/8250/8250_dw.c | ||
2376 | @@ -417,6 +417,8 @@ MODULE_DEVICE_TABLE(of, dw8250_of_match); | ||
2377 | static const struct acpi_device_id dw8250_acpi_match[] = { | ||
2378 | { "INT33C4", 0 }, | ||
2379 | { "INT33C5", 0 }, | ||
2380 | + { "INT3434", 0 }, | ||
2381 | + { "INT3435", 0 }, | ||
2382 | { "80860F0A", 0 }, | ||
2383 | { }, | ||
2384 | }; | ||
2385 | diff --git a/drivers/tty/serial/pmac_zilog.c b/drivers/tty/serial/pmac_zilog.c | ||
2386 | index f87f1a0c8c6e..5ba30e078236 100644 | ||
2387 | --- a/drivers/tty/serial/pmac_zilog.c | ||
2388 | +++ b/drivers/tty/serial/pmac_zilog.c | ||
2389 | @@ -2050,6 +2050,9 @@ static int __init pmz_console_init(void) | ||
2390 | /* Probe ports */ | ||
2391 | pmz_probe(); | ||
2392 | |||
2393 | + if (pmz_ports_count == 0) | ||
2394 | + return -ENODEV; | ||
2395 | + | ||
2396 | /* TODO: Autoprobe console based on OF */ | ||
2397 | /* pmz_console.index = i; */ | ||
2398 | register_console(&pmz_console); | ||
2399 | diff --git a/drivers/tty/tty_ldsem.c b/drivers/tty/tty_ldsem.c | ||
2400 | index 22fad8ad5ac2..d8a55e87877f 100644 | ||
2401 | --- a/drivers/tty/tty_ldsem.c | ||
2402 | +++ b/drivers/tty/tty_ldsem.c | ||
2403 | @@ -86,11 +86,21 @@ static inline long ldsem_atomic_update(long delta, struct ld_semaphore *sem) | ||
2404 | return atomic_long_add_return(delta, (atomic_long_t *)&sem->count); | ||
2405 | } | ||
2406 | |||
2407 | +/* | ||
2408 | + * ldsem_cmpxchg() updates @*old with the last-known sem->count value. | ||
2409 | + * Returns 1 if count was successfully changed; @*old will have @new value. | ||
2410 | + * Returns 0 if count was not changed; @*old will have most recent sem->count | ||
2411 | + */ | ||
2412 | static inline int ldsem_cmpxchg(long *old, long new, struct ld_semaphore *sem) | ||
2413 | { | ||
2414 | - long tmp = *old; | ||
2415 | - *old = atomic_long_cmpxchg(&sem->count, *old, new); | ||
2416 | - return *old == tmp; | ||
2417 | + long tmp = atomic_long_cmpxchg(&sem->count, *old, new); | ||
2418 | + if (tmp == *old) { | ||
2419 | + *old = new; | ||
2420 | + return 1; | ||
2421 | + } else { | ||
2422 | + *old = tmp; | ||
2423 | + return 0; | ||
2424 | + } | ||
2425 | } | ||
2426 | |||
2427 | /* | ||
2428 | diff --git a/drivers/usb/chipidea/core.c b/drivers/usb/chipidea/core.c | ||
2429 | index 23763dcec069..d6a50b7bb4ca 100644 | ||
2430 | --- a/drivers/usb/chipidea/core.c | ||
2431 | +++ b/drivers/usb/chipidea/core.c | ||
2432 | @@ -575,6 +575,10 @@ static int ci_hdrc_probe(struct platform_device *pdev) | ||
2433 | : CI_ROLE_GADGET; | ||
2434 | } | ||
2435 | |||
2436 | + /* only update vbus status for peripheral */ | ||
2437 | + if (ci->role == CI_ROLE_GADGET) | ||
2438 | + ci_handle_vbus_change(ci); | ||
2439 | + | ||
2440 | ret = ci_role_start(ci, ci->role); | ||
2441 | if (ret) { | ||
2442 | dev_err(dev, "can't start %s role\n", ci_role(ci)->name); | ||
2443 | diff --git a/drivers/usb/chipidea/host.c b/drivers/usb/chipidea/host.c | ||
2444 | index 64d7a6d9a1ad..5d874d5cf500 100644 | ||
2445 | --- a/drivers/usb/chipidea/host.c | ||
2446 | +++ b/drivers/usb/chipidea/host.c | ||
2447 | @@ -88,7 +88,8 @@ static int host_start(struct ci_hdrc *ci) | ||
2448 | return ret; | ||
2449 | |||
2450 | disable_reg: | ||
2451 | - regulator_disable(ci->platdata->reg_vbus); | ||
2452 | + if (ci->platdata->reg_vbus) | ||
2453 | + regulator_disable(ci->platdata->reg_vbus); | ||
2454 | |||
2455 | put_hcd: | ||
2456 | usb_put_hcd(hcd); | ||
2457 | diff --git a/drivers/usb/chipidea/udc.c b/drivers/usb/chipidea/udc.c | ||
2458 | index 9333083dd111..d98fa254eaaf 100644 | ||
2459 | --- a/drivers/usb/chipidea/udc.c | ||
2460 | +++ b/drivers/usb/chipidea/udc.c | ||
2461 | @@ -1818,9 +1818,6 @@ static int udc_start(struct ci_hdrc *ci) | ||
2462 | pm_runtime_no_callbacks(&ci->gadget.dev); | ||
2463 | pm_runtime_enable(&ci->gadget.dev); | ||
2464 | |||
2465 | - /* Update ci->vbus_active */ | ||
2466 | - ci_handle_vbus_change(ci); | ||
2467 | - | ||
2468 | return retval; | ||
2469 | |||
2470 | remove_trans: | ||
2471 | diff --git a/drivers/usb/class/cdc-wdm.c b/drivers/usb/class/cdc-wdm.c | ||
2472 | index d3318a0df8ee..6463ca3bcfba 100644 | ||
2473 | --- a/drivers/usb/class/cdc-wdm.c | ||
2474 | +++ b/drivers/usb/class/cdc-wdm.c | ||
2475 | @@ -820,13 +820,11 @@ static int wdm_manage_power(struct usb_interface *intf, int on) | ||
2476 | { | ||
2477 | /* need autopm_get/put here to ensure the usbcore sees the new value */ | ||
2478 | int rv = usb_autopm_get_interface(intf); | ||
2479 | - if (rv < 0) | ||
2480 | - goto err; | ||
2481 | |||
2482 | intf->needs_remote_wakeup = on; | ||
2483 | - usb_autopm_put_interface(intf); | ||
2484 | -err: | ||
2485 | - return rv; | ||
2486 | + if (!rv) | ||
2487 | + usb_autopm_put_interface(intf); | ||
2488 | + return 0; | ||
2489 | } | ||
2490 | |||
2491 | static int wdm_probe(struct usb_interface *intf, const struct usb_device_id *id) | ||
2492 | diff --git a/drivers/usb/host/xhci-pci.c b/drivers/usb/host/xhci-pci.c | ||
2493 | index b8dffd59eb25..73f5208714a4 100644 | ||
2494 | --- a/drivers/usb/host/xhci-pci.c | ||
2495 | +++ b/drivers/usb/host/xhci-pci.c | ||
2496 | @@ -128,7 +128,12 @@ static void xhci_pci_quirks(struct device *dev, struct xhci_hcd *xhci) | ||
2497 | * any other sleep) on Haswell machines with LPT and LPT-LP | ||
2498 | * with the new Intel BIOS | ||
2499 | */ | ||
2500 | - xhci->quirks |= XHCI_SPURIOUS_WAKEUP; | ||
2501 | + /* Limit the quirk to only known vendors, as this triggers | ||
2502 | + * yet another BIOS bug on some other machines | ||
2503 | + * https://bugzilla.kernel.org/show_bug.cgi?id=66171 | ||
2504 | + */ | ||
2505 | + if (pdev->subsystem_vendor == PCI_VENDOR_ID_HP) | ||
2506 | + xhci->quirks |= XHCI_SPURIOUS_WAKEUP; | ||
2507 | } | ||
2508 | if (pdev->vendor == PCI_VENDOR_ID_ETRON && | ||
2509 | pdev->device == PCI_DEVICE_ID_ASROCK_P67) { | ||
2510 | diff --git a/drivers/usb/musb/musb_core.c b/drivers/usb/musb/musb_core.c | ||
2511 | index 0d0d11880968..f7dca0b92bfb 100644 | ||
2512 | --- a/drivers/usb/musb/musb_core.c | ||
2513 | +++ b/drivers/usb/musb/musb_core.c | ||
2514 | @@ -1809,9 +1809,6 @@ static void musb_free(struct musb *musb) | ||
2515 | disable_irq_wake(musb->nIrq); | ||
2516 | free_irq(musb->nIrq, musb); | ||
2517 | } | ||
2518 | - cancel_work_sync(&musb->irq_work); | ||
2519 | - if (musb->dma_controller) | ||
2520 | - dma_controller_destroy(musb->dma_controller); | ||
2521 | |||
2522 | musb_host_free(musb); | ||
2523 | } | ||
2524 | @@ -1893,6 +1890,9 @@ musb_init_controller(struct device *dev, int nIrq, void __iomem *ctrl) | ||
2525 | musb_platform_disable(musb); | ||
2526 | musb_generic_disable(musb); | ||
2527 | |||
2528 | + /* Init IRQ workqueue before request_irq */ | ||
2529 | + INIT_WORK(&musb->irq_work, musb_irq_work); | ||
2530 | + | ||
2531 | /* setup musb parts of the core (especially endpoints) */ | ||
2532 | status = musb_core_init(plat->config->multipoint | ||
2533 | ? MUSB_CONTROLLER_MHDRC | ||
2534 | @@ -1902,9 +1902,6 @@ musb_init_controller(struct device *dev, int nIrq, void __iomem *ctrl) | ||
2535 | |||
2536 | setup_timer(&musb->otg_timer, musb_otg_timer_func, (unsigned long) musb); | ||
2537 | |||
2538 | - /* Init IRQ workqueue before request_irq */ | ||
2539 | - INIT_WORK(&musb->irq_work, musb_irq_work); | ||
2540 | - | ||
2541 | /* attach to the IRQ */ | ||
2542 | if (request_irq(nIrq, musb->isr, 0, dev_name(dev), musb)) { | ||
2543 | dev_err(dev, "request_irq %d failed!\n", nIrq); | ||
2544 | @@ -1978,6 +1975,7 @@ fail4: | ||
2545 | musb_host_cleanup(musb); | ||
2546 | |||
2547 | fail3: | ||
2548 | + cancel_work_sync(&musb->irq_work); | ||
2549 | if (musb->dma_controller) | ||
2550 | dma_controller_destroy(musb->dma_controller); | ||
2551 | pm_runtime_put_sync(musb->controller); | ||
2552 | @@ -2036,6 +2034,10 @@ static int musb_remove(struct platform_device *pdev) | ||
2553 | musb_exit_debugfs(musb); | ||
2554 | musb_shutdown(pdev); | ||
2555 | |||
2556 | + if (musb->dma_controller) | ||
2557 | + dma_controller_destroy(musb->dma_controller); | ||
2558 | + | ||
2559 | + cancel_work_sync(&musb->irq_work); | ||
2560 | musb_free(musb); | ||
2561 | device_init_wakeup(dev, 0); | ||
2562 | return 0; | ||
2563 | diff --git a/drivers/usb/serial/generic.c b/drivers/usb/serial/generic.c | ||
2564 | index 1f31e6b4c251..dc97744489b0 100644 | ||
2565 | --- a/drivers/usb/serial/generic.c | ||
2566 | +++ b/drivers/usb/serial/generic.c | ||
2567 | @@ -176,14 +176,7 @@ retry: | ||
2568 | return result; | ||
2569 | } | ||
2570 | |||
2571 | - /* Try sending off another urb, unless in irq context (in which case | ||
2572 | - * there will be no free urb). */ | ||
2573 | - if (!in_irq()) | ||
2574 | - goto retry; | ||
2575 | - | ||
2576 | - clear_bit_unlock(USB_SERIAL_WRITE_BUSY, &port->flags); | ||
2577 | - | ||
2578 | - return 0; | ||
2579 | + goto retry; /* try sending off another urb */ | ||
2580 | } | ||
2581 | |||
2582 | /** | ||
2583 | diff --git a/drivers/usb/serial/option.c b/drivers/usb/serial/option.c | ||
2584 | index 496b7e39d5be..cc7a24154490 100644 | ||
2585 | --- a/drivers/usb/serial/option.c | ||
2586 | +++ b/drivers/usb/serial/option.c | ||
2587 | @@ -251,6 +251,7 @@ static void option_instat_callback(struct urb *urb); | ||
2588 | #define ZTE_PRODUCT_MF628 0x0015 | ||
2589 | #define ZTE_PRODUCT_MF626 0x0031 | ||
2590 | #define ZTE_PRODUCT_MC2718 0xffe8 | ||
2591 | +#define ZTE_PRODUCT_AC2726 0xfff1 | ||
2592 | |||
2593 | #define BENQ_VENDOR_ID 0x04a5 | ||
2594 | #define BENQ_PRODUCT_H10 0x4068 | ||
2595 | @@ -1453,6 +1454,7 @@ static const struct usb_device_id option_ids[] = { | ||
2596 | { USB_VENDOR_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0xff, 0x02, 0x01) }, | ||
2597 | { USB_VENDOR_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0xff, 0x02, 0x05) }, | ||
2598 | { USB_VENDOR_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0xff, 0x86, 0x10) }, | ||
2599 | + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, ZTE_PRODUCT_AC2726, 0xff, 0xff, 0xff) }, | ||
2600 | |||
2601 | { USB_DEVICE(BENQ_VENDOR_ID, BENQ_PRODUCT_H10) }, | ||
2602 | { USB_DEVICE(DLINK_VENDOR_ID, DLINK_PRODUCT_DWM_652) }, | ||
2603 | diff --git a/drivers/usb/serial/zte_ev.c b/drivers/usb/serial/zte_ev.c | ||
2604 | index fca4c752a4ed..eae2c873b39f 100644 | ||
2605 | --- a/drivers/usb/serial/zte_ev.c | ||
2606 | +++ b/drivers/usb/serial/zte_ev.c | ||
2607 | @@ -281,8 +281,7 @@ static const struct usb_device_id id_table[] = { | ||
2608 | { USB_DEVICE(0x19d2, 0xfffd) }, | ||
2609 | { USB_DEVICE(0x19d2, 0xfffc) }, | ||
2610 | { USB_DEVICE(0x19d2, 0xfffb) }, | ||
2611 | - /* AC2726, AC8710_V3 */ | ||
2612 | - { USB_DEVICE_AND_INTERFACE_INFO(0x19d2, 0xfff1, 0xff, 0xff, 0xff) }, | ||
2613 | + /* AC8710_V3 */ | ||
2614 | { USB_DEVICE(0x19d2, 0xfff6) }, | ||
2615 | { USB_DEVICE(0x19d2, 0xfff7) }, | ||
2616 | { USB_DEVICE(0x19d2, 0xfff8) }, | ||
2617 | diff --git a/fs/aio.c b/fs/aio.c | ||
2618 | index 6efb7f6cb22e..062a5f6a1448 100644 | ||
2619 | --- a/fs/aio.c | ||
2620 | +++ b/fs/aio.c | ||
2621 | @@ -244,9 +244,14 @@ static void aio_free_ring(struct kioctx *ctx) | ||
2622 | int i; | ||
2623 | |||
2624 | for (i = 0; i < ctx->nr_pages; i++) { | ||
2625 | + struct page *page; | ||
2626 | pr_debug("pid(%d) [%d] page->count=%d\n", current->pid, i, | ||
2627 | page_count(ctx->ring_pages[i])); | ||
2628 | - put_page(ctx->ring_pages[i]); | ||
2629 | + page = ctx->ring_pages[i]; | ||
2630 | + if (!page) | ||
2631 | + continue; | ||
2632 | + ctx->ring_pages[i] = NULL; | ||
2633 | + put_page(page); | ||
2634 | } | ||
2635 | |||
2636 | put_aio_ring_file(ctx); | ||
2637 | @@ -280,18 +285,38 @@ static int aio_migratepage(struct address_space *mapping, struct page *new, | ||
2638 | unsigned long flags; | ||
2639 | int rc; | ||
2640 | |||
2641 | + rc = 0; | ||
2642 | + | ||
2643 | + /* Make sure the old page hasn't already been changed */ | ||
2644 | + spin_lock(&mapping->private_lock); | ||
2645 | + ctx = mapping->private_data; | ||
2646 | + if (ctx) { | ||
2647 | + pgoff_t idx; | ||
2648 | + spin_lock_irqsave(&ctx->completion_lock, flags); | ||
2649 | + idx = old->index; | ||
2650 | + if (idx < (pgoff_t)ctx->nr_pages) { | ||
2651 | + if (ctx->ring_pages[idx] != old) | ||
2652 | + rc = -EAGAIN; | ||
2653 | + } else | ||
2654 | + rc = -EINVAL; | ||
2655 | + spin_unlock_irqrestore(&ctx->completion_lock, flags); | ||
2656 | + } else | ||
2657 | + rc = -EINVAL; | ||
2658 | + spin_unlock(&mapping->private_lock); | ||
2659 | + | ||
2660 | + if (rc != 0) | ||
2661 | + return rc; | ||
2662 | + | ||
2663 | /* Writeback must be complete */ | ||
2664 | BUG_ON(PageWriteback(old)); | ||
2665 | - put_page(old); | ||
2666 | + get_page(new); | ||
2667 | |||
2668 | - rc = migrate_page_move_mapping(mapping, new, old, NULL, mode); | ||
2669 | + rc = migrate_page_move_mapping(mapping, new, old, NULL, mode, 1); | ||
2670 | if (rc != MIGRATEPAGE_SUCCESS) { | ||
2671 | - get_page(old); | ||
2672 | + put_page(new); | ||
2673 | return rc; | ||
2674 | } | ||
2675 | |||
2676 | - get_page(new); | ||
2677 | - | ||
2678 | /* We can potentially race against kioctx teardown here. Use the | ||
2679 | * address_space's private data lock to protect the mapping's | ||
2680 | * private_data. | ||
2681 | @@ -303,13 +328,24 @@ static int aio_migratepage(struct address_space *mapping, struct page *new, | ||
2682 | spin_lock_irqsave(&ctx->completion_lock, flags); | ||
2683 | migrate_page_copy(new, old); | ||
2684 | idx = old->index; | ||
2685 | - if (idx < (pgoff_t)ctx->nr_pages) | ||
2686 | - ctx->ring_pages[idx] = new; | ||
2687 | + if (idx < (pgoff_t)ctx->nr_pages) { | ||
2688 | + /* And only do the move if things haven't changed */ | ||
2689 | + if (ctx->ring_pages[idx] == old) | ||
2690 | + ctx->ring_pages[idx] = new; | ||
2691 | + else | ||
2692 | + rc = -EAGAIN; | ||
2693 | + } else | ||
2694 | + rc = -EINVAL; | ||
2695 | spin_unlock_irqrestore(&ctx->completion_lock, flags); | ||
2696 | } else | ||
2697 | rc = -EBUSY; | ||
2698 | spin_unlock(&mapping->private_lock); | ||
2699 | |||
2700 | + if (rc == MIGRATEPAGE_SUCCESS) | ||
2701 | + put_page(old); | ||
2702 | + else | ||
2703 | + put_page(new); | ||
2704 | + | ||
2705 | return rc; | ||
2706 | } | ||
2707 | #endif | ||
2708 | @@ -326,7 +362,7 @@ static int aio_setup_ring(struct kioctx *ctx) | ||
2709 | struct aio_ring *ring; | ||
2710 | unsigned nr_events = ctx->max_reqs; | ||
2711 | struct mm_struct *mm = current->mm; | ||
2712 | - unsigned long size, populate; | ||
2713 | + unsigned long size, unused; | ||
2714 | int nr_pages; | ||
2715 | int i; | ||
2716 | struct file *file; | ||
2717 | @@ -347,6 +383,20 @@ static int aio_setup_ring(struct kioctx *ctx) | ||
2718 | return -EAGAIN; | ||
2719 | } | ||
2720 | |||
2721 | + ctx->aio_ring_file = file; | ||
2722 | + nr_events = (PAGE_SIZE * nr_pages - sizeof(struct aio_ring)) | ||
2723 | + / sizeof(struct io_event); | ||
2724 | + | ||
2725 | + ctx->ring_pages = ctx->internal_pages; | ||
2726 | + if (nr_pages > AIO_RING_PAGES) { | ||
2727 | + ctx->ring_pages = kcalloc(nr_pages, sizeof(struct page *), | ||
2728 | + GFP_KERNEL); | ||
2729 | + if (!ctx->ring_pages) { | ||
2730 | + put_aio_ring_file(ctx); | ||
2731 | + return -ENOMEM; | ||
2732 | + } | ||
2733 | + } | ||
2734 | + | ||
2735 | for (i = 0; i < nr_pages; i++) { | ||
2736 | struct page *page; | ||
2737 | page = find_or_create_page(file->f_inode->i_mapping, | ||
2738 | @@ -358,19 +408,14 @@ static int aio_setup_ring(struct kioctx *ctx) | ||
2739 | SetPageUptodate(page); | ||
2740 | SetPageDirty(page); | ||
2741 | unlock_page(page); | ||
2742 | + | ||
2743 | + ctx->ring_pages[i] = page; | ||
2744 | } | ||
2745 | - ctx->aio_ring_file = file; | ||
2746 | - nr_events = (PAGE_SIZE * nr_pages - sizeof(struct aio_ring)) | ||
2747 | - / sizeof(struct io_event); | ||
2748 | + ctx->nr_pages = i; | ||
2749 | |||
2750 | - ctx->ring_pages = ctx->internal_pages; | ||
2751 | - if (nr_pages > AIO_RING_PAGES) { | ||
2752 | - ctx->ring_pages = kcalloc(nr_pages, sizeof(struct page *), | ||
2753 | - GFP_KERNEL); | ||
2754 | - if (!ctx->ring_pages) { | ||
2755 | - put_aio_ring_file(ctx); | ||
2756 | - return -ENOMEM; | ||
2757 | - } | ||
2758 | + if (unlikely(i != nr_pages)) { | ||
2759 | + aio_free_ring(ctx); | ||
2760 | + return -EAGAIN; | ||
2761 | } | ||
2762 | |||
2763 | ctx->mmap_size = nr_pages * PAGE_SIZE; | ||
2764 | @@ -379,9 +424,9 @@ static int aio_setup_ring(struct kioctx *ctx) | ||
2765 | down_write(&mm->mmap_sem); | ||
2766 | ctx->mmap_base = do_mmap_pgoff(ctx->aio_ring_file, 0, ctx->mmap_size, | ||
2767 | PROT_READ | PROT_WRITE, | ||
2768 | - MAP_SHARED | MAP_POPULATE, 0, &populate); | ||
2769 | + MAP_SHARED, 0, &unused); | ||
2770 | + up_write(&mm->mmap_sem); | ||
2771 | if (IS_ERR((void *)ctx->mmap_base)) { | ||
2772 | - up_write(&mm->mmap_sem); | ||
2773 | ctx->mmap_size = 0; | ||
2774 | aio_free_ring(ctx); | ||
2775 | return -EAGAIN; | ||
2776 | @@ -389,27 +434,6 @@ static int aio_setup_ring(struct kioctx *ctx) | ||
2777 | |||
2778 | pr_debug("mmap address: 0x%08lx\n", ctx->mmap_base); | ||
2779 | |||
2780 | - /* We must do this while still holding mmap_sem for write, as we | ||
2781 | - * need to be protected against userspace attempting to mremap() | ||
2782 | - * or munmap() the ring buffer. | ||
2783 | - */ | ||
2784 | - ctx->nr_pages = get_user_pages(current, mm, ctx->mmap_base, nr_pages, | ||
2785 | - 1, 0, ctx->ring_pages, NULL); | ||
2786 | - | ||
2787 | - /* Dropping the reference here is safe as the page cache will hold | ||
2788 | - * onto the pages for us. It is also required so that page migration | ||
2789 | - * can unmap the pages and get the right reference count. | ||
2790 | - */ | ||
2791 | - for (i = 0; i < ctx->nr_pages; i++) | ||
2792 | - put_page(ctx->ring_pages[i]); | ||
2793 | - | ||
2794 | - up_write(&mm->mmap_sem); | ||
2795 | - | ||
2796 | - if (unlikely(ctx->nr_pages != nr_pages)) { | ||
2797 | - aio_free_ring(ctx); | ||
2798 | - return -EAGAIN; | ||
2799 | - } | ||
2800 | - | ||
2801 | ctx->user_id = ctx->mmap_base; | ||
2802 | ctx->nr_events = nr_events; /* trusted copy */ | ||
2803 | |||
2804 | @@ -652,7 +676,8 @@ static struct kioctx *ioctx_alloc(unsigned nr_events) | ||
2805 | aio_nr += ctx->max_reqs; | ||
2806 | spin_unlock(&aio_nr_lock); | ||
2807 | |||
2808 | - percpu_ref_get(&ctx->users); /* io_setup() will drop this ref */ | ||
2809 | + percpu_ref_get(&ctx->users); /* io_setup() will drop this ref */ | ||
2810 | + percpu_ref_get(&ctx->reqs); /* free_ioctx_users() will drop this */ | ||
2811 | |||
2812 | err = ioctx_add_table(ctx, mm); | ||
2813 | if (err) | ||
2814 | diff --git a/fs/ceph/addr.c b/fs/ceph/addr.c | ||
2815 | index 6df8bd481425..ec3ba43b9faa 100644 | ||
2816 | --- a/fs/ceph/addr.c | ||
2817 | +++ b/fs/ceph/addr.c | ||
2818 | @@ -210,13 +210,17 @@ static int readpage_nounlock(struct file *filp, struct page *page) | ||
2819 | if (err < 0) { | ||
2820 | SetPageError(page); | ||
2821 | goto out; | ||
2822 | - } else if (err < PAGE_CACHE_SIZE) { | ||
2823 | + } else { | ||
2824 | + if (err < PAGE_CACHE_SIZE) { | ||
2825 | /* zero fill remainder of page */ | ||
2826 | - zero_user_segment(page, err, PAGE_CACHE_SIZE); | ||
2827 | + zero_user_segment(page, err, PAGE_CACHE_SIZE); | ||
2828 | + } else { | ||
2829 | + flush_dcache_page(page); | ||
2830 | + } | ||
2831 | } | ||
2832 | SetPageUptodate(page); | ||
2833 | |||
2834 | - if (err == 0) | ||
2835 | + if (err >= 0) | ||
2836 | ceph_readpage_to_fscache(inode, page); | ||
2837 | |||
2838 | out: | ||
2839 | diff --git a/fs/ceph/cache.c b/fs/ceph/cache.c | ||
2840 | index 6bfe65e0b038..360b622b0be0 100644 | ||
2841 | --- a/fs/ceph/cache.c | ||
2842 | +++ b/fs/ceph/cache.c | ||
2843 | @@ -324,6 +324,9 @@ void ceph_invalidate_fscache_page(struct inode* inode, struct page *page) | ||
2844 | { | ||
2845 | struct ceph_inode_info *ci = ceph_inode(inode); | ||
2846 | |||
2847 | + if (!PageFsCache(page)) | ||
2848 | + return; | ||
2849 | + | ||
2850 | fscache_wait_on_page_write(ci->fscache, page); | ||
2851 | fscache_uncache_page(ci->fscache, page); | ||
2852 | } | ||
2853 | diff --git a/fs/ceph/mds_client.c b/fs/ceph/mds_client.c | ||
2854 | index b7bda5d9611d..788901552eb1 100644 | ||
2855 | --- a/fs/ceph/mds_client.c | ||
2856 | +++ b/fs/ceph/mds_client.c | ||
2857 | @@ -642,6 +642,8 @@ static void __unregister_request(struct ceph_mds_client *mdsc, | ||
2858 | req->r_unsafe_dir = NULL; | ||
2859 | } | ||
2860 | |||
2861 | + complete_all(&req->r_safe_completion); | ||
2862 | + | ||
2863 | ceph_mdsc_put_request(req); | ||
2864 | } | ||
2865 | |||
2866 | @@ -1875,8 +1877,11 @@ static int __do_request(struct ceph_mds_client *mdsc, | ||
2867 | int mds = -1; | ||
2868 | int err = -EAGAIN; | ||
2869 | |||
2870 | - if (req->r_err || req->r_got_result) | ||
2871 | + if (req->r_err || req->r_got_result) { | ||
2872 | + if (req->r_aborted) | ||
2873 | + __unregister_request(mdsc, req); | ||
2874 | goto out; | ||
2875 | + } | ||
2876 | |||
2877 | if (req->r_timeout && | ||
2878 | time_after_eq(jiffies, req->r_started + req->r_timeout)) { | ||
2879 | @@ -2186,7 +2191,6 @@ static void handle_reply(struct ceph_mds_session *session, struct ceph_msg *msg) | ||
2880 | if (head->safe) { | ||
2881 | req->r_got_safe = true; | ||
2882 | __unregister_request(mdsc, req); | ||
2883 | - complete_all(&req->r_safe_completion); | ||
2884 | |||
2885 | if (req->r_got_unsafe) { | ||
2886 | /* | ||
2887 | diff --git a/fs/cifs/cifsproto.h b/fs/cifs/cifsproto.h | ||
2888 | index b5ec2a268f56..45ccfbd8ea5f 100644 | ||
2889 | --- a/fs/cifs/cifsproto.h | ||
2890 | +++ b/fs/cifs/cifsproto.h | ||
2891 | @@ -475,9 +475,10 @@ extern int CIFSGetExtAttr(const unsigned int xid, struct cifs_tcon *tcon, | ||
2892 | const int netfid, __u64 *pExtAttrBits, __u64 *pMask); | ||
2893 | extern void cifs_autodisable_serverino(struct cifs_sb_info *cifs_sb); | ||
2894 | extern bool CIFSCouldBeMFSymlink(const struct cifs_fattr *fattr); | ||
2895 | -extern int CIFSCheckMFSymlink(struct cifs_fattr *fattr, | ||
2896 | - const unsigned char *path, | ||
2897 | - struct cifs_sb_info *cifs_sb, unsigned int xid); | ||
2898 | +extern int CIFSCheckMFSymlink(unsigned int xid, struct cifs_tcon *tcon, | ||
2899 | + struct cifs_sb_info *cifs_sb, | ||
2900 | + struct cifs_fattr *fattr, | ||
2901 | + const unsigned char *path); | ||
2902 | extern int mdfour(unsigned char *, unsigned char *, int); | ||
2903 | extern int E_md4hash(const unsigned char *passwd, unsigned char *p16, | ||
2904 | const struct nls_table *codepage); | ||
2905 | diff --git a/fs/cifs/dir.c b/fs/cifs/dir.c | ||
2906 | index 5384c2a640ca..f039c23d003d 100644 | ||
2907 | --- a/fs/cifs/dir.c | ||
2908 | +++ b/fs/cifs/dir.c | ||
2909 | @@ -193,7 +193,7 @@ check_name(struct dentry *direntry) | ||
2910 | static int | ||
2911 | cifs_do_create(struct inode *inode, struct dentry *direntry, unsigned int xid, | ||
2912 | struct tcon_link *tlink, unsigned oflags, umode_t mode, | ||
2913 | - __u32 *oplock, struct cifs_fid *fid, int *created) | ||
2914 | + __u32 *oplock, struct cifs_fid *fid) | ||
2915 | { | ||
2916 | int rc = -ENOENT; | ||
2917 | int create_options = CREATE_NOT_DIR; | ||
2918 | @@ -349,7 +349,6 @@ cifs_do_create(struct inode *inode, struct dentry *direntry, unsigned int xid, | ||
2919 | .device = 0, | ||
2920 | }; | ||
2921 | |||
2922 | - *created |= FILE_CREATED; | ||
2923 | if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SET_UID) { | ||
2924 | args.uid = current_fsuid(); | ||
2925 | if (inode->i_mode & S_ISGID) | ||
2926 | @@ -480,13 +479,16 @@ cifs_atomic_open(struct inode *inode, struct dentry *direntry, | ||
2927 | cifs_add_pending_open(&fid, tlink, &open); | ||
2928 | |||
2929 | rc = cifs_do_create(inode, direntry, xid, tlink, oflags, mode, | ||
2930 | - &oplock, &fid, opened); | ||
2931 | + &oplock, &fid); | ||
2932 | |||
2933 | if (rc) { | ||
2934 | cifs_del_pending_open(&open); | ||
2935 | goto out; | ||
2936 | } | ||
2937 | |||
2938 | + if ((oflags & (O_CREAT | O_EXCL)) == (O_CREAT | O_EXCL)) | ||
2939 | + *opened |= FILE_CREATED; | ||
2940 | + | ||
2941 | rc = finish_open(file, direntry, generic_file_open, opened); | ||
2942 | if (rc) { | ||
2943 | if (server->ops->close) | ||
2944 | @@ -529,7 +531,6 @@ int cifs_create(struct inode *inode, struct dentry *direntry, umode_t mode, | ||
2945 | struct TCP_Server_Info *server; | ||
2946 | struct cifs_fid fid; | ||
2947 | __u32 oplock; | ||
2948 | - int created = FILE_CREATED; | ||
2949 | |||
2950 | cifs_dbg(FYI, "cifs_create parent inode = 0x%p name is: %s and dentry = 0x%p\n", | ||
2951 | inode, direntry->d_name.name, direntry); | ||
2952 | @@ -546,7 +547,7 @@ int cifs_create(struct inode *inode, struct dentry *direntry, umode_t mode, | ||
2953 | server->ops->new_lease_key(&fid); | ||
2954 | |||
2955 | rc = cifs_do_create(inode, direntry, xid, tlink, oflags, mode, | ||
2956 | - &oplock, &fid, &created); | ||
2957 | + &oplock, &fid); | ||
2958 | if (!rc && server->ops->close) | ||
2959 | server->ops->close(xid, tcon, &fid); | ||
2960 | |||
2961 | diff --git a/fs/cifs/inode.c b/fs/cifs/inode.c | ||
2962 | index 36f9ebb93ceb..49719b8228e5 100644 | ||
2963 | --- a/fs/cifs/inode.c | ||
2964 | +++ b/fs/cifs/inode.c | ||
2965 | @@ -383,7 +383,8 @@ int cifs_get_inode_info_unix(struct inode **pinode, | ||
2966 | |||
2967 | /* check for Minshall+French symlinks */ | ||
2968 | if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MF_SYMLINKS) { | ||
2969 | - int tmprc = CIFSCheckMFSymlink(&fattr, full_path, cifs_sb, xid); | ||
2970 | + int tmprc = CIFSCheckMFSymlink(xid, tcon, cifs_sb, &fattr, | ||
2971 | + full_path); | ||
2972 | if (tmprc) | ||
2973 | cifs_dbg(FYI, "CIFSCheckMFSymlink: %d\n", tmprc); | ||
2974 | } | ||
2975 | @@ -799,7 +800,8 @@ cifs_get_inode_info(struct inode **inode, const char *full_path, | ||
2976 | |||
2977 | /* check for Minshall+French symlinks */ | ||
2978 | if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MF_SYMLINKS) { | ||
2979 | - tmprc = CIFSCheckMFSymlink(&fattr, full_path, cifs_sb, xid); | ||
2980 | + tmprc = CIFSCheckMFSymlink(xid, tcon, cifs_sb, &fattr, | ||
2981 | + full_path); | ||
2982 | if (tmprc) | ||
2983 | cifs_dbg(FYI, "CIFSCheckMFSymlink: %d\n", tmprc); | ||
2984 | } | ||
2985 | diff --git a/fs/cifs/link.c b/fs/cifs/link.c | ||
2986 | index 7e36ceba0c7a..477e53bad551 100644 | ||
2987 | --- a/fs/cifs/link.c | ||
2988 | +++ b/fs/cifs/link.c | ||
2989 | @@ -354,34 +354,30 @@ open_query_close_cifs_symlink(const unsigned char *path, char *pbuf, | ||
2990 | |||
2991 | |||
2992 | int | ||
2993 | -CIFSCheckMFSymlink(struct cifs_fattr *fattr, | ||
2994 | - const unsigned char *path, | ||
2995 | - struct cifs_sb_info *cifs_sb, unsigned int xid) | ||
2996 | +CIFSCheckMFSymlink(unsigned int xid, struct cifs_tcon *tcon, | ||
2997 | + struct cifs_sb_info *cifs_sb, struct cifs_fattr *fattr, | ||
2998 | + const unsigned char *path) | ||
2999 | { | ||
3000 | - int rc = 0; | ||
3001 | + int rc; | ||
3002 | u8 *buf = NULL; | ||
3003 | unsigned int link_len = 0; | ||
3004 | unsigned int bytes_read = 0; | ||
3005 | - struct cifs_tcon *ptcon; | ||
3006 | |||
3007 | if (!CIFSCouldBeMFSymlink(fattr)) | ||
3008 | /* it's not a symlink */ | ||
3009 | return 0; | ||
3010 | |||
3011 | buf = kmalloc(CIFS_MF_SYMLINK_FILE_SIZE, GFP_KERNEL); | ||
3012 | - if (!buf) { | ||
3013 | - rc = -ENOMEM; | ||
3014 | - goto out; | ||
3015 | - } | ||
3016 | + if (!buf) | ||
3017 | + return -ENOMEM; | ||
3018 | |||
3019 | - ptcon = tlink_tcon(cifs_sb_tlink(cifs_sb)); | ||
3020 | - if ((ptcon->ses) && (ptcon->ses->server->ops->query_mf_symlink)) | ||
3021 | - rc = ptcon->ses->server->ops->query_mf_symlink(path, buf, | ||
3022 | - &bytes_read, cifs_sb, xid); | ||
3023 | + if (tcon->ses->server->ops->query_mf_symlink) | ||
3024 | + rc = tcon->ses->server->ops->query_mf_symlink(path, buf, | ||
3025 | + &bytes_read, cifs_sb, xid); | ||
3026 | else | ||
3027 | - goto out; | ||
3028 | + rc = -ENOSYS; | ||
3029 | |||
3030 | - if (rc != 0) | ||
3031 | + if (rc) | ||
3032 | goto out; | ||
3033 | |||
3034 | if (bytes_read == 0) /* not a symlink */ | ||
3035 | diff --git a/fs/ext2/super.c b/fs/ext2/super.c | ||
3036 | index 288534920fe5..20d6697bd638 100644 | ||
3037 | --- a/fs/ext2/super.c | ||
3038 | +++ b/fs/ext2/super.c | ||
3039 | @@ -1493,6 +1493,7 @@ static ssize_t ext2_quota_write(struct super_block *sb, int type, | ||
3040 | sb->s_blocksize - offset : towrite; | ||
3041 | |||
3042 | tmp_bh.b_state = 0; | ||
3043 | + tmp_bh.b_size = sb->s_blocksize; | ||
3044 | err = ext2_get_block(inode, blk, &tmp_bh, 1); | ||
3045 | if (err < 0) | ||
3046 | goto out; | ||
3047 | diff --git a/fs/ext4/ext4.h b/fs/ext4/ext4.h | ||
3048 | index af815ea9d7cc..745faaa7ef95 100644 | ||
3049 | --- a/fs/ext4/ext4.h | ||
3050 | +++ b/fs/ext4/ext4.h | ||
3051 | @@ -267,6 +267,16 @@ struct ext4_io_submit { | ||
3052 | /* Translate # of blks to # of clusters */ | ||
3053 | #define EXT4_NUM_B2C(sbi, blks) (((blks) + (sbi)->s_cluster_ratio - 1) >> \ | ||
3054 | (sbi)->s_cluster_bits) | ||
3055 | +/* Mask out the low bits to get the starting block of the cluster */ | ||
3056 | +#define EXT4_PBLK_CMASK(s, pblk) ((pblk) & \ | ||
3057 | + ~((ext4_fsblk_t) (s)->s_cluster_ratio - 1)) | ||
3058 | +#define EXT4_LBLK_CMASK(s, lblk) ((lblk) & \ | ||
3059 | + ~((ext4_lblk_t) (s)->s_cluster_ratio - 1)) | ||
3060 | +/* Get the cluster offset */ | ||
3061 | +#define EXT4_PBLK_COFF(s, pblk) ((pblk) & \ | ||
3062 | + ((ext4_fsblk_t) (s)->s_cluster_ratio - 1)) | ||
3063 | +#define EXT4_LBLK_COFF(s, lblk) ((lblk) & \ | ||
3064 | + ((ext4_lblk_t) (s)->s_cluster_ratio - 1)) | ||
3065 | |||
3066 | /* | ||
3067 | * Structure of a blocks group descriptor | ||
3068 | diff --git a/fs/ext4/ext4_jbd2.c b/fs/ext4/ext4_jbd2.c | ||
3069 | index 17ac112ab101..3fe29de832c8 100644 | ||
3070 | --- a/fs/ext4/ext4_jbd2.c | ||
3071 | +++ b/fs/ext4/ext4_jbd2.c | ||
3072 | @@ -259,6 +259,15 @@ int __ext4_handle_dirty_metadata(const char *where, unsigned int line, | ||
3073 | if (WARN_ON_ONCE(err)) { | ||
3074 | ext4_journal_abort_handle(where, line, __func__, bh, | ||
3075 | handle, err); | ||
3076 | + ext4_error_inode(inode, where, line, | ||
3077 | + bh->b_blocknr, | ||
3078 | + "journal_dirty_metadata failed: " | ||
3079 | + "handle type %u started at line %u, " | ||
3080 | + "credits %u/%u, errcode %d", | ||
3081 | + handle->h_type, | ||
3082 | + handle->h_line_no, | ||
3083 | + handle->h_requested_credits, | ||
3084 | + handle->h_buffer_credits, err); | ||
3085 | } | ||
3086 | } else { | ||
3087 | if (inode) | ||
3088 | diff --git a/fs/ext4/extents.c b/fs/ext4/extents.c | ||
3089 | index 54d52afcdb19..f76027fe58ae 100644 | ||
3090 | --- a/fs/ext4/extents.c | ||
3091 | +++ b/fs/ext4/extents.c | ||
3092 | @@ -360,8 +360,10 @@ static int ext4_valid_extent(struct inode *inode, struct ext4_extent *ext) | ||
3093 | { | ||
3094 | ext4_fsblk_t block = ext4_ext_pblock(ext); | ||
3095 | int len = ext4_ext_get_actual_len(ext); | ||
3096 | + ext4_lblk_t lblock = le32_to_cpu(ext->ee_block); | ||
3097 | + ext4_lblk_t last = lblock + len - 1; | ||
3098 | |||
3099 | - if (len == 0) | ||
3100 | + if (lblock > last) | ||
3101 | return 0; | ||
3102 | return ext4_data_block_valid(EXT4_SB(inode->i_sb), block, len); | ||
3103 | } | ||
3104 | @@ -387,11 +389,26 @@ static int ext4_valid_extent_entries(struct inode *inode, | ||
3105 | if (depth == 0) { | ||
3106 | /* leaf entries */ | ||
3107 | struct ext4_extent *ext = EXT_FIRST_EXTENT(eh); | ||
3108 | + struct ext4_super_block *es = EXT4_SB(inode->i_sb)->s_es; | ||
3109 | + ext4_fsblk_t pblock = 0; | ||
3110 | + ext4_lblk_t lblock = 0; | ||
3111 | + ext4_lblk_t prev = 0; | ||
3112 | + int len = 0; | ||
3113 | while (entries) { | ||
3114 | if (!ext4_valid_extent(inode, ext)) | ||
3115 | return 0; | ||
3116 | + | ||
3117 | + /* Check for overlapping extents */ | ||
3118 | + lblock = le32_to_cpu(ext->ee_block); | ||
3119 | + len = ext4_ext_get_actual_len(ext); | ||
3120 | + if ((lblock <= prev) && prev) { | ||
3121 | + pblock = ext4_ext_pblock(ext); | ||
3122 | + es->s_last_error_block = cpu_to_le64(pblock); | ||
3123 | + return 0; | ||
3124 | + } | ||
3125 | ext++; | ||
3126 | entries--; | ||
3127 | + prev = lblock + len - 1; | ||
3128 | } | ||
3129 | } else { | ||
3130 | struct ext4_extent_idx *ext_idx = EXT_FIRST_INDEX(eh); | ||
3131 | @@ -1844,8 +1861,7 @@ static unsigned int ext4_ext_check_overlap(struct ext4_sb_info *sbi, | ||
3132 | depth = ext_depth(inode); | ||
3133 | if (!path[depth].p_ext) | ||
3134 | goto out; | ||
3135 | - b2 = le32_to_cpu(path[depth].p_ext->ee_block); | ||
3136 | - b2 &= ~(sbi->s_cluster_ratio - 1); | ||
3137 | + b2 = EXT4_LBLK_CMASK(sbi, le32_to_cpu(path[depth].p_ext->ee_block)); | ||
3138 | |||
3139 | /* | ||
3140 | * get the next allocated block if the extent in the path | ||
3141 | @@ -1855,7 +1871,7 @@ static unsigned int ext4_ext_check_overlap(struct ext4_sb_info *sbi, | ||
3142 | b2 = ext4_ext_next_allocated_block(path); | ||
3143 | if (b2 == EXT_MAX_BLOCKS) | ||
3144 | goto out; | ||
3145 | - b2 &= ~(sbi->s_cluster_ratio - 1); | ||
3146 | + b2 = EXT4_LBLK_CMASK(sbi, b2); | ||
3147 | } | ||
3148 | |||
3149 | /* check for wrap through zero on extent logical start block*/ | ||
3150 | @@ -2535,7 +2551,7 @@ static int ext4_remove_blocks(handle_t *handle, struct inode *inode, | ||
3151 | * extent, we have to mark the cluster as used (store negative | ||
3152 | * cluster number in partial_cluster). | ||
3153 | */ | ||
3154 | - unaligned = pblk & (sbi->s_cluster_ratio - 1); | ||
3155 | + unaligned = EXT4_PBLK_COFF(sbi, pblk); | ||
3156 | if (unaligned && (ee_len == num) && | ||
3157 | (*partial_cluster != -((long long)EXT4_B2C(sbi, pblk)))) | ||
3158 | *partial_cluster = EXT4_B2C(sbi, pblk); | ||
3159 | @@ -2629,7 +2645,7 @@ ext4_ext_rm_leaf(handle_t *handle, struct inode *inode, | ||
3160 | * accidentally freeing it later on | ||
3161 | */ | ||
3162 | pblk = ext4_ext_pblock(ex); | ||
3163 | - if (pblk & (sbi->s_cluster_ratio - 1)) | ||
3164 | + if (EXT4_PBLK_COFF(sbi, pblk)) | ||
3165 | *partial_cluster = | ||
3166 | -((long long)EXT4_B2C(sbi, pblk)); | ||
3167 | ex--; | ||
3168 | @@ -3784,7 +3800,7 @@ int ext4_find_delalloc_cluster(struct inode *inode, ext4_lblk_t lblk) | ||
3169 | { | ||
3170 | struct ext4_sb_info *sbi = EXT4_SB(inode->i_sb); | ||
3171 | ext4_lblk_t lblk_start, lblk_end; | ||
3172 | - lblk_start = lblk & (~(sbi->s_cluster_ratio - 1)); | ||
3173 | + lblk_start = EXT4_LBLK_CMASK(sbi, lblk); | ||
3174 | lblk_end = lblk_start + sbi->s_cluster_ratio - 1; | ||
3175 | |||
3176 | return ext4_find_delalloc_range(inode, lblk_start, lblk_end); | ||
3177 | @@ -3843,9 +3859,9 @@ get_reserved_cluster_alloc(struct inode *inode, ext4_lblk_t lblk_start, | ||
3178 | trace_ext4_get_reserved_cluster_alloc(inode, lblk_start, num_blks); | ||
3179 | |||
3180 | /* Check towards left side */ | ||
3181 | - c_offset = lblk_start & (sbi->s_cluster_ratio - 1); | ||
3182 | + c_offset = EXT4_LBLK_COFF(sbi, lblk_start); | ||
3183 | if (c_offset) { | ||
3184 | - lblk_from = lblk_start & (~(sbi->s_cluster_ratio - 1)); | ||
3185 | + lblk_from = EXT4_LBLK_CMASK(sbi, lblk_start); | ||
3186 | lblk_to = lblk_from + c_offset - 1; | ||
3187 | |||
3188 | if (ext4_find_delalloc_range(inode, lblk_from, lblk_to)) | ||
3189 | @@ -3853,7 +3869,7 @@ get_reserved_cluster_alloc(struct inode *inode, ext4_lblk_t lblk_start, | ||
3190 | } | ||
3191 | |||
3192 | /* Now check towards right. */ | ||
3193 | - c_offset = (lblk_start + num_blks) & (sbi->s_cluster_ratio - 1); | ||
3194 | + c_offset = EXT4_LBLK_COFF(sbi, lblk_start + num_blks); | ||
3195 | if (allocated_clusters && c_offset) { | ||
3196 | lblk_from = lblk_start + num_blks; | ||
3197 | lblk_to = lblk_from + (sbi->s_cluster_ratio - c_offset) - 1; | ||
3198 | @@ -4061,7 +4077,7 @@ static int get_implied_cluster_alloc(struct super_block *sb, | ||
3199 | struct ext4_ext_path *path) | ||
3200 | { | ||
3201 | struct ext4_sb_info *sbi = EXT4_SB(sb); | ||
3202 | - ext4_lblk_t c_offset = map->m_lblk & (sbi->s_cluster_ratio-1); | ||
3203 | + ext4_lblk_t c_offset = EXT4_LBLK_COFF(sbi, map->m_lblk); | ||
3204 | ext4_lblk_t ex_cluster_start, ex_cluster_end; | ||
3205 | ext4_lblk_t rr_cluster_start; | ||
3206 | ext4_lblk_t ee_block = le32_to_cpu(ex->ee_block); | ||
3207 | @@ -4079,8 +4095,7 @@ static int get_implied_cluster_alloc(struct super_block *sb, | ||
3208 | (rr_cluster_start == ex_cluster_start)) { | ||
3209 | if (rr_cluster_start == ex_cluster_end) | ||
3210 | ee_start += ee_len - 1; | ||
3211 | - map->m_pblk = (ee_start & ~(sbi->s_cluster_ratio - 1)) + | ||
3212 | - c_offset; | ||
3213 | + map->m_pblk = EXT4_PBLK_CMASK(sbi, ee_start) + c_offset; | ||
3214 | map->m_len = min(map->m_len, | ||
3215 | (unsigned) sbi->s_cluster_ratio - c_offset); | ||
3216 | /* | ||
3217 | @@ -4234,7 +4249,7 @@ int ext4_ext_map_blocks(handle_t *handle, struct inode *inode, | ||
3218 | */ | ||
3219 | map->m_flags &= ~EXT4_MAP_FROM_CLUSTER; | ||
3220 | newex.ee_block = cpu_to_le32(map->m_lblk); | ||
3221 | - cluster_offset = map->m_lblk & (sbi->s_cluster_ratio-1); | ||
3222 | + cluster_offset = EXT4_LBLK_COFF(sbi, map->m_lblk); | ||
3223 | |||
3224 | /* | ||
3225 | * If we are doing bigalloc, check to see if the extent returned | ||
3226 | @@ -4302,7 +4317,7 @@ int ext4_ext_map_blocks(handle_t *handle, struct inode *inode, | ||
3227 | * needed so that future calls to get_implied_cluster_alloc() | ||
3228 | * work correctly. | ||
3229 | */ | ||
3230 | - offset = map->m_lblk & (sbi->s_cluster_ratio - 1); | ||
3231 | + offset = EXT4_LBLK_COFF(sbi, map->m_lblk); | ||
3232 | ar.len = EXT4_NUM_B2C(sbi, offset+allocated); | ||
3233 | ar.goal -= offset; | ||
3234 | ar.logical -= offset; | ||
3235 | diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c | ||
3236 | index e274e9c1171f..1ddee3dfabe3 100644 | ||
3237 | --- a/fs/ext4/inode.c | ||
3238 | +++ b/fs/ext4/inode.c | ||
3239 | @@ -1206,7 +1206,6 @@ static int ext4_journalled_write_end(struct file *file, | ||
3240 | */ | ||
3241 | static int ext4_da_reserve_metadata(struct inode *inode, ext4_lblk_t lblock) | ||
3242 | { | ||
3243 | - int retries = 0; | ||
3244 | struct ext4_sb_info *sbi = EXT4_SB(inode->i_sb); | ||
3245 | struct ext4_inode_info *ei = EXT4_I(inode); | ||
3246 | unsigned int md_needed; | ||
3247 | @@ -1218,7 +1217,6 @@ static int ext4_da_reserve_metadata(struct inode *inode, ext4_lblk_t lblock) | ||
3248 | * in order to allocate nrblocks | ||
3249 | * worse case is one extent per block | ||
3250 | */ | ||
3251 | -repeat: | ||
3252 | spin_lock(&ei->i_block_reservation_lock); | ||
3253 | /* | ||
3254 | * ext4_calc_metadata_amount() has side effects, which we have | ||
3255 | @@ -1238,10 +1236,6 @@ repeat: | ||
3256 | ei->i_da_metadata_calc_len = save_len; | ||
3257 | ei->i_da_metadata_calc_last_lblock = save_last_lblock; | ||
3258 | spin_unlock(&ei->i_block_reservation_lock); | ||
3259 | - if (ext4_should_retry_alloc(inode->i_sb, &retries)) { | ||
3260 | - cond_resched(); | ||
3261 | - goto repeat; | ||
3262 | - } | ||
3263 | return -ENOSPC; | ||
3264 | } | ||
3265 | ei->i_reserved_meta_blocks += md_needed; | ||
3266 | @@ -1255,7 +1249,6 @@ repeat: | ||
3267 | */ | ||
3268 | static int ext4_da_reserve_space(struct inode *inode, ext4_lblk_t lblock) | ||
3269 | { | ||
3270 | - int retries = 0; | ||
3271 | struct ext4_sb_info *sbi = EXT4_SB(inode->i_sb); | ||
3272 | struct ext4_inode_info *ei = EXT4_I(inode); | ||
3273 | unsigned int md_needed; | ||
3274 | @@ -1277,7 +1270,6 @@ static int ext4_da_reserve_space(struct inode *inode, ext4_lblk_t lblock) | ||
3275 | * in order to allocate nrblocks | ||
3276 | * worse case is one extent per block | ||
3277 | */ | ||
3278 | -repeat: | ||
3279 | spin_lock(&ei->i_block_reservation_lock); | ||
3280 | /* | ||
3281 | * ext4_calc_metadata_amount() has side effects, which we have | ||
3282 | @@ -1297,10 +1289,6 @@ repeat: | ||
3283 | ei->i_da_metadata_calc_len = save_len; | ||
3284 | ei->i_da_metadata_calc_last_lblock = save_last_lblock; | ||
3285 | spin_unlock(&ei->i_block_reservation_lock); | ||
3286 | - if (ext4_should_retry_alloc(inode->i_sb, &retries)) { | ||
3287 | - cond_resched(); | ||
3288 | - goto repeat; | ||
3289 | - } | ||
3290 | dquot_release_reservation_block(inode, EXT4_C2B(sbi, 1)); | ||
3291 | return -ENOSPC; | ||
3292 | } | ||
3293 | diff --git a/fs/ext4/mballoc.c b/fs/ext4/mballoc.c | ||
3294 | index a41e3ba8cfaa..04a5c7504be9 100644 | ||
3295 | --- a/fs/ext4/mballoc.c | ||
3296 | +++ b/fs/ext4/mballoc.c | ||
3297 | @@ -3442,6 +3442,9 @@ static void ext4_mb_pa_callback(struct rcu_head *head) | ||
3298 | { | ||
3299 | struct ext4_prealloc_space *pa; | ||
3300 | pa = container_of(head, struct ext4_prealloc_space, u.pa_rcu); | ||
3301 | + | ||
3302 | + BUG_ON(atomic_read(&pa->pa_count)); | ||
3303 | + BUG_ON(pa->pa_deleted == 0); | ||
3304 | kmem_cache_free(ext4_pspace_cachep, pa); | ||
3305 | } | ||
3306 | |||
3307 | @@ -3455,11 +3458,13 @@ static void ext4_mb_put_pa(struct ext4_allocation_context *ac, | ||
3308 | ext4_group_t grp; | ||
3309 | ext4_fsblk_t grp_blk; | ||
3310 | |||
3311 | - if (!atomic_dec_and_test(&pa->pa_count) || pa->pa_free != 0) | ||
3312 | - return; | ||
3313 | - | ||
3314 | /* in this short window concurrent discard can set pa_deleted */ | ||
3315 | spin_lock(&pa->pa_lock); | ||
3316 | + if (!atomic_dec_and_test(&pa->pa_count) || pa->pa_free != 0) { | ||
3317 | + spin_unlock(&pa->pa_lock); | ||
3318 | + return; | ||
3319 | + } | ||
3320 | + | ||
3321 | if (pa->pa_deleted == 1) { | ||
3322 | spin_unlock(&pa->pa_lock); | ||
3323 | return; | ||
3324 | @@ -4121,7 +4126,7 @@ ext4_mb_initialize_context(struct ext4_allocation_context *ac, | ||
3325 | ext4_get_group_no_and_offset(sb, goal, &group, &block); | ||
3326 | |||
3327 | /* set up allocation goals */ | ||
3328 | - ac->ac_b_ex.fe_logical = ar->logical & ~(sbi->s_cluster_ratio - 1); | ||
3329 | + ac->ac_b_ex.fe_logical = EXT4_LBLK_CMASK(sbi, ar->logical); | ||
3330 | ac->ac_status = AC_STATUS_CONTINUE; | ||
3331 | ac->ac_sb = sb; | ||
3332 | ac->ac_inode = ar->inode; | ||
3333 | @@ -4663,7 +4668,7 @@ void ext4_free_blocks(handle_t *handle, struct inode *inode, | ||
3334 | * blocks at the beginning or the end unless we are explicitly | ||
3335 | * requested to avoid doing so. | ||
3336 | */ | ||
3337 | - overflow = block & (sbi->s_cluster_ratio - 1); | ||
3338 | + overflow = EXT4_PBLK_COFF(sbi, block); | ||
3339 | if (overflow) { | ||
3340 | if (flags & EXT4_FREE_BLOCKS_NOFREE_FIRST_CLUSTER) { | ||
3341 | overflow = sbi->s_cluster_ratio - overflow; | ||
3342 | @@ -4677,7 +4682,7 @@ void ext4_free_blocks(handle_t *handle, struct inode *inode, | ||
3343 | count += overflow; | ||
3344 | } | ||
3345 | } | ||
3346 | - overflow = count & (sbi->s_cluster_ratio - 1); | ||
3347 | + overflow = EXT4_LBLK_COFF(sbi, count); | ||
3348 | if (overflow) { | ||
3349 | if (flags & EXT4_FREE_BLOCKS_NOFREE_LAST_CLUSTER) { | ||
3350 | if (count > overflow) | ||
3351 | @@ -4794,8 +4799,8 @@ do_more: | ||
3352 | " group:%d block:%d count:%lu failed" | ||
3353 | " with %d", block_group, bit, count, | ||
3354 | err); | ||
3355 | - } | ||
3356 | - | ||
3357 | + } else | ||
3358 | + EXT4_MB_GRP_CLEAR_TRIMMED(e4b.bd_info); | ||
3359 | |||
3360 | ext4_lock_group(sb, block_group); | ||
3361 | mb_clear_bits(bitmap_bh->b_data, bit, count_clusters); | ||
3362 | diff --git a/fs/ext4/super.c b/fs/ext4/super.c | ||
3363 | index 2c2e6cbc6bed..b947e0af9956 100644 | ||
3364 | --- a/fs/ext4/super.c | ||
3365 | +++ b/fs/ext4/super.c | ||
3366 | @@ -773,7 +773,7 @@ static void ext4_put_super(struct super_block *sb) | ||
3367 | } | ||
3368 | |||
3369 | ext4_es_unregister_shrinker(sbi); | ||
3370 | - del_timer(&sbi->s_err_report); | ||
3371 | + del_timer_sync(&sbi->s_err_report); | ||
3372 | ext4_release_system_zone(sb); | ||
3373 | ext4_mb_release(sb); | ||
3374 | ext4_ext_release(sb); | ||
3375 | @@ -3288,11 +3288,19 @@ int ext4_calculate_overhead(struct super_block *sb) | ||
3376 | } | ||
3377 | |||
3378 | |||
3379 | -static ext4_fsblk_t ext4_calculate_resv_clusters(struct ext4_sb_info *sbi) | ||
3380 | +static ext4_fsblk_t ext4_calculate_resv_clusters(struct super_block *sb) | ||
3381 | { | ||
3382 | ext4_fsblk_t resv_clusters; | ||
3383 | |||
3384 | /* | ||
3385 | + * There's no need to reserve anything when we aren't using extents. | ||
3386 | + * The space estimates are exact, there are no unwritten extents, | ||
3387 | + * hole punching doesn't need new metadata... This is needed especially | ||
3388 | + * to keep ext2/3 backward compatibility. | ||
3389 | + */ | ||
3390 | + if (!EXT4_HAS_INCOMPAT_FEATURE(sb, EXT4_FEATURE_INCOMPAT_EXTENTS)) | ||
3391 | + return 0; | ||
3392 | + /* | ||
3393 | * By default we reserve 2% or 4096 clusters, whichever is smaller. | ||
3394 | * This should cover the situations where we can not afford to run | ||
3395 | * out of space like for example punch hole, or converting | ||
3396 | @@ -3300,7 +3308,8 @@ static ext4_fsblk_t ext4_calculate_resv_clusters(struct ext4_sb_info *sbi) | ||
3397 | * allocation would require 1, or 2 blocks, higher numbers are | ||
3398 | * very rare. | ||
3399 | */ | ||
3400 | - resv_clusters = ext4_blocks_count(sbi->s_es) >> sbi->s_cluster_bits; | ||
3401 | + resv_clusters = ext4_blocks_count(EXT4_SB(sb)->s_es) >> | ||
3402 | + EXT4_SB(sb)->s_cluster_bits; | ||
3403 | |||
3404 | do_div(resv_clusters, 50); | ||
3405 | resv_clusters = min_t(ext4_fsblk_t, resv_clusters, 4096); | ||
3406 | @@ -4043,10 +4052,10 @@ no_journal: | ||
3407 | "available"); | ||
3408 | } | ||
3409 | |||
3410 | - err = ext4_reserve_clusters(sbi, ext4_calculate_resv_clusters(sbi)); | ||
3411 | + err = ext4_reserve_clusters(sbi, ext4_calculate_resv_clusters(sb)); | ||
3412 | if (err) { | ||
3413 | ext4_msg(sb, KERN_ERR, "failed to reserve %llu clusters for " | ||
3414 | - "reserved pool", ext4_calculate_resv_clusters(sbi)); | ||
3415 | + "reserved pool", ext4_calculate_resv_clusters(sb)); | ||
3416 | goto failed_mount4a; | ||
3417 | } | ||
3418 | |||
3419 | @@ -4151,7 +4160,7 @@ failed_mount_wq: | ||
3420 | } | ||
3421 | failed_mount3: | ||
3422 | ext4_es_unregister_shrinker(sbi); | ||
3423 | - del_timer(&sbi->s_err_report); | ||
3424 | + del_timer_sync(&sbi->s_err_report); | ||
3425 | if (sbi->s_flex_groups) | ||
3426 | ext4_kvfree(sbi->s_flex_groups); | ||
3427 | percpu_counter_destroy(&sbi->s_freeclusters_counter); | ||
3428 | diff --git a/fs/gfs2/aops.c b/fs/gfs2/aops.c | ||
3429 | index 1f7d8057ea68..1253c2006029 100644 | ||
3430 | --- a/fs/gfs2/aops.c | ||
3431 | +++ b/fs/gfs2/aops.c | ||
3432 | @@ -984,6 +984,7 @@ static ssize_t gfs2_direct_IO(int rw, struct kiocb *iocb, | ||
3433 | { | ||
3434 | struct file *file = iocb->ki_filp; | ||
3435 | struct inode *inode = file->f_mapping->host; | ||
3436 | + struct address_space *mapping = inode->i_mapping; | ||
3437 | struct gfs2_inode *ip = GFS2_I(inode); | ||
3438 | struct gfs2_holder gh; | ||
3439 | int rv; | ||
3440 | @@ -1004,6 +1005,35 @@ static ssize_t gfs2_direct_IO(int rw, struct kiocb *iocb, | ||
3441 | if (rv != 1) | ||
3442 | goto out; /* dio not valid, fall back to buffered i/o */ | ||
3443 | |||
3444 | + /* | ||
3445 | + * Now since we are holding a deferred (CW) lock at this point, you | ||
3446 | + * might be wondering why this is ever needed. There is a case however | ||
3447 | + * where we've granted a deferred local lock against a cached exclusive | ||
3448 | + * glock. That is ok provided all granted local locks are deferred, but | ||
3449 | + * it also means that it is possible to encounter pages which are | ||
3450 | + * cached and possibly also mapped. So here we check for that and sort | ||
3451 | + * them out ahead of the dio. The glock state machine will take care of | ||
3452 | + * everything else. | ||
3453 | + * | ||
3454 | + * If in fact the cached glock state (gl->gl_state) is deferred (CW) in | ||
3455 | + * the first place, mapping->nr_pages will always be zero. | ||
3456 | + */ | ||
3457 | + if (mapping->nrpages) { | ||
3458 | + loff_t lstart = offset & (PAGE_CACHE_SIZE - 1); | ||
3459 | + loff_t len = iov_length(iov, nr_segs); | ||
3460 | + loff_t end = PAGE_ALIGN(offset + len) - 1; | ||
3461 | + | ||
3462 | + rv = 0; | ||
3463 | + if (len == 0) | ||
3464 | + goto out; | ||
3465 | + if (test_and_clear_bit(GIF_SW_PAGED, &ip->i_flags)) | ||
3466 | + unmap_shared_mapping_range(ip->i_inode.i_mapping, offset, len); | ||
3467 | + rv = filemap_write_and_wait_range(mapping, lstart, end); | ||
3468 | + if (rv) | ||
3469 | + return rv; | ||
3470 | + truncate_inode_pages_range(mapping, lstart, end); | ||
3471 | + } | ||
3472 | + | ||
3473 | rv = __blockdev_direct_IO(rw, iocb, inode, inode->i_sb->s_bdev, iov, | ||
3474 | offset, nr_segs, gfs2_get_block_direct, | ||
3475 | NULL, NULL, 0); | ||
3476 | diff --git a/fs/gfs2/log.c b/fs/gfs2/log.c | ||
3477 | index 610613fb65b5..9dcb9777a5f8 100644 | ||
3478 | --- a/fs/gfs2/log.c | ||
3479 | +++ b/fs/gfs2/log.c | ||
3480 | @@ -551,10 +551,10 @@ void gfs2_add_revoke(struct gfs2_sbd *sdp, struct gfs2_bufdata *bd) | ||
3481 | struct buffer_head *bh = bd->bd_bh; | ||
3482 | struct gfs2_glock *gl = bd->bd_gl; | ||
3483 | |||
3484 | - gfs2_remove_from_ail(bd); | ||
3485 | - bd->bd_bh = NULL; | ||
3486 | bh->b_private = NULL; | ||
3487 | bd->bd_blkno = bh->b_blocknr; | ||
3488 | + gfs2_remove_from_ail(bd); /* drops ref on bh */ | ||
3489 | + bd->bd_bh = NULL; | ||
3490 | bd->bd_ops = &gfs2_revoke_lops; | ||
3491 | sdp->sd_log_num_revoke++; | ||
3492 | atomic_inc(&gl->gl_revokes); | ||
3493 | diff --git a/fs/gfs2/meta_io.c b/fs/gfs2/meta_io.c | ||
3494 | index 932415050540..52f177be3bf8 100644 | ||
3495 | --- a/fs/gfs2/meta_io.c | ||
3496 | +++ b/fs/gfs2/meta_io.c | ||
3497 | @@ -258,6 +258,7 @@ void gfs2_remove_from_journal(struct buffer_head *bh, struct gfs2_trans *tr, int | ||
3498 | struct address_space *mapping = bh->b_page->mapping; | ||
3499 | struct gfs2_sbd *sdp = gfs2_mapping2sbd(mapping); | ||
3500 | struct gfs2_bufdata *bd = bh->b_private; | ||
3501 | + int was_pinned = 0; | ||
3502 | |||
3503 | if (test_clear_buffer_pinned(bh)) { | ||
3504 | trace_gfs2_pin(bd, 0); | ||
3505 | @@ -273,12 +274,16 @@ void gfs2_remove_from_journal(struct buffer_head *bh, struct gfs2_trans *tr, int | ||
3506 | tr->tr_num_databuf_rm++; | ||
3507 | } | ||
3508 | tr->tr_touched = 1; | ||
3509 | + was_pinned = 1; | ||
3510 | brelse(bh); | ||
3511 | } | ||
3512 | if (bd) { | ||
3513 | spin_lock(&sdp->sd_ail_lock); | ||
3514 | if (bd->bd_tr) { | ||
3515 | gfs2_trans_add_revoke(sdp, bd); | ||
3516 | + } else if (was_pinned) { | ||
3517 | + bh->b_private = NULL; | ||
3518 | + kmem_cache_free(gfs2_bufdata_cachep, bd); | ||
3519 | } | ||
3520 | spin_unlock(&sdp->sd_ail_lock); | ||
3521 | } | ||
3522 | diff --git a/fs/gfs2/ops_fstype.c b/fs/gfs2/ops_fstype.c | ||
3523 | index 19ff5e8c285c..21518b76cd8b 100644 | ||
3524 | --- a/fs/gfs2/ops_fstype.c | ||
3525 | +++ b/fs/gfs2/ops_fstype.c | ||
3526 | @@ -1366,8 +1366,18 @@ static struct dentry *gfs2_mount(struct file_system_type *fs_type, int flags, | ||
3527 | if (IS_ERR(s)) | ||
3528 | goto error_bdev; | ||
3529 | |||
3530 | - if (s->s_root) | ||
3531 | + if (s->s_root) { | ||
3532 | + /* | ||
3533 | + * s_umount nests inside bd_mutex during | ||
3534 | + * __invalidate_device(). blkdev_put() acquires | ||
3535 | + * bd_mutex and can't be called under s_umount. Drop | ||
3536 | + * s_umount temporarily. This is safe as we're | ||
3537 | + * holding an active reference. | ||
3538 | + */ | ||
3539 | + up_write(&s->s_umount); | ||
3540 | blkdev_put(bdev, mode); | ||
3541 | + down_write(&s->s_umount); | ||
3542 | + } | ||
3543 | |||
3544 | memset(&args, 0, sizeof(args)); | ||
3545 | args.ar_quota = GFS2_QUOTA_DEFAULT; | ||
3546 | diff --git a/fs/jbd2/transaction.c b/fs/jbd2/transaction.c | ||
3547 | index 7aa9a32573bb..b0b74e58697b 100644 | ||
3548 | --- a/fs/jbd2/transaction.c | ||
3549 | +++ b/fs/jbd2/transaction.c | ||
3550 | @@ -1290,7 +1290,10 @@ int jbd2_journal_dirty_metadata(handle_t *handle, struct buffer_head *bh) | ||
3551 | * once a transaction -bzzz | ||
3552 | */ | ||
3553 | jh->b_modified = 1; | ||
3554 | - J_ASSERT_JH(jh, handle->h_buffer_credits > 0); | ||
3555 | + if (handle->h_buffer_credits <= 0) { | ||
3556 | + ret = -ENOSPC; | ||
3557 | + goto out_unlock_bh; | ||
3558 | + } | ||
3559 | handle->h_buffer_credits--; | ||
3560 | } | ||
3561 | |||
3562 | @@ -1373,7 +1376,6 @@ out_unlock_bh: | ||
3563 | jbd2_journal_put_journal_head(jh); | ||
3564 | out: | ||
3565 | JBUFFER_TRACE(jh, "exit"); | ||
3566 | - WARN_ON(ret); /* All errors are bugs, so dump the stack */ | ||
3567 | return ret; | ||
3568 | } | ||
3569 | |||
3570 | diff --git a/fs/xfs/xfs_qm.c b/fs/xfs/xfs_qm.c | ||
3571 | index 3e6c2e6c9cd2..4688a622b373 100644 | ||
3572 | --- a/fs/xfs/xfs_qm.c | ||
3573 | +++ b/fs/xfs/xfs_qm.c | ||
3574 | @@ -137,8 +137,6 @@ xfs_qm_dqpurge( | ||
3575 | { | ||
3576 | struct xfs_mount *mp = dqp->q_mount; | ||
3577 | struct xfs_quotainfo *qi = mp->m_quotainfo; | ||
3578 | - struct xfs_dquot *gdqp = NULL; | ||
3579 | - struct xfs_dquot *pdqp = NULL; | ||
3580 | |||
3581 | xfs_dqlock(dqp); | ||
3582 | if ((dqp->dq_flags & XFS_DQ_FREEING) || dqp->q_nrefs != 0) { | ||
3583 | @@ -146,21 +144,6 @@ xfs_qm_dqpurge( | ||
3584 | return EAGAIN; | ||
3585 | } | ||
3586 | |||
3587 | - /* | ||
3588 | - * If this quota has a hint attached, prepare for releasing it now. | ||
3589 | - */ | ||
3590 | - gdqp = dqp->q_gdquot; | ||
3591 | - if (gdqp) { | ||
3592 | - xfs_dqlock(gdqp); | ||
3593 | - dqp->q_gdquot = NULL; | ||
3594 | - } | ||
3595 | - | ||
3596 | - pdqp = dqp->q_pdquot; | ||
3597 | - if (pdqp) { | ||
3598 | - xfs_dqlock(pdqp); | ||
3599 | - dqp->q_pdquot = NULL; | ||
3600 | - } | ||
3601 | - | ||
3602 | dqp->dq_flags |= XFS_DQ_FREEING; | ||
3603 | |||
3604 | xfs_dqflock(dqp); | ||
3605 | @@ -209,11 +192,47 @@ xfs_qm_dqpurge( | ||
3606 | XFS_STATS_DEC(xs_qm_dquot_unused); | ||
3607 | |||
3608 | xfs_qm_dqdestroy(dqp); | ||
3609 | + return 0; | ||
3610 | +} | ||
3611 | + | ||
3612 | +/* | ||
3613 | + * Release the group or project dquot pointers the user dquots maybe carrying | ||
3614 | + * around as a hint, and proceed to purge the user dquot cache if requested. | ||
3615 | +*/ | ||
3616 | +STATIC int | ||
3617 | +xfs_qm_dqpurge_hints( | ||
3618 | + struct xfs_dquot *dqp, | ||
3619 | + void *data) | ||
3620 | +{ | ||
3621 | + struct xfs_dquot *gdqp = NULL; | ||
3622 | + struct xfs_dquot *pdqp = NULL; | ||
3623 | + uint flags = *((uint *)data); | ||
3624 | |||
3625 | + xfs_dqlock(dqp); | ||
3626 | + if (dqp->dq_flags & XFS_DQ_FREEING) { | ||
3627 | + xfs_dqunlock(dqp); | ||
3628 | + return EAGAIN; | ||
3629 | + } | ||
3630 | + | ||
3631 | + /* If this quota has a hint attached, prepare for releasing it now */ | ||
3632 | + gdqp = dqp->q_gdquot; | ||
3633 | if (gdqp) | ||
3634 | - xfs_qm_dqput(gdqp); | ||
3635 | + dqp->q_gdquot = NULL; | ||
3636 | + | ||
3637 | + pdqp = dqp->q_pdquot; | ||
3638 | if (pdqp) | ||
3639 | - xfs_qm_dqput(pdqp); | ||
3640 | + dqp->q_pdquot = NULL; | ||
3641 | + | ||
3642 | + xfs_dqunlock(dqp); | ||
3643 | + | ||
3644 | + if (gdqp) | ||
3645 | + xfs_qm_dqrele(gdqp); | ||
3646 | + if (pdqp) | ||
3647 | + xfs_qm_dqrele(pdqp); | ||
3648 | + | ||
3649 | + if (flags & XFS_QMOPT_UQUOTA) | ||
3650 | + return xfs_qm_dqpurge(dqp, NULL); | ||
3651 | + | ||
3652 | return 0; | ||
3653 | } | ||
3654 | |||
3655 | @@ -225,8 +244,18 @@ xfs_qm_dqpurge_all( | ||
3656 | struct xfs_mount *mp, | ||
3657 | uint flags) | ||
3658 | { | ||
3659 | - if (flags & XFS_QMOPT_UQUOTA) | ||
3660 | - xfs_qm_dquot_walk(mp, XFS_DQ_USER, xfs_qm_dqpurge, NULL); | ||
3661 | + /* | ||
3662 | + * We have to release group/project dquot hint(s) from the user dquot | ||
3663 | + * at first if they are there, otherwise we would run into an infinite | ||
3664 | + * loop while walking through radix tree to purge other type of dquots | ||
3665 | + * since their refcount is not zero if the user dquot refers to them | ||
3666 | + * as hint. | ||
3667 | + * | ||
3668 | + * Call the special xfs_qm_dqpurge_hints() will end up go through the | ||
3669 | + * general xfs_qm_dqpurge() against user dquot cache if requested. | ||
3670 | + */ | ||
3671 | + xfs_qm_dquot_walk(mp, XFS_DQ_USER, xfs_qm_dqpurge_hints, &flags); | ||
3672 | + | ||
3673 | if (flags & XFS_QMOPT_GQUOTA) | ||
3674 | xfs_qm_dquot_walk(mp, XFS_DQ_GROUP, xfs_qm_dqpurge, NULL); | ||
3675 | if (flags & XFS_QMOPT_PQUOTA) | ||
3676 | diff --git a/include/acpi/acpi_bus.h b/include/acpi/acpi_bus.h | ||
3677 | index 2611577869ae..d78b353b12b4 100644 | ||
3678 | --- a/include/acpi/acpi_bus.h | ||
3679 | +++ b/include/acpi/acpi_bus.h | ||
3680 | @@ -169,7 +169,8 @@ struct acpi_device_flags { | ||
3681 | u32 ejectable:1; | ||
3682 | u32 power_manageable:1; | ||
3683 | u32 match_driver:1; | ||
3684 | - u32 reserved:27; | ||
3685 | + u32 no_hotplug:1; | ||
3686 | + u32 reserved:26; | ||
3687 | }; | ||
3688 | |||
3689 | /* File System */ | ||
3690 | @@ -357,6 +358,7 @@ extern struct kobject *acpi_kobj; | ||
3691 | extern int acpi_bus_generate_netlink_event(const char*, const char*, u8, int); | ||
3692 | void acpi_bus_private_data_handler(acpi_handle, void *); | ||
3693 | int acpi_bus_get_private_data(acpi_handle, void **); | ||
3694 | +void acpi_bus_no_hotplug(acpi_handle handle); | ||
3695 | extern int acpi_notifier_call_chain(struct acpi_device *, u32, u32); | ||
3696 | extern int register_acpi_notifier(struct notifier_block *); | ||
3697 | extern int unregister_acpi_notifier(struct notifier_block *); | ||
3698 | diff --git a/include/asm-generic/pgtable.h b/include/asm-generic/pgtable.h | ||
3699 | index f330d28e4d0e..b12079afbd5f 100644 | ||
3700 | --- a/include/asm-generic/pgtable.h | ||
3701 | +++ b/include/asm-generic/pgtable.h | ||
3702 | @@ -217,7 +217,7 @@ static inline int pmd_same(pmd_t pmd_a, pmd_t pmd_b) | ||
3703 | #endif | ||
3704 | |||
3705 | #ifndef pte_accessible | ||
3706 | -# define pte_accessible(pte) ((void)(pte),1) | ||
3707 | +# define pte_accessible(mm, pte) ((void)(pte), 1) | ||
3708 | #endif | ||
3709 | |||
3710 | #ifndef flush_tlb_fix_spurious_fault | ||
3711 | diff --git a/include/drm/drm_pciids.h b/include/drm/drm_pciids.h | ||
3712 | index 3d79e513c0b3..0bd7a2ec8a45 100644 | ||
3713 | --- a/include/drm/drm_pciids.h | ||
3714 | +++ b/include/drm/drm_pciids.h | ||
3715 | @@ -588,7 +588,7 @@ | ||
3716 | {0x1002, 0x9645, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_SUMO2|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \ | ||
3717 | {0x1002, 0x9647, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_SUMO|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP|RADEON_IS_IGP},\ | ||
3718 | {0x1002, 0x9648, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_SUMO|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP|RADEON_IS_IGP},\ | ||
3719 | - {0x1002, 0x9649, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_SUMO|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP|RADEON_IS_IGP},\ | ||
3720 | + {0x1002, 0x9649, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_SUMO2|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP|RADEON_IS_IGP},\ | ||
3721 | {0x1002, 0x964a, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_SUMO|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \ | ||
3722 | {0x1002, 0x964b, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_SUMO|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \ | ||
3723 | {0x1002, 0x964c, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_SUMO|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \ | ||
3724 | diff --git a/include/linux/auxvec.h b/include/linux/auxvec.h | ||
3725 | index 669fef5c745a..3e0fbe441763 100644 | ||
3726 | --- a/include/linux/auxvec.h | ||
3727 | +++ b/include/linux/auxvec.h | ||
3728 | @@ -3,6 +3,6 @@ | ||
3729 | |||
3730 | #include <uapi/linux/auxvec.h> | ||
3731 | |||
3732 | -#define AT_VECTOR_SIZE_BASE 19 /* NEW_AUX_ENT entries in auxiliary table */ | ||
3733 | +#define AT_VECTOR_SIZE_BASE 20 /* NEW_AUX_ENT entries in auxiliary table */ | ||
3734 | /* number of "#define AT_.*" above, minus {AT_NULL, AT_IGNORE, AT_NOTELF} */ | ||
3735 | #endif /* _LINUX_AUXVEC_H */ | ||
3736 | diff --git a/include/linux/libata.h b/include/linux/libata.h | ||
3737 | index 0e23c26485f4..9b503376738f 100644 | ||
3738 | --- a/include/linux/libata.h | ||
3739 | +++ b/include/linux/libata.h | ||
3740 | @@ -418,6 +418,7 @@ enum { | ||
3741 | ATA_HORKAGE_DUMP_ID = (1 << 16), /* dump IDENTIFY data */ | ||
3742 | ATA_HORKAGE_MAX_SEC_LBA48 = (1 << 17), /* Set max sects to 65535 */ | ||
3743 | ATA_HORKAGE_ATAPI_DMADIR = (1 << 18), /* device requires dmadir */ | ||
3744 | + ATA_HORKAGE_NO_NCQ_TRIM = (1 << 19), /* don't use queued TRIM */ | ||
3745 | |||
3746 | /* DMA mask for user DMA control: User visible values; DO NOT | ||
3747 | renumber */ | ||
3748 | diff --git a/include/linux/migrate.h b/include/linux/migrate.h | ||
3749 | index 8d3c57fdf221..ee8b14ae4f3f 100644 | ||
3750 | --- a/include/linux/migrate.h | ||
3751 | +++ b/include/linux/migrate.h | ||
3752 | @@ -55,7 +55,8 @@ extern int migrate_huge_page_move_mapping(struct address_space *mapping, | ||
3753 | struct page *newpage, struct page *page); | ||
3754 | extern int migrate_page_move_mapping(struct address_space *mapping, | ||
3755 | struct page *newpage, struct page *page, | ||
3756 | - struct buffer_head *head, enum migrate_mode mode); | ||
3757 | + struct buffer_head *head, enum migrate_mode mode, | ||
3758 | + int extra_count); | ||
3759 | #else | ||
3760 | |||
3761 | static inline void putback_lru_pages(struct list_head *l) {} | ||
3762 | @@ -90,10 +91,18 @@ static inline int migrate_huge_page_move_mapping(struct address_space *mapping, | ||
3763 | #endif /* CONFIG_MIGRATION */ | ||
3764 | |||
3765 | #ifdef CONFIG_NUMA_BALANCING | ||
3766 | -extern int migrate_misplaced_page(struct page *page, int node); | ||
3767 | +extern bool pmd_trans_migrating(pmd_t pmd); | ||
3768 | +extern void wait_migrate_huge_page(struct anon_vma *anon_vma, pmd_t *pmd); | ||
3769 | extern int migrate_misplaced_page(struct page *page, int node); | ||
3770 | extern bool migrate_ratelimited(int node); | ||
3771 | #else | ||
3772 | +static inline bool pmd_trans_migrating(pmd_t pmd) | ||
3773 | +{ | ||
3774 | + return false; | ||
3775 | +} | ||
3776 | +static inline void wait_migrate_huge_page(struct anon_vma *anon_vma, pmd_t *pmd) | ||
3777 | +{ | ||
3778 | +} | ||
3779 | static inline int migrate_misplaced_page(struct page *page, int node) | ||
3780 | { | ||
3781 | return -EAGAIN; /* can't migrate now */ | ||
3782 | diff --git a/include/linux/mm_types.h b/include/linux/mm_types.h | ||
3783 | index d9851eeb6e1d..8e082f18fb6a 100644 | ||
3784 | --- a/include/linux/mm_types.h | ||
3785 | +++ b/include/linux/mm_types.h | ||
3786 | @@ -435,6 +435,14 @@ struct mm_struct { | ||
3787 | */ | ||
3788 | int first_nid; | ||
3789 | #endif | ||
3790 | +#if defined(CONFIG_NUMA_BALANCING) || defined(CONFIG_COMPACTION) | ||
3791 | + /* | ||
3792 | + * An operation with batched TLB flushing is going on. Anything that | ||
3793 | + * can move process memory needs to flush the TLB when moving a | ||
3794 | + * PROT_NONE or PROT_NUMA mapped page. | ||
3795 | + */ | ||
3796 | + bool tlb_flush_pending; | ||
3797 | +#endif | ||
3798 | struct uprobes_state uprobes_state; | ||
3799 | }; | ||
3800 | |||
3801 | @@ -455,4 +463,45 @@ static inline cpumask_t *mm_cpumask(struct mm_struct *mm) | ||
3802 | return mm->cpu_vm_mask_var; | ||
3803 | } | ||
3804 | |||
3805 | +#if defined(CONFIG_NUMA_BALANCING) || defined(CONFIG_COMPACTION) | ||
3806 | +/* | ||
3807 | + * Memory barriers to keep this state in sync are graciously provided by | ||
3808 | + * the page table locks, outside of which no page table modifications happen. | ||
3809 | + * The barriers below prevent the compiler from re-ordering the instructions | ||
3810 | + * around the memory barriers that are already present in the code. | ||
3811 | + */ | ||
3812 | +static inline bool mm_tlb_flush_pending(struct mm_struct *mm) | ||
3813 | +{ | ||
3814 | + barrier(); | ||
3815 | + return mm->tlb_flush_pending; | ||
3816 | +} | ||
3817 | +static inline void set_tlb_flush_pending(struct mm_struct *mm) | ||
3818 | +{ | ||
3819 | + mm->tlb_flush_pending = true; | ||
3820 | + | ||
3821 | + /* | ||
3822 | + * Guarantee that the tlb_flush_pending store does not leak into the | ||
3823 | + * critical section updating the page tables | ||
3824 | + */ | ||
3825 | + smp_mb__before_spinlock(); | ||
3826 | +} | ||
3827 | +/* Clearing is done after a TLB flush, which also provides a barrier. */ | ||
3828 | +static inline void clear_tlb_flush_pending(struct mm_struct *mm) | ||
3829 | +{ | ||
3830 | + barrier(); | ||
3831 | + mm->tlb_flush_pending = false; | ||
3832 | +} | ||
3833 | +#else | ||
3834 | +static inline bool mm_tlb_flush_pending(struct mm_struct *mm) | ||
3835 | +{ | ||
3836 | + return false; | ||
3837 | +} | ||
3838 | +static inline void set_tlb_flush_pending(struct mm_struct *mm) | ||
3839 | +{ | ||
3840 | +} | ||
3841 | +static inline void clear_tlb_flush_pending(struct mm_struct *mm) | ||
3842 | +{ | ||
3843 | +} | ||
3844 | +#endif | ||
3845 | + | ||
3846 | #endif /* _LINUX_MM_TYPES_H */ | ||
3847 | diff --git a/include/linux/reboot.h b/include/linux/reboot.h | ||
3848 | index 8e00f9f6f963..9e7db9e73cc1 100644 | ||
3849 | --- a/include/linux/reboot.h | ||
3850 | +++ b/include/linux/reboot.h | ||
3851 | @@ -43,6 +43,7 @@ extern int unregister_reboot_notifier(struct notifier_block *); | ||
3852 | * Architecture-specific implementations of sys_reboot commands. | ||
3853 | */ | ||
3854 | |||
3855 | +extern void migrate_to_reboot_cpu(void); | ||
3856 | extern void machine_restart(char *cmd); | ||
3857 | extern void machine_halt(void); | ||
3858 | extern void machine_power_off(void); | ||
3859 | diff --git a/include/target/target_core_base.h b/include/target/target_core_base.h | ||
3860 | index 5bdb8b7d2a69..23bfd1028457 100644 | ||
3861 | --- a/include/target/target_core_base.h | ||
3862 | +++ b/include/target/target_core_base.h | ||
3863 | @@ -624,6 +624,7 @@ struct se_dev_attrib { | ||
3864 | u32 unmap_granularity; | ||
3865 | u32 unmap_granularity_alignment; | ||
3866 | u32 max_write_same_len; | ||
3867 | + u32 max_bytes_per_io; | ||
3868 | struct se_device *da_dev; | ||
3869 | struct config_group da_group; | ||
3870 | }; | ||
3871 | diff --git a/include/uapi/drm/radeon_drm.h b/include/uapi/drm/radeon_drm.h | ||
3872 | index 46d41e8b0dcc..a71442bd7ec9 100644 | ||
3873 | --- a/include/uapi/drm/radeon_drm.h | ||
3874 | +++ b/include/uapi/drm/radeon_drm.h | ||
3875 | @@ -981,6 +981,8 @@ struct drm_radeon_cs { | ||
3876 | #define RADEON_INFO_SI_TILE_MODE_ARRAY 0x16 | ||
3877 | /* query if CP DMA is supported on the compute ring */ | ||
3878 | #define RADEON_INFO_SI_CP_DMA_COMPUTE 0x17 | ||
3879 | +/* query the number of render backends */ | ||
3880 | +#define RADEON_INFO_SI_BACKEND_ENABLED_MASK 0x19 | ||
3881 | |||
3882 | |||
3883 | struct drm_radeon_info { | ||
3884 | diff --git a/kernel/cgroup.c b/kernel/cgroup.c | ||
3885 | index 5c9127dc1b66..b6fd78344c53 100644 | ||
3886 | --- a/kernel/cgroup.c | ||
3887 | +++ b/kernel/cgroup.c | ||
3888 | @@ -4490,14 +4490,6 @@ static long cgroup_create(struct cgroup *parent, struct dentry *dentry, | ||
3889 | list_add_tail_rcu(&cgrp->sibling, &cgrp->parent->children); | ||
3890 | root->number_of_cgroups++; | ||
3891 | |||
3892 | - /* each css holds a ref to the cgroup's dentry and the parent css */ | ||
3893 | - for_each_root_subsys(root, ss) { | ||
3894 | - struct cgroup_subsys_state *css = css_ar[ss->subsys_id]; | ||
3895 | - | ||
3896 | - dget(dentry); | ||
3897 | - css_get(css->parent); | ||
3898 | - } | ||
3899 | - | ||
3900 | /* hold a ref to the parent's dentry */ | ||
3901 | dget(parent->dentry); | ||
3902 | |||
3903 | @@ -4509,6 +4501,13 @@ static long cgroup_create(struct cgroup *parent, struct dentry *dentry, | ||
3904 | if (err) | ||
3905 | goto err_destroy; | ||
3906 | |||
3907 | + /* each css holds a ref to the cgroup's dentry and parent css */ | ||
3908 | + dget(dentry); | ||
3909 | + css_get(css->parent); | ||
3910 | + | ||
3911 | + /* mark it consumed for error path */ | ||
3912 | + css_ar[ss->subsys_id] = NULL; | ||
3913 | + | ||
3914 | if (ss->broken_hierarchy && !ss->warned_broken_hierarchy && | ||
3915 | parent->parent) { | ||
3916 | pr_warning("cgroup: %s (%d) created nested cgroup for controller \"%s\" which has incomplete hierarchy support. Nested cgroups may change behavior in the future.\n", | ||
3917 | @@ -4555,6 +4554,14 @@ err_free_cgrp: | ||
3918 | return err; | ||
3919 | |||
3920 | err_destroy: | ||
3921 | + for_each_root_subsys(root, ss) { | ||
3922 | + struct cgroup_subsys_state *css = css_ar[ss->subsys_id]; | ||
3923 | + | ||
3924 | + if (css) { | ||
3925 | + percpu_ref_cancel_init(&css->refcnt); | ||
3926 | + ss->css_free(css); | ||
3927 | + } | ||
3928 | + } | ||
3929 | cgroup_destroy_locked(cgrp); | ||
3930 | mutex_unlock(&cgroup_mutex); | ||
3931 | mutex_unlock(&dentry->d_inode->i_mutex); | ||
3932 | @@ -4716,8 +4723,12 @@ static int cgroup_destroy_locked(struct cgroup *cgrp) | ||
3933 | * will be invoked to perform the rest of destruction once the | ||
3934 | * percpu refs of all css's are confirmed to be killed. | ||
3935 | */ | ||
3936 | - for_each_root_subsys(cgrp->root, ss) | ||
3937 | - kill_css(cgroup_css(cgrp, ss)); | ||
3938 | + for_each_root_subsys(cgrp->root, ss) { | ||
3939 | + struct cgroup_subsys_state *css = cgroup_css(cgrp, ss); | ||
3940 | + | ||
3941 | + if (css) | ||
3942 | + kill_css(css); | ||
3943 | + } | ||
3944 | |||
3945 | /* | ||
3946 | * Mark @cgrp dead. This prevents further task migration and child | ||
3947 | diff --git a/kernel/fork.c b/kernel/fork.c | ||
3948 | index 086fe73ad6bd..690cfacaed71 100644 | ||
3949 | --- a/kernel/fork.c | ||
3950 | +++ b/kernel/fork.c | ||
3951 | @@ -537,6 +537,7 @@ static struct mm_struct *mm_init(struct mm_struct *mm, struct task_struct *p) | ||
3952 | spin_lock_init(&mm->page_table_lock); | ||
3953 | mm_init_aio(mm); | ||
3954 | mm_init_owner(mm, p); | ||
3955 | + clear_tlb_flush_pending(mm); | ||
3956 | |||
3957 | if (likely(!mm_alloc_pgd(mm))) { | ||
3958 | mm->def_flags = 0; | ||
3959 | diff --git a/kernel/freezer.c b/kernel/freezer.c | ||
3960 | index b462fa197517..aa6a8aadb911 100644 | ||
3961 | --- a/kernel/freezer.c | ||
3962 | +++ b/kernel/freezer.c | ||
3963 | @@ -19,6 +19,12 @@ EXPORT_SYMBOL(system_freezing_cnt); | ||
3964 | bool pm_freezing; | ||
3965 | bool pm_nosig_freezing; | ||
3966 | |||
3967 | +/* | ||
3968 | + * Temporary export for the deadlock workaround in ata_scsi_hotplug(). | ||
3969 | + * Remove once the hack becomes unnecessary. | ||
3970 | + */ | ||
3971 | +EXPORT_SYMBOL_GPL(pm_freezing); | ||
3972 | + | ||
3973 | /* protects freezing and frozen transitions */ | ||
3974 | static DEFINE_SPINLOCK(freezer_lock); | ||
3975 | |||
3976 | diff --git a/kernel/kexec.c b/kernel/kexec.c | ||
3977 | index ecd783dda9ae..355e13af62c5 100644 | ||
3978 | --- a/kernel/kexec.c | ||
3979 | +++ b/kernel/kexec.c | ||
3980 | @@ -1680,6 +1680,7 @@ int kernel_kexec(void) | ||
3981 | { | ||
3982 | kexec_in_progress = true; | ||
3983 | kernel_restart_prepare(NULL); | ||
3984 | + migrate_to_reboot_cpu(); | ||
3985 | printk(KERN_EMERG "Starting new kernel\n"); | ||
3986 | machine_shutdown(); | ||
3987 | } | ||
3988 | diff --git a/kernel/reboot.c b/kernel/reboot.c | ||
3989 | index f813b3474646..662c83fc16b7 100644 | ||
3990 | --- a/kernel/reboot.c | ||
3991 | +++ b/kernel/reboot.c | ||
3992 | @@ -104,7 +104,7 @@ int unregister_reboot_notifier(struct notifier_block *nb) | ||
3993 | } | ||
3994 | EXPORT_SYMBOL(unregister_reboot_notifier); | ||
3995 | |||
3996 | -static void migrate_to_reboot_cpu(void) | ||
3997 | +void migrate_to_reboot_cpu(void) | ||
3998 | { | ||
3999 | /* The boot cpu is always logical cpu 0 */ | ||
4000 | int cpu = reboot_cpu; | ||
4001 | diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c | ||
4002 | index 513fc2fd5109..7765ad82736a 100644 | ||
4003 | --- a/kernel/sched/fair.c | ||
4004 | +++ b/kernel/sched/fair.c | ||
4005 | @@ -974,6 +974,13 @@ void task_numa_work(struct callback_head *work) | ||
4006 | if (vma->vm_end - vma->vm_start < HPAGE_SIZE) | ||
4007 | continue; | ||
4008 | |||
4009 | + /* | ||
4010 | + * Skip inaccessible VMAs to avoid any confusion between | ||
4011 | + * PROT_NONE and NUMA hinting ptes | ||
4012 | + */ | ||
4013 | + if (!(vma->vm_flags & (VM_READ | VM_EXEC | VM_WRITE))) | ||
4014 | + continue; | ||
4015 | + | ||
4016 | do { | ||
4017 | start = max(start, vma->vm_start); | ||
4018 | end = ALIGN(start + (pages << PAGE_SHIFT), HPAGE_SIZE); | ||
4019 | diff --git a/kernel/sched/rt.c b/kernel/sched/rt.c | ||
4020 | index 01970c8e64df..417b1b3fd7e9 100644 | ||
4021 | --- a/kernel/sched/rt.c | ||
4022 | +++ b/kernel/sched/rt.c | ||
4023 | @@ -899,6 +899,13 @@ inc_rt_prio_smp(struct rt_rq *rt_rq, int prio, int prev_prio) | ||
4024 | { | ||
4025 | struct rq *rq = rq_of_rt_rq(rt_rq); | ||
4026 | |||
4027 | +#ifdef CONFIG_RT_GROUP_SCHED | ||
4028 | + /* | ||
4029 | + * Change rq's cpupri only if rt_rq is the top queue. | ||
4030 | + */ | ||
4031 | + if (&rq->rt != rt_rq) | ||
4032 | + return; | ||
4033 | +#endif | ||
4034 | if (rq->online && prio < prev_prio) | ||
4035 | cpupri_set(&rq->rd->cpupri, rq->cpu, prio); | ||
4036 | } | ||
4037 | @@ -908,6 +915,13 @@ dec_rt_prio_smp(struct rt_rq *rt_rq, int prio, int prev_prio) | ||
4038 | { | ||
4039 | struct rq *rq = rq_of_rt_rq(rt_rq); | ||
4040 | |||
4041 | +#ifdef CONFIG_RT_GROUP_SCHED | ||
4042 | + /* | ||
4043 | + * Change rq's cpupri only if rt_rq is the top queue. | ||
4044 | + */ | ||
4045 | + if (&rq->rt != rt_rq) | ||
4046 | + return; | ||
4047 | +#endif | ||
4048 | if (rq->online && rt_rq->highest_prio.curr != prev_prio) | ||
4049 | cpupri_set(&rq->rd->cpupri, rq->cpu, rt_rq->highest_prio.curr); | ||
4050 | } | ||
4051 | diff --git a/kernel/trace/ftrace.c b/kernel/trace/ftrace.c | ||
4052 | index f3bd09eecb7e..1345d9ff0662 100644 | ||
4053 | --- a/kernel/trace/ftrace.c | ||
4054 | +++ b/kernel/trace/ftrace.c | ||
4055 | @@ -775,7 +775,7 @@ static int ftrace_profile_init(void) | ||
4056 | int cpu; | ||
4057 | int ret = 0; | ||
4058 | |||
4059 | - for_each_online_cpu(cpu) { | ||
4060 | + for_each_possible_cpu(cpu) { | ||
4061 | ret = ftrace_profile_init_cpu(cpu); | ||
4062 | if (ret) | ||
4063 | break; | ||
4064 | diff --git a/mm/compaction.c b/mm/compaction.c | ||
4065 | index b5326b141a25..74ad00908c79 100644 | ||
4066 | --- a/mm/compaction.c | ||
4067 | +++ b/mm/compaction.c | ||
4068 | @@ -134,6 +134,10 @@ static void update_pageblock_skip(struct compact_control *cc, | ||
4069 | bool migrate_scanner) | ||
4070 | { | ||
4071 | struct zone *zone = cc->zone; | ||
4072 | + | ||
4073 | + if (cc->ignore_skip_hint) | ||
4074 | + return; | ||
4075 | + | ||
4076 | if (!page) | ||
4077 | return; | ||
4078 | |||
4079 | diff --git a/mm/fremap.c b/mm/fremap.c | ||
4080 | index 5bff08147768..bbc4d660221a 100644 | ||
4081 | --- a/mm/fremap.c | ||
4082 | +++ b/mm/fremap.c | ||
4083 | @@ -208,9 +208,10 @@ get_write_lock: | ||
4084 | if (mapping_cap_account_dirty(mapping)) { | ||
4085 | unsigned long addr; | ||
4086 | struct file *file = get_file(vma->vm_file); | ||
4087 | + /* mmap_region may free vma; grab the info now */ | ||
4088 | + vm_flags = vma->vm_flags; | ||
4089 | |||
4090 | - addr = mmap_region(file, start, size, | ||
4091 | - vma->vm_flags, pgoff); | ||
4092 | + addr = mmap_region(file, start, size, vm_flags, pgoff); | ||
4093 | fput(file); | ||
4094 | if (IS_ERR_VALUE(addr)) { | ||
4095 | err = addr; | ||
4096 | @@ -218,7 +219,7 @@ get_write_lock: | ||
4097 | BUG_ON(addr != start); | ||
4098 | err = 0; | ||
4099 | } | ||
4100 | - goto out; | ||
4101 | + goto out_freed; | ||
4102 | } | ||
4103 | mutex_lock(&mapping->i_mmap_mutex); | ||
4104 | flush_dcache_mmap_lock(mapping); | ||
4105 | @@ -253,6 +254,7 @@ get_write_lock: | ||
4106 | out: | ||
4107 | if (vma) | ||
4108 | vm_flags = vma->vm_flags; | ||
4109 | +out_freed: | ||
4110 | if (likely(!has_write_lock)) | ||
4111 | up_read(&mm->mmap_sem); | ||
4112 | else | ||
4113 | diff --git a/mm/huge_memory.c b/mm/huge_memory.c | ||
4114 | index cca80d96e509..47962456ed87 100644 | ||
4115 | --- a/mm/huge_memory.c | ||
4116 | +++ b/mm/huge_memory.c | ||
4117 | @@ -884,6 +884,10 @@ int copy_huge_pmd(struct mm_struct *dst_mm, struct mm_struct *src_mm, | ||
4118 | ret = 0; | ||
4119 | goto out_unlock; | ||
4120 | } | ||
4121 | + | ||
4122 | + /* mmap_sem prevents this happening but warn if that changes */ | ||
4123 | + WARN_ON(pmd_trans_migrating(pmd)); | ||
4124 | + | ||
4125 | if (unlikely(pmd_trans_splitting(pmd))) { | ||
4126 | /* split huge page running from under us */ | ||
4127 | spin_unlock(&src_mm->page_table_lock); | ||
4128 | @@ -1240,6 +1244,10 @@ struct page *follow_trans_huge_pmd(struct vm_area_struct *vma, | ||
4129 | if ((flags & FOLL_DUMP) && is_huge_zero_pmd(*pmd)) | ||
4130 | return ERR_PTR(-EFAULT); | ||
4131 | |||
4132 | + /* Full NUMA hinting faults to serialise migration in fault paths */ | ||
4133 | + if ((flags & FOLL_NUMA) && pmd_numa(*pmd)) | ||
4134 | + goto out; | ||
4135 | + | ||
4136 | page = pmd_page(*pmd); | ||
4137 | VM_BUG_ON(!PageHead(page)); | ||
4138 | if (flags & FOLL_TOUCH) { | ||
4139 | @@ -1290,6 +1298,17 @@ int do_huge_pmd_numa_page(struct mm_struct *mm, struct vm_area_struct *vma, | ||
4140 | if (unlikely(!pmd_same(pmd, *pmdp))) | ||
4141 | goto out_unlock; | ||
4142 | |||
4143 | + /* | ||
4144 | + * If there are potential migrations, wait for completion and retry | ||
4145 | + * without disrupting NUMA hinting information. Do not relock and | ||
4146 | + * check_same as the page may no longer be mapped. | ||
4147 | + */ | ||
4148 | + if (unlikely(pmd_trans_migrating(*pmdp))) { | ||
4149 | + spin_unlock(&mm->page_table_lock); | ||
4150 | + wait_migrate_huge_page(vma->anon_vma, pmdp); | ||
4151 | + goto out; | ||
4152 | + } | ||
4153 | + | ||
4154 | page = pmd_page(pmd); | ||
4155 | page_nid = page_to_nid(page); | ||
4156 | count_vm_numa_event(NUMA_HINT_FAULTS); | ||
4157 | @@ -1306,23 +1325,22 @@ int do_huge_pmd_numa_page(struct mm_struct *mm, struct vm_area_struct *vma, | ||
4158 | /* If the page was locked, there are no parallel migrations */ | ||
4159 | if (page_locked) | ||
4160 | goto clear_pmdnuma; | ||
4161 | + } | ||
4162 | |||
4163 | - /* | ||
4164 | - * Otherwise wait for potential migrations and retry. We do | ||
4165 | - * relock and check_same as the page may no longer be mapped. | ||
4166 | - * As the fault is being retried, do not account for it. | ||
4167 | - */ | ||
4168 | + /* Migration could have started since the pmd_trans_migrating check */ | ||
4169 | + if (!page_locked) { | ||
4170 | spin_unlock(&mm->page_table_lock); | ||
4171 | wait_on_page_locked(page); | ||
4172 | page_nid = -1; | ||
4173 | goto out; | ||
4174 | } | ||
4175 | |||
4176 | - /* Page is misplaced, serialise migrations and parallel THP splits */ | ||
4177 | + /* | ||
4178 | + * Page is misplaced. Page lock serialises migrations. Acquire anon_vma | ||
4179 | + * to serialises splits | ||
4180 | + */ | ||
4181 | get_page(page); | ||
4182 | spin_unlock(&mm->page_table_lock); | ||
4183 | - if (!page_locked) | ||
4184 | - lock_page(page); | ||
4185 | anon_vma = page_lock_anon_vma_read(page); | ||
4186 | |||
4187 | /* Confirm the PTE did not while locked */ | ||
4188 | @@ -1334,6 +1352,13 @@ int do_huge_pmd_numa_page(struct mm_struct *mm, struct vm_area_struct *vma, | ||
4189 | goto out_unlock; | ||
4190 | } | ||
4191 | |||
4192 | + /* Bail if we fail to protect against THP splits for any reason */ | ||
4193 | + if (unlikely(!anon_vma)) { | ||
4194 | + put_page(page); | ||
4195 | + page_nid = -1; | ||
4196 | + goto clear_pmdnuma; | ||
4197 | + } | ||
4198 | + | ||
4199 | /* | ||
4200 | * Migrate the THP to the requested node, returns with page unlocked | ||
4201 | * and pmd_numa cleared. | ||
4202 | @@ -1466,20 +1491,24 @@ int change_huge_pmd(struct vm_area_struct *vma, pmd_t *pmd, | ||
4203 | |||
4204 | if (__pmd_trans_huge_lock(pmd, vma) == 1) { | ||
4205 | pmd_t entry; | ||
4206 | - entry = pmdp_get_and_clear(mm, addr, pmd); | ||
4207 | if (!prot_numa) { | ||
4208 | + entry = pmdp_get_and_clear(mm, addr, pmd); | ||
4209 | + if (pmd_numa(entry)) | ||
4210 | + entry = pmd_mknonnuma(entry); | ||
4211 | entry = pmd_modify(entry, newprot); | ||
4212 | BUG_ON(pmd_write(entry)); | ||
4213 | + set_pmd_at(mm, addr, pmd, entry); | ||
4214 | } else { | ||
4215 | struct page *page = pmd_page(*pmd); | ||
4216 | + entry = *pmd; | ||
4217 | |||
4218 | /* only check non-shared pages */ | ||
4219 | if (page_mapcount(page) == 1 && | ||
4220 | !pmd_numa(*pmd)) { | ||
4221 | entry = pmd_mknuma(entry); | ||
4222 | + set_pmd_at(mm, addr, pmd, entry); | ||
4223 | } | ||
4224 | } | ||
4225 | - set_pmd_at(mm, addr, pmd, entry); | ||
4226 | spin_unlock(&vma->vm_mm->page_table_lock); | ||
4227 | ret = 1; | ||
4228 | } | ||
4229 | diff --git a/mm/memcontrol.c b/mm/memcontrol.c | ||
4230 | index 36cc2d0570ab..e0e979276df0 100644 | ||
4231 | --- a/mm/memcontrol.c | ||
4232 | +++ b/mm/memcontrol.c | ||
4233 | @@ -337,7 +337,7 @@ struct mem_cgroup { | ||
4234 | static size_t memcg_size(void) | ||
4235 | { | ||
4236 | return sizeof(struct mem_cgroup) + | ||
4237 | - nr_node_ids * sizeof(struct mem_cgroup_per_node); | ||
4238 | + nr_node_ids * sizeof(struct mem_cgroup_per_node *); | ||
4239 | } | ||
4240 | |||
4241 | /* internal only representation about the status of kmem accounting. */ | ||
4242 | diff --git a/mm/memory-failure.c b/mm/memory-failure.c | ||
4243 | index bf3351b5115e..9aea53f4551c 100644 | ||
4244 | --- a/mm/memory-failure.c | ||
4245 | +++ b/mm/memory-failure.c | ||
4246 | @@ -938,6 +938,16 @@ static int hwpoison_user_mappings(struct page *p, unsigned long pfn, | ||
4247 | BUG_ON(!PageHWPoison(p)); | ||
4248 | return SWAP_FAIL; | ||
4249 | } | ||
4250 | + /* | ||
4251 | + * We pinned the head page for hwpoison handling, | ||
4252 | + * now we split the thp and we are interested in | ||
4253 | + * the hwpoisoned raw page, so move the refcount | ||
4254 | + * to it. | ||
4255 | + */ | ||
4256 | + if (hpage != p) { | ||
4257 | + put_page(hpage); | ||
4258 | + get_page(p); | ||
4259 | + } | ||
4260 | /* THP is split, so ppage should be the real poisoned page. */ | ||
4261 | ppage = p; | ||
4262 | } | ||
4263 | @@ -1519,10 +1529,16 @@ static int soft_offline_huge_page(struct page *page, int flags) | ||
4264 | if (ret > 0) | ||
4265 | ret = -EIO; | ||
4266 | } else { | ||
4267 | - set_page_hwpoison_huge_page(hpage); | ||
4268 | - dequeue_hwpoisoned_huge_page(hpage); | ||
4269 | - atomic_long_add(1 << compound_order(hpage), | ||
4270 | - &num_poisoned_pages); | ||
4271 | + /* overcommit hugetlb page will be freed to buddy */ | ||
4272 | + if (PageHuge(page)) { | ||
4273 | + set_page_hwpoison_huge_page(hpage); | ||
4274 | + dequeue_hwpoisoned_huge_page(hpage); | ||
4275 | + atomic_long_add(1 << compound_order(hpage), | ||
4276 | + &num_poisoned_pages); | ||
4277 | + } else { | ||
4278 | + SetPageHWPoison(page); | ||
4279 | + atomic_long_inc(&num_poisoned_pages); | ||
4280 | + } | ||
4281 | } | ||
4282 | return ret; | ||
4283 | } | ||
4284 | diff --git a/mm/mempolicy.c b/mm/mempolicy.c | ||
4285 | index 04729647f359..6b22d8f9bfb8 100644 | ||
4286 | --- a/mm/mempolicy.c | ||
4287 | +++ b/mm/mempolicy.c | ||
4288 | @@ -1317,7 +1317,7 @@ static long do_mbind(unsigned long start, unsigned long len, | ||
4289 | if (nr_failed && (flags & MPOL_MF_STRICT)) | ||
4290 | err = -EIO; | ||
4291 | } else | ||
4292 | - putback_lru_pages(&pagelist); | ||
4293 | + putback_movable_pages(&pagelist); | ||
4294 | |||
4295 | up_write(&mm->mmap_sem); | ||
4296 | mpol_out: | ||
4297 | diff --git a/mm/migrate.c b/mm/migrate.c | ||
4298 | index c04692774e88..e3cf71dd1288 100644 | ||
4299 | --- a/mm/migrate.c | ||
4300 | +++ b/mm/migrate.c | ||
4301 | @@ -36,6 +36,7 @@ | ||
4302 | #include <linux/hugetlb_cgroup.h> | ||
4303 | #include <linux/gfp.h> | ||
4304 | #include <linux/balloon_compaction.h> | ||
4305 | +#include <linux/mmu_notifier.h> | ||
4306 | |||
4307 | #include <asm/tlbflush.h> | ||
4308 | |||
4309 | @@ -315,14 +316,15 @@ static inline bool buffer_migrate_lock_buffers(struct buffer_head *head, | ||
4310 | */ | ||
4311 | int migrate_page_move_mapping(struct address_space *mapping, | ||
4312 | struct page *newpage, struct page *page, | ||
4313 | - struct buffer_head *head, enum migrate_mode mode) | ||
4314 | + struct buffer_head *head, enum migrate_mode mode, | ||
4315 | + int extra_count) | ||
4316 | { | ||
4317 | - int expected_count = 0; | ||
4318 | + int expected_count = 1 + extra_count; | ||
4319 | void **pslot; | ||
4320 | |||
4321 | if (!mapping) { | ||
4322 | /* Anonymous page without mapping */ | ||
4323 | - if (page_count(page) != 1) | ||
4324 | + if (page_count(page) != expected_count) | ||
4325 | return -EAGAIN; | ||
4326 | return MIGRATEPAGE_SUCCESS; | ||
4327 | } | ||
4328 | @@ -332,7 +334,7 @@ int migrate_page_move_mapping(struct address_space *mapping, | ||
4329 | pslot = radix_tree_lookup_slot(&mapping->page_tree, | ||
4330 | page_index(page)); | ||
4331 | |||
4332 | - expected_count = 2 + page_has_private(page); | ||
4333 | + expected_count += 1 + page_has_private(page); | ||
4334 | if (page_count(page) != expected_count || | ||
4335 | radix_tree_deref_slot_protected(pslot, &mapping->tree_lock) != page) { | ||
4336 | spin_unlock_irq(&mapping->tree_lock); | ||
4337 | @@ -525,7 +527,7 @@ int migrate_page(struct address_space *mapping, | ||
4338 | |||
4339 | BUG_ON(PageWriteback(page)); /* Writeback must be complete */ | ||
4340 | |||
4341 | - rc = migrate_page_move_mapping(mapping, newpage, page, NULL, mode); | ||
4342 | + rc = migrate_page_move_mapping(mapping, newpage, page, NULL, mode, 0); | ||
4343 | |||
4344 | if (rc != MIGRATEPAGE_SUCCESS) | ||
4345 | return rc; | ||
4346 | @@ -552,7 +554,7 @@ int buffer_migrate_page(struct address_space *mapping, | ||
4347 | |||
4348 | head = page_buffers(page); | ||
4349 | |||
4350 | - rc = migrate_page_move_mapping(mapping, newpage, page, head, mode); | ||
4351 | + rc = migrate_page_move_mapping(mapping, newpage, page, head, mode, 0); | ||
4352 | |||
4353 | if (rc != MIGRATEPAGE_SUCCESS) | ||
4354 | return rc; | ||
4355 | @@ -1596,6 +1598,18 @@ int numamigrate_isolate_page(pg_data_t *pgdat, struct page *page) | ||
4356 | return 1; | ||
4357 | } | ||
4358 | |||
4359 | +bool pmd_trans_migrating(pmd_t pmd) | ||
4360 | +{ | ||
4361 | + struct page *page = pmd_page(pmd); | ||
4362 | + return PageLocked(page); | ||
4363 | +} | ||
4364 | + | ||
4365 | +void wait_migrate_huge_page(struct anon_vma *anon_vma, pmd_t *pmd) | ||
4366 | +{ | ||
4367 | + struct page *page = pmd_page(*pmd); | ||
4368 | + wait_on_page_locked(page); | ||
4369 | +} | ||
4370 | + | ||
4371 | /* | ||
4372 | * Attempt to migrate a misplaced page to the specified destination | ||
4373 | * node. Caller is expected to have an elevated reference count on | ||
4374 | @@ -1655,12 +1669,14 @@ int migrate_misplaced_transhuge_page(struct mm_struct *mm, | ||
4375 | unsigned long address, | ||
4376 | struct page *page, int node) | ||
4377 | { | ||
4378 | - unsigned long haddr = address & HPAGE_PMD_MASK; | ||
4379 | pg_data_t *pgdat = NODE_DATA(node); | ||
4380 | int isolated = 0; | ||
4381 | struct page *new_page = NULL; | ||
4382 | struct mem_cgroup *memcg = NULL; | ||
4383 | int page_lru = page_is_file_cache(page); | ||
4384 | + unsigned long mmun_start = address & HPAGE_PMD_MASK; | ||
4385 | + unsigned long mmun_end = mmun_start + HPAGE_PMD_SIZE; | ||
4386 | + pmd_t orig_entry; | ||
4387 | |||
4388 | /* | ||
4389 | * Don't migrate pages that are mapped in multiple processes. | ||
4390 | @@ -1690,6 +1706,9 @@ int migrate_misplaced_transhuge_page(struct mm_struct *mm, | ||
4391 | goto out_fail; | ||
4392 | } | ||
4393 | |||
4394 | + if (mm_tlb_flush_pending(mm)) | ||
4395 | + flush_tlb_range(vma, mmun_start, mmun_end); | ||
4396 | + | ||
4397 | /* Prepare a page as a migration target */ | ||
4398 | __set_page_locked(new_page); | ||
4399 | SetPageSwapBacked(new_page); | ||
4400 | @@ -1701,9 +1720,12 @@ int migrate_misplaced_transhuge_page(struct mm_struct *mm, | ||
4401 | WARN_ON(PageLRU(new_page)); | ||
4402 | |||
4403 | /* Recheck the target PMD */ | ||
4404 | + mmu_notifier_invalidate_range_start(mm, mmun_start, mmun_end); | ||
4405 | spin_lock(&mm->page_table_lock); | ||
4406 | - if (unlikely(!pmd_same(*pmd, entry))) { | ||
4407 | + if (unlikely(!pmd_same(*pmd, entry) || page_count(page) != 2)) { | ||
4408 | +fail_putback: | ||
4409 | spin_unlock(&mm->page_table_lock); | ||
4410 | + mmu_notifier_invalidate_range_end(mm, mmun_start, mmun_end); | ||
4411 | |||
4412 | /* Reverse changes made by migrate_page_copy() */ | ||
4413 | if (TestClearPageActive(new_page)) | ||
4414 | @@ -1720,7 +1742,8 @@ int migrate_misplaced_transhuge_page(struct mm_struct *mm, | ||
4415 | putback_lru_page(page); | ||
4416 | mod_zone_page_state(page_zone(page), | ||
4417 | NR_ISOLATED_ANON + page_lru, -HPAGE_PMD_NR); | ||
4418 | - goto out_fail; | ||
4419 | + | ||
4420 | + goto out_unlock; | ||
4421 | } | ||
4422 | |||
4423 | /* | ||
4424 | @@ -1732,16 +1755,35 @@ int migrate_misplaced_transhuge_page(struct mm_struct *mm, | ||
4425 | */ | ||
4426 | mem_cgroup_prepare_migration(page, new_page, &memcg); | ||
4427 | |||
4428 | + orig_entry = *pmd; | ||
4429 | entry = mk_pmd(new_page, vma->vm_page_prot); | ||
4430 | - entry = pmd_mknonnuma(entry); | ||
4431 | - entry = maybe_pmd_mkwrite(pmd_mkdirty(entry), vma); | ||
4432 | entry = pmd_mkhuge(entry); | ||
4433 | + entry = maybe_pmd_mkwrite(pmd_mkdirty(entry), vma); | ||
4434 | |||
4435 | - pmdp_clear_flush(vma, haddr, pmd); | ||
4436 | - set_pmd_at(mm, haddr, pmd, entry); | ||
4437 | - page_add_new_anon_rmap(new_page, vma, haddr); | ||
4438 | + /* | ||
4439 | + * Clear the old entry under pagetable lock and establish the new PTE. | ||
4440 | + * Any parallel GUP will either observe the old page blocking on the | ||
4441 | + * page lock, block on the page table lock or observe the new page. | ||
4442 | + * The SetPageUptodate on the new page and page_add_new_anon_rmap | ||
4443 | + * guarantee the copy is visible before the pagetable update. | ||
4444 | + */ | ||
4445 | + flush_cache_range(vma, mmun_start, mmun_end); | ||
4446 | + page_add_new_anon_rmap(new_page, vma, mmun_start); | ||
4447 | + pmdp_clear_flush(vma, mmun_start, pmd); | ||
4448 | + set_pmd_at(mm, mmun_start, pmd, entry); | ||
4449 | + flush_tlb_range(vma, mmun_start, mmun_end); | ||
4450 | update_mmu_cache_pmd(vma, address, &entry); | ||
4451 | + | ||
4452 | + if (page_count(page) != 2) { | ||
4453 | + set_pmd_at(mm, mmun_start, pmd, orig_entry); | ||
4454 | + flush_tlb_range(vma, mmun_start, mmun_end); | ||
4455 | + update_mmu_cache_pmd(vma, address, &entry); | ||
4456 | + page_remove_rmap(new_page); | ||
4457 | + goto fail_putback; | ||
4458 | + } | ||
4459 | + | ||
4460 | page_remove_rmap(page); | ||
4461 | + | ||
4462 | /* | ||
4463 | * Finish the charge transaction under the page table lock to | ||
4464 | * prevent split_huge_page() from dividing up the charge | ||
4465 | @@ -1749,6 +1791,7 @@ int migrate_misplaced_transhuge_page(struct mm_struct *mm, | ||
4466 | */ | ||
4467 | mem_cgroup_end_migration(memcg, page, new_page, true); | ||
4468 | spin_unlock(&mm->page_table_lock); | ||
4469 | + mmu_notifier_invalidate_range_end(mm, mmun_start, mmun_end); | ||
4470 | |||
4471 | unlock_page(new_page); | ||
4472 | unlock_page(page); | ||
4473 | @@ -1766,10 +1809,15 @@ int migrate_misplaced_transhuge_page(struct mm_struct *mm, | ||
4474 | out_fail: | ||
4475 | count_vm_events(PGMIGRATE_FAIL, HPAGE_PMD_NR); | ||
4476 | out_dropref: | ||
4477 | - entry = pmd_mknonnuma(entry); | ||
4478 | - set_pmd_at(mm, haddr, pmd, entry); | ||
4479 | - update_mmu_cache_pmd(vma, address, &entry); | ||
4480 | + spin_lock(&mm->page_table_lock); | ||
4481 | + if (pmd_same(*pmd, entry)) { | ||
4482 | + entry = pmd_mknonnuma(entry); | ||
4483 | + set_pmd_at(mm, mmun_start, pmd, entry); | ||
4484 | + update_mmu_cache_pmd(vma, address, &entry); | ||
4485 | + } | ||
4486 | + spin_unlock(&mm->page_table_lock); | ||
4487 | |||
4488 | +out_unlock: | ||
4489 | unlock_page(page); | ||
4490 | put_page(page); | ||
4491 | return 0; | ||
4492 | diff --git a/mm/mlock.c b/mm/mlock.c | ||
4493 | index d480cd6fc475..192e6eebe4f2 100644 | ||
4494 | --- a/mm/mlock.c | ||
4495 | +++ b/mm/mlock.c | ||
4496 | @@ -133,7 +133,10 @@ static void __munlock_isolation_failed(struct page *page) | ||
4497 | |||
4498 | /** | ||
4499 | * munlock_vma_page - munlock a vma page | ||
4500 | - * @page - page to be unlocked | ||
4501 | + * @page - page to be unlocked, either a normal page or THP page head | ||
4502 | + * | ||
4503 | + * returns the size of the page as a page mask (0 for normal page, | ||
4504 | + * HPAGE_PMD_NR - 1 for THP head page) | ||
4505 | * | ||
4506 | * called from munlock()/munmap() path with page supposedly on the LRU. | ||
4507 | * When we munlock a page, because the vma where we found the page is being | ||
4508 | @@ -148,21 +151,30 @@ static void __munlock_isolation_failed(struct page *page) | ||
4509 | */ | ||
4510 | unsigned int munlock_vma_page(struct page *page) | ||
4511 | { | ||
4512 | - unsigned int page_mask = 0; | ||
4513 | + unsigned int nr_pages; | ||
4514 | |||
4515 | BUG_ON(!PageLocked(page)); | ||
4516 | |||
4517 | if (TestClearPageMlocked(page)) { | ||
4518 | - unsigned int nr_pages = hpage_nr_pages(page); | ||
4519 | + nr_pages = hpage_nr_pages(page); | ||
4520 | mod_zone_page_state(page_zone(page), NR_MLOCK, -nr_pages); | ||
4521 | - page_mask = nr_pages - 1; | ||
4522 | if (!isolate_lru_page(page)) | ||
4523 | __munlock_isolated_page(page); | ||
4524 | else | ||
4525 | __munlock_isolation_failed(page); | ||
4526 | + } else { | ||
4527 | + nr_pages = hpage_nr_pages(page); | ||
4528 | } | ||
4529 | |||
4530 | - return page_mask; | ||
4531 | + /* | ||
4532 | + * Regardless of the original PageMlocked flag, we determine nr_pages | ||
4533 | + * after touching the flag. This leaves a possible race with a THP page | ||
4534 | + * split, such that a whole THP page was munlocked, but nr_pages == 1. | ||
4535 | + * Returning a smaller mask due to that is OK, the worst that can | ||
4536 | + * happen is subsequent useless scanning of the former tail pages. | ||
4537 | + * The NR_MLOCK accounting can however become broken. | ||
4538 | + */ | ||
4539 | + return nr_pages - 1; | ||
4540 | } | ||
4541 | |||
4542 | /** | ||
4543 | @@ -286,10 +298,12 @@ static void __munlock_pagevec(struct pagevec *pvec, struct zone *zone) | ||
4544 | { | ||
4545 | int i; | ||
4546 | int nr = pagevec_count(pvec); | ||
4547 | - int delta_munlocked = -nr; | ||
4548 | + int delta_munlocked; | ||
4549 | struct pagevec pvec_putback; | ||
4550 | int pgrescued = 0; | ||
4551 | |||
4552 | + pagevec_init(&pvec_putback, 0); | ||
4553 | + | ||
4554 | /* Phase 1: page isolation */ | ||
4555 | spin_lock_irq(&zone->lru_lock); | ||
4556 | for (i = 0; i < nr; i++) { | ||
4557 | @@ -318,18 +332,21 @@ skip_munlock: | ||
4558 | /* | ||
4559 | * We won't be munlocking this page in the next phase | ||
4560 | * but we still need to release the follow_page_mask() | ||
4561 | - * pin. | ||
4562 | + * pin. We cannot do it under lru_lock however. If it's | ||
4563 | + * the last pin, __page_cache_release would deadlock. | ||
4564 | */ | ||
4565 | + pagevec_add(&pvec_putback, pvec->pages[i]); | ||
4566 | pvec->pages[i] = NULL; | ||
4567 | - put_page(page); | ||
4568 | - delta_munlocked++; | ||
4569 | } | ||
4570 | } | ||
4571 | + delta_munlocked = -nr + pagevec_count(&pvec_putback); | ||
4572 | __mod_zone_page_state(zone, NR_MLOCK, delta_munlocked); | ||
4573 | spin_unlock_irq(&zone->lru_lock); | ||
4574 | |||
4575 | + /* Now we can release pins of pages that we are not munlocking */ | ||
4576 | + pagevec_release(&pvec_putback); | ||
4577 | + | ||
4578 | /* Phase 2: page munlock */ | ||
4579 | - pagevec_init(&pvec_putback, 0); | ||
4580 | for (i = 0; i < nr; i++) { | ||
4581 | struct page *page = pvec->pages[i]; | ||
4582 | |||
4583 | @@ -440,7 +457,8 @@ void munlock_vma_pages_range(struct vm_area_struct *vma, | ||
4584 | |||
4585 | while (start < end) { | ||
4586 | struct page *page = NULL; | ||
4587 | - unsigned int page_mask, page_increm; | ||
4588 | + unsigned int page_mask; | ||
4589 | + unsigned long page_increm; | ||
4590 | struct pagevec pvec; | ||
4591 | struct zone *zone; | ||
4592 | int zoneid; | ||
4593 | @@ -490,7 +508,9 @@ void munlock_vma_pages_range(struct vm_area_struct *vma, | ||
4594 | goto next; | ||
4595 | } | ||
4596 | } | ||
4597 | - page_increm = 1 + (~(start >> PAGE_SHIFT) & page_mask); | ||
4598 | + /* It's a bug to munlock in the middle of a THP page */ | ||
4599 | + VM_BUG_ON((start >> PAGE_SHIFT) & page_mask); | ||
4600 | + page_increm = 1 + page_mask; | ||
4601 | start += page_increm * PAGE_SIZE; | ||
4602 | next: | ||
4603 | cond_resched(); | ||
4604 | diff --git a/mm/mprotect.c b/mm/mprotect.c | ||
4605 | index 6c3f56f19275..7651a571f283 100644 | ||
4606 | --- a/mm/mprotect.c | ||
4607 | +++ b/mm/mprotect.c | ||
4608 | @@ -54,13 +54,16 @@ static unsigned long change_pte_range(struct vm_area_struct *vma, pmd_t *pmd, | ||
4609 | pte_t ptent; | ||
4610 | bool updated = false; | ||
4611 | |||
4612 | - ptent = ptep_modify_prot_start(mm, addr, pte); | ||
4613 | if (!prot_numa) { | ||
4614 | + ptent = ptep_modify_prot_start(mm, addr, pte); | ||
4615 | + if (pte_numa(ptent)) | ||
4616 | + ptent = pte_mknonnuma(ptent); | ||
4617 | ptent = pte_modify(ptent, newprot); | ||
4618 | updated = true; | ||
4619 | } else { | ||
4620 | struct page *page; | ||
4621 | |||
4622 | + ptent = *pte; | ||
4623 | page = vm_normal_page(vma, addr, oldpte); | ||
4624 | if (page) { | ||
4625 | int this_nid = page_to_nid(page); | ||
4626 | @@ -73,6 +76,7 @@ static unsigned long change_pte_range(struct vm_area_struct *vma, pmd_t *pmd, | ||
4627 | if (!pte_numa(oldpte) && | ||
4628 | page_mapcount(page) == 1) { | ||
4629 | ptent = pte_mknuma(ptent); | ||
4630 | + set_pte_at(mm, addr, pte, ptent); | ||
4631 | updated = true; | ||
4632 | } | ||
4633 | } | ||
4634 | @@ -89,7 +93,10 @@ static unsigned long change_pte_range(struct vm_area_struct *vma, pmd_t *pmd, | ||
4635 | |||
4636 | if (updated) | ||
4637 | pages++; | ||
4638 | - ptep_modify_prot_commit(mm, addr, pte, ptent); | ||
4639 | + | ||
4640 | + /* Only !prot_numa always clears the pte */ | ||
4641 | + if (!prot_numa) | ||
4642 | + ptep_modify_prot_commit(mm, addr, pte, ptent); | ||
4643 | } else if (IS_ENABLED(CONFIG_MIGRATION) && !pte_file(oldpte)) { | ||
4644 | swp_entry_t entry = pte_to_swp_entry(oldpte); | ||
4645 | |||
4646 | @@ -209,6 +216,7 @@ static unsigned long change_protection_range(struct vm_area_struct *vma, | ||
4647 | BUG_ON(addr >= end); | ||
4648 | pgd = pgd_offset(mm, addr); | ||
4649 | flush_cache_range(vma, addr, end); | ||
4650 | + set_tlb_flush_pending(mm); | ||
4651 | do { | ||
4652 | next = pgd_addr_end(addr, end); | ||
4653 | if (pgd_none_or_clear_bad(pgd)) | ||
4654 | @@ -220,6 +228,7 @@ static unsigned long change_protection_range(struct vm_area_struct *vma, | ||
4655 | /* Only flush the TLB if we actually modified any entries: */ | ||
4656 | if (pages) | ||
4657 | flush_tlb_range(vma, start, end); | ||
4658 | + clear_tlb_flush_pending(mm); | ||
4659 | |||
4660 | return pages; | ||
4661 | } | ||
4662 | diff --git a/mm/page_alloc.c b/mm/page_alloc.c | ||
4663 | index dd886fac451a..317ea747d2cd 100644 | ||
4664 | --- a/mm/page_alloc.c | ||
4665 | +++ b/mm/page_alloc.c | ||
4666 | @@ -1822,7 +1822,7 @@ static void zlc_clear_zones_full(struct zonelist *zonelist) | ||
4667 | |||
4668 | static bool zone_local(struct zone *local_zone, struct zone *zone) | ||
4669 | { | ||
4670 | - return node_distance(local_zone->node, zone->node) == LOCAL_DISTANCE; | ||
4671 | + return local_zone->node == zone->node; | ||
4672 | } | ||
4673 | |||
4674 | static bool zone_allows_reclaim(struct zone *local_zone, struct zone *zone) | ||
4675 | @@ -1919,18 +1919,17 @@ zonelist_scan: | ||
4676 | * page was allocated in should have no effect on the | ||
4677 | * time the page has in memory before being reclaimed. | ||
4678 | * | ||
4679 | - * When zone_reclaim_mode is enabled, try to stay in | ||
4680 | - * local zones in the fastpath. If that fails, the | ||
4681 | - * slowpath is entered, which will do another pass | ||
4682 | - * starting with the local zones, but ultimately fall | ||
4683 | - * back to remote zones that do not partake in the | ||
4684 | - * fairness round-robin cycle of this zonelist. | ||
4685 | + * Try to stay in local zones in the fastpath. If | ||
4686 | + * that fails, the slowpath is entered, which will do | ||
4687 | + * another pass starting with the local zones, but | ||
4688 | + * ultimately fall back to remote zones that do not | ||
4689 | + * partake in the fairness round-robin cycle of this | ||
4690 | + * zonelist. | ||
4691 | */ | ||
4692 | if (alloc_flags & ALLOC_WMARK_LOW) { | ||
4693 | if (zone_page_state(zone, NR_ALLOC_BATCH) <= 0) | ||
4694 | continue; | ||
4695 | - if (zone_reclaim_mode && | ||
4696 | - !zone_local(preferred_zone, zone)) | ||
4697 | + if (!zone_local(preferred_zone, zone)) | ||
4698 | continue; | ||
4699 | } | ||
4700 | /* | ||
4701 | @@ -2396,7 +2395,7 @@ static void prepare_slowpath(gfp_t gfp_mask, unsigned int order, | ||
4702 | * thrash fairness information for zones that are not | ||
4703 | * actually part of this zonelist's round-robin cycle. | ||
4704 | */ | ||
4705 | - if (zone_reclaim_mode && !zone_local(preferred_zone, zone)) | ||
4706 | + if (!zone_local(preferred_zone, zone)) | ||
4707 | continue; | ||
4708 | mod_zone_page_state(zone, NR_ALLOC_BATCH, | ||
4709 | high_wmark_pages(zone) - | ||
4710 | diff --git a/mm/pgtable-generic.c b/mm/pgtable-generic.c | ||
4711 | index 3929a40bd6c0..28e64f504ba5 100644 | ||
4712 | --- a/mm/pgtable-generic.c | ||
4713 | +++ b/mm/pgtable-generic.c | ||
4714 | @@ -110,9 +110,10 @@ int pmdp_clear_flush_young(struct vm_area_struct *vma, | ||
4715 | pte_t ptep_clear_flush(struct vm_area_struct *vma, unsigned long address, | ||
4716 | pte_t *ptep) | ||
4717 | { | ||
4718 | + struct mm_struct *mm = (vma)->vm_mm; | ||
4719 | pte_t pte; | ||
4720 | - pte = ptep_get_and_clear((vma)->vm_mm, address, ptep); | ||
4721 | - if (pte_accessible(pte)) | ||
4722 | + pte = ptep_get_and_clear(mm, address, ptep); | ||
4723 | + if (pte_accessible(mm, pte)) | ||
4724 | flush_tlb_page(vma, address); | ||
4725 | return pte; | ||
4726 | } | ||
4727 | @@ -191,6 +192,9 @@ pgtable_t pgtable_trans_huge_withdraw(struct mm_struct *mm, pmd_t *pmdp) | ||
4728 | void pmdp_invalidate(struct vm_area_struct *vma, unsigned long address, | ||
4729 | pmd_t *pmdp) | ||
4730 | { | ||
4731 | + pmd_t entry = *pmdp; | ||
4732 | + if (pmd_numa(entry)) | ||
4733 | + entry = pmd_mknonnuma(entry); | ||
4734 | set_pmd_at(vma->vm_mm, address, pmdp, pmd_mknotpresent(*pmdp)); | ||
4735 | flush_tlb_range(vma, address, address + HPAGE_PMD_SIZE); | ||
4736 | } | ||
4737 | diff --git a/mm/rmap.c b/mm/rmap.c | ||
4738 | index fd3ee7a54a13..b9d2222a0ecb 100644 | ||
4739 | --- a/mm/rmap.c | ||
4740 | +++ b/mm/rmap.c | ||
4741 | @@ -600,7 +600,11 @@ pte_t *__page_check_address(struct page *page, struct mm_struct *mm, | ||
4742 | spinlock_t *ptl; | ||
4743 | |||
4744 | if (unlikely(PageHuge(page))) { | ||
4745 | + /* when pud is not present, pte will be NULL */ | ||
4746 | pte = huge_pte_offset(mm, address); | ||
4747 | + if (!pte) | ||
4748 | + return NULL; | ||
4749 | + | ||
4750 | ptl = &mm->page_table_lock; | ||
4751 | goto check; | ||
4752 | } | ||
4753 | diff --git a/net/wireless/radiotap.c b/net/wireless/radiotap.c | ||
4754 | index a271c27fac77..722da616438c 100644 | ||
4755 | --- a/net/wireless/radiotap.c | ||
4756 | +++ b/net/wireless/radiotap.c | ||
4757 | @@ -124,6 +124,10 @@ int ieee80211_radiotap_iterator_init( | ||
4758 | /* find payload start allowing for extended bitmap(s) */ | ||
4759 | |||
4760 | if (iterator->_bitmap_shifter & (1<<IEEE80211_RADIOTAP_EXT)) { | ||
4761 | + if ((unsigned long)iterator->_arg - | ||
4762 | + (unsigned long)iterator->_rtheader + sizeof(uint32_t) > | ||
4763 | + (unsigned long)iterator->_max_length) | ||
4764 | + return -EINVAL; | ||
4765 | while (get_unaligned_le32(iterator->_arg) & | ||
4766 | (1 << IEEE80211_RADIOTAP_EXT)) { | ||
4767 | iterator->_arg += sizeof(uint32_t); | ||
4768 | diff --git a/scripts/link-vmlinux.sh b/scripts/link-vmlinux.sh | ||
4769 | index 32b10f53d0b4..2dcb37736d84 100644 | ||
4770 | --- a/scripts/link-vmlinux.sh | ||
4771 | +++ b/scripts/link-vmlinux.sh | ||
4772 | @@ -82,7 +82,9 @@ kallsyms() | ||
4773 | kallsymopt="${kallsymopt} --all-symbols" | ||
4774 | fi | ||
4775 | |||
4776 | - kallsymopt="${kallsymopt} --page-offset=$CONFIG_PAGE_OFFSET" | ||
4777 | + if [ -n "${CONFIG_ARM}" ] && [ -n "${CONFIG_PAGE_OFFSET}" ]; then | ||
4778 | + kallsymopt="${kallsymopt} --page-offset=$CONFIG_PAGE_OFFSET" | ||
4779 | + fi | ||
4780 | |||
4781 | local aflags="${KBUILD_AFLAGS} ${KBUILD_AFLAGS_KERNEL} \ | ||
4782 | ${NOSTDINC_FLAGS} ${LINUXINCLUDE} ${KBUILD_CPPFLAGS}" | ||
4783 | diff --git a/security/selinux/hooks.c b/security/selinux/hooks.c | ||
4784 | index d9a78fd8a2e1..392a0445265c 100644 | ||
4785 | --- a/security/selinux/hooks.c | ||
4786 | +++ b/security/selinux/hooks.c | ||
4787 | @@ -3792,7 +3792,7 @@ static int selinux_skb_peerlbl_sid(struct sk_buff *skb, u16 family, u32 *sid) | ||
4788 | u32 nlbl_sid; | ||
4789 | u32 nlbl_type; | ||
4790 | |||
4791 | - selinux_skb_xfrm_sid(skb, &xfrm_sid); | ||
4792 | + selinux_xfrm_skb_sid(skb, &xfrm_sid); | ||
4793 | selinux_netlbl_skbuff_getsid(skb, family, &nlbl_type, &nlbl_sid); | ||
4794 | |||
4795 | err = security_net_peersid_resolve(nlbl_sid, nlbl_type, xfrm_sid, sid); | ||
4796 | @@ -4297,8 +4297,10 @@ static int selinux_socket_sock_rcv_skb(struct sock *sk, struct sk_buff *skb) | ||
4797 | } | ||
4798 | err = avc_has_perm(sk_sid, peer_sid, SECCLASS_PEER, | ||
4799 | PEER__RECV, &ad); | ||
4800 | - if (err) | ||
4801 | + if (err) { | ||
4802 | selinux_netlbl_err(skb, err, 0); | ||
4803 | + return err; | ||
4804 | + } | ||
4805 | } | ||
4806 | |||
4807 | if (secmark_active) { | ||
4808 | @@ -4809,22 +4811,32 @@ static unsigned int selinux_ip_postroute(struct sk_buff *skb, int ifindex, | ||
4809 | * as fast and as clean as possible. */ | ||
4810 | if (!selinux_policycap_netpeer) | ||
4811 | return selinux_ip_postroute_compat(skb, ifindex, family); | ||
4812 | + | ||
4813 | + secmark_active = selinux_secmark_enabled(); | ||
4814 | + peerlbl_active = netlbl_enabled() || selinux_xfrm_enabled(); | ||
4815 | + if (!secmark_active && !peerlbl_active) | ||
4816 | + return NF_ACCEPT; | ||
4817 | + | ||
4818 | + sk = skb->sk; | ||
4819 | + | ||
4820 | #ifdef CONFIG_XFRM | ||
4821 | /* If skb->dst->xfrm is non-NULL then the packet is undergoing an IPsec | ||
4822 | * packet transformation so allow the packet to pass without any checks | ||
4823 | * since we'll have another chance to perform access control checks | ||
4824 | * when the packet is on it's final way out. | ||
4825 | * NOTE: there appear to be some IPv6 multicast cases where skb->dst | ||
4826 | - * is NULL, in this case go ahead and apply access control. */ | ||
4827 | - if (skb_dst(skb) != NULL && skb_dst(skb)->xfrm != NULL) | ||
4828 | + * is NULL, in this case go ahead and apply access control. | ||
4829 | + * is NULL, in this case go ahead and apply access control. | ||
4830 | + * NOTE: if this is a local socket (skb->sk != NULL) that is in the | ||
4831 | + * TCP listening state we cannot wait until the XFRM processing | ||
4832 | + * is done as we will miss out on the SA label if we do; | ||
4833 | + * unfortunately, this means more work, but it is only once per | ||
4834 | + * connection. */ | ||
4835 | + if (skb_dst(skb) != NULL && skb_dst(skb)->xfrm != NULL && | ||
4836 | + !(sk != NULL && sk->sk_state == TCP_LISTEN)) | ||
4837 | return NF_ACCEPT; | ||
4838 | #endif | ||
4839 | - secmark_active = selinux_secmark_enabled(); | ||
4840 | - peerlbl_active = netlbl_enabled() || selinux_xfrm_enabled(); | ||
4841 | - if (!secmark_active && !peerlbl_active) | ||
4842 | - return NF_ACCEPT; | ||
4843 | |||
4844 | - sk = skb->sk; | ||
4845 | if (sk == NULL) { | ||
4846 | /* Without an associated socket the packet is either coming | ||
4847 | * from the kernel or it is being forwarded; check the packet | ||
4848 | @@ -4852,6 +4864,25 @@ static unsigned int selinux_ip_postroute(struct sk_buff *skb, int ifindex, | ||
4849 | struct sk_security_struct *sksec = sk->sk_security; | ||
4850 | if (selinux_skb_peerlbl_sid(skb, family, &skb_sid)) | ||
4851 | return NF_DROP; | ||
4852 | + /* At this point, if the returned skb peerlbl is SECSID_NULL | ||
4853 | + * and the packet has been through at least one XFRM | ||
4854 | + * transformation then we must be dealing with the "final" | ||
4855 | + * form of labeled IPsec packet; since we've already applied | ||
4856 | + * all of our access controls on this packet we can safely | ||
4857 | + * pass the packet. */ | ||
4858 | + if (skb_sid == SECSID_NULL) { | ||
4859 | + switch (family) { | ||
4860 | + case PF_INET: | ||
4861 | + if (IPCB(skb)->flags & IPSKB_XFRM_TRANSFORMED) | ||
4862 | + return NF_ACCEPT; | ||
4863 | + break; | ||
4864 | + case PF_INET6: | ||
4865 | + if (IP6CB(skb)->flags & IP6SKB_XFRM_TRANSFORMED) | ||
4866 | + return NF_ACCEPT; | ||
4867 | + default: | ||
4868 | + return NF_DROP_ERR(-ECONNREFUSED); | ||
4869 | + } | ||
4870 | + } | ||
4871 | if (selinux_conn_sid(sksec->sid, skb_sid, &peer_sid)) | ||
4872 | return NF_DROP; | ||
4873 | secmark_perm = PACKET__SEND; | ||
4874 | @@ -5521,11 +5552,11 @@ static int selinux_setprocattr(struct task_struct *p, | ||
4875 | /* Check for ptracing, and update the task SID if ok. | ||
4876 | Otherwise, leave SID unchanged and fail. */ | ||
4877 | ptsid = 0; | ||
4878 | - task_lock(p); | ||
4879 | + rcu_read_lock(); | ||
4880 | tracer = ptrace_parent(p); | ||
4881 | if (tracer) | ||
4882 | ptsid = task_sid(tracer); | ||
4883 | - task_unlock(p); | ||
4884 | + rcu_read_unlock(); | ||
4885 | |||
4886 | if (tracer) { | ||
4887 | error = avc_has_perm(ptsid, sid, SECCLASS_PROCESS, | ||
4888 | diff --git a/security/selinux/include/xfrm.h b/security/selinux/include/xfrm.h | ||
4889 | index 6713f04e30ba..c1af4e14b12f 100644 | ||
4890 | --- a/security/selinux/include/xfrm.h | ||
4891 | +++ b/security/selinux/include/xfrm.h | ||
4892 | @@ -47,6 +47,7 @@ int selinux_xfrm_sock_rcv_skb(u32 sid, struct sk_buff *skb, | ||
4893 | int selinux_xfrm_postroute_last(u32 isec_sid, struct sk_buff *skb, | ||
4894 | struct common_audit_data *ad, u8 proto); | ||
4895 | int selinux_xfrm_decode_session(struct sk_buff *skb, u32 *sid, int ckall); | ||
4896 | +int selinux_xfrm_skb_sid(struct sk_buff *skb, u32 *sid); | ||
4897 | |||
4898 | static inline void selinux_xfrm_notify_policyload(void) | ||
4899 | { | ||
4900 | @@ -85,12 +86,12 @@ static inline int selinux_xfrm_decode_session(struct sk_buff *skb, u32 *sid, int | ||
4901 | static inline void selinux_xfrm_notify_policyload(void) | ||
4902 | { | ||
4903 | } | ||
4904 | -#endif | ||
4905 | |||
4906 | -static inline void selinux_skb_xfrm_sid(struct sk_buff *skb, u32 *sid) | ||
4907 | +static inline int selinux_xfrm_skb_sid(struct sk_buff *skb, u32 *sid) | ||
4908 | { | ||
4909 | - int err = selinux_xfrm_decode_session(skb, sid, 0); | ||
4910 | - BUG_ON(err); | ||
4911 | + *sid = SECSID_NULL; | ||
4912 | + return 0; | ||
4913 | } | ||
4914 | +#endif | ||
4915 | |||
4916 | #endif /* _SELINUX_XFRM_H_ */ | ||
4917 | diff --git a/security/selinux/xfrm.c b/security/selinux/xfrm.c | ||
4918 | index d03081886214..78504a18958a 100644 | ||
4919 | --- a/security/selinux/xfrm.c | ||
4920 | +++ b/security/selinux/xfrm.c | ||
4921 | @@ -152,21 +152,13 @@ int selinux_xfrm_state_pol_flow_match(struct xfrm_state *x, struct xfrm_policy * | ||
4922 | return rc; | ||
4923 | } | ||
4924 | |||
4925 | -/* | ||
4926 | - * LSM hook implementation that checks and/or returns the xfrm sid for the | ||
4927 | - * incoming packet. | ||
4928 | - */ | ||
4929 | - | ||
4930 | -int selinux_xfrm_decode_session(struct sk_buff *skb, u32 *sid, int ckall) | ||
4931 | +static int selinux_xfrm_skb_sid_ingress(struct sk_buff *skb, | ||
4932 | + u32 *sid, int ckall) | ||
4933 | { | ||
4934 | - struct sec_path *sp; | ||
4935 | + struct sec_path *sp = skb->sp; | ||
4936 | |||
4937 | *sid = SECSID_NULL; | ||
4938 | |||
4939 | - if (skb == NULL) | ||
4940 | - return 0; | ||
4941 | - | ||
4942 | - sp = skb->sp; | ||
4943 | if (sp) { | ||
4944 | int i, sid_set = 0; | ||
4945 | |||
4946 | @@ -190,6 +182,45 @@ int selinux_xfrm_decode_session(struct sk_buff *skb, u32 *sid, int ckall) | ||
4947 | return 0; | ||
4948 | } | ||
4949 | |||
4950 | +static u32 selinux_xfrm_skb_sid_egress(struct sk_buff *skb) | ||
4951 | +{ | ||
4952 | + struct dst_entry *dst = skb_dst(skb); | ||
4953 | + struct xfrm_state *x; | ||
4954 | + | ||
4955 | + if (dst == NULL) | ||
4956 | + return SECSID_NULL; | ||
4957 | + x = dst->xfrm; | ||
4958 | + if (x == NULL || !selinux_authorizable_xfrm(x)) | ||
4959 | + return SECSID_NULL; | ||
4960 | + | ||
4961 | + return x->security->ctx_sid; | ||
4962 | +} | ||
4963 | + | ||
4964 | +/* | ||
4965 | + * LSM hook implementation that checks and/or returns the xfrm sid for the | ||
4966 | + * incoming packet. | ||
4967 | + */ | ||
4968 | + | ||
4969 | +int selinux_xfrm_decode_session(struct sk_buff *skb, u32 *sid, int ckall) | ||
4970 | +{ | ||
4971 | + if (skb == NULL) { | ||
4972 | + *sid = SECSID_NULL; | ||
4973 | + return 0; | ||
4974 | + } | ||
4975 | + return selinux_xfrm_skb_sid_ingress(skb, sid, ckall); | ||
4976 | +} | ||
4977 | + | ||
4978 | +int selinux_xfrm_skb_sid(struct sk_buff *skb, u32 *sid) | ||
4979 | +{ | ||
4980 | + int rc; | ||
4981 | + | ||
4982 | + rc = selinux_xfrm_skb_sid_ingress(skb, sid, 0); | ||
4983 | + if (rc == 0 && *sid == SECSID_NULL) | ||
4984 | + *sid = selinux_xfrm_skb_sid_egress(skb); | ||
4985 | + | ||
4986 | + return rc; | ||
4987 | +} | ||
4988 | + | ||
4989 | /* | ||
4990 | * Security blob allocation for xfrm_policy and xfrm_state | ||
4991 | * CTX does not have a meaningful value on input | ||
4992 | diff --git a/sound/core/pcm_lib.c b/sound/core/pcm_lib.c | ||
4993 | index 6e03b465e44e..a2104671f51d 100644 | ||
4994 | --- a/sound/core/pcm_lib.c | ||
4995 | +++ b/sound/core/pcm_lib.c | ||
4996 | @@ -1937,6 +1937,8 @@ static int wait_for_avail(struct snd_pcm_substream *substream, | ||
4997 | case SNDRV_PCM_STATE_DISCONNECTED: | ||
4998 | err = -EBADFD; | ||
4999 | goto _endloop; | ||
5000 | + case SNDRV_PCM_STATE_PAUSED: | ||
5001 | + continue; | ||
5002 | } | ||
5003 | if (!tout) { | ||
5004 | snd_printd("%s write error (DMA or IRQ trouble?)\n", | ||
5005 | diff --git a/sound/pci/hda/hda_intel.c b/sound/pci/hda/hda_intel.c | ||
5006 | index a63aff2ca594..f7e76619f7c9 100644 | ||
5007 | --- a/sound/pci/hda/hda_intel.c | ||
5008 | +++ b/sound/pci/hda/hda_intel.c | ||
5009 | @@ -3430,6 +3430,10 @@ static void check_probe_mask(struct azx *chip, int dev) | ||
5010 | * white/black-list for enable_msi | ||
5011 | */ | ||
5012 | static struct snd_pci_quirk msi_black_list[] = { | ||
5013 | + SND_PCI_QUIRK(0x103c, 0x2191, "HP", 0), /* AMD Hudson */ | ||
5014 | + SND_PCI_QUIRK(0x103c, 0x2192, "HP", 0), /* AMD Hudson */ | ||
5015 | + SND_PCI_QUIRK(0x103c, 0x21f7, "HP", 0), /* AMD Hudson */ | ||
5016 | + SND_PCI_QUIRK(0x103c, 0x21fa, "HP", 0), /* AMD Hudson */ | ||
5017 | SND_PCI_QUIRK(0x1043, 0x81f2, "ASUS", 0), /* Athlon64 X2 + nvidia */ | ||
5018 | SND_PCI_QUIRK(0x1043, 0x81f6, "ASUS", 0), /* nvidia */ | ||
5019 | SND_PCI_QUIRK(0x1043, 0x822d, "ASUS", 0), /* Athlon64 X2 + nvidia MCP55 */ | ||
5020 | diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c | ||
5021 | index 21b948af6ed0..dce47c414ea7 100644 | ||
5022 | --- a/sound/pci/hda/patch_realtek.c | ||
5023 | +++ b/sound/pci/hda/patch_realtek.c | ||
5024 | @@ -4004,10 +4004,13 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = { | ||
5025 | SND_PCI_QUIRK(0x1028, 0x0606, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE), | ||
5026 | SND_PCI_QUIRK(0x1028, 0x0608, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE), | ||
5027 | SND_PCI_QUIRK(0x1028, 0x0609, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE), | ||
5028 | + SND_PCI_QUIRK(0x1028, 0x0610, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE), | ||
5029 | SND_PCI_QUIRK(0x1028, 0x0613, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE), | ||
5030 | SND_PCI_QUIRK(0x1028, 0x0614, "Dell Inspiron 3135", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE), | ||
5031 | SND_PCI_QUIRK(0x1028, 0x0616, "Dell Vostro 5470", ALC290_FIXUP_MONO_SPEAKERS), | ||
5032 | + SND_PCI_QUIRK(0x1028, 0x0629, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE), | ||
5033 | SND_PCI_QUIRK(0x1028, 0x0638, "Dell Inspiron 5439", ALC290_FIXUP_MONO_SPEAKERS), | ||
5034 | + SND_PCI_QUIRK(0x1028, 0x063e, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE), | ||
5035 | SND_PCI_QUIRK(0x1028, 0x15cc, "Dell X5 Precision", ALC269_FIXUP_DELL2_MIC_NO_PRESENCE), | ||
5036 | SND_PCI_QUIRK(0x1028, 0x15cd, "Dell X5 Precision", ALC269_FIXUP_DELL2_MIC_NO_PRESENCE), | ||
5037 | SND_PCI_QUIRK(0x103c, 0x1586, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC2), | ||
5038 | diff --git a/sound/soc/codecs/wm5110.c b/sound/soc/codecs/wm5110.c | ||
5039 | index 0048ce5bfa2f..831a34d7cc72 100644 | ||
5040 | --- a/sound/soc/codecs/wm5110.c | ||
5041 | +++ b/sound/soc/codecs/wm5110.c | ||
5042 | @@ -1031,7 +1031,7 @@ static const struct snd_soc_dapm_route wm5110_dapm_routes[] = { | ||
5043 | { "HPOUT2R", NULL, "OUT2R" }, | ||
5044 | |||
5045 | { "HPOUT3L", NULL, "OUT3L" }, | ||
5046 | - { "HPOUT3R", NULL, "OUT3L" }, | ||
5047 | + { "HPOUT3R", NULL, "OUT3R" }, | ||
5048 | |||
5049 | { "SPKOUTLN", NULL, "OUT4L" }, | ||
5050 | { "SPKOUTLP", NULL, "OUT4L" }, | ||
5051 | diff --git a/sound/soc/codecs/wm8904.c b/sound/soc/codecs/wm8904.c | ||
5052 | index 4dfa8dceeabf..48bae0ec500f 100644 | ||
5053 | --- a/sound/soc/codecs/wm8904.c | ||
5054 | +++ b/sound/soc/codecs/wm8904.c | ||
5055 | @@ -1443,7 +1443,7 @@ static int wm8904_set_fmt(struct snd_soc_dai *dai, unsigned int fmt) | ||
5056 | |||
5057 | switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) { | ||
5058 | case SND_SOC_DAIFMT_DSP_B: | ||
5059 | - aif1 |= WM8904_AIF_LRCLK_INV; | ||
5060 | + aif1 |= 0x3 | WM8904_AIF_LRCLK_INV; | ||
5061 | case SND_SOC_DAIFMT_DSP_A: | ||
5062 | aif1 |= 0x3; | ||
5063 | break; | ||
5064 | diff --git a/sound/soc/codecs/wm_adsp.c b/sound/soc/codecs/wm_adsp.c | ||
5065 | index 60b6b593c407..0d5de6003849 100644 | ||
5066 | --- a/sound/soc/codecs/wm_adsp.c | ||
5067 | +++ b/sound/soc/codecs/wm_adsp.c | ||
5068 | @@ -1466,13 +1466,17 @@ static int wm_adsp2_ena(struct wm_adsp *dsp) | ||
5069 | return ret; | ||
5070 | |||
5071 | /* Wait for the RAM to start, should be near instantaneous */ | ||
5072 | - count = 0; | ||
5073 | - do { | ||
5074 | + for (count = 0; count < 10; ++count) { | ||
5075 | ret = regmap_read(dsp->regmap, dsp->base + ADSP2_STATUS1, | ||
5076 | &val); | ||
5077 | if (ret != 0) | ||
5078 | return ret; | ||
5079 | - } while (!(val & ADSP2_RAM_RDY) && ++count < 10); | ||
5080 | + | ||
5081 | + if (val & ADSP2_RAM_RDY) | ||
5082 | + break; | ||
5083 | + | ||
5084 | + msleep(1); | ||
5085 | + } | ||
5086 | |||
5087 | if (!(val & ADSP2_RAM_RDY)) { | ||
5088 | adsp_err(dsp, "Failed to start DSP RAM\n"); | ||
5089 | diff --git a/sound/soc/tegra/tegra20_i2s.c b/sound/soc/tegra/tegra20_i2s.c | ||
5090 | index 52af7f6fb37f..540832e9e684 100644 | ||
5091 | --- a/sound/soc/tegra/tegra20_i2s.c | ||
5092 | +++ b/sound/soc/tegra/tegra20_i2s.c | ||
5093 | @@ -74,7 +74,7 @@ static int tegra20_i2s_set_fmt(struct snd_soc_dai *dai, | ||
5094 | unsigned int fmt) | ||
5095 | { | ||
5096 | struct tegra20_i2s *i2s = snd_soc_dai_get_drvdata(dai); | ||
5097 | - unsigned int mask, val; | ||
5098 | + unsigned int mask = 0, val = 0; | ||
5099 | |||
5100 | switch (fmt & SND_SOC_DAIFMT_INV_MASK) { | ||
5101 | case SND_SOC_DAIFMT_NB_NF: | ||
5102 | @@ -83,10 +83,10 @@ static int tegra20_i2s_set_fmt(struct snd_soc_dai *dai, | ||
5103 | return -EINVAL; | ||
5104 | } | ||
5105 | |||
5106 | - mask = TEGRA20_I2S_CTRL_MASTER_ENABLE; | ||
5107 | + mask |= TEGRA20_I2S_CTRL_MASTER_ENABLE; | ||
5108 | switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) { | ||
5109 | case SND_SOC_DAIFMT_CBS_CFS: | ||
5110 | - val = TEGRA20_I2S_CTRL_MASTER_ENABLE; | ||
5111 | + val |= TEGRA20_I2S_CTRL_MASTER_ENABLE; | ||
5112 | break; | ||
5113 | case SND_SOC_DAIFMT_CBM_CFM: | ||
5114 | break; | ||
5115 | diff --git a/sound/soc/tegra/tegra20_spdif.c b/sound/soc/tegra/tegra20_spdif.c | ||
5116 | index 551b3c93ce93..2e7d4aca3d7d 100644 | ||
5117 | --- a/sound/soc/tegra/tegra20_spdif.c | ||
5118 | +++ b/sound/soc/tegra/tegra20_spdif.c | ||
5119 | @@ -67,15 +67,15 @@ static int tegra20_spdif_hw_params(struct snd_pcm_substream *substream, | ||
5120 | { | ||
5121 | struct device *dev = dai->dev; | ||
5122 | struct tegra20_spdif *spdif = snd_soc_dai_get_drvdata(dai); | ||
5123 | - unsigned int mask, val; | ||
5124 | + unsigned int mask = 0, val = 0; | ||
5125 | int ret, spdifclock; | ||
5126 | |||
5127 | - mask = TEGRA20_SPDIF_CTRL_PACK | | ||
5128 | - TEGRA20_SPDIF_CTRL_BIT_MODE_MASK; | ||
5129 | + mask |= TEGRA20_SPDIF_CTRL_PACK | | ||
5130 | + TEGRA20_SPDIF_CTRL_BIT_MODE_MASK; | ||
5131 | switch (params_format(params)) { | ||
5132 | case SNDRV_PCM_FORMAT_S16_LE: | ||
5133 | - val = TEGRA20_SPDIF_CTRL_PACK | | ||
5134 | - TEGRA20_SPDIF_CTRL_BIT_MODE_16BIT; | ||
5135 | + val |= TEGRA20_SPDIF_CTRL_PACK | | ||
5136 | + TEGRA20_SPDIF_CTRL_BIT_MODE_16BIT; | ||
5137 | break; | ||
5138 | default: | ||
5139 | return -EINVAL; | ||
5140 | diff --git a/sound/soc/tegra/tegra30_i2s.c b/sound/soc/tegra/tegra30_i2s.c | ||
5141 | index 47565fd04505..732e9cb1be97 100644 | ||
5142 | --- a/sound/soc/tegra/tegra30_i2s.c | ||
5143 | +++ b/sound/soc/tegra/tegra30_i2s.c | ||
5144 | @@ -117,7 +117,7 @@ static int tegra30_i2s_set_fmt(struct snd_soc_dai *dai, | ||
5145 | unsigned int fmt) | ||
5146 | { | ||
5147 | struct tegra30_i2s *i2s = snd_soc_dai_get_drvdata(dai); | ||
5148 | - unsigned int mask, val; | ||
5149 | + unsigned int mask = 0, val = 0; | ||
5150 | |||
5151 | switch (fmt & SND_SOC_DAIFMT_INV_MASK) { | ||
5152 | case SND_SOC_DAIFMT_NB_NF: | ||
5153 | @@ -126,10 +126,10 @@ static int tegra30_i2s_set_fmt(struct snd_soc_dai *dai, | ||
5154 | return -EINVAL; | ||
5155 | } | ||
5156 | |||
5157 | - mask = TEGRA30_I2S_CTRL_MASTER_ENABLE; | ||
5158 | + mask |= TEGRA30_I2S_CTRL_MASTER_ENABLE; | ||
5159 | switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) { | ||
5160 | case SND_SOC_DAIFMT_CBS_CFS: | ||
5161 | - val = TEGRA30_I2S_CTRL_MASTER_ENABLE; | ||
5162 | + val |= TEGRA30_I2S_CTRL_MASTER_ENABLE; | ||
5163 | break; | ||
5164 | case SND_SOC_DAIFMT_CBM_CFM: | ||
5165 | break; | ||
5166 | diff --git a/tools/power/cpupower/utils/cpupower-set.c b/tools/power/cpupower/utils/cpupower-set.c | ||
5167 | index dc4de3762111..bcf1d2f0b791 100644 | ||
5168 | --- a/tools/power/cpupower/utils/cpupower-set.c | ||
5169 | +++ b/tools/power/cpupower/utils/cpupower-set.c | ||
5170 | @@ -18,9 +18,9 @@ | ||
5171 | #include "helpers/bitmask.h" | ||
5172 | |||
5173 | static struct option set_opts[] = { | ||
5174 | - { .name = "perf-bias", .has_arg = optional_argument, .flag = NULL, .val = 'b'}, | ||
5175 | - { .name = "sched-mc", .has_arg = optional_argument, .flag = NULL, .val = 'm'}, | ||
5176 | - { .name = "sched-smt", .has_arg = optional_argument, .flag = NULL, .val = 's'}, | ||
5177 | + { .name = "perf-bias", .has_arg = required_argument, .flag = NULL, .val = 'b'}, | ||
5178 | + { .name = "sched-mc", .has_arg = required_argument, .flag = NULL, .val = 'm'}, | ||
5179 | + { .name = "sched-smt", .has_arg = required_argument, .flag = NULL, .val = 's'}, | ||
5180 | { }, | ||
5181 | }; | ||
5182 |