Contents of /trunk/kernel-magellan/patches-4.2/0104-4.2.5-all-fixes.patch
Parent Directory | Revision Log
Revision 2710 -
(show annotations)
(download)
Mon Nov 2 12:49:35 2015 UTC (8 years, 10 months ago) by niro
File size: 62340 byte(s)
Mon Nov 2 12:49:35 2015 UTC (8 years, 10 months ago) by niro
File size: 62340 byte(s)
-linux-4.2.5
1 | diff --git a/Makefile b/Makefile |
2 | index a952801a6cd5..96076dcad18e 100644 |
3 | --- a/Makefile |
4 | +++ b/Makefile |
5 | @@ -1,6 +1,6 @@ |
6 | VERSION = 4 |
7 | PATCHLEVEL = 2 |
8 | -SUBLEVEL = 4 |
9 | +SUBLEVEL = 5 |
10 | EXTRAVERSION = |
11 | NAME = Hurr durr I'ma sheep |
12 | |
13 | diff --git a/arch/arm/mach-ux500/Makefile b/arch/arm/mach-ux500/Makefile |
14 | index 4418a5078833..c8643ac5db71 100644 |
15 | --- a/arch/arm/mach-ux500/Makefile |
16 | +++ b/arch/arm/mach-ux500/Makefile |
17 | @@ -7,7 +7,7 @@ obj-$(CONFIG_CACHE_L2X0) += cache-l2x0.o |
18 | obj-$(CONFIG_UX500_SOC_DB8500) += cpu-db8500.o |
19 | obj-$(CONFIG_MACH_MOP500) += board-mop500-regulators.o \ |
20 | board-mop500-audio.o |
21 | -obj-$(CONFIG_SMP) += platsmp.o headsmp.o |
22 | +obj-$(CONFIG_SMP) += platsmp.o |
23 | obj-$(CONFIG_HOTPLUG_CPU) += hotplug.o |
24 | obj-$(CONFIG_PM_GENERIC_DOMAINS) += pm_domains.o |
25 | |
26 | diff --git a/arch/arm/mach-ux500/cpu-db8500.c b/arch/arm/mach-ux500/cpu-db8500.c |
27 | index 16913800bbf9..ba708ce08616 100644 |
28 | --- a/arch/arm/mach-ux500/cpu-db8500.c |
29 | +++ b/arch/arm/mach-ux500/cpu-db8500.c |
30 | @@ -154,7 +154,6 @@ static const char * stericsson_dt_platform_compat[] = { |
31 | }; |
32 | |
33 | DT_MACHINE_START(U8500_DT, "ST-Ericsson Ux5x0 platform (Device Tree Support)") |
34 | - .smp = smp_ops(ux500_smp_ops), |
35 | .map_io = u8500_map_io, |
36 | .init_irq = ux500_init_irq, |
37 | /* we re-use nomadik timer here */ |
38 | diff --git a/arch/arm/mach-ux500/headsmp.S b/arch/arm/mach-ux500/headsmp.S |
39 | deleted file mode 100644 |
40 | index 9cdea049485d..000000000000 |
41 | --- a/arch/arm/mach-ux500/headsmp.S |
42 | +++ /dev/null |
43 | @@ -1,37 +0,0 @@ |
44 | -/* |
45 | - * Copyright (c) 2009 ST-Ericsson |
46 | - * This file is based ARM Realview platform |
47 | - * Copyright (c) 2003 ARM Limited |
48 | - * All Rights Reserved |
49 | - * |
50 | - * This program is free software; you can redistribute it and/or modify |
51 | - * it under the terms of the GNU General Public License version 2 as |
52 | - * published by the Free Software Foundation. |
53 | - */ |
54 | -#include <linux/linkage.h> |
55 | -#include <linux/init.h> |
56 | - |
57 | -/* |
58 | - * U8500 specific entry point for secondary CPUs. |
59 | - */ |
60 | -ENTRY(u8500_secondary_startup) |
61 | - mrc p15, 0, r0, c0, c0, 5 |
62 | - and r0, r0, #15 |
63 | - adr r4, 1f |
64 | - ldmia r4, {r5, r6} |
65 | - sub r4, r4, r5 |
66 | - add r6, r6, r4 |
67 | -pen: ldr r7, [r6] |
68 | - cmp r7, r0 |
69 | - bne pen |
70 | - |
71 | - /* |
72 | - * we've been released from the holding pen: secondary_stack |
73 | - * should now contain the SVC stack for this core |
74 | - */ |
75 | - b secondary_startup |
76 | -ENDPROC(u8500_secondary_startup) |
77 | - |
78 | - .align 2 |
79 | -1: .long . |
80 | - .long pen_release |
81 | diff --git a/arch/arm/mach-ux500/platsmp.c b/arch/arm/mach-ux500/platsmp.c |
82 | index 62b1de922bd8..70766b963758 100644 |
83 | --- a/arch/arm/mach-ux500/platsmp.c |
84 | +++ b/arch/arm/mach-ux500/platsmp.c |
85 | @@ -28,135 +28,81 @@ |
86 | #include "db8500-regs.h" |
87 | #include "id.h" |
88 | |
89 | -static void __iomem *scu_base; |
90 | -static void __iomem *backupram; |
91 | - |
92 | -/* This is called from headsmp.S to wakeup the secondary core */ |
93 | -extern void u8500_secondary_startup(void); |
94 | - |
95 | -/* |
96 | - * Write pen_release in a way that is guaranteed to be visible to all |
97 | - * observers, irrespective of whether they're taking part in coherency |
98 | - * or not. This is necessary for the hotplug code to work reliably. |
99 | - */ |
100 | -static void write_pen_release(int val) |
101 | -{ |
102 | - pen_release = val; |
103 | - smp_wmb(); |
104 | - sync_cache_w(&pen_release); |
105 | -} |
106 | - |
107 | -static DEFINE_SPINLOCK(boot_lock); |
108 | - |
109 | -static void ux500_secondary_init(unsigned int cpu) |
110 | -{ |
111 | - /* |
112 | - * let the primary processor know we're out of the |
113 | - * pen, then head off into the C entry point |
114 | - */ |
115 | - write_pen_release(-1); |
116 | - |
117 | - /* |
118 | - * Synchronise with the boot thread. |
119 | - */ |
120 | - spin_lock(&boot_lock); |
121 | - spin_unlock(&boot_lock); |
122 | -} |
123 | +/* Magic triggers in backup RAM */ |
124 | +#define UX500_CPU1_JUMPADDR_OFFSET 0x1FF4 |
125 | +#define UX500_CPU1_WAKEMAGIC_OFFSET 0x1FF0 |
126 | |
127 | -static int ux500_boot_secondary(unsigned int cpu, struct task_struct *idle) |
128 | +static void wakeup_secondary(void) |
129 | { |
130 | - unsigned long timeout; |
131 | - |
132 | - /* |
133 | - * set synchronisation state between this boot processor |
134 | - * and the secondary one |
135 | - */ |
136 | - spin_lock(&boot_lock); |
137 | - |
138 | - /* |
139 | - * The secondary processor is waiting to be released from |
140 | - * the holding pen - release it, then wait for it to flag |
141 | - * that it has been released by resetting pen_release. |
142 | - */ |
143 | - write_pen_release(cpu_logical_map(cpu)); |
144 | - |
145 | - arch_send_wakeup_ipi_mask(cpumask_of(cpu)); |
146 | + struct device_node *np; |
147 | + static void __iomem *backupram; |
148 | |
149 | - timeout = jiffies + (1 * HZ); |
150 | - while (time_before(jiffies, timeout)) { |
151 | - if (pen_release == -1) |
152 | - break; |
153 | + np = of_find_compatible_node(NULL, NULL, "ste,dbx500-backupram"); |
154 | + if (!np) { |
155 | + pr_err("No backupram base address\n"); |
156 | + return; |
157 | + } |
158 | + backupram = of_iomap(np, 0); |
159 | + of_node_put(np); |
160 | + if (!backupram) { |
161 | + pr_err("No backupram remap\n"); |
162 | + return; |
163 | } |
164 | |
165 | /* |
166 | - * now the secondary core is starting up let it run its |
167 | - * calibrations, then wait for it to finish |
168 | - */ |
169 | - spin_unlock(&boot_lock); |
170 | - |
171 | - return pen_release != -1 ? -ENOSYS : 0; |
172 | -} |
173 | - |
174 | -static void __init wakeup_secondary(void) |
175 | -{ |
176 | - /* |
177 | * write the address of secondary startup into the backup ram register |
178 | * at offset 0x1FF4, then write the magic number 0xA1FEED01 to the |
179 | * backup ram register at offset 0x1FF0, which is what boot rom code |
180 | - * is waiting for. This would wake up the secondary core from WFE |
181 | + * is waiting for. This will wake up the secondary core from WFE. |
182 | */ |
183 | -#define UX500_CPU1_JUMPADDR_OFFSET 0x1FF4 |
184 | - __raw_writel(virt_to_phys(u8500_secondary_startup), |
185 | - backupram + UX500_CPU1_JUMPADDR_OFFSET); |
186 | - |
187 | -#define UX500_CPU1_WAKEMAGIC_OFFSET 0x1FF0 |
188 | - __raw_writel(0xA1FEED01, |
189 | - backupram + UX500_CPU1_WAKEMAGIC_OFFSET); |
190 | + writel(virt_to_phys(secondary_startup), |
191 | + backupram + UX500_CPU1_JUMPADDR_OFFSET); |
192 | + writel(0xA1FEED01, |
193 | + backupram + UX500_CPU1_WAKEMAGIC_OFFSET); |
194 | |
195 | /* make sure write buffer is drained */ |
196 | mb(); |
197 | + iounmap(backupram); |
198 | } |
199 | |
200 | -/* |
201 | - * Initialise the CPU possible map early - this describes the CPUs |
202 | - * which may be present or become present in the system. |
203 | - */ |
204 | -static void __init ux500_smp_init_cpus(void) |
205 | +static void __init ux500_smp_prepare_cpus(unsigned int max_cpus) |
206 | { |
207 | - unsigned int i, ncores; |
208 | struct device_node *np; |
209 | + static void __iomem *scu_base; |
210 | + unsigned int ncores; |
211 | + int i; |
212 | |
213 | np = of_find_compatible_node(NULL, NULL, "arm,cortex-a9-scu"); |
214 | + if (!np) { |
215 | + pr_err("No SCU base address\n"); |
216 | + return; |
217 | + } |
218 | scu_base = of_iomap(np, 0); |
219 | of_node_put(np); |
220 | - if (!scu_base) |
221 | + if (!scu_base) { |
222 | + pr_err("No SCU remap\n"); |
223 | return; |
224 | - backupram = ioremap(U8500_BACKUPRAM0_BASE, SZ_8K); |
225 | - ncores = scu_get_core_count(scu_base); |
226 | - |
227 | - /* sanity check */ |
228 | - if (ncores > nr_cpu_ids) { |
229 | - pr_warn("SMP: %u cores greater than maximum (%u), clipping\n", |
230 | - ncores, nr_cpu_ids); |
231 | - ncores = nr_cpu_ids; |
232 | } |
233 | |
234 | + scu_enable(scu_base); |
235 | + ncores = scu_get_core_count(scu_base); |
236 | for (i = 0; i < ncores; i++) |
237 | set_cpu_possible(i, true); |
238 | + iounmap(scu_base); |
239 | } |
240 | |
241 | -static void __init ux500_smp_prepare_cpus(unsigned int max_cpus) |
242 | +static int ux500_boot_secondary(unsigned int cpu, struct task_struct *idle) |
243 | { |
244 | - scu_enable(scu_base); |
245 | wakeup_secondary(); |
246 | + arch_send_wakeup_ipi_mask(cpumask_of(cpu)); |
247 | + return 0; |
248 | } |
249 | |
250 | struct smp_operations ux500_smp_ops __initdata = { |
251 | - .smp_init_cpus = ux500_smp_init_cpus, |
252 | .smp_prepare_cpus = ux500_smp_prepare_cpus, |
253 | - .smp_secondary_init = ux500_secondary_init, |
254 | .smp_boot_secondary = ux500_boot_secondary, |
255 | #ifdef CONFIG_HOTPLUG_CPU |
256 | .cpu_die = ux500_cpu_die, |
257 | #endif |
258 | }; |
259 | +CPU_METHOD_OF_DECLARE(ux500_smp, "ste,dbx500-smp", &ux500_smp_ops); |
260 | diff --git a/arch/arm/mach-ux500/setup.h b/arch/arm/mach-ux500/setup.h |
261 | index 1fb6ad2789f1..65876eac0761 100644 |
262 | --- a/arch/arm/mach-ux500/setup.h |
263 | +++ b/arch/arm/mach-ux500/setup.h |
264 | @@ -26,7 +26,6 @@ extern struct device *ux500_soc_device_init(const char *soc_id); |
265 | |
266 | extern void ux500_timer_init(void); |
267 | |
268 | -extern struct smp_operations ux500_smp_ops; |
269 | extern void ux500_cpu_die(unsigned int cpu); |
270 | |
271 | #endif /* __ASM_ARCH_SETUP_H */ |
272 | diff --git a/arch/arm64/Makefile b/arch/arm64/Makefile |
273 | index 81151663ef38..3258174e6152 100644 |
274 | --- a/arch/arm64/Makefile |
275 | +++ b/arch/arm64/Makefile |
276 | @@ -31,7 +31,7 @@ endif |
277 | CHECKFLAGS += -D__aarch64__ |
278 | |
279 | ifeq ($(CONFIG_ARM64_ERRATUM_843419), y) |
280 | -CFLAGS_MODULE += -mcmodel=large |
281 | +KBUILD_CFLAGS_MODULE += -mcmodel=large |
282 | endif |
283 | |
284 | # Default value |
285 | diff --git a/arch/arm64/include/asm/pgtable.h b/arch/arm64/include/asm/pgtable.h |
286 | index 56283f8a675c..cf7319422768 100644 |
287 | --- a/arch/arm64/include/asm/pgtable.h |
288 | +++ b/arch/arm64/include/asm/pgtable.h |
289 | @@ -80,7 +80,7 @@ extern void __pgd_error(const char *file, int line, unsigned long val); |
290 | #define PAGE_S2 __pgprot(PROT_DEFAULT | PTE_S2_MEMATTR(MT_S2_NORMAL) | PTE_S2_RDONLY) |
291 | #define PAGE_S2_DEVICE __pgprot(PROT_DEFAULT | PTE_S2_MEMATTR(MT_S2_DEVICE_nGnRE) | PTE_S2_RDONLY | PTE_UXN) |
292 | |
293 | -#define PAGE_NONE __pgprot(((_PAGE_DEFAULT) & ~PTE_TYPE_MASK) | PTE_PROT_NONE | PTE_PXN | PTE_UXN) |
294 | +#define PAGE_NONE __pgprot(((_PAGE_DEFAULT) & ~PTE_VALID) | PTE_PROT_NONE | PTE_PXN | PTE_UXN) |
295 | #define PAGE_SHARED __pgprot(_PAGE_DEFAULT | PTE_USER | PTE_NG | PTE_PXN | PTE_UXN | PTE_WRITE) |
296 | #define PAGE_SHARED_EXEC __pgprot(_PAGE_DEFAULT | PTE_USER | PTE_NG | PTE_PXN | PTE_WRITE) |
297 | #define PAGE_COPY __pgprot(_PAGE_DEFAULT | PTE_USER | PTE_NG | PTE_PXN | PTE_UXN) |
298 | @@ -460,7 +460,7 @@ static inline pud_t *pud_offset(pgd_t *pgd, unsigned long addr) |
299 | static inline pte_t pte_modify(pte_t pte, pgprot_t newprot) |
300 | { |
301 | const pteval_t mask = PTE_USER | PTE_PXN | PTE_UXN | PTE_RDONLY | |
302 | - PTE_PROT_NONE | PTE_WRITE | PTE_TYPE_MASK; |
303 | + PTE_PROT_NONE | PTE_VALID | PTE_WRITE; |
304 | pte_val(pte) = (pte_val(pte) & ~mask) | (pgprot_val(newprot) & mask); |
305 | return pte; |
306 | } |
307 | diff --git a/arch/sparc/crypto/aes_glue.c b/arch/sparc/crypto/aes_glue.c |
308 | index 2e48eb8813ff..c90930de76ba 100644 |
309 | --- a/arch/sparc/crypto/aes_glue.c |
310 | +++ b/arch/sparc/crypto/aes_glue.c |
311 | @@ -433,6 +433,7 @@ static struct crypto_alg algs[] = { { |
312 | .blkcipher = { |
313 | .min_keysize = AES_MIN_KEY_SIZE, |
314 | .max_keysize = AES_MAX_KEY_SIZE, |
315 | + .ivsize = AES_BLOCK_SIZE, |
316 | .setkey = aes_set_key, |
317 | .encrypt = cbc_encrypt, |
318 | .decrypt = cbc_decrypt, |
319 | @@ -452,6 +453,7 @@ static struct crypto_alg algs[] = { { |
320 | .blkcipher = { |
321 | .min_keysize = AES_MIN_KEY_SIZE, |
322 | .max_keysize = AES_MAX_KEY_SIZE, |
323 | + .ivsize = AES_BLOCK_SIZE, |
324 | .setkey = aes_set_key, |
325 | .encrypt = ctr_crypt, |
326 | .decrypt = ctr_crypt, |
327 | diff --git a/arch/sparc/crypto/camellia_glue.c b/arch/sparc/crypto/camellia_glue.c |
328 | index 6bf2479a12fb..561a84d93cf6 100644 |
329 | --- a/arch/sparc/crypto/camellia_glue.c |
330 | +++ b/arch/sparc/crypto/camellia_glue.c |
331 | @@ -274,6 +274,7 @@ static struct crypto_alg algs[] = { { |
332 | .blkcipher = { |
333 | .min_keysize = CAMELLIA_MIN_KEY_SIZE, |
334 | .max_keysize = CAMELLIA_MAX_KEY_SIZE, |
335 | + .ivsize = CAMELLIA_BLOCK_SIZE, |
336 | .setkey = camellia_set_key, |
337 | .encrypt = cbc_encrypt, |
338 | .decrypt = cbc_decrypt, |
339 | diff --git a/arch/sparc/crypto/des_glue.c b/arch/sparc/crypto/des_glue.c |
340 | index dd6a34fa6e19..61af794aa2d3 100644 |
341 | --- a/arch/sparc/crypto/des_glue.c |
342 | +++ b/arch/sparc/crypto/des_glue.c |
343 | @@ -429,6 +429,7 @@ static struct crypto_alg algs[] = { { |
344 | .blkcipher = { |
345 | .min_keysize = DES_KEY_SIZE, |
346 | .max_keysize = DES_KEY_SIZE, |
347 | + .ivsize = DES_BLOCK_SIZE, |
348 | .setkey = des_set_key, |
349 | .encrypt = cbc_encrypt, |
350 | .decrypt = cbc_decrypt, |
351 | @@ -485,6 +486,7 @@ static struct crypto_alg algs[] = { { |
352 | .blkcipher = { |
353 | .min_keysize = DES3_EDE_KEY_SIZE, |
354 | .max_keysize = DES3_EDE_KEY_SIZE, |
355 | + .ivsize = DES3_EDE_BLOCK_SIZE, |
356 | .setkey = des3_ede_set_key, |
357 | .encrypt = cbc3_encrypt, |
358 | .decrypt = cbc3_decrypt, |
359 | diff --git a/arch/x86/crypto/camellia_aesni_avx_glue.c b/arch/x86/crypto/camellia_aesni_avx_glue.c |
360 | index 80a0e4389c9a..bacaa13acac5 100644 |
361 | --- a/arch/x86/crypto/camellia_aesni_avx_glue.c |
362 | +++ b/arch/x86/crypto/camellia_aesni_avx_glue.c |
363 | @@ -554,6 +554,11 @@ static int __init camellia_aesni_init(void) |
364 | { |
365 | const char *feature_name; |
366 | |
367 | + if (!cpu_has_avx || !cpu_has_aes || !cpu_has_osxsave) { |
368 | + pr_info("AVX or AES-NI instructions are not detected.\n"); |
369 | + return -ENODEV; |
370 | + } |
371 | + |
372 | if (!cpu_has_xfeatures(XSTATE_SSE | XSTATE_YMM, &feature_name)) { |
373 | pr_info("CPU feature '%s' is not supported.\n", feature_name); |
374 | return -ENODEV; |
375 | diff --git a/arch/x86/kvm/emulate.c b/arch/x86/kvm/emulate.c |
376 | index e7a4fde5d631..2392541a96e6 100644 |
377 | --- a/arch/x86/kvm/emulate.c |
378 | +++ b/arch/x86/kvm/emulate.c |
379 | @@ -2418,7 +2418,7 @@ static int rsm_load_state_64(struct x86_emulate_ctxt *ctxt, u64 smbase) |
380 | u64 val, cr0, cr4; |
381 | u32 base3; |
382 | u16 selector; |
383 | - int i; |
384 | + int i, r; |
385 | |
386 | for (i = 0; i < 16; i++) |
387 | *reg_write(ctxt, i) = GET_SMSTATE(u64, smbase, 0x7ff8 - i * 8); |
388 | @@ -2460,13 +2460,17 @@ static int rsm_load_state_64(struct x86_emulate_ctxt *ctxt, u64 smbase) |
389 | dt.address = GET_SMSTATE(u64, smbase, 0x7e68); |
390 | ctxt->ops->set_gdt(ctxt, &dt); |
391 | |
392 | + r = rsm_enter_protected_mode(ctxt, cr0, cr4); |
393 | + if (r != X86EMUL_CONTINUE) |
394 | + return r; |
395 | + |
396 | for (i = 0; i < 6; i++) { |
397 | - int r = rsm_load_seg_64(ctxt, smbase, i); |
398 | + r = rsm_load_seg_64(ctxt, smbase, i); |
399 | if (r != X86EMUL_CONTINUE) |
400 | return r; |
401 | } |
402 | |
403 | - return rsm_enter_protected_mode(ctxt, cr0, cr4); |
404 | + return X86EMUL_CONTINUE; |
405 | } |
406 | |
407 | static int em_rsm(struct x86_emulate_ctxt *ctxt) |
408 | diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c |
409 | index 32c6e6ac5964..373328b71599 100644 |
410 | --- a/arch/x86/kvm/x86.c |
411 | +++ b/arch/x86/kvm/x86.c |
412 | @@ -6706,6 +6706,12 @@ static inline int vcpu_block(struct kvm *kvm, struct kvm_vcpu *vcpu) |
413 | return 1; |
414 | } |
415 | |
416 | +static inline bool kvm_vcpu_running(struct kvm_vcpu *vcpu) |
417 | +{ |
418 | + return (vcpu->arch.mp_state == KVM_MP_STATE_RUNNABLE && |
419 | + !vcpu->arch.apf.halted); |
420 | +} |
421 | + |
422 | static int vcpu_run(struct kvm_vcpu *vcpu) |
423 | { |
424 | int r; |
425 | @@ -6714,8 +6720,7 @@ static int vcpu_run(struct kvm_vcpu *vcpu) |
426 | vcpu->srcu_idx = srcu_read_lock(&kvm->srcu); |
427 | |
428 | for (;;) { |
429 | - if (vcpu->arch.mp_state == KVM_MP_STATE_RUNNABLE && |
430 | - !vcpu->arch.apf.halted) |
431 | + if (kvm_vcpu_running(vcpu)) |
432 | r = vcpu_enter_guest(vcpu); |
433 | else |
434 | r = vcpu_block(kvm, vcpu); |
435 | @@ -8011,19 +8016,36 @@ void kvm_arch_flush_shadow_memslot(struct kvm *kvm, |
436 | kvm_mmu_invalidate_zap_all_pages(kvm); |
437 | } |
438 | |
439 | +static inline bool kvm_vcpu_has_events(struct kvm_vcpu *vcpu) |
440 | +{ |
441 | + if (!list_empty_careful(&vcpu->async_pf.done)) |
442 | + return true; |
443 | + |
444 | + if (kvm_apic_has_events(vcpu)) |
445 | + return true; |
446 | + |
447 | + if (vcpu->arch.pv.pv_unhalted) |
448 | + return true; |
449 | + |
450 | + if (atomic_read(&vcpu->arch.nmi_queued)) |
451 | + return true; |
452 | + |
453 | + if (test_bit(KVM_REQ_SMI, &vcpu->requests)) |
454 | + return true; |
455 | + |
456 | + if (kvm_arch_interrupt_allowed(vcpu) && |
457 | + kvm_cpu_has_interrupt(vcpu)) |
458 | + return true; |
459 | + |
460 | + return false; |
461 | +} |
462 | + |
463 | int kvm_arch_vcpu_runnable(struct kvm_vcpu *vcpu) |
464 | { |
465 | if (is_guest_mode(vcpu) && kvm_x86_ops->check_nested_events) |
466 | kvm_x86_ops->check_nested_events(vcpu, false); |
467 | |
468 | - return (vcpu->arch.mp_state == KVM_MP_STATE_RUNNABLE && |
469 | - !vcpu->arch.apf.halted) |
470 | - || !list_empty_careful(&vcpu->async_pf.done) |
471 | - || kvm_apic_has_events(vcpu) |
472 | - || vcpu->arch.pv.pv_unhalted |
473 | - || atomic_read(&vcpu->arch.nmi_queued) || |
474 | - (kvm_arch_interrupt_allowed(vcpu) && |
475 | - kvm_cpu_has_interrupt(vcpu)); |
476 | + return kvm_vcpu_running(vcpu) || kvm_vcpu_has_events(vcpu); |
477 | } |
478 | |
479 | int kvm_arch_vcpu_should_kick(struct kvm_vcpu *vcpu) |
480 | diff --git a/crypto/ahash.c b/crypto/ahash.c |
481 | index 8acb886032ae..9c1dc8d6106a 100644 |
482 | --- a/crypto/ahash.c |
483 | +++ b/crypto/ahash.c |
484 | @@ -544,7 +544,8 @@ static int ahash_prepare_alg(struct ahash_alg *alg) |
485 | struct crypto_alg *base = &alg->halg.base; |
486 | |
487 | if (alg->halg.digestsize > PAGE_SIZE / 8 || |
488 | - alg->halg.statesize > PAGE_SIZE / 8) |
489 | + alg->halg.statesize > PAGE_SIZE / 8 || |
490 | + alg->halg.statesize == 0) |
491 | return -EINVAL; |
492 | |
493 | base->cra_type = &crypto_ahash_type; |
494 | diff --git a/drivers/block/rbd.c b/drivers/block/rbd.c |
495 | index bc67a93aa4f4..324bf35ec4dd 100644 |
496 | --- a/drivers/block/rbd.c |
497 | +++ b/drivers/block/rbd.c |
498 | @@ -5201,7 +5201,6 @@ static int rbd_dev_probe_parent(struct rbd_device *rbd_dev) |
499 | out_err: |
500 | if (parent) { |
501 | rbd_dev_unparent(rbd_dev); |
502 | - kfree(rbd_dev->header_name); |
503 | rbd_dev_destroy(parent); |
504 | } else { |
505 | rbd_put_client(rbdc); |
506 | diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_display.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_display.c |
507 | index b16b9256883e..4c4035fdeb6f 100644 |
508 | --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_display.c |
509 | +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_display.c |
510 | @@ -76,8 +76,6 @@ static void amdgpu_flip_work_func(struct work_struct *__work) |
511 | /* We borrow the event spin lock for protecting flip_status */ |
512 | spin_lock_irqsave(&crtc->dev->event_lock, flags); |
513 | |
514 | - /* set the proper interrupt */ |
515 | - amdgpu_irq_get(adev, &adev->pageflip_irq, work->crtc_id); |
516 | /* do the flip (mmio) */ |
517 | adev->mode_info.funcs->page_flip(adev, work->crtc_id, work->base); |
518 | /* set the flip status */ |
519 | diff --git a/drivers/gpu/drm/amd/amdgpu/ci_dpm.c b/drivers/gpu/drm/amd/amdgpu/ci_dpm.c |
520 | index 82e8d0730517..a1a35a5df8e7 100644 |
521 | --- a/drivers/gpu/drm/amd/amdgpu/ci_dpm.c |
522 | +++ b/drivers/gpu/drm/amd/amdgpu/ci_dpm.c |
523 | @@ -6185,6 +6185,11 @@ static int ci_dpm_late_init(void *handle) |
524 | if (!amdgpu_dpm) |
525 | return 0; |
526 | |
527 | + /* init the sysfs and debugfs files late */ |
528 | + ret = amdgpu_pm_sysfs_init(adev); |
529 | + if (ret) |
530 | + return ret; |
531 | + |
532 | ret = ci_set_temperature_range(adev); |
533 | if (ret) |
534 | return ret; |
535 | @@ -6232,9 +6237,6 @@ static int ci_dpm_sw_init(void *handle) |
536 | adev->pm.dpm.current_ps = adev->pm.dpm.requested_ps = adev->pm.dpm.boot_ps; |
537 | if (amdgpu_dpm == 1) |
538 | amdgpu_pm_print_power_states(adev); |
539 | - ret = amdgpu_pm_sysfs_init(adev); |
540 | - if (ret) |
541 | - goto dpm_failed; |
542 | mutex_unlock(&adev->pm.mutex); |
543 | DRM_INFO("amdgpu: dpm initialized\n"); |
544 | |
545 | diff --git a/drivers/gpu/drm/amd/amdgpu/cik.c b/drivers/gpu/drm/amd/amdgpu/cik.c |
546 | index 341c56681841..519fa515c4d8 100644 |
547 | --- a/drivers/gpu/drm/amd/amdgpu/cik.c |
548 | +++ b/drivers/gpu/drm/amd/amdgpu/cik.c |
549 | @@ -1565,6 +1565,9 @@ static void cik_pcie_gen3_enable(struct amdgpu_device *adev) |
550 | int ret, i; |
551 | u16 tmp16; |
552 | |
553 | + if (pci_is_root_bus(adev->pdev->bus)) |
554 | + return; |
555 | + |
556 | if (amdgpu_pcie_gen2 == 0) |
557 | return; |
558 | |
559 | diff --git a/drivers/gpu/drm/amd/amdgpu/cz_dpm.c b/drivers/gpu/drm/amd/amdgpu/cz_dpm.c |
560 | index ace870afc7d4..fd29c18fc14e 100644 |
561 | --- a/drivers/gpu/drm/amd/amdgpu/cz_dpm.c |
562 | +++ b/drivers/gpu/drm/amd/amdgpu/cz_dpm.c |
563 | @@ -596,6 +596,12 @@ static int cz_dpm_late_init(void *handle) |
564 | struct amdgpu_device *adev = (struct amdgpu_device *)handle; |
565 | |
566 | if (amdgpu_dpm) { |
567 | + int ret; |
568 | + /* init the sysfs and debugfs files late */ |
569 | + ret = amdgpu_pm_sysfs_init(adev); |
570 | + if (ret) |
571 | + return ret; |
572 | + |
573 | /* powerdown unused blocks for now */ |
574 | cz_dpm_powergate_uvd(adev, true); |
575 | cz_dpm_powergate_vce(adev, true); |
576 | @@ -632,10 +638,6 @@ static int cz_dpm_sw_init(void *handle) |
577 | if (amdgpu_dpm == 1) |
578 | amdgpu_pm_print_power_states(adev); |
579 | |
580 | - ret = amdgpu_pm_sysfs_init(adev); |
581 | - if (ret) |
582 | - goto dpm_init_failed; |
583 | - |
584 | mutex_unlock(&adev->pm.mutex); |
585 | DRM_INFO("amdgpu: dpm initialized\n"); |
586 | |
587 | diff --git a/drivers/gpu/drm/amd/amdgpu/dce_v10_0.c b/drivers/gpu/drm/amd/amdgpu/dce_v10_0.c |
588 | index e774a437dd65..ef36467c7e34 100644 |
589 | --- a/drivers/gpu/drm/amd/amdgpu/dce_v10_0.c |
590 | +++ b/drivers/gpu/drm/amd/amdgpu/dce_v10_0.c |
591 | @@ -233,6 +233,24 @@ static u32 dce_v10_0_vblank_get_counter(struct amdgpu_device *adev, int crtc) |
592 | return RREG32(mmCRTC_STATUS_FRAME_COUNT + crtc_offsets[crtc]); |
593 | } |
594 | |
595 | +static void dce_v10_0_pageflip_interrupt_init(struct amdgpu_device *adev) |
596 | +{ |
597 | + unsigned i; |
598 | + |
599 | + /* Enable pflip interrupts */ |
600 | + for (i = 0; i < adev->mode_info.num_crtc; i++) |
601 | + amdgpu_irq_get(adev, &adev->pageflip_irq, i); |
602 | +} |
603 | + |
604 | +static void dce_v10_0_pageflip_interrupt_fini(struct amdgpu_device *adev) |
605 | +{ |
606 | + unsigned i; |
607 | + |
608 | + /* Disable pflip interrupts */ |
609 | + for (i = 0; i < adev->mode_info.num_crtc; i++) |
610 | + amdgpu_irq_put(adev, &adev->pageflip_irq, i); |
611 | +} |
612 | + |
613 | /** |
614 | * dce_v10_0_page_flip - pageflip callback. |
615 | * |
616 | @@ -2641,9 +2659,10 @@ static void dce_v10_0_crtc_dpms(struct drm_crtc *crtc, int mode) |
617 | dce_v10_0_vga_enable(crtc, true); |
618 | amdgpu_atombios_crtc_blank(crtc, ATOM_DISABLE); |
619 | dce_v10_0_vga_enable(crtc, false); |
620 | - /* Make sure VBLANK interrupt is still enabled */ |
621 | + /* Make sure VBLANK and PFLIP interrupts are still enabled */ |
622 | type = amdgpu_crtc_idx_to_irq_type(adev, amdgpu_crtc->crtc_id); |
623 | amdgpu_irq_update(adev, &adev->crtc_irq, type); |
624 | + amdgpu_irq_update(adev, &adev->pageflip_irq, type); |
625 | drm_vblank_post_modeset(dev, amdgpu_crtc->crtc_id); |
626 | dce_v10_0_crtc_load_lut(crtc); |
627 | break; |
628 | @@ -3002,6 +3021,8 @@ static int dce_v10_0_hw_init(void *handle) |
629 | dce_v10_0_audio_enable(adev, &adev->mode_info.audio.pin[i], false); |
630 | } |
631 | |
632 | + dce_v10_0_pageflip_interrupt_init(adev); |
633 | + |
634 | return 0; |
635 | } |
636 | |
637 | @@ -3016,6 +3037,8 @@ static int dce_v10_0_hw_fini(void *handle) |
638 | dce_v10_0_audio_enable(adev, &adev->mode_info.audio.pin[i], false); |
639 | } |
640 | |
641 | + dce_v10_0_pageflip_interrupt_fini(adev); |
642 | + |
643 | return 0; |
644 | } |
645 | |
646 | @@ -3027,6 +3050,8 @@ static int dce_v10_0_suspend(void *handle) |
647 | |
648 | dce_v10_0_hpd_fini(adev); |
649 | |
650 | + dce_v10_0_pageflip_interrupt_fini(adev); |
651 | + |
652 | return 0; |
653 | } |
654 | |
655 | @@ -3052,6 +3077,8 @@ static int dce_v10_0_resume(void *handle) |
656 | /* initialize hpd */ |
657 | dce_v10_0_hpd_init(adev); |
658 | |
659 | + dce_v10_0_pageflip_interrupt_init(adev); |
660 | + |
661 | return 0; |
662 | } |
663 | |
664 | @@ -3346,7 +3373,6 @@ static int dce_v10_0_pageflip_irq(struct amdgpu_device *adev, |
665 | spin_unlock_irqrestore(&adev->ddev->event_lock, flags); |
666 | |
667 | drm_vblank_put(adev->ddev, amdgpu_crtc->crtc_id); |
668 | - amdgpu_irq_put(adev, &adev->pageflip_irq, crtc_id); |
669 | queue_work(amdgpu_crtc->pflip_queue, &works->unpin_work); |
670 | |
671 | return 0; |
672 | diff --git a/drivers/gpu/drm/amd/amdgpu/dce_v11_0.c b/drivers/gpu/drm/amd/amdgpu/dce_v11_0.c |
673 | index c4a21a7afd68..329bca0f1331 100644 |
674 | --- a/drivers/gpu/drm/amd/amdgpu/dce_v11_0.c |
675 | +++ b/drivers/gpu/drm/amd/amdgpu/dce_v11_0.c |
676 | @@ -233,6 +233,24 @@ static u32 dce_v11_0_vblank_get_counter(struct amdgpu_device *adev, int crtc) |
677 | return RREG32(mmCRTC_STATUS_FRAME_COUNT + crtc_offsets[crtc]); |
678 | } |
679 | |
680 | +static void dce_v11_0_pageflip_interrupt_init(struct amdgpu_device *adev) |
681 | +{ |
682 | + unsigned i; |
683 | + |
684 | + /* Enable pflip interrupts */ |
685 | + for (i = 0; i < adev->mode_info.num_crtc; i++) |
686 | + amdgpu_irq_get(adev, &adev->pageflip_irq, i); |
687 | +} |
688 | + |
689 | +static void dce_v11_0_pageflip_interrupt_fini(struct amdgpu_device *adev) |
690 | +{ |
691 | + unsigned i; |
692 | + |
693 | + /* Disable pflip interrupts */ |
694 | + for (i = 0; i < adev->mode_info.num_crtc; i++) |
695 | + amdgpu_irq_put(adev, &adev->pageflip_irq, i); |
696 | +} |
697 | + |
698 | /** |
699 | * dce_v11_0_page_flip - pageflip callback. |
700 | * |
701 | @@ -2640,9 +2658,10 @@ static void dce_v11_0_crtc_dpms(struct drm_crtc *crtc, int mode) |
702 | dce_v11_0_vga_enable(crtc, true); |
703 | amdgpu_atombios_crtc_blank(crtc, ATOM_DISABLE); |
704 | dce_v11_0_vga_enable(crtc, false); |
705 | - /* Make sure VBLANK interrupt is still enabled */ |
706 | + /* Make sure VBLANK and PFLIP interrupts are still enabled */ |
707 | type = amdgpu_crtc_idx_to_irq_type(adev, amdgpu_crtc->crtc_id); |
708 | amdgpu_irq_update(adev, &adev->crtc_irq, type); |
709 | + amdgpu_irq_update(adev, &adev->pageflip_irq, type); |
710 | drm_vblank_post_modeset(dev, amdgpu_crtc->crtc_id); |
711 | dce_v11_0_crtc_load_lut(crtc); |
712 | break; |
713 | @@ -2888,7 +2907,7 @@ static int dce_v11_0_early_init(void *handle) |
714 | |
715 | switch (adev->asic_type) { |
716 | case CHIP_CARRIZO: |
717 | - adev->mode_info.num_crtc = 4; |
718 | + adev->mode_info.num_crtc = 3; |
719 | adev->mode_info.num_hpd = 6; |
720 | adev->mode_info.num_dig = 9; |
721 | break; |
722 | @@ -3000,6 +3019,8 @@ static int dce_v11_0_hw_init(void *handle) |
723 | dce_v11_0_audio_enable(adev, &adev->mode_info.audio.pin[i], false); |
724 | } |
725 | |
726 | + dce_v11_0_pageflip_interrupt_init(adev); |
727 | + |
728 | return 0; |
729 | } |
730 | |
731 | @@ -3014,6 +3035,8 @@ static int dce_v11_0_hw_fini(void *handle) |
732 | dce_v11_0_audio_enable(adev, &adev->mode_info.audio.pin[i], false); |
733 | } |
734 | |
735 | + dce_v11_0_pageflip_interrupt_fini(adev); |
736 | + |
737 | return 0; |
738 | } |
739 | |
740 | @@ -3025,6 +3048,8 @@ static int dce_v11_0_suspend(void *handle) |
741 | |
742 | dce_v11_0_hpd_fini(adev); |
743 | |
744 | + dce_v11_0_pageflip_interrupt_fini(adev); |
745 | + |
746 | return 0; |
747 | } |
748 | |
749 | @@ -3051,6 +3076,8 @@ static int dce_v11_0_resume(void *handle) |
750 | /* initialize hpd */ |
751 | dce_v11_0_hpd_init(adev); |
752 | |
753 | + dce_v11_0_pageflip_interrupt_init(adev); |
754 | + |
755 | return 0; |
756 | } |
757 | |
758 | @@ -3345,7 +3372,6 @@ static int dce_v11_0_pageflip_irq(struct amdgpu_device *adev, |
759 | spin_unlock_irqrestore(&adev->ddev->event_lock, flags); |
760 | |
761 | drm_vblank_put(adev->ddev, amdgpu_crtc->crtc_id); |
762 | - amdgpu_irq_put(adev, &adev->pageflip_irq, crtc_id); |
763 | queue_work(amdgpu_crtc->pflip_queue, &works->unpin_work); |
764 | |
765 | return 0; |
766 | diff --git a/drivers/gpu/drm/amd/amdgpu/dce_v8_0.c b/drivers/gpu/drm/amd/amdgpu/dce_v8_0.c |
767 | index cc050a329c49..937879ed86bc 100644 |
768 | --- a/drivers/gpu/drm/amd/amdgpu/dce_v8_0.c |
769 | +++ b/drivers/gpu/drm/amd/amdgpu/dce_v8_0.c |
770 | @@ -204,6 +204,24 @@ static u32 dce_v8_0_vblank_get_counter(struct amdgpu_device *adev, int crtc) |
771 | return RREG32(mmCRTC_STATUS_FRAME_COUNT + crtc_offsets[crtc]); |
772 | } |
773 | |
774 | +static void dce_v8_0_pageflip_interrupt_init(struct amdgpu_device *adev) |
775 | +{ |
776 | + unsigned i; |
777 | + |
778 | + /* Enable pflip interrupts */ |
779 | + for (i = 0; i < adev->mode_info.num_crtc; i++) |
780 | + amdgpu_irq_get(adev, &adev->pageflip_irq, i); |
781 | +} |
782 | + |
783 | +static void dce_v8_0_pageflip_interrupt_fini(struct amdgpu_device *adev) |
784 | +{ |
785 | + unsigned i; |
786 | + |
787 | + /* Disable pflip interrupts */ |
788 | + for (i = 0; i < adev->mode_info.num_crtc; i++) |
789 | + amdgpu_irq_put(adev, &adev->pageflip_irq, i); |
790 | +} |
791 | + |
792 | /** |
793 | * dce_v8_0_page_flip - pageflip callback. |
794 | * |
795 | @@ -2575,9 +2593,10 @@ static void dce_v8_0_crtc_dpms(struct drm_crtc *crtc, int mode) |
796 | dce_v8_0_vga_enable(crtc, true); |
797 | amdgpu_atombios_crtc_blank(crtc, ATOM_DISABLE); |
798 | dce_v8_0_vga_enable(crtc, false); |
799 | - /* Make sure VBLANK interrupt is still enabled */ |
800 | + /* Make sure VBLANK and PFLIP interrupts are still enabled */ |
801 | type = amdgpu_crtc_idx_to_irq_type(adev, amdgpu_crtc->crtc_id); |
802 | amdgpu_irq_update(adev, &adev->crtc_irq, type); |
803 | + amdgpu_irq_update(adev, &adev->pageflip_irq, type); |
804 | drm_vblank_post_modeset(dev, amdgpu_crtc->crtc_id); |
805 | dce_v8_0_crtc_load_lut(crtc); |
806 | break; |
807 | @@ -2933,6 +2952,8 @@ static int dce_v8_0_hw_init(void *handle) |
808 | dce_v8_0_audio_enable(adev, &adev->mode_info.audio.pin[i], false); |
809 | } |
810 | |
811 | + dce_v8_0_pageflip_interrupt_init(adev); |
812 | + |
813 | return 0; |
814 | } |
815 | |
816 | @@ -2947,6 +2968,8 @@ static int dce_v8_0_hw_fini(void *handle) |
817 | dce_v8_0_audio_enable(adev, &adev->mode_info.audio.pin[i], false); |
818 | } |
819 | |
820 | + dce_v8_0_pageflip_interrupt_fini(adev); |
821 | + |
822 | return 0; |
823 | } |
824 | |
825 | @@ -2958,6 +2981,8 @@ static int dce_v8_0_suspend(void *handle) |
826 | |
827 | dce_v8_0_hpd_fini(adev); |
828 | |
829 | + dce_v8_0_pageflip_interrupt_fini(adev); |
830 | + |
831 | return 0; |
832 | } |
833 | |
834 | @@ -2981,6 +3006,8 @@ static int dce_v8_0_resume(void *handle) |
835 | /* initialize hpd */ |
836 | dce_v8_0_hpd_init(adev); |
837 | |
838 | + dce_v8_0_pageflip_interrupt_init(adev); |
839 | + |
840 | return 0; |
841 | } |
842 | |
843 | @@ -3376,7 +3403,6 @@ static int dce_v8_0_pageflip_irq(struct amdgpu_device *adev, |
844 | spin_unlock_irqrestore(&adev->ddev->event_lock, flags); |
845 | |
846 | drm_vblank_put(adev->ddev, amdgpu_crtc->crtc_id); |
847 | - amdgpu_irq_put(adev, &adev->pageflip_irq, crtc_id); |
848 | queue_work(amdgpu_crtc->pflip_queue, &works->unpin_work); |
849 | |
850 | return 0; |
851 | diff --git a/drivers/gpu/drm/amd/amdgpu/kv_dpm.c b/drivers/gpu/drm/amd/amdgpu/kv_dpm.c |
852 | index 94ec04a9c4d5..9745ed3a9aef 100644 |
853 | --- a/drivers/gpu/drm/amd/amdgpu/kv_dpm.c |
854 | +++ b/drivers/gpu/drm/amd/amdgpu/kv_dpm.c |
855 | @@ -2995,6 +2995,12 @@ static int kv_dpm_late_init(void *handle) |
856 | { |
857 | /* powerdown unused blocks for now */ |
858 | struct amdgpu_device *adev = (struct amdgpu_device *)handle; |
859 | + int ret; |
860 | + |
861 | + /* init the sysfs and debugfs files late */ |
862 | + ret = amdgpu_pm_sysfs_init(adev); |
863 | + if (ret) |
864 | + return ret; |
865 | |
866 | kv_dpm_powergate_acp(adev, true); |
867 | kv_dpm_powergate_samu(adev, true); |
868 | @@ -3038,9 +3044,6 @@ static int kv_dpm_sw_init(void *handle) |
869 | adev->pm.dpm.current_ps = adev->pm.dpm.requested_ps = adev->pm.dpm.boot_ps; |
870 | if (amdgpu_dpm == 1) |
871 | amdgpu_pm_print_power_states(adev); |
872 | - ret = amdgpu_pm_sysfs_init(adev); |
873 | - if (ret) |
874 | - goto dpm_failed; |
875 | mutex_unlock(&adev->pm.mutex); |
876 | DRM_INFO("amdgpu: dpm initialized\n"); |
877 | |
878 | diff --git a/drivers/gpu/drm/amd/amdgpu/vi.c b/drivers/gpu/drm/amd/amdgpu/vi.c |
879 | index 4f58a1e18de6..9ffa56cebdbc 100644 |
880 | --- a/drivers/gpu/drm/amd/amdgpu/vi.c |
881 | +++ b/drivers/gpu/drm/amd/amdgpu/vi.c |
882 | @@ -968,6 +968,9 @@ static void vi_pcie_gen3_enable(struct amdgpu_device *adev) |
883 | u32 mask; |
884 | int ret; |
885 | |
886 | + if (pci_is_root_bus(adev->pdev->bus)) |
887 | + return; |
888 | + |
889 | if (amdgpu_pcie_gen2 == 0) |
890 | return; |
891 | |
892 | diff --git a/drivers/gpu/drm/drm_dp_mst_topology.c b/drivers/gpu/drm/drm_dp_mst_topology.c |
893 | index 969e7898a7ed..27a2426c3daa 100644 |
894 | --- a/drivers/gpu/drm/drm_dp_mst_topology.c |
895 | +++ b/drivers/gpu/drm/drm_dp_mst_topology.c |
896 | @@ -2789,12 +2789,13 @@ static int drm_dp_mst_i2c_xfer(struct i2c_adapter *adapter, struct i2c_msg *msgs |
897 | if (msgs[num - 1].flags & I2C_M_RD) |
898 | reading = true; |
899 | |
900 | - if (!reading) { |
901 | + if (!reading || (num - 1 > DP_REMOTE_I2C_READ_MAX_TRANSACTIONS)) { |
902 | DRM_DEBUG_KMS("Unsupported I2C transaction for MST device\n"); |
903 | ret = -EIO; |
904 | goto out; |
905 | } |
906 | |
907 | + memset(&msg, 0, sizeof(msg)); |
908 | msg.req_type = DP_REMOTE_I2C_READ; |
909 | msg.u.i2c_read.num_transactions = num - 1; |
910 | msg.u.i2c_read.port_number = port->port_num; |
911 | diff --git a/drivers/gpu/drm/drm_sysfs.c b/drivers/gpu/drm/drm_sysfs.c |
912 | index 0f6cd33b531f..684bd4a13843 100644 |
913 | --- a/drivers/gpu/drm/drm_sysfs.c |
914 | +++ b/drivers/gpu/drm/drm_sysfs.c |
915 | @@ -235,18 +235,12 @@ static ssize_t dpms_show(struct device *device, |
916 | char *buf) |
917 | { |
918 | struct drm_connector *connector = to_drm_connector(device); |
919 | - struct drm_device *dev = connector->dev; |
920 | - uint64_t dpms_status; |
921 | - int ret; |
922 | + int dpms; |
923 | |
924 | - ret = drm_object_property_get_value(&connector->base, |
925 | - dev->mode_config.dpms_property, |
926 | - &dpms_status); |
927 | - if (ret) |
928 | - return 0; |
929 | + dpms = READ_ONCE(connector->dpms); |
930 | |
931 | return snprintf(buf, PAGE_SIZE, "%s\n", |
932 | - drm_get_dpms_name((int)dpms_status)); |
933 | + drm_get_dpms_name(dpms)); |
934 | } |
935 | |
936 | static ssize_t enabled_show(struct device *device, |
937 | diff --git a/drivers/gpu/drm/nouveau/nouveau_fbcon.c b/drivers/gpu/drm/nouveau/nouveau_fbcon.c |
938 | index 6751553abe4a..567791b27d6d 100644 |
939 | --- a/drivers/gpu/drm/nouveau/nouveau_fbcon.c |
940 | +++ b/drivers/gpu/drm/nouveau/nouveau_fbcon.c |
941 | @@ -178,8 +178,30 @@ nouveau_fbcon_sync(struct fb_info *info) |
942 | return 0; |
943 | } |
944 | |
945 | +static int |
946 | +nouveau_fbcon_open(struct fb_info *info, int user) |
947 | +{ |
948 | + struct nouveau_fbdev *fbcon = info->par; |
949 | + struct nouveau_drm *drm = nouveau_drm(fbcon->dev); |
950 | + int ret = pm_runtime_get_sync(drm->dev->dev); |
951 | + if (ret < 0 && ret != -EACCES) |
952 | + return ret; |
953 | + return 0; |
954 | +} |
955 | + |
956 | +static int |
957 | +nouveau_fbcon_release(struct fb_info *info, int user) |
958 | +{ |
959 | + struct nouveau_fbdev *fbcon = info->par; |
960 | + struct nouveau_drm *drm = nouveau_drm(fbcon->dev); |
961 | + pm_runtime_put(drm->dev->dev); |
962 | + return 0; |
963 | +} |
964 | + |
965 | static struct fb_ops nouveau_fbcon_ops = { |
966 | .owner = THIS_MODULE, |
967 | + .fb_open = nouveau_fbcon_open, |
968 | + .fb_release = nouveau_fbcon_release, |
969 | .fb_check_var = drm_fb_helper_check_var, |
970 | .fb_set_par = drm_fb_helper_set_par, |
971 | .fb_fillrect = nouveau_fbcon_fillrect, |
972 | @@ -195,6 +217,8 @@ static struct fb_ops nouveau_fbcon_ops = { |
973 | |
974 | static struct fb_ops nouveau_fbcon_sw_ops = { |
975 | .owner = THIS_MODULE, |
976 | + .fb_open = nouveau_fbcon_open, |
977 | + .fb_release = nouveau_fbcon_release, |
978 | .fb_check_var = drm_fb_helper_check_var, |
979 | .fb_set_par = drm_fb_helper_set_par, |
980 | .fb_fillrect = cfb_fillrect, |
981 | diff --git a/drivers/gpu/drm/qxl/qxl_fb.c b/drivers/gpu/drm/qxl/qxl_fb.c |
982 | index 6b6e57e8c2d6..847a902e7385 100644 |
983 | --- a/drivers/gpu/drm/qxl/qxl_fb.c |
984 | +++ b/drivers/gpu/drm/qxl/qxl_fb.c |
985 | @@ -144,14 +144,17 @@ static void qxl_dirty_update(struct qxl_fbdev *qfbdev, |
986 | |
987 | spin_lock_irqsave(&qfbdev->dirty.lock, flags); |
988 | |
989 | - if (qfbdev->dirty.y1 < y) |
990 | - y = qfbdev->dirty.y1; |
991 | - if (qfbdev->dirty.y2 > y2) |
992 | - y2 = qfbdev->dirty.y2; |
993 | - if (qfbdev->dirty.x1 < x) |
994 | - x = qfbdev->dirty.x1; |
995 | - if (qfbdev->dirty.x2 > x2) |
996 | - x2 = qfbdev->dirty.x2; |
997 | + if ((qfbdev->dirty.y2 - qfbdev->dirty.y1) && |
998 | + (qfbdev->dirty.x2 - qfbdev->dirty.x1)) { |
999 | + if (qfbdev->dirty.y1 < y) |
1000 | + y = qfbdev->dirty.y1; |
1001 | + if (qfbdev->dirty.y2 > y2) |
1002 | + y2 = qfbdev->dirty.y2; |
1003 | + if (qfbdev->dirty.x1 < x) |
1004 | + x = qfbdev->dirty.x1; |
1005 | + if (qfbdev->dirty.x2 > x2) |
1006 | + x2 = qfbdev->dirty.x2; |
1007 | + } |
1008 | |
1009 | qfbdev->dirty.x1 = x; |
1010 | qfbdev->dirty.x2 = x2; |
1011 | diff --git a/drivers/gpu/drm/radeon/radeon_display.c b/drivers/gpu/drm/radeon/radeon_display.c |
1012 | index d2e9e9efc159..6743174acdbc 100644 |
1013 | --- a/drivers/gpu/drm/radeon/radeon_display.c |
1014 | +++ b/drivers/gpu/drm/radeon/radeon_display.c |
1015 | @@ -1633,18 +1633,8 @@ int radeon_modeset_init(struct radeon_device *rdev) |
1016 | radeon_fbdev_init(rdev); |
1017 | drm_kms_helper_poll_init(rdev->ddev); |
1018 | |
1019 | - if (rdev->pm.dpm_enabled) { |
1020 | - /* do dpm late init */ |
1021 | - ret = radeon_pm_late_init(rdev); |
1022 | - if (ret) { |
1023 | - rdev->pm.dpm_enabled = false; |
1024 | - DRM_ERROR("radeon_pm_late_init failed, disabling dpm\n"); |
1025 | - } |
1026 | - /* set the dpm state for PX since there won't be |
1027 | - * a modeset to call this. |
1028 | - */ |
1029 | - radeon_pm_compute_clocks(rdev); |
1030 | - } |
1031 | + /* do pm late init */ |
1032 | + ret = radeon_pm_late_init(rdev); |
1033 | |
1034 | return 0; |
1035 | } |
1036 | diff --git a/drivers/gpu/drm/radeon/radeon_dp_mst.c b/drivers/gpu/drm/radeon/radeon_dp_mst.c |
1037 | index 257b10be5cda..42986130cc63 100644 |
1038 | --- a/drivers/gpu/drm/radeon/radeon_dp_mst.c |
1039 | +++ b/drivers/gpu/drm/radeon/radeon_dp_mst.c |
1040 | @@ -283,6 +283,7 @@ static struct drm_connector *radeon_dp_add_mst_connector(struct drm_dp_mst_topol |
1041 | radeon_connector->mst_encoder = radeon_dp_create_fake_mst_encoder(master); |
1042 | |
1043 | drm_object_attach_property(&connector->base, dev->mode_config.path_property, 0); |
1044 | + drm_object_attach_property(&connector->base, dev->mode_config.tile_property, 0); |
1045 | drm_mode_connector_set_path_property(connector, pathprop); |
1046 | drm_reinit_primary_mode_group(dev); |
1047 | |
1048 | diff --git a/drivers/gpu/drm/radeon/radeon_pm.c b/drivers/gpu/drm/radeon/radeon_pm.c |
1049 | index c1ba83a8dd8c..948c33105801 100644 |
1050 | --- a/drivers/gpu/drm/radeon/radeon_pm.c |
1051 | +++ b/drivers/gpu/drm/radeon/radeon_pm.c |
1052 | @@ -1331,14 +1331,6 @@ static int radeon_pm_init_old(struct radeon_device *rdev) |
1053 | INIT_DELAYED_WORK(&rdev->pm.dynpm_idle_work, radeon_dynpm_idle_work_handler); |
1054 | |
1055 | if (rdev->pm.num_power_states > 1) { |
1056 | - /* where's the best place to put these? */ |
1057 | - ret = device_create_file(rdev->dev, &dev_attr_power_profile); |
1058 | - if (ret) |
1059 | - DRM_ERROR("failed to create device file for power profile\n"); |
1060 | - ret = device_create_file(rdev->dev, &dev_attr_power_method); |
1061 | - if (ret) |
1062 | - DRM_ERROR("failed to create device file for power method\n"); |
1063 | - |
1064 | if (radeon_debugfs_pm_init(rdev)) { |
1065 | DRM_ERROR("Failed to register debugfs file for PM!\n"); |
1066 | } |
1067 | @@ -1396,20 +1388,6 @@ static int radeon_pm_init_dpm(struct radeon_device *rdev) |
1068 | goto dpm_failed; |
1069 | rdev->pm.dpm_enabled = true; |
1070 | |
1071 | - ret = device_create_file(rdev->dev, &dev_attr_power_dpm_state); |
1072 | - if (ret) |
1073 | - DRM_ERROR("failed to create device file for dpm state\n"); |
1074 | - ret = device_create_file(rdev->dev, &dev_attr_power_dpm_force_performance_level); |
1075 | - if (ret) |
1076 | - DRM_ERROR("failed to create device file for dpm state\n"); |
1077 | - /* XXX: these are noops for dpm but are here for backwards compat */ |
1078 | - ret = device_create_file(rdev->dev, &dev_attr_power_profile); |
1079 | - if (ret) |
1080 | - DRM_ERROR("failed to create device file for power profile\n"); |
1081 | - ret = device_create_file(rdev->dev, &dev_attr_power_method); |
1082 | - if (ret) |
1083 | - DRM_ERROR("failed to create device file for power method\n"); |
1084 | - |
1085 | if (radeon_debugfs_pm_init(rdev)) { |
1086 | DRM_ERROR("Failed to register debugfs file for dpm!\n"); |
1087 | } |
1088 | @@ -1550,9 +1528,44 @@ int radeon_pm_late_init(struct radeon_device *rdev) |
1089 | int ret = 0; |
1090 | |
1091 | if (rdev->pm.pm_method == PM_METHOD_DPM) { |
1092 | - mutex_lock(&rdev->pm.mutex); |
1093 | - ret = radeon_dpm_late_enable(rdev); |
1094 | - mutex_unlock(&rdev->pm.mutex); |
1095 | + if (rdev->pm.dpm_enabled) { |
1096 | + ret = device_create_file(rdev->dev, &dev_attr_power_dpm_state); |
1097 | + if (ret) |
1098 | + DRM_ERROR("failed to create device file for dpm state\n"); |
1099 | + ret = device_create_file(rdev->dev, &dev_attr_power_dpm_force_performance_level); |
1100 | + if (ret) |
1101 | + DRM_ERROR("failed to create device file for dpm state\n"); |
1102 | + /* XXX: these are noops for dpm but are here for backwards compat */ |
1103 | + ret = device_create_file(rdev->dev, &dev_attr_power_profile); |
1104 | + if (ret) |
1105 | + DRM_ERROR("failed to create device file for power profile\n"); |
1106 | + ret = device_create_file(rdev->dev, &dev_attr_power_method); |
1107 | + if (ret) |
1108 | + DRM_ERROR("failed to create device file for power method\n"); |
1109 | + |
1110 | + mutex_lock(&rdev->pm.mutex); |
1111 | + ret = radeon_dpm_late_enable(rdev); |
1112 | + mutex_unlock(&rdev->pm.mutex); |
1113 | + if (ret) { |
1114 | + rdev->pm.dpm_enabled = false; |
1115 | + DRM_ERROR("radeon_pm_late_init failed, disabling dpm\n"); |
1116 | + } else { |
1117 | + /* set the dpm state for PX since there won't be |
1118 | + * a modeset to call this. |
1119 | + */ |
1120 | + radeon_pm_compute_clocks(rdev); |
1121 | + } |
1122 | + } |
1123 | + } else { |
1124 | + if (rdev->pm.num_power_states > 1) { |
1125 | + /* where's the best place to put these? */ |
1126 | + ret = device_create_file(rdev->dev, &dev_attr_power_profile); |
1127 | + if (ret) |
1128 | + DRM_ERROR("failed to create device file for power profile\n"); |
1129 | + ret = device_create_file(rdev->dev, &dev_attr_power_method); |
1130 | + if (ret) |
1131 | + DRM_ERROR("failed to create device file for power method\n"); |
1132 | + } |
1133 | } |
1134 | return ret; |
1135 | } |
1136 | diff --git a/drivers/i2c/busses/i2c-designware-platdrv.c b/drivers/i2c/busses/i2c-designware-platdrv.c |
1137 | index 3dd2de31a2f8..472b88285c75 100644 |
1138 | --- a/drivers/i2c/busses/i2c-designware-platdrv.c |
1139 | +++ b/drivers/i2c/busses/i2c-designware-platdrv.c |
1140 | @@ -24,6 +24,7 @@ |
1141 | #include <linux/kernel.h> |
1142 | #include <linux/module.h> |
1143 | #include <linux/delay.h> |
1144 | +#include <linux/dmi.h> |
1145 | #include <linux/i2c.h> |
1146 | #include <linux/clk.h> |
1147 | #include <linux/clk-provider.h> |
1148 | @@ -51,6 +52,22 @@ static u32 i2c_dw_get_clk_rate_khz(struct dw_i2c_dev *dev) |
1149 | } |
1150 | |
1151 | #ifdef CONFIG_ACPI |
1152 | +/* |
1153 | + * The HCNT/LCNT information coming from ACPI should be the most accurate |
1154 | + * for given platform. However, some systems get it wrong. On such systems |
1155 | + * we get better results by calculating those based on the input clock. |
1156 | + */ |
1157 | +static const struct dmi_system_id dw_i2c_no_acpi_params[] = { |
1158 | + { |
1159 | + .ident = "Dell Inspiron 7348", |
1160 | + .matches = { |
1161 | + DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), |
1162 | + DMI_MATCH(DMI_PRODUCT_NAME, "Inspiron 7348"), |
1163 | + }, |
1164 | + }, |
1165 | + { } |
1166 | +}; |
1167 | + |
1168 | static void dw_i2c_acpi_params(struct platform_device *pdev, char method[], |
1169 | u16 *hcnt, u16 *lcnt, u32 *sda_hold) |
1170 | { |
1171 | @@ -58,6 +75,9 @@ static void dw_i2c_acpi_params(struct platform_device *pdev, char method[], |
1172 | acpi_handle handle = ACPI_HANDLE(&pdev->dev); |
1173 | union acpi_object *obj; |
1174 | |
1175 | + if (dmi_check_system(dw_i2c_no_acpi_params)) |
1176 | + return; |
1177 | + |
1178 | if (ACPI_FAILURE(acpi_evaluate_object(handle, method, NULL, &buf))) |
1179 | return; |
1180 | |
1181 | @@ -253,12 +273,6 @@ static int dw_i2c_probe(struct platform_device *pdev) |
1182 | adap->dev.parent = &pdev->dev; |
1183 | adap->dev.of_node = pdev->dev.of_node; |
1184 | |
1185 | - r = i2c_add_numbered_adapter(adap); |
1186 | - if (r) { |
1187 | - dev_err(&pdev->dev, "failure adding adapter\n"); |
1188 | - return r; |
1189 | - } |
1190 | - |
1191 | if (dev->pm_runtime_disabled) { |
1192 | pm_runtime_forbid(&pdev->dev); |
1193 | } else { |
1194 | @@ -268,6 +282,13 @@ static int dw_i2c_probe(struct platform_device *pdev) |
1195 | pm_runtime_enable(&pdev->dev); |
1196 | } |
1197 | |
1198 | + r = i2c_add_numbered_adapter(adap); |
1199 | + if (r) { |
1200 | + dev_err(&pdev->dev, "failure adding adapter\n"); |
1201 | + pm_runtime_disable(&pdev->dev); |
1202 | + return r; |
1203 | + } |
1204 | + |
1205 | return 0; |
1206 | } |
1207 | |
1208 | diff --git a/drivers/i2c/busses/i2c-rcar.c b/drivers/i2c/busses/i2c-rcar.c |
1209 | index d8361dada584..d8b5a8fee1e6 100644 |
1210 | --- a/drivers/i2c/busses/i2c-rcar.c |
1211 | +++ b/drivers/i2c/busses/i2c-rcar.c |
1212 | @@ -690,15 +690,16 @@ static int rcar_i2c_probe(struct platform_device *pdev) |
1213 | return ret; |
1214 | } |
1215 | |
1216 | + pm_runtime_enable(dev); |
1217 | + platform_set_drvdata(pdev, priv); |
1218 | + |
1219 | ret = i2c_add_numbered_adapter(adap); |
1220 | if (ret < 0) { |
1221 | dev_err(dev, "reg adap failed: %d\n", ret); |
1222 | + pm_runtime_disable(dev); |
1223 | return ret; |
1224 | } |
1225 | |
1226 | - pm_runtime_enable(dev); |
1227 | - platform_set_drvdata(pdev, priv); |
1228 | - |
1229 | dev_info(dev, "probed\n"); |
1230 | |
1231 | return 0; |
1232 | diff --git a/drivers/i2c/busses/i2c-s3c2410.c b/drivers/i2c/busses/i2c-s3c2410.c |
1233 | index 50bfd8cef5f2..5df819610d52 100644 |
1234 | --- a/drivers/i2c/busses/i2c-s3c2410.c |
1235 | +++ b/drivers/i2c/busses/i2c-s3c2410.c |
1236 | @@ -1243,17 +1243,19 @@ static int s3c24xx_i2c_probe(struct platform_device *pdev) |
1237 | i2c->adap.nr = i2c->pdata->bus_num; |
1238 | i2c->adap.dev.of_node = pdev->dev.of_node; |
1239 | |
1240 | + platform_set_drvdata(pdev, i2c); |
1241 | + |
1242 | + pm_runtime_enable(&pdev->dev); |
1243 | + |
1244 | ret = i2c_add_numbered_adapter(&i2c->adap); |
1245 | if (ret < 0) { |
1246 | dev_err(&pdev->dev, "failed to add bus to i2c core\n"); |
1247 | + pm_runtime_disable(&pdev->dev); |
1248 | s3c24xx_i2c_deregister_cpufreq(i2c); |
1249 | clk_unprepare(i2c->clk); |
1250 | return ret; |
1251 | } |
1252 | |
1253 | - platform_set_drvdata(pdev, i2c); |
1254 | - |
1255 | - pm_runtime_enable(&pdev->dev); |
1256 | pm_runtime_enable(&i2c->adap.dev); |
1257 | |
1258 | dev_info(&pdev->dev, "%s: S3C I2C adapter\n", dev_name(&i2c->adap.dev)); |
1259 | diff --git a/drivers/md/dm-thin.c b/drivers/md/dm-thin.c |
1260 | index 75aef240c2d1..493c38e08bd2 100644 |
1261 | --- a/drivers/md/dm-thin.c |
1262 | +++ b/drivers/md/dm-thin.c |
1263 | @@ -3255,7 +3255,7 @@ static int pool_ctr(struct dm_target *ti, unsigned argc, char **argv) |
1264 | metadata_low_callback, |
1265 | pool); |
1266 | if (r) |
1267 | - goto out_free_pt; |
1268 | + goto out_flags_changed; |
1269 | |
1270 | pt->callbacks.congested_fn = pool_is_congested; |
1271 | dm_table_add_target_callbacks(ti->table, &pt->callbacks); |
1272 | diff --git a/drivers/mfd/max77843.c b/drivers/mfd/max77843.c |
1273 | index a354ac677ec7..1074a0d68680 100644 |
1274 | --- a/drivers/mfd/max77843.c |
1275 | +++ b/drivers/mfd/max77843.c |
1276 | @@ -79,7 +79,7 @@ static int max77843_chg_init(struct max77843 *max77843) |
1277 | if (!max77843->i2c_chg) { |
1278 | dev_err(&max77843->i2c->dev, |
1279 | "Cannot allocate I2C device for Charger\n"); |
1280 | - return PTR_ERR(max77843->i2c_chg); |
1281 | + return -ENODEV; |
1282 | } |
1283 | i2c_set_clientdata(max77843->i2c_chg, max77843); |
1284 | |
1285 | diff --git a/drivers/net/ethernet/ibm/emac/core.h b/drivers/net/ethernet/ibm/emac/core.h |
1286 | index 28df37420da9..ac02c675c59c 100644 |
1287 | --- a/drivers/net/ethernet/ibm/emac/core.h |
1288 | +++ b/drivers/net/ethernet/ibm/emac/core.h |
1289 | @@ -460,8 +460,8 @@ struct emac_ethtool_regs_subhdr { |
1290 | u32 index; |
1291 | }; |
1292 | |
1293 | -#define EMAC_ETHTOOL_REGS_VER 0 |
1294 | -#define EMAC4_ETHTOOL_REGS_VER 1 |
1295 | -#define EMAC4SYNC_ETHTOOL_REGS_VER 2 |
1296 | +#define EMAC_ETHTOOL_REGS_VER 3 |
1297 | +#define EMAC4_ETHTOOL_REGS_VER 4 |
1298 | +#define EMAC4SYNC_ETHTOOL_REGS_VER 5 |
1299 | |
1300 | #endif /* __IBM_NEWEMAC_CORE_H */ |
1301 | diff --git a/drivers/net/ppp/pppoe.c b/drivers/net/ppp/pppoe.c |
1302 | index 3837ae344f63..2ed75060da50 100644 |
1303 | --- a/drivers/net/ppp/pppoe.c |
1304 | +++ b/drivers/net/ppp/pppoe.c |
1305 | @@ -313,7 +313,6 @@ static void pppoe_flush_dev(struct net_device *dev) |
1306 | if (po->pppoe_dev == dev && |
1307 | sk->sk_state & (PPPOX_CONNECTED | PPPOX_BOUND | PPPOX_ZOMBIE)) { |
1308 | pppox_unbind_sock(sk); |
1309 | - sk->sk_state = PPPOX_ZOMBIE; |
1310 | sk->sk_state_change(sk); |
1311 | po->pppoe_dev = NULL; |
1312 | dev_put(dev); |
1313 | diff --git a/drivers/pinctrl/freescale/pinctrl-imx25.c b/drivers/pinctrl/freescale/pinctrl-imx25.c |
1314 | index faf635654312..293ed4381cc0 100644 |
1315 | --- a/drivers/pinctrl/freescale/pinctrl-imx25.c |
1316 | +++ b/drivers/pinctrl/freescale/pinctrl-imx25.c |
1317 | @@ -26,7 +26,8 @@ |
1318 | #include "pinctrl-imx.h" |
1319 | |
1320 | enum imx25_pads { |
1321 | - MX25_PAD_RESERVE0 = 1, |
1322 | + MX25_PAD_RESERVE0 = 0, |
1323 | + MX25_PAD_RESERVE1 = 1, |
1324 | MX25_PAD_A10 = 2, |
1325 | MX25_PAD_A13 = 3, |
1326 | MX25_PAD_A14 = 4, |
1327 | @@ -169,6 +170,7 @@ enum imx25_pads { |
1328 | /* Pad names for the pinmux subsystem */ |
1329 | static const struct pinctrl_pin_desc imx25_pinctrl_pads[] = { |
1330 | IMX_PINCTRL_PIN(MX25_PAD_RESERVE0), |
1331 | + IMX_PINCTRL_PIN(MX25_PAD_RESERVE1), |
1332 | IMX_PINCTRL_PIN(MX25_PAD_A10), |
1333 | IMX_PINCTRL_PIN(MX25_PAD_A13), |
1334 | IMX_PINCTRL_PIN(MX25_PAD_A14), |
1335 | diff --git a/fs/btrfs/backref.c b/fs/btrfs/backref.c |
1336 | index 802fabb30e15..34cbe3505dac 100644 |
1337 | --- a/fs/btrfs/backref.c |
1338 | +++ b/fs/btrfs/backref.c |
1339 | @@ -1809,7 +1809,6 @@ static int iterate_inode_extrefs(u64 inum, struct btrfs_root *fs_root, |
1340 | int found = 0; |
1341 | struct extent_buffer *eb; |
1342 | struct btrfs_inode_extref *extref; |
1343 | - struct extent_buffer *leaf; |
1344 | u32 item_size; |
1345 | u32 cur_offset; |
1346 | unsigned long ptr; |
1347 | @@ -1837,9 +1836,8 @@ static int iterate_inode_extrefs(u64 inum, struct btrfs_root *fs_root, |
1348 | btrfs_set_lock_blocking_rw(eb, BTRFS_READ_LOCK); |
1349 | btrfs_release_path(path); |
1350 | |
1351 | - leaf = path->nodes[0]; |
1352 | - item_size = btrfs_item_size_nr(leaf, slot); |
1353 | - ptr = btrfs_item_ptr_offset(leaf, slot); |
1354 | + item_size = btrfs_item_size_nr(eb, slot); |
1355 | + ptr = btrfs_item_ptr_offset(eb, slot); |
1356 | cur_offset = 0; |
1357 | |
1358 | while (cur_offset < item_size) { |
1359 | @@ -1853,7 +1851,7 @@ static int iterate_inode_extrefs(u64 inum, struct btrfs_root *fs_root, |
1360 | if (ret) |
1361 | break; |
1362 | |
1363 | - cur_offset += btrfs_inode_extref_name_len(leaf, extref); |
1364 | + cur_offset += btrfs_inode_extref_name_len(eb, extref); |
1365 | cur_offset += sizeof(*extref); |
1366 | } |
1367 | btrfs_tree_read_unlock_blocking(eb); |
1368 | diff --git a/fs/btrfs/ioctl.c b/fs/btrfs/ioctl.c |
1369 | index 0770c91586ca..f490b6155091 100644 |
1370 | --- a/fs/btrfs/ioctl.c |
1371 | +++ b/fs/btrfs/ioctl.c |
1372 | @@ -4647,6 +4647,11 @@ locked: |
1373 | bctl->flags |= BTRFS_BALANCE_TYPE_MASK; |
1374 | } |
1375 | |
1376 | + if (bctl->flags & ~(BTRFS_BALANCE_ARGS_MASK | BTRFS_BALANCE_TYPE_MASK)) { |
1377 | + ret = -EINVAL; |
1378 | + goto out_bargs; |
1379 | + } |
1380 | + |
1381 | do_balance: |
1382 | /* |
1383 | * Ownership of bctl and mutually_exclusive_operation_running |
1384 | diff --git a/fs/btrfs/volumes.h b/fs/btrfs/volumes.h |
1385 | index 95842a909e7f..2ac5f8cd701a 100644 |
1386 | --- a/fs/btrfs/volumes.h |
1387 | +++ b/fs/btrfs/volumes.h |
1388 | @@ -376,6 +376,14 @@ struct map_lookup { |
1389 | #define BTRFS_BALANCE_ARGS_VRANGE (1ULL << 4) |
1390 | #define BTRFS_BALANCE_ARGS_LIMIT (1ULL << 5) |
1391 | |
1392 | +#define BTRFS_BALANCE_ARGS_MASK \ |
1393 | + (BTRFS_BALANCE_ARGS_PROFILES | \ |
1394 | + BTRFS_BALANCE_ARGS_USAGE | \ |
1395 | + BTRFS_BALANCE_ARGS_DEVID | \ |
1396 | + BTRFS_BALANCE_ARGS_DRANGE | \ |
1397 | + BTRFS_BALANCE_ARGS_VRANGE | \ |
1398 | + BTRFS_BALANCE_ARGS_LIMIT) |
1399 | + |
1400 | /* |
1401 | * Profile changing flags. When SOFT is set we won't relocate chunk if |
1402 | * it already has the target profile (even though it may be |
1403 | diff --git a/fs/nfsd/blocklayout.c b/fs/nfsd/blocklayout.c |
1404 | index cdefaa331a07..c29d9421bd5e 100644 |
1405 | --- a/fs/nfsd/blocklayout.c |
1406 | +++ b/fs/nfsd/blocklayout.c |
1407 | @@ -56,14 +56,6 @@ nfsd4_block_proc_layoutget(struct inode *inode, const struct svc_fh *fhp, |
1408 | u32 device_generation = 0; |
1409 | int error; |
1410 | |
1411 | - /* |
1412 | - * We do not attempt to support I/O smaller than the fs block size, |
1413 | - * or not aligned to it. |
1414 | - */ |
1415 | - if (args->lg_minlength < block_size) { |
1416 | - dprintk("pnfsd: I/O too small\n"); |
1417 | - goto out_layoutunavailable; |
1418 | - } |
1419 | if (seg->offset & (block_size - 1)) { |
1420 | dprintk("pnfsd: I/O misaligned\n"); |
1421 | goto out_layoutunavailable; |
1422 | diff --git a/include/drm/drm_dp_mst_helper.h b/include/drm/drm_dp_mst_helper.h |
1423 | index 86d0b25ed054..a89f505c856b 100644 |
1424 | --- a/include/drm/drm_dp_mst_helper.h |
1425 | +++ b/include/drm/drm_dp_mst_helper.h |
1426 | @@ -253,6 +253,7 @@ struct drm_dp_remote_dpcd_write { |
1427 | u8 *bytes; |
1428 | }; |
1429 | |
1430 | +#define DP_REMOTE_I2C_READ_MAX_TRANSACTIONS 4 |
1431 | struct drm_dp_remote_i2c_read { |
1432 | u8 num_transactions; |
1433 | u8 port_number; |
1434 | @@ -262,7 +263,7 @@ struct drm_dp_remote_i2c_read { |
1435 | u8 *bytes; |
1436 | u8 no_stop_bit; |
1437 | u8 i2c_transaction_delay; |
1438 | - } transactions[4]; |
1439 | + } transactions[DP_REMOTE_I2C_READ_MAX_TRANSACTIONS]; |
1440 | u8 read_i2c_device_id; |
1441 | u8 num_bytes_read; |
1442 | }; |
1443 | diff --git a/include/linux/skbuff.h b/include/linux/skbuff.h |
1444 | index 9b88536487e6..275158803824 100644 |
1445 | --- a/include/linux/skbuff.h |
1446 | +++ b/include/linux/skbuff.h |
1447 | @@ -2601,6 +2601,9 @@ static inline void skb_postpull_rcsum(struct sk_buff *skb, |
1448 | { |
1449 | if (skb->ip_summed == CHECKSUM_COMPLETE) |
1450 | skb->csum = csum_sub(skb->csum, csum_partial(start, len, 0)); |
1451 | + else if (skb->ip_summed == CHECKSUM_PARTIAL && |
1452 | + skb_checksum_start_offset(skb) < 0) |
1453 | + skb->ip_summed = CHECKSUM_NONE; |
1454 | } |
1455 | |
1456 | unsigned char *skb_pull_rcsum(struct sk_buff *skb, unsigned int len); |
1457 | diff --git a/include/net/af_unix.h b/include/net/af_unix.h |
1458 | index 4a167b30a12f..cb1b9bbda332 100644 |
1459 | --- a/include/net/af_unix.h |
1460 | +++ b/include/net/af_unix.h |
1461 | @@ -63,7 +63,11 @@ struct unix_sock { |
1462 | #define UNIX_GC_MAYBE_CYCLE 1 |
1463 | struct socket_wq peer_wq; |
1464 | }; |
1465 | -#define unix_sk(__sk) ((struct unix_sock *)__sk) |
1466 | + |
1467 | +static inline struct unix_sock *unix_sk(struct sock *sk) |
1468 | +{ |
1469 | + return (struct unix_sock *)sk; |
1470 | +} |
1471 | |
1472 | #define peer_wait peer_wq.wait |
1473 | |
1474 | diff --git a/include/net/sock.h b/include/net/sock.h |
1475 | index f21f0708ec59..4ca4c3fe446f 100644 |
1476 | --- a/include/net/sock.h |
1477 | +++ b/include/net/sock.h |
1478 | @@ -826,6 +826,14 @@ static inline __must_check int sk_add_backlog(struct sock *sk, struct sk_buff *s |
1479 | if (sk_rcvqueues_full(sk, limit)) |
1480 | return -ENOBUFS; |
1481 | |
1482 | + /* |
1483 | + * If the skb was allocated from pfmemalloc reserves, only |
1484 | + * allow SOCK_MEMALLOC sockets to use it as this socket is |
1485 | + * helping free memory |
1486 | + */ |
1487 | + if (skb_pfmemalloc(skb) && !sock_flag(sk, SOCK_MEMALLOC)) |
1488 | + return -ENOMEM; |
1489 | + |
1490 | __sk_add_backlog(sk, skb); |
1491 | sk->sk_backlog.len += skb->truesize; |
1492 | return 0; |
1493 | diff --git a/kernel/time/timekeeping.c b/kernel/time/timekeeping.c |
1494 | index a20d4110e871..3688f1e07ebd 100644 |
1495 | --- a/kernel/time/timekeeping.c |
1496 | +++ b/kernel/time/timekeeping.c |
1497 | @@ -1244,7 +1244,7 @@ void __init timekeeping_init(void) |
1498 | set_normalized_timespec64(&tmp, -boot.tv_sec, -boot.tv_nsec); |
1499 | tk_set_wall_to_mono(tk, tmp); |
1500 | |
1501 | - timekeeping_update(tk, TK_MIRROR); |
1502 | + timekeeping_update(tk, TK_MIRROR | TK_CLOCK_WAS_SET); |
1503 | |
1504 | write_seqcount_end(&tk_core.seq); |
1505 | raw_spin_unlock_irqrestore(&timekeeper_lock, flags); |
1506 | diff --git a/kernel/workqueue.c b/kernel/workqueue.c |
1507 | index a413acb59a07..1de0f5fabb98 100644 |
1508 | --- a/kernel/workqueue.c |
1509 | +++ b/kernel/workqueue.c |
1510 | @@ -1458,13 +1458,13 @@ static void __queue_delayed_work(int cpu, struct workqueue_struct *wq, |
1511 | timer_stats_timer_set_start_info(&dwork->timer); |
1512 | |
1513 | dwork->wq = wq; |
1514 | + /* timer isn't guaranteed to run in this cpu, record earlier */ |
1515 | + if (cpu == WORK_CPU_UNBOUND) |
1516 | + cpu = raw_smp_processor_id(); |
1517 | dwork->cpu = cpu; |
1518 | timer->expires = jiffies + delay; |
1519 | |
1520 | - if (unlikely(cpu != WORK_CPU_UNBOUND)) |
1521 | - add_timer_on(timer, cpu); |
1522 | - else |
1523 | - add_timer(timer); |
1524 | + add_timer_on(timer, cpu); |
1525 | } |
1526 | |
1527 | /** |
1528 | diff --git a/mm/memcontrol.c b/mm/memcontrol.c |
1529 | index 237d4686482d..03a6f7506cf3 100644 |
1530 | --- a/mm/memcontrol.c |
1531 | +++ b/mm/memcontrol.c |
1532 | @@ -3687,6 +3687,7 @@ static int __mem_cgroup_usage_register_event(struct mem_cgroup *memcg, |
1533 | ret = page_counter_memparse(args, "-1", &threshold); |
1534 | if (ret) |
1535 | return ret; |
1536 | + threshold <<= PAGE_SHIFT; |
1537 | |
1538 | mutex_lock(&memcg->thresholds_lock); |
1539 | |
1540 | diff --git a/net/core/ethtool.c b/net/core/ethtool.c |
1541 | index b495ab1797fa..29edf74846fc 100644 |
1542 | --- a/net/core/ethtool.c |
1543 | +++ b/net/core/ethtool.c |
1544 | @@ -1284,7 +1284,7 @@ static int ethtool_get_strings(struct net_device *dev, void __user *useraddr) |
1545 | |
1546 | gstrings.len = ret; |
1547 | |
1548 | - data = kmalloc(gstrings.len * ETH_GSTRING_LEN, GFP_USER); |
1549 | + data = kcalloc(gstrings.len, ETH_GSTRING_LEN, GFP_USER); |
1550 | if (!data) |
1551 | return -ENOMEM; |
1552 | |
1553 | diff --git a/net/core/filter.c b/net/core/filter.c |
1554 | index be3098fb65e4..8dcdd86b68dd 100644 |
1555 | --- a/net/core/filter.c |
1556 | +++ b/net/core/filter.c |
1557 | @@ -1412,6 +1412,7 @@ static u64 bpf_clone_redirect(u64 r1, u64 ifindex, u64 flags, u64 r4, u64 r5) |
1558 | return dev_forward_skb(dev, skb2); |
1559 | |
1560 | skb2->dev = dev; |
1561 | + skb_sender_cpu_clear(skb2); |
1562 | return dev_queue_xmit(skb2); |
1563 | } |
1564 | |
1565 | @@ -1701,9 +1702,13 @@ int sk_get_filter(struct sock *sk, struct sock_filter __user *ubuf, |
1566 | goto out; |
1567 | |
1568 | /* We're copying the filter that has been originally attached, |
1569 | - * so no conversion/decode needed anymore. |
1570 | + * so no conversion/decode needed anymore. eBPF programs that |
1571 | + * have no original program cannot be dumped through this. |
1572 | */ |
1573 | + ret = -EACCES; |
1574 | fprog = filter->prog->orig_prog; |
1575 | + if (!fprog) |
1576 | + goto out; |
1577 | |
1578 | ret = fprog->len; |
1579 | if (!len) |
1580 | diff --git a/net/core/skbuff.c b/net/core/skbuff.c |
1581 | index 7b84330e5d30..7bfa18746681 100644 |
1582 | --- a/net/core/skbuff.c |
1583 | +++ b/net/core/skbuff.c |
1584 | @@ -2958,11 +2958,12 @@ EXPORT_SYMBOL_GPL(skb_append_pagefrags); |
1585 | */ |
1586 | unsigned char *skb_pull_rcsum(struct sk_buff *skb, unsigned int len) |
1587 | { |
1588 | + unsigned char *data = skb->data; |
1589 | + |
1590 | BUG_ON(len > skb->len); |
1591 | - skb->len -= len; |
1592 | - BUG_ON(skb->len < skb->data_len); |
1593 | - skb_postpull_rcsum(skb, skb->data, len); |
1594 | - return skb->data += len; |
1595 | + __skb_pull(skb, len); |
1596 | + skb_postpull_rcsum(skb, data, len); |
1597 | + return skb->data; |
1598 | } |
1599 | EXPORT_SYMBOL_GPL(skb_pull_rcsum); |
1600 | |
1601 | diff --git a/net/dsa/slave.c b/net/dsa/slave.c |
1602 | index 35c47ddd04f0..25dbb91e1bc0 100644 |
1603 | --- a/net/dsa/slave.c |
1604 | +++ b/net/dsa/slave.c |
1605 | @@ -348,12 +348,17 @@ static int dsa_slave_stp_update(struct net_device *dev, u8 state) |
1606 | static int dsa_slave_port_attr_set(struct net_device *dev, |
1607 | struct switchdev_attr *attr) |
1608 | { |
1609 | - int ret = 0; |
1610 | + struct dsa_slave_priv *p = netdev_priv(dev); |
1611 | + struct dsa_switch *ds = p->parent; |
1612 | + int ret; |
1613 | |
1614 | switch (attr->id) { |
1615 | case SWITCHDEV_ATTR_PORT_STP_STATE: |
1616 | - if (attr->trans == SWITCHDEV_TRANS_COMMIT) |
1617 | - ret = dsa_slave_stp_update(dev, attr->u.stp_state); |
1618 | + if (attr->trans == SWITCHDEV_TRANS_PREPARE) |
1619 | + ret = ds->drv->port_stp_update ? 0 : -EOPNOTSUPP; |
1620 | + else |
1621 | + ret = ds->drv->port_stp_update(ds, p->port, |
1622 | + attr->u.stp_state); |
1623 | break; |
1624 | default: |
1625 | ret = -EOPNOTSUPP; |
1626 | diff --git a/net/ipv4/inet_connection_sock.c b/net/ipv4/inet_connection_sock.c |
1627 | index 134957159c27..61b45a17fc73 100644 |
1628 | --- a/net/ipv4/inet_connection_sock.c |
1629 | +++ b/net/ipv4/inet_connection_sock.c |
1630 | @@ -577,21 +577,22 @@ EXPORT_SYMBOL(inet_rtx_syn_ack); |
1631 | static bool reqsk_queue_unlink(struct request_sock_queue *queue, |
1632 | struct request_sock *req) |
1633 | { |
1634 | - struct listen_sock *lopt = queue->listen_opt; |
1635 | struct request_sock **prev; |
1636 | + struct listen_sock *lopt; |
1637 | bool found = false; |
1638 | |
1639 | spin_lock(&queue->syn_wait_lock); |
1640 | - |
1641 | - for (prev = &lopt->syn_table[req->rsk_hash]; *prev != NULL; |
1642 | - prev = &(*prev)->dl_next) { |
1643 | - if (*prev == req) { |
1644 | - *prev = req->dl_next; |
1645 | - found = true; |
1646 | - break; |
1647 | + lopt = queue->listen_opt; |
1648 | + if (lopt) { |
1649 | + for (prev = &lopt->syn_table[req->rsk_hash]; *prev != NULL; |
1650 | + prev = &(*prev)->dl_next) { |
1651 | + if (*prev == req) { |
1652 | + *prev = req->dl_next; |
1653 | + found = true; |
1654 | + break; |
1655 | + } |
1656 | } |
1657 | } |
1658 | - |
1659 | spin_unlock(&queue->syn_wait_lock); |
1660 | if (timer_pending(&req->rsk_timer) && del_timer_sync(&req->rsk_timer)) |
1661 | reqsk_put(req); |
1662 | @@ -685,20 +686,20 @@ void reqsk_queue_hash_req(struct request_sock_queue *queue, |
1663 | req->num_timeout = 0; |
1664 | req->sk = NULL; |
1665 | |
1666 | + setup_timer(&req->rsk_timer, reqsk_timer_handler, (unsigned long)req); |
1667 | + mod_timer_pinned(&req->rsk_timer, jiffies + timeout); |
1668 | + req->rsk_hash = hash; |
1669 | + |
1670 | /* before letting lookups find us, make sure all req fields |
1671 | * are committed to memory and refcnt initialized. |
1672 | */ |
1673 | smp_wmb(); |
1674 | atomic_set(&req->rsk_refcnt, 2); |
1675 | - setup_timer(&req->rsk_timer, reqsk_timer_handler, (unsigned long)req); |
1676 | - req->rsk_hash = hash; |
1677 | |
1678 | spin_lock(&queue->syn_wait_lock); |
1679 | req->dl_next = lopt->syn_table[hash]; |
1680 | lopt->syn_table[hash] = req; |
1681 | spin_unlock(&queue->syn_wait_lock); |
1682 | - |
1683 | - mod_timer_pinned(&req->rsk_timer, jiffies + timeout); |
1684 | } |
1685 | EXPORT_SYMBOL(reqsk_queue_hash_req); |
1686 | |
1687 | diff --git a/net/ipv6/route.c b/net/ipv6/route.c |
1688 | index 00b64d402a57..dd6ebba5846c 100644 |
1689 | --- a/net/ipv6/route.c |
1690 | +++ b/net/ipv6/route.c |
1691 | @@ -139,6 +139,9 @@ static void rt6_uncached_list_flush_dev(struct net *net, struct net_device *dev) |
1692 | struct net_device *loopback_dev = net->loopback_dev; |
1693 | int cpu; |
1694 | |
1695 | + if (dev == loopback_dev) |
1696 | + return; |
1697 | + |
1698 | for_each_possible_cpu(cpu) { |
1699 | struct uncached_list *ul = per_cpu_ptr(&rt6_uncached_list, cpu); |
1700 | struct rt6_info *rt; |
1701 | @@ -148,14 +151,12 @@ static void rt6_uncached_list_flush_dev(struct net *net, struct net_device *dev) |
1702 | struct inet6_dev *rt_idev = rt->rt6i_idev; |
1703 | struct net_device *rt_dev = rt->dst.dev; |
1704 | |
1705 | - if (rt_idev && (rt_idev->dev == dev || !dev) && |
1706 | - rt_idev->dev != loopback_dev) { |
1707 | + if (rt_idev->dev == dev) { |
1708 | rt->rt6i_idev = in6_dev_get(loopback_dev); |
1709 | in6_dev_put(rt_idev); |
1710 | } |
1711 | |
1712 | - if (rt_dev && (rt_dev == dev || !dev) && |
1713 | - rt_dev != loopback_dev) { |
1714 | + if (rt_dev == dev) { |
1715 | rt->dst.dev = loopback_dev; |
1716 | dev_hold(rt->dst.dev); |
1717 | dev_put(rt_dev); |
1718 | @@ -2577,7 +2578,8 @@ void rt6_ifdown(struct net *net, struct net_device *dev) |
1719 | |
1720 | fib6_clean_all(net, fib6_ifdown, &adn); |
1721 | icmp6_clean_all(fib6_ifdown, &adn); |
1722 | - rt6_uncached_list_flush_dev(net, dev); |
1723 | + if (dev) |
1724 | + rt6_uncached_list_flush_dev(net, dev); |
1725 | } |
1726 | |
1727 | struct rt6_mtu_change_arg { |
1728 | diff --git a/net/l2tp/l2tp_core.c b/net/l2tp/l2tp_core.c |
1729 | index f6b090df3930..afca2eb4dfa7 100644 |
1730 | --- a/net/l2tp/l2tp_core.c |
1731 | +++ b/net/l2tp/l2tp_core.c |
1732 | @@ -1319,7 +1319,7 @@ static void l2tp_tunnel_del_work(struct work_struct *work) |
1733 | tunnel = container_of(work, struct l2tp_tunnel, del_work); |
1734 | sk = l2tp_tunnel_sock_lookup(tunnel); |
1735 | if (!sk) |
1736 | - return; |
1737 | + goto out; |
1738 | |
1739 | sock = sk->sk_socket; |
1740 | |
1741 | @@ -1341,6 +1341,8 @@ static void l2tp_tunnel_del_work(struct work_struct *work) |
1742 | } |
1743 | |
1744 | l2tp_tunnel_sock_put(sk); |
1745 | +out: |
1746 | + l2tp_tunnel_dec_refcount(tunnel); |
1747 | } |
1748 | |
1749 | /* Create a socket for the tunnel, if one isn't set up by |
1750 | @@ -1636,8 +1638,13 @@ EXPORT_SYMBOL_GPL(l2tp_tunnel_create); |
1751 | */ |
1752 | int l2tp_tunnel_delete(struct l2tp_tunnel *tunnel) |
1753 | { |
1754 | + l2tp_tunnel_inc_refcount(tunnel); |
1755 | l2tp_tunnel_closeall(tunnel); |
1756 | - return (false == queue_work(l2tp_wq, &tunnel->del_work)); |
1757 | + if (false == queue_work(l2tp_wq, &tunnel->del_work)) { |
1758 | + l2tp_tunnel_dec_refcount(tunnel); |
1759 | + return 1; |
1760 | + } |
1761 | + return 0; |
1762 | } |
1763 | EXPORT_SYMBOL_GPL(l2tp_tunnel_delete); |
1764 | |
1765 | diff --git a/net/netlink/af_netlink.c b/net/netlink/af_netlink.c |
1766 | index 0857f7243797..a133d16eb053 100644 |
1767 | --- a/net/netlink/af_netlink.c |
1768 | +++ b/net/netlink/af_netlink.c |
1769 | @@ -2750,6 +2750,7 @@ static int netlink_dump(struct sock *sk) |
1770 | struct sk_buff *skb = NULL; |
1771 | struct nlmsghdr *nlh; |
1772 | int len, err = -ENOBUFS; |
1773 | + int alloc_min_size; |
1774 | int alloc_size; |
1775 | |
1776 | mutex_lock(nlk->cb_mutex); |
1777 | @@ -2758,9 +2759,6 @@ static int netlink_dump(struct sock *sk) |
1778 | goto errout_skb; |
1779 | } |
1780 | |
1781 | - cb = &nlk->cb; |
1782 | - alloc_size = max_t(int, cb->min_dump_alloc, NLMSG_GOODSIZE); |
1783 | - |
1784 | if (!netlink_rx_is_mmaped(sk) && |
1785 | atomic_read(&sk->sk_rmem_alloc) >= sk->sk_rcvbuf) |
1786 | goto errout_skb; |
1787 | @@ -2770,23 +2768,35 @@ static int netlink_dump(struct sock *sk) |
1788 | * to reduce number of system calls on dump operations, if user |
1789 | * ever provided a big enough buffer. |
1790 | */ |
1791 | - if (alloc_size < nlk->max_recvmsg_len) { |
1792 | - skb = netlink_alloc_skb(sk, |
1793 | - nlk->max_recvmsg_len, |
1794 | - nlk->portid, |
1795 | + cb = &nlk->cb; |
1796 | + alloc_min_size = max_t(int, cb->min_dump_alloc, NLMSG_GOODSIZE); |
1797 | + |
1798 | + if (alloc_min_size < nlk->max_recvmsg_len) { |
1799 | + alloc_size = nlk->max_recvmsg_len; |
1800 | + skb = netlink_alloc_skb(sk, alloc_size, nlk->portid, |
1801 | GFP_KERNEL | |
1802 | __GFP_NOWARN | |
1803 | __GFP_NORETRY); |
1804 | - /* available room should be exact amount to avoid MSG_TRUNC */ |
1805 | - if (skb) |
1806 | - skb_reserve(skb, skb_tailroom(skb) - |
1807 | - nlk->max_recvmsg_len); |
1808 | } |
1809 | - if (!skb) |
1810 | + if (!skb) { |
1811 | + alloc_size = alloc_min_size; |
1812 | skb = netlink_alloc_skb(sk, alloc_size, nlk->portid, |
1813 | GFP_KERNEL); |
1814 | + } |
1815 | if (!skb) |
1816 | goto errout_skb; |
1817 | + |
1818 | + /* Trim skb to allocated size. User is expected to provide buffer as |
1819 | + * large as max(min_dump_alloc, 16KiB (mac_recvmsg_len capped at |
1820 | + * netlink_recvmsg())). dump will pack as many smaller messages as |
1821 | + * could fit within the allocated skb. skb is typically allocated |
1822 | + * with larger space than required (could be as much as near 2x the |
1823 | + * requested size with align to next power of 2 approach). Allowing |
1824 | + * dump to use the excess space makes it difficult for a user to have a |
1825 | + * reasonable static buffer based on the expected largest dump of a |
1826 | + * single netdev. The outcome is MSG_TRUNC error. |
1827 | + */ |
1828 | + skb_reserve(skb, skb_tailroom(skb) - alloc_size); |
1829 | netlink_skb_set_owner_r(skb, sk); |
1830 | |
1831 | len = cb->dump(skb, cb); |
1832 | diff --git a/net/openvswitch/flow_table.c b/net/openvswitch/flow_table.c |
1833 | index b5c3bba87fc8..af08e6fc9860 100644 |
1834 | --- a/net/openvswitch/flow_table.c |
1835 | +++ b/net/openvswitch/flow_table.c |
1836 | @@ -92,7 +92,8 @@ struct sw_flow *ovs_flow_alloc(void) |
1837 | |
1838 | /* Initialize the default stat node. */ |
1839 | stats = kmem_cache_alloc_node(flow_stats_cache, |
1840 | - GFP_KERNEL | __GFP_ZERO, 0); |
1841 | + GFP_KERNEL | __GFP_ZERO, |
1842 | + node_online(0) ? 0 : NUMA_NO_NODE); |
1843 | if (!stats) |
1844 | goto err; |
1845 | |
1846 | diff --git a/net/sched/act_mirred.c b/net/sched/act_mirred.c |
1847 | index 268545050ddb..b1768198ad59 100644 |
1848 | --- a/net/sched/act_mirred.c |
1849 | +++ b/net/sched/act_mirred.c |
1850 | @@ -168,6 +168,7 @@ static int tcf_mirred(struct sk_buff *skb, const struct tc_action *a, |
1851 | |
1852 | skb2->skb_iif = skb->dev->ifindex; |
1853 | skb2->dev = dev; |
1854 | + skb_sender_cpu_clear(skb2); |
1855 | err = dev_queue_xmit(skb2); |
1856 | |
1857 | out: |
1858 | diff --git a/net/sunrpc/xprtrdma/svc_rdma_recvfrom.c b/net/sunrpc/xprtrdma/svc_rdma_recvfrom.c |
1859 | index 2e1348bde325..96d886a866e9 100644 |
1860 | --- a/net/sunrpc/xprtrdma/svc_rdma_recvfrom.c |
1861 | +++ b/net/sunrpc/xprtrdma/svc_rdma_recvfrom.c |
1862 | @@ -146,7 +146,8 @@ int rdma_read_chunk_lcl(struct svcxprt_rdma *xprt, |
1863 | ctxt->read_hdr = head; |
1864 | pages_needed = |
1865 | min_t(int, pages_needed, rdma_read_max_sge(xprt, pages_needed)); |
1866 | - read = min_t(int, pages_needed << PAGE_SHIFT, rs_length); |
1867 | + read = min_t(int, (pages_needed << PAGE_SHIFT) - *page_offset, |
1868 | + rs_length); |
1869 | |
1870 | for (pno = 0; pno < pages_needed; pno++) { |
1871 | int len = min_t(int, rs_length, PAGE_SIZE - pg_off); |
1872 | @@ -245,7 +246,8 @@ int rdma_read_chunk_frmr(struct svcxprt_rdma *xprt, |
1873 | ctxt->direction = DMA_FROM_DEVICE; |
1874 | ctxt->frmr = frmr; |
1875 | pages_needed = min_t(int, pages_needed, xprt->sc_frmr_pg_list_len); |
1876 | - read = min_t(int, pages_needed << PAGE_SHIFT, rs_length); |
1877 | + read = min_t(int, (pages_needed << PAGE_SHIFT) - *page_offset, |
1878 | + rs_length); |
1879 | |
1880 | frmr->kva = page_address(rqstp->rq_arg.pages[pg_no]); |
1881 | frmr->direction = DMA_FROM_DEVICE; |
1882 | diff --git a/net/tipc/msg.h b/net/tipc/msg.h |
1883 | index 19c45fb66238..49f9a9648aa9 100644 |
1884 | --- a/net/tipc/msg.h |
1885 | +++ b/net/tipc/msg.h |
1886 | @@ -357,7 +357,7 @@ static inline u32 msg_importance(struct tipc_msg *m) |
1887 | if (likely((usr <= TIPC_CRITICAL_IMPORTANCE) && !msg_errcode(m))) |
1888 | return usr; |
1889 | if ((usr == MSG_FRAGMENTER) || (usr == MSG_BUNDLER)) |
1890 | - return msg_bits(m, 5, 13, 0x7); |
1891 | + return msg_bits(m, 9, 0, 0x7); |
1892 | return TIPC_SYSTEM_IMPORTANCE; |
1893 | } |
1894 | |
1895 | @@ -366,7 +366,7 @@ static inline void msg_set_importance(struct tipc_msg *m, u32 i) |
1896 | int usr = msg_user(m); |
1897 | |
1898 | if (likely((usr == MSG_FRAGMENTER) || (usr == MSG_BUNDLER))) |
1899 | - msg_set_bits(m, 5, 13, 0x7, i); |
1900 | + msg_set_bits(m, 9, 0, 0x7, i); |
1901 | else if (i < TIPC_SYSTEM_IMPORTANCE) |
1902 | msg_set_user(m, i); |
1903 | else |
1904 | diff --git a/net/unix/af_unix.c b/net/unix/af_unix.c |
1905 | index 03ee4d359f6a..94f658235fb4 100644 |
1906 | --- a/net/unix/af_unix.c |
1907 | +++ b/net/unix/af_unix.c |
1908 | @@ -2064,6 +2064,11 @@ static int unix_stream_read_generic(struct unix_stream_read_state *state) |
1909 | goto out; |
1910 | } |
1911 | |
1912 | + if (flags & MSG_PEEK) |
1913 | + skip = sk_peek_offset(sk, flags); |
1914 | + else |
1915 | + skip = 0; |
1916 | + |
1917 | do { |
1918 | int chunk; |
1919 | struct sk_buff *skb, *last; |
1920 | @@ -2112,7 +2117,6 @@ unlock: |
1921 | break; |
1922 | } |
1923 | |
1924 | - skip = sk_peek_offset(sk, flags); |
1925 | while (skip >= unix_skb_len(skb)) { |
1926 | skip -= unix_skb_len(skb); |
1927 | last = skb; |
1928 | @@ -2181,6 +2185,17 @@ unlock: |
1929 | |
1930 | sk_peek_offset_fwd(sk, chunk); |
1931 | |
1932 | + if (UNIXCB(skb).fp) |
1933 | + break; |
1934 | + |
1935 | + skip = 0; |
1936 | + last = skb; |
1937 | + last_len = skb->len; |
1938 | + unix_state_lock(sk); |
1939 | + skb = skb_peek_next(skb, &sk->sk_receive_queue); |
1940 | + if (skb) |
1941 | + goto again; |
1942 | + unix_state_unlock(sk); |
1943 | break; |
1944 | } |
1945 | } while (size); |