Contents of /trunk/kernel-alx/patches-3.12/0106-3.12.7-all-fixes.patch
Parent Directory | Revision Log
Revision 2423 -
(show annotations)
(download)
Tue Mar 25 12:29:50 2014 UTC (10 years, 6 months ago) by niro
File size: 176498 byte(s)
Tue Mar 25 12:29:50 2014 UTC (10 years, 6 months ago) by niro
File size: 176498 byte(s)
-added 3.12 branch
1 | 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 |