Annotation of /trunk/kernel-alx/patches-4.4/0110-4.4.11-all-fixes.patch
Parent Directory | Revision Log
Revision 2802 -
(hide annotations)
(download)
Mon May 30 12:46:26 2016 UTC (8 years, 3 months ago) by niro
File size: 121850 byte(s)
Mon May 30 12:46:26 2016 UTC (8 years, 3 months ago) by niro
File size: 121850 byte(s)
-linux-4.4.11
1 | niro | 2802 | diff --git a/Makefile b/Makefile |
2 | index 5b5f462f834c..aad86274b61b 100644 | ||
3 | --- a/Makefile | ||
4 | +++ b/Makefile | ||
5 | @@ -1,6 +1,6 @@ | ||
6 | VERSION = 4 | ||
7 | PATCHLEVEL = 4 | ||
8 | -SUBLEVEL = 10 | ||
9 | +SUBLEVEL = 11 | ||
10 | EXTRAVERSION = | ||
11 | NAME = Blurry Fish Butt | ||
12 | |||
13 | diff --git a/arch/arm/boot/dts/at91sam9x5.dtsi b/arch/arm/boot/dts/at91sam9x5.dtsi | ||
14 | index 0827d594b1f0..cd0cd5fd09a3 100644 | ||
15 | --- a/arch/arm/boot/dts/at91sam9x5.dtsi | ||
16 | +++ b/arch/arm/boot/dts/at91sam9x5.dtsi | ||
17 | @@ -106,7 +106,7 @@ | ||
18 | |||
19 | pmc: pmc@fffffc00 { | ||
20 | compatible = "atmel,at91sam9x5-pmc", "syscon"; | ||
21 | - reg = <0xfffffc00 0x100>; | ||
22 | + reg = <0xfffffc00 0x200>; | ||
23 | interrupts = <1 IRQ_TYPE_LEVEL_HIGH 7>; | ||
24 | interrupt-controller; | ||
25 | #address-cells = <1>; | ||
26 | diff --git a/arch/s390/include/asm/mmu.h b/arch/s390/include/asm/mmu.h | ||
27 | index d29ad9545b41..081b2ad99d73 100644 | ||
28 | --- a/arch/s390/include/asm/mmu.h | ||
29 | +++ b/arch/s390/include/asm/mmu.h | ||
30 | @@ -11,7 +11,7 @@ typedef struct { | ||
31 | spinlock_t list_lock; | ||
32 | struct list_head pgtable_list; | ||
33 | struct list_head gmap_list; | ||
34 | - unsigned long asce_bits; | ||
35 | + unsigned long asce; | ||
36 | unsigned long asce_limit; | ||
37 | unsigned long vdso_base; | ||
38 | /* The mmu context allocates 4K page tables. */ | ||
39 | diff --git a/arch/s390/include/asm/mmu_context.h b/arch/s390/include/asm/mmu_context.h | ||
40 | index e485817f7b1a..22877c9440ea 100644 | ||
41 | --- a/arch/s390/include/asm/mmu_context.h | ||
42 | +++ b/arch/s390/include/asm/mmu_context.h | ||
43 | @@ -26,12 +26,28 @@ static inline int init_new_context(struct task_struct *tsk, | ||
44 | mm->context.has_pgste = 0; | ||
45 | mm->context.use_skey = 0; | ||
46 | #endif | ||
47 | - if (mm->context.asce_limit == 0) { | ||
48 | + switch (mm->context.asce_limit) { | ||
49 | + case 1UL << 42: | ||
50 | + /* | ||
51 | + * forked 3-level task, fall through to set new asce with new | ||
52 | + * mm->pgd | ||
53 | + */ | ||
54 | + case 0: | ||
55 | /* context created by exec, set asce limit to 4TB */ | ||
56 | - mm->context.asce_bits = _ASCE_TABLE_LENGTH | | ||
57 | - _ASCE_USER_BITS | _ASCE_TYPE_REGION3; | ||
58 | mm->context.asce_limit = STACK_TOP_MAX; | ||
59 | - } else if (mm->context.asce_limit == (1UL << 31)) { | ||
60 | + mm->context.asce = __pa(mm->pgd) | _ASCE_TABLE_LENGTH | | ||
61 | + _ASCE_USER_BITS | _ASCE_TYPE_REGION3; | ||
62 | + break; | ||
63 | + case 1UL << 53: | ||
64 | + /* forked 4-level task, set new asce with new mm->pgd */ | ||
65 | + mm->context.asce = __pa(mm->pgd) | _ASCE_TABLE_LENGTH | | ||
66 | + _ASCE_USER_BITS | _ASCE_TYPE_REGION2; | ||
67 | + break; | ||
68 | + case 1UL << 31: | ||
69 | + /* forked 2-level compat task, set new asce with new mm->pgd */ | ||
70 | + mm->context.asce = __pa(mm->pgd) | _ASCE_TABLE_LENGTH | | ||
71 | + _ASCE_USER_BITS | _ASCE_TYPE_SEGMENT; | ||
72 | + /* pgd_alloc() did not increase mm->nr_pmds */ | ||
73 | mm_inc_nr_pmds(mm); | ||
74 | } | ||
75 | crst_table_init((unsigned long *) mm->pgd, pgd_entry_type(mm)); | ||
76 | @@ -42,7 +58,7 @@ static inline int init_new_context(struct task_struct *tsk, | ||
77 | |||
78 | static inline void set_user_asce(struct mm_struct *mm) | ||
79 | { | ||
80 | - S390_lowcore.user_asce = mm->context.asce_bits | __pa(mm->pgd); | ||
81 | + S390_lowcore.user_asce = mm->context.asce; | ||
82 | if (current->thread.mm_segment.ar4) | ||
83 | __ctl_load(S390_lowcore.user_asce, 7, 7); | ||
84 | set_cpu_flag(CIF_ASCE); | ||
85 | @@ -71,7 +87,7 @@ static inline void switch_mm(struct mm_struct *prev, struct mm_struct *next, | ||
86 | { | ||
87 | int cpu = smp_processor_id(); | ||
88 | |||
89 | - S390_lowcore.user_asce = next->context.asce_bits | __pa(next->pgd); | ||
90 | + S390_lowcore.user_asce = next->context.asce; | ||
91 | if (prev == next) | ||
92 | return; | ||
93 | if (MACHINE_HAS_TLB_LC) | ||
94 | diff --git a/arch/s390/include/asm/pgalloc.h b/arch/s390/include/asm/pgalloc.h | ||
95 | index d7cc79fb6191..5991cdcb5b40 100644 | ||
96 | --- a/arch/s390/include/asm/pgalloc.h | ||
97 | +++ b/arch/s390/include/asm/pgalloc.h | ||
98 | @@ -56,8 +56,8 @@ static inline unsigned long pgd_entry_type(struct mm_struct *mm) | ||
99 | return _REGION2_ENTRY_EMPTY; | ||
100 | } | ||
101 | |||
102 | -int crst_table_upgrade(struct mm_struct *, unsigned long limit); | ||
103 | -void crst_table_downgrade(struct mm_struct *, unsigned long limit); | ||
104 | +int crst_table_upgrade(struct mm_struct *); | ||
105 | +void crst_table_downgrade(struct mm_struct *); | ||
106 | |||
107 | static inline pud_t *pud_alloc_one(struct mm_struct *mm, unsigned long address) | ||
108 | { | ||
109 | diff --git a/arch/s390/include/asm/processor.h b/arch/s390/include/asm/processor.h | ||
110 | index b16c3d0a1b9f..c1ea67db8404 100644 | ||
111 | --- a/arch/s390/include/asm/processor.h | ||
112 | +++ b/arch/s390/include/asm/processor.h | ||
113 | @@ -163,7 +163,7 @@ extern __vector128 init_task_fpu_regs[__NUM_VXRS]; | ||
114 | regs->psw.mask = PSW_USER_BITS | PSW_MASK_BA; \ | ||
115 | regs->psw.addr = new_psw | PSW_ADDR_AMODE; \ | ||
116 | regs->gprs[15] = new_stackp; \ | ||
117 | - crst_table_downgrade(current->mm, 1UL << 31); \ | ||
118 | + crst_table_downgrade(current->mm); \ | ||
119 | execve_tail(); \ | ||
120 | } while (0) | ||
121 | |||
122 | diff --git a/arch/s390/include/asm/tlbflush.h b/arch/s390/include/asm/tlbflush.h | ||
123 | index ca148f7c3eaa..a2e6ef32e054 100644 | ||
124 | --- a/arch/s390/include/asm/tlbflush.h | ||
125 | +++ b/arch/s390/include/asm/tlbflush.h | ||
126 | @@ -110,8 +110,7 @@ static inline void __tlb_flush_asce(struct mm_struct *mm, unsigned long asce) | ||
127 | static inline void __tlb_flush_kernel(void) | ||
128 | { | ||
129 | if (MACHINE_HAS_IDTE) | ||
130 | - __tlb_flush_idte((unsigned long) init_mm.pgd | | ||
131 | - init_mm.context.asce_bits); | ||
132 | + __tlb_flush_idte(init_mm.context.asce); | ||
133 | else | ||
134 | __tlb_flush_global(); | ||
135 | } | ||
136 | @@ -133,8 +132,7 @@ static inline void __tlb_flush_asce(struct mm_struct *mm, unsigned long asce) | ||
137 | static inline void __tlb_flush_kernel(void) | ||
138 | { | ||
139 | if (MACHINE_HAS_TLB_LC) | ||
140 | - __tlb_flush_idte_local((unsigned long) init_mm.pgd | | ||
141 | - init_mm.context.asce_bits); | ||
142 | + __tlb_flush_idte_local(init_mm.context.asce); | ||
143 | else | ||
144 | __tlb_flush_local(); | ||
145 | } | ||
146 | @@ -148,8 +146,7 @@ static inline void __tlb_flush_mm(struct mm_struct * mm) | ||
147 | * only ran on the local cpu. | ||
148 | */ | ||
149 | if (MACHINE_HAS_IDTE && list_empty(&mm->context.gmap_list)) | ||
150 | - __tlb_flush_asce(mm, (unsigned long) mm->pgd | | ||
151 | - mm->context.asce_bits); | ||
152 | + __tlb_flush_asce(mm, mm->context.asce); | ||
153 | else | ||
154 | __tlb_flush_full(mm); | ||
155 | } | ||
156 | diff --git a/arch/s390/mm/init.c b/arch/s390/mm/init.c | ||
157 | index c722400c7697..feff9caf89b5 100644 | ||
158 | --- a/arch/s390/mm/init.c | ||
159 | +++ b/arch/s390/mm/init.c | ||
160 | @@ -89,7 +89,8 @@ void __init paging_init(void) | ||
161 | asce_bits = _ASCE_TYPE_REGION3 | _ASCE_TABLE_LENGTH; | ||
162 | pgd_type = _REGION3_ENTRY_EMPTY; | ||
163 | } | ||
164 | - S390_lowcore.kernel_asce = (__pa(init_mm.pgd) & PAGE_MASK) | asce_bits; | ||
165 | + init_mm.context.asce = (__pa(init_mm.pgd) & PAGE_MASK) | asce_bits; | ||
166 | + S390_lowcore.kernel_asce = init_mm.context.asce; | ||
167 | clear_table((unsigned long *) init_mm.pgd, pgd_type, | ||
168 | sizeof(unsigned long)*2048); | ||
169 | vmem_map_init(); | ||
170 | diff --git a/arch/s390/mm/mmap.c b/arch/s390/mm/mmap.c | ||
171 | index ea01477b4aa6..f2b6b1d9c804 100644 | ||
172 | --- a/arch/s390/mm/mmap.c | ||
173 | +++ b/arch/s390/mm/mmap.c | ||
174 | @@ -174,7 +174,7 @@ int s390_mmap_check(unsigned long addr, unsigned long len, unsigned long flags) | ||
175 | if (!(flags & MAP_FIXED)) | ||
176 | addr = 0; | ||
177 | if ((addr + len) >= TASK_SIZE) | ||
178 | - return crst_table_upgrade(current->mm, 1UL << 53); | ||
179 | + return crst_table_upgrade(current->mm); | ||
180 | return 0; | ||
181 | } | ||
182 | |||
183 | @@ -191,7 +191,7 @@ s390_get_unmapped_area(struct file *filp, unsigned long addr, | ||
184 | return area; | ||
185 | if (area == -ENOMEM && !is_compat_task() && TASK_SIZE < (1UL << 53)) { | ||
186 | /* Upgrade the page table to 4 levels and retry. */ | ||
187 | - rc = crst_table_upgrade(mm, 1UL << 53); | ||
188 | + rc = crst_table_upgrade(mm); | ||
189 | if (rc) | ||
190 | return (unsigned long) rc; | ||
191 | area = arch_get_unmapped_area(filp, addr, len, pgoff, flags); | ||
192 | @@ -213,7 +213,7 @@ s390_get_unmapped_area_topdown(struct file *filp, const unsigned long addr, | ||
193 | return area; | ||
194 | if (area == -ENOMEM && !is_compat_task() && TASK_SIZE < (1UL << 53)) { | ||
195 | /* Upgrade the page table to 4 levels and retry. */ | ||
196 | - rc = crst_table_upgrade(mm, 1UL << 53); | ||
197 | + rc = crst_table_upgrade(mm); | ||
198 | if (rc) | ||
199 | return (unsigned long) rc; | ||
200 | area = arch_get_unmapped_area_topdown(filp, addr, len, | ||
201 | diff --git a/arch/s390/mm/pgtable.c b/arch/s390/mm/pgtable.c | ||
202 | index 54ef3bc01b43..471a370a527b 100644 | ||
203 | --- a/arch/s390/mm/pgtable.c | ||
204 | +++ b/arch/s390/mm/pgtable.c | ||
205 | @@ -49,81 +49,52 @@ static void __crst_table_upgrade(void *arg) | ||
206 | __tlb_flush_local(); | ||
207 | } | ||
208 | |||
209 | -int crst_table_upgrade(struct mm_struct *mm, unsigned long limit) | ||
210 | +int crst_table_upgrade(struct mm_struct *mm) | ||
211 | { | ||
212 | unsigned long *table, *pgd; | ||
213 | - unsigned long entry; | ||
214 | - int flush; | ||
215 | |||
216 | - BUG_ON(limit > (1UL << 53)); | ||
217 | - flush = 0; | ||
218 | -repeat: | ||
219 | + /* upgrade should only happen from 3 to 4 levels */ | ||
220 | + BUG_ON(mm->context.asce_limit != (1UL << 42)); | ||
221 | + | ||
222 | table = crst_table_alloc(mm); | ||
223 | if (!table) | ||
224 | return -ENOMEM; | ||
225 | + | ||
226 | spin_lock_bh(&mm->page_table_lock); | ||
227 | - if (mm->context.asce_limit < limit) { | ||
228 | - pgd = (unsigned long *) mm->pgd; | ||
229 | - if (mm->context.asce_limit <= (1UL << 31)) { | ||
230 | - entry = _REGION3_ENTRY_EMPTY; | ||
231 | - mm->context.asce_limit = 1UL << 42; | ||
232 | - mm->context.asce_bits = _ASCE_TABLE_LENGTH | | ||
233 | - _ASCE_USER_BITS | | ||
234 | - _ASCE_TYPE_REGION3; | ||
235 | - } else { | ||
236 | - entry = _REGION2_ENTRY_EMPTY; | ||
237 | - mm->context.asce_limit = 1UL << 53; | ||
238 | - mm->context.asce_bits = _ASCE_TABLE_LENGTH | | ||
239 | - _ASCE_USER_BITS | | ||
240 | - _ASCE_TYPE_REGION2; | ||
241 | - } | ||
242 | - crst_table_init(table, entry); | ||
243 | - pgd_populate(mm, (pgd_t *) table, (pud_t *) pgd); | ||
244 | - mm->pgd = (pgd_t *) table; | ||
245 | - mm->task_size = mm->context.asce_limit; | ||
246 | - table = NULL; | ||
247 | - flush = 1; | ||
248 | - } | ||
249 | + pgd = (unsigned long *) mm->pgd; | ||
250 | + crst_table_init(table, _REGION2_ENTRY_EMPTY); | ||
251 | + pgd_populate(mm, (pgd_t *) table, (pud_t *) pgd); | ||
252 | + mm->pgd = (pgd_t *) table; | ||
253 | + mm->context.asce_limit = 1UL << 53; | ||
254 | + mm->context.asce = __pa(mm->pgd) | _ASCE_TABLE_LENGTH | | ||
255 | + _ASCE_USER_BITS | _ASCE_TYPE_REGION2; | ||
256 | + mm->task_size = mm->context.asce_limit; | ||
257 | spin_unlock_bh(&mm->page_table_lock); | ||
258 | - if (table) | ||
259 | - crst_table_free(mm, table); | ||
260 | - if (mm->context.asce_limit < limit) | ||
261 | - goto repeat; | ||
262 | - if (flush) | ||
263 | - on_each_cpu(__crst_table_upgrade, mm, 0); | ||
264 | + | ||
265 | + on_each_cpu(__crst_table_upgrade, mm, 0); | ||
266 | return 0; | ||
267 | } | ||
268 | |||
269 | -void crst_table_downgrade(struct mm_struct *mm, unsigned long limit) | ||
270 | +void crst_table_downgrade(struct mm_struct *mm) | ||
271 | { | ||
272 | pgd_t *pgd; | ||
273 | |||
274 | + /* downgrade should only happen from 3 to 2 levels (compat only) */ | ||
275 | + BUG_ON(mm->context.asce_limit != (1UL << 42)); | ||
276 | + | ||
277 | if (current->active_mm == mm) { | ||
278 | clear_user_asce(); | ||
279 | __tlb_flush_mm(mm); | ||
280 | } | ||
281 | - while (mm->context.asce_limit > limit) { | ||
282 | - pgd = mm->pgd; | ||
283 | - switch (pgd_val(*pgd) & _REGION_ENTRY_TYPE_MASK) { | ||
284 | - case _REGION_ENTRY_TYPE_R2: | ||
285 | - mm->context.asce_limit = 1UL << 42; | ||
286 | - mm->context.asce_bits = _ASCE_TABLE_LENGTH | | ||
287 | - _ASCE_USER_BITS | | ||
288 | - _ASCE_TYPE_REGION3; | ||
289 | - break; | ||
290 | - case _REGION_ENTRY_TYPE_R3: | ||
291 | - mm->context.asce_limit = 1UL << 31; | ||
292 | - mm->context.asce_bits = _ASCE_TABLE_LENGTH | | ||
293 | - _ASCE_USER_BITS | | ||
294 | - _ASCE_TYPE_SEGMENT; | ||
295 | - break; | ||
296 | - default: | ||
297 | - BUG(); | ||
298 | - } | ||
299 | - mm->pgd = (pgd_t *) (pgd_val(*pgd) & _REGION_ENTRY_ORIGIN); | ||
300 | - mm->task_size = mm->context.asce_limit; | ||
301 | - crst_table_free(mm, (unsigned long *) pgd); | ||
302 | - } | ||
303 | + | ||
304 | + pgd = mm->pgd; | ||
305 | + mm->pgd = (pgd_t *) (pgd_val(*pgd) & _REGION_ENTRY_ORIGIN); | ||
306 | + mm->context.asce_limit = 1UL << 31; | ||
307 | + mm->context.asce = __pa(mm->pgd) | _ASCE_TABLE_LENGTH | | ||
308 | + _ASCE_USER_BITS | _ASCE_TYPE_SEGMENT; | ||
309 | + mm->task_size = mm->context.asce_limit; | ||
310 | + crst_table_free(mm, (unsigned long *) pgd); | ||
311 | + | ||
312 | if (current->active_mm == mm) | ||
313 | set_user_asce(mm); | ||
314 | } | ||
315 | diff --git a/crypto/ahash.c b/crypto/ahash.c | ||
316 | index d19b52324cf5..dac1c24e9c3e 100644 | ||
317 | --- a/crypto/ahash.c | ||
318 | +++ b/crypto/ahash.c | ||
319 | @@ -69,8 +69,9 @@ static int hash_walk_new_entry(struct crypto_hash_walk *walk) | ||
320 | struct scatterlist *sg; | ||
321 | |||
322 | sg = walk->sg; | ||
323 | - walk->pg = sg_page(sg); | ||
324 | walk->offset = sg->offset; | ||
325 | + walk->pg = sg_page(walk->sg) + (walk->offset >> PAGE_SHIFT); | ||
326 | + walk->offset = offset_in_page(walk->offset); | ||
327 | walk->entrylen = sg->length; | ||
328 | |||
329 | if (walk->entrylen > walk->total) | ||
330 | diff --git a/crypto/testmgr.c b/crypto/testmgr.c | ||
331 | index ae8c57fd8bc7..d4944318ca1f 100644 | ||
332 | --- a/crypto/testmgr.c | ||
333 | +++ b/crypto/testmgr.c | ||
334 | @@ -1849,6 +1849,7 @@ static int alg_test_drbg(const struct alg_test_desc *desc, const char *driver, | ||
335 | static int do_test_rsa(struct crypto_akcipher *tfm, | ||
336 | struct akcipher_testvec *vecs) | ||
337 | { | ||
338 | + char *xbuf[XBUFSIZE]; | ||
339 | struct akcipher_request *req; | ||
340 | void *outbuf_enc = NULL; | ||
341 | void *outbuf_dec = NULL; | ||
342 | @@ -1857,9 +1858,12 @@ static int do_test_rsa(struct crypto_akcipher *tfm, | ||
343 | int err = -ENOMEM; | ||
344 | struct scatterlist src, dst, src_tab[2]; | ||
345 | |||
346 | + if (testmgr_alloc_buf(xbuf)) | ||
347 | + return err; | ||
348 | + | ||
349 | req = akcipher_request_alloc(tfm, GFP_KERNEL); | ||
350 | if (!req) | ||
351 | - return err; | ||
352 | + goto free_xbuf; | ||
353 | |||
354 | init_completion(&result.completion); | ||
355 | |||
356 | @@ -1877,9 +1881,14 @@ static int do_test_rsa(struct crypto_akcipher *tfm, | ||
357 | if (!outbuf_enc) | ||
358 | goto free_req; | ||
359 | |||
360 | + if (WARN_ON(vecs->m_size > PAGE_SIZE)) | ||
361 | + goto free_all; | ||
362 | + | ||
363 | + memcpy(xbuf[0], vecs->m, vecs->m_size); | ||
364 | + | ||
365 | sg_init_table(src_tab, 2); | ||
366 | - sg_set_buf(&src_tab[0], vecs->m, 8); | ||
367 | - sg_set_buf(&src_tab[1], vecs->m + 8, vecs->m_size - 8); | ||
368 | + sg_set_buf(&src_tab[0], xbuf[0], 8); | ||
369 | + sg_set_buf(&src_tab[1], xbuf[0] + 8, vecs->m_size - 8); | ||
370 | sg_init_one(&dst, outbuf_enc, out_len_max); | ||
371 | akcipher_request_set_crypt(req, src_tab, &dst, vecs->m_size, | ||
372 | out_len_max); | ||
373 | @@ -1898,7 +1907,7 @@ static int do_test_rsa(struct crypto_akcipher *tfm, | ||
374 | goto free_all; | ||
375 | } | ||
376 | /* verify that encrypted message is equal to expected */ | ||
377 | - if (memcmp(vecs->c, sg_virt(req->dst), vecs->c_size)) { | ||
378 | + if (memcmp(vecs->c, outbuf_enc, vecs->c_size)) { | ||
379 | pr_err("alg: rsa: encrypt test failed. Invalid output\n"); | ||
380 | err = -EINVAL; | ||
381 | goto free_all; | ||
382 | @@ -1913,7 +1922,13 @@ static int do_test_rsa(struct crypto_akcipher *tfm, | ||
383 | err = -ENOMEM; | ||
384 | goto free_all; | ||
385 | } | ||
386 | - sg_init_one(&src, vecs->c, vecs->c_size); | ||
387 | + | ||
388 | + if (WARN_ON(vecs->c_size > PAGE_SIZE)) | ||
389 | + goto free_all; | ||
390 | + | ||
391 | + memcpy(xbuf[0], vecs->c, vecs->c_size); | ||
392 | + | ||
393 | + sg_init_one(&src, xbuf[0], vecs->c_size); | ||
394 | sg_init_one(&dst, outbuf_dec, out_len_max); | ||
395 | init_completion(&result.completion); | ||
396 | akcipher_request_set_crypt(req, &src, &dst, vecs->c_size, out_len_max); | ||
397 | @@ -1940,6 +1955,8 @@ free_all: | ||
398 | kfree(outbuf_enc); | ||
399 | free_req: | ||
400 | akcipher_request_free(req); | ||
401 | +free_xbuf: | ||
402 | + testmgr_free_buf(xbuf); | ||
403 | return err; | ||
404 | } | ||
405 | |||
406 | diff --git a/drivers/base/regmap/regmap-spmi.c b/drivers/base/regmap/regmap-spmi.c | ||
407 | index 7e58f6560399..4a36e415e938 100644 | ||
408 | --- a/drivers/base/regmap/regmap-spmi.c | ||
409 | +++ b/drivers/base/regmap/regmap-spmi.c | ||
410 | @@ -142,7 +142,7 @@ static int regmap_spmi_ext_read(void *context, | ||
411 | while (val_size) { | ||
412 | len = min_t(size_t, val_size, 8); | ||
413 | |||
414 | - err = spmi_ext_register_readl(context, addr, val, val_size); | ||
415 | + err = spmi_ext_register_readl(context, addr, val, len); | ||
416 | if (err) | ||
417 | goto err_out; | ||
418 | |||
419 | diff --git a/drivers/crypto/qat/qat_common/adf_common_drv.h b/drivers/crypto/qat/qat_common/adf_common_drv.h | ||
420 | index 3f76bd495bcb..b9178d0a3093 100644 | ||
421 | --- a/drivers/crypto/qat/qat_common/adf_common_drv.h | ||
422 | +++ b/drivers/crypto/qat/qat_common/adf_common_drv.h | ||
423 | @@ -145,6 +145,8 @@ int adf_enable_aer(struct adf_accel_dev *accel_dev, struct pci_driver *adf); | ||
424 | void adf_disable_aer(struct adf_accel_dev *accel_dev); | ||
425 | int adf_init_aer(void); | ||
426 | void adf_exit_aer(void); | ||
427 | +int adf_init_pf_wq(void); | ||
428 | +void adf_exit_pf_wq(void); | ||
429 | int adf_init_admin_comms(struct adf_accel_dev *accel_dev); | ||
430 | void adf_exit_admin_comms(struct adf_accel_dev *accel_dev); | ||
431 | int adf_send_admin_init(struct adf_accel_dev *accel_dev); | ||
432 | diff --git a/drivers/crypto/qat/qat_common/adf_ctl_drv.c b/drivers/crypto/qat/qat_common/adf_ctl_drv.c | ||
433 | index 473d36d91644..e7480f373532 100644 | ||
434 | --- a/drivers/crypto/qat/qat_common/adf_ctl_drv.c | ||
435 | +++ b/drivers/crypto/qat/qat_common/adf_ctl_drv.c | ||
436 | @@ -469,12 +469,17 @@ static int __init adf_register_ctl_device_driver(void) | ||
437 | if (adf_init_aer()) | ||
438 | goto err_aer; | ||
439 | |||
440 | + if (adf_init_pf_wq()) | ||
441 | + goto err_pf_wq; | ||
442 | + | ||
443 | if (qat_crypto_register()) | ||
444 | goto err_crypto_register; | ||
445 | |||
446 | return 0; | ||
447 | |||
448 | err_crypto_register: | ||
449 | + adf_exit_pf_wq(); | ||
450 | +err_pf_wq: | ||
451 | adf_exit_aer(); | ||
452 | err_aer: | ||
453 | adf_chr_drv_destroy(); | ||
454 | @@ -487,6 +492,7 @@ static void __exit adf_unregister_ctl_device_driver(void) | ||
455 | { | ||
456 | adf_chr_drv_destroy(); | ||
457 | adf_exit_aer(); | ||
458 | + adf_exit_pf_wq(); | ||
459 | qat_crypto_unregister(); | ||
460 | adf_clean_vf_map(false); | ||
461 | mutex_destroy(&adf_ctl_lock); | ||
462 | diff --git a/drivers/crypto/qat/qat_common/adf_sriov.c b/drivers/crypto/qat/qat_common/adf_sriov.c | ||
463 | index 1117a8b58280..38a0415e767d 100644 | ||
464 | --- a/drivers/crypto/qat/qat_common/adf_sriov.c | ||
465 | +++ b/drivers/crypto/qat/qat_common/adf_sriov.c | ||
466 | @@ -119,11 +119,6 @@ static int adf_enable_sriov(struct adf_accel_dev *accel_dev) | ||
467 | int i; | ||
468 | u32 reg; | ||
469 | |||
470 | - /* Workqueue for PF2VF responses */ | ||
471 | - pf2vf_resp_wq = create_workqueue("qat_pf2vf_resp_wq"); | ||
472 | - if (!pf2vf_resp_wq) | ||
473 | - return -ENOMEM; | ||
474 | - | ||
475 | for (i = 0, vf_info = accel_dev->pf.vf_info; i < totalvfs; | ||
476 | i++, vf_info++) { | ||
477 | /* This ptr will be populated when VFs will be created */ | ||
478 | @@ -216,11 +211,6 @@ void adf_disable_sriov(struct adf_accel_dev *accel_dev) | ||
479 | |||
480 | kfree(accel_dev->pf.vf_info); | ||
481 | accel_dev->pf.vf_info = NULL; | ||
482 | - | ||
483 | - if (pf2vf_resp_wq) { | ||
484 | - destroy_workqueue(pf2vf_resp_wq); | ||
485 | - pf2vf_resp_wq = NULL; | ||
486 | - } | ||
487 | } | ||
488 | EXPORT_SYMBOL_GPL(adf_disable_sriov); | ||
489 | |||
490 | @@ -304,3 +294,19 @@ int adf_sriov_configure(struct pci_dev *pdev, int numvfs) | ||
491 | return numvfs; | ||
492 | } | ||
493 | EXPORT_SYMBOL_GPL(adf_sriov_configure); | ||
494 | + | ||
495 | +int __init adf_init_pf_wq(void) | ||
496 | +{ | ||
497 | + /* Workqueue for PF2VF responses */ | ||
498 | + pf2vf_resp_wq = create_workqueue("qat_pf2vf_resp_wq"); | ||
499 | + | ||
500 | + return !pf2vf_resp_wq ? -ENOMEM : 0; | ||
501 | +} | ||
502 | + | ||
503 | +void adf_exit_pf_wq(void) | ||
504 | +{ | ||
505 | + if (pf2vf_resp_wq) { | ||
506 | + destroy_workqueue(pf2vf_resp_wq); | ||
507 | + pf2vf_resp_wq = NULL; | ||
508 | + } | ||
509 | +} | ||
510 | diff --git a/drivers/gpu/drm/i915/intel_crt.c b/drivers/gpu/drm/i915/intel_crt.c | ||
511 | index 6a2c76e367a5..97d1ed20418b 100644 | ||
512 | --- a/drivers/gpu/drm/i915/intel_crt.c | ||
513 | +++ b/drivers/gpu/drm/i915/intel_crt.c | ||
514 | @@ -248,8 +248,14 @@ static bool intel_crt_compute_config(struct intel_encoder *encoder, | ||
515 | pipe_config->has_pch_encoder = true; | ||
516 | |||
517 | /* LPT FDI RX only supports 8bpc. */ | ||
518 | - if (HAS_PCH_LPT(dev)) | ||
519 | + if (HAS_PCH_LPT(dev)) { | ||
520 | + if (pipe_config->bw_constrained && pipe_config->pipe_bpp < 24) { | ||
521 | + DRM_DEBUG_KMS("LPT only supports 24bpp\n"); | ||
522 | + return false; | ||
523 | + } | ||
524 | + | ||
525 | pipe_config->pipe_bpp = 24; | ||
526 | + } | ||
527 | |||
528 | /* FDI must always be 2.7 GHz */ | ||
529 | if (HAS_DDI(dev)) { | ||
530 | diff --git a/drivers/gpu/drm/i915/intel_pm.c b/drivers/gpu/drm/i915/intel_pm.c | ||
531 | index f091ad12d694..0a68d2ec89dc 100644 | ||
532 | --- a/drivers/gpu/drm/i915/intel_pm.c | ||
533 | +++ b/drivers/gpu/drm/i915/intel_pm.c | ||
534 | @@ -6620,6 +6620,12 @@ static void broadwell_init_clock_gating(struct drm_device *dev) | ||
535 | misccpctl = I915_READ(GEN7_MISCCPCTL); | ||
536 | I915_WRITE(GEN7_MISCCPCTL, misccpctl & ~GEN7_DOP_CLOCK_GATE_ENABLE); | ||
537 | I915_WRITE(GEN8_L3SQCREG1, BDW_WA_L3SQCREG1_DEFAULT); | ||
538 | + /* | ||
539 | + * Wait at least 100 clocks before re-enabling clock gating. See | ||
540 | + * the definition of L3SQCREG1 in BSpec. | ||
541 | + */ | ||
542 | + POSTING_READ(GEN8_L3SQCREG1); | ||
543 | + udelay(1); | ||
544 | I915_WRITE(GEN7_MISCCPCTL, misccpctl); | ||
545 | |||
546 | /* | ||
547 | diff --git a/drivers/gpu/drm/radeon/atombios_crtc.c b/drivers/gpu/drm/radeon/atombios_crtc.c | ||
548 | index dac78ad24b31..79bab6fd76bb 100644 | ||
549 | --- a/drivers/gpu/drm/radeon/atombios_crtc.c | ||
550 | +++ b/drivers/gpu/drm/radeon/atombios_crtc.c | ||
551 | @@ -1739,6 +1739,7 @@ static u32 radeon_get_pll_use_mask(struct drm_crtc *crtc) | ||
552 | static int radeon_get_shared_dp_ppll(struct drm_crtc *crtc) | ||
553 | { | ||
554 | struct drm_device *dev = crtc->dev; | ||
555 | + struct radeon_device *rdev = dev->dev_private; | ||
556 | struct drm_crtc *test_crtc; | ||
557 | struct radeon_crtc *test_radeon_crtc; | ||
558 | |||
559 | @@ -1748,6 +1749,10 @@ static int radeon_get_shared_dp_ppll(struct drm_crtc *crtc) | ||
560 | test_radeon_crtc = to_radeon_crtc(test_crtc); | ||
561 | if (test_radeon_crtc->encoder && | ||
562 | ENCODER_MODE_IS_DP(atombios_get_encoder_mode(test_radeon_crtc->encoder))) { | ||
563 | + /* PPLL2 is exclusive to UNIPHYA on DCE61 */ | ||
564 | + if (ASIC_IS_DCE61(rdev) && !ASIC_IS_DCE8(rdev) && | ||
565 | + test_radeon_crtc->pll_id == ATOM_PPLL2) | ||
566 | + continue; | ||
567 | /* for DP use the same PLL for all */ | ||
568 | if (test_radeon_crtc->pll_id != ATOM_PPLL_INVALID) | ||
569 | return test_radeon_crtc->pll_id; | ||
570 | @@ -1769,6 +1774,7 @@ static int radeon_get_shared_nondp_ppll(struct drm_crtc *crtc) | ||
571 | { | ||
572 | struct radeon_crtc *radeon_crtc = to_radeon_crtc(crtc); | ||
573 | struct drm_device *dev = crtc->dev; | ||
574 | + struct radeon_device *rdev = dev->dev_private; | ||
575 | struct drm_crtc *test_crtc; | ||
576 | struct radeon_crtc *test_radeon_crtc; | ||
577 | u32 adjusted_clock, test_adjusted_clock; | ||
578 | @@ -1784,6 +1790,10 @@ static int radeon_get_shared_nondp_ppll(struct drm_crtc *crtc) | ||
579 | test_radeon_crtc = to_radeon_crtc(test_crtc); | ||
580 | if (test_radeon_crtc->encoder && | ||
581 | !ENCODER_MODE_IS_DP(atombios_get_encoder_mode(test_radeon_crtc->encoder))) { | ||
582 | + /* PPLL2 is exclusive to UNIPHYA on DCE61 */ | ||
583 | + if (ASIC_IS_DCE61(rdev) && !ASIC_IS_DCE8(rdev) && | ||
584 | + test_radeon_crtc->pll_id == ATOM_PPLL2) | ||
585 | + continue; | ||
586 | /* check if we are already driving this connector with another crtc */ | ||
587 | if (test_radeon_crtc->connector == radeon_crtc->connector) { | ||
588 | /* if we are, return that pll */ | ||
589 | diff --git a/drivers/gpu/drm/radeon/radeon_dp_auxch.c b/drivers/gpu/drm/radeon/radeon_dp_auxch.c | ||
590 | index 3b0c229d7dcd..db64e0062689 100644 | ||
591 | --- a/drivers/gpu/drm/radeon/radeon_dp_auxch.c | ||
592 | +++ b/drivers/gpu/drm/radeon/radeon_dp_auxch.c | ||
593 | @@ -105,7 +105,7 @@ radeon_dp_aux_transfer_native(struct drm_dp_aux *aux, struct drm_dp_aux_msg *msg | ||
594 | |||
595 | tmp &= AUX_HPD_SEL(0x7); | ||
596 | tmp |= AUX_HPD_SEL(chan->rec.hpd); | ||
597 | - tmp |= AUX_EN | AUX_LS_READ_EN; | ||
598 | + tmp |= AUX_EN | AUX_LS_READ_EN | AUX_HPD_DISCON(0x1); | ||
599 | |||
600 | WREG32(AUX_CONTROL + aux_offset[instance], tmp); | ||
601 | |||
602 | diff --git a/drivers/infiniband/hw/mlx5/main.c b/drivers/infiniband/hw/mlx5/main.c | ||
603 | index 721d63f5b461..fd17443aeacd 100644 | ||
604 | --- a/drivers/infiniband/hw/mlx5/main.c | ||
605 | +++ b/drivers/infiniband/hw/mlx5/main.c | ||
606 | @@ -405,8 +405,8 @@ static int mlx5_query_hca_port(struct ib_device *ibdev, u8 port, | ||
607 | struct mlx5_ib_dev *dev = to_mdev(ibdev); | ||
608 | struct mlx5_core_dev *mdev = dev->mdev; | ||
609 | struct mlx5_hca_vport_context *rep; | ||
610 | - int max_mtu; | ||
611 | - int oper_mtu; | ||
612 | + u16 max_mtu; | ||
613 | + u16 oper_mtu; | ||
614 | int err; | ||
615 | u8 ib_link_width_oper; | ||
616 | u8 vl_hw_cap; | ||
617 | diff --git a/drivers/input/misc/max8997_haptic.c b/drivers/input/misc/max8997_haptic.c | ||
618 | index a806ba3818f7..8d6326d7e7be 100644 | ||
619 | --- a/drivers/input/misc/max8997_haptic.c | ||
620 | +++ b/drivers/input/misc/max8997_haptic.c | ||
621 | @@ -255,12 +255,14 @@ static int max8997_haptic_probe(struct platform_device *pdev) | ||
622 | struct max8997_dev *iodev = dev_get_drvdata(pdev->dev.parent); | ||
623 | const struct max8997_platform_data *pdata = | ||
624 | dev_get_platdata(iodev->dev); | ||
625 | - const struct max8997_haptic_platform_data *haptic_pdata = | ||
626 | - pdata->haptic_pdata; | ||
627 | + const struct max8997_haptic_platform_data *haptic_pdata = NULL; | ||
628 | struct max8997_haptic *chip; | ||
629 | struct input_dev *input_dev; | ||
630 | int error; | ||
631 | |||
632 | + if (pdata) | ||
633 | + haptic_pdata = pdata->haptic_pdata; | ||
634 | + | ||
635 | if (!haptic_pdata) { | ||
636 | dev_err(&pdev->dev, "no haptic platform data\n"); | ||
637 | return -EINVAL; | ||
638 | diff --git a/drivers/media/v4l2-core/videobuf2-v4l2.c b/drivers/media/v4l2-core/videobuf2-v4l2.c | ||
639 | index 6c441be8f893..502984c724ff 100644 | ||
640 | --- a/drivers/media/v4l2-core/videobuf2-v4l2.c | ||
641 | +++ b/drivers/media/v4l2-core/videobuf2-v4l2.c | ||
642 | @@ -67,11 +67,6 @@ static int __verify_planes_array(struct vb2_buffer *vb, const struct v4l2_buffer | ||
643 | return 0; | ||
644 | } | ||
645 | |||
646 | -static int __verify_planes_array_core(struct vb2_buffer *vb, const void *pb) | ||
647 | -{ | ||
648 | - return __verify_planes_array(vb, pb); | ||
649 | -} | ||
650 | - | ||
651 | /** | ||
652 | * __verify_length() - Verify that the bytesused value for each plane fits in | ||
653 | * the plane length and that the data offset doesn't exceed the bytesused value. | ||
654 | @@ -437,7 +432,6 @@ static int __fill_vb2_buffer(struct vb2_buffer *vb, | ||
655 | } | ||
656 | |||
657 | static const struct vb2_buf_ops v4l2_buf_ops = { | ||
658 | - .verify_planes_array = __verify_planes_array_core, | ||
659 | .fill_user_buffer = __fill_v4l2_buffer, | ||
660 | .fill_vb2_buffer = __fill_vb2_buffer, | ||
661 | .set_timestamp = __set_timestamp, | ||
662 | diff --git a/drivers/net/ethernet/atheros/atlx/atl2.c b/drivers/net/ethernet/atheros/atlx/atl2.c | ||
663 | index 8f76f4558a88..2ff465848b65 100644 | ||
664 | --- a/drivers/net/ethernet/atheros/atlx/atl2.c | ||
665 | +++ b/drivers/net/ethernet/atheros/atlx/atl2.c | ||
666 | @@ -1412,7 +1412,7 @@ static int atl2_probe(struct pci_dev *pdev, const struct pci_device_id *ent) | ||
667 | |||
668 | err = -EIO; | ||
669 | |||
670 | - netdev->hw_features = NETIF_F_SG | NETIF_F_HW_VLAN_CTAG_RX; | ||
671 | + netdev->hw_features = NETIF_F_HW_VLAN_CTAG_RX; | ||
672 | netdev->features |= (NETIF_F_HW_VLAN_CTAG_TX | NETIF_F_HW_VLAN_CTAG_RX); | ||
673 | |||
674 | /* Init PHY as early as possible due to power saving issue */ | ||
675 | diff --git a/drivers/net/ethernet/cavium/thunder/nicvf_queues.c b/drivers/net/ethernet/cavium/thunder/nicvf_queues.c | ||
676 | index 206b6a71a545..d1c217eaf417 100644 | ||
677 | --- a/drivers/net/ethernet/cavium/thunder/nicvf_queues.c | ||
678 | +++ b/drivers/net/ethernet/cavium/thunder/nicvf_queues.c | ||
679 | @@ -550,6 +550,7 @@ static void nicvf_rcv_queue_config(struct nicvf *nic, struct queue_set *qs, | ||
680 | nicvf_config_vlan_stripping(nic, nic->netdev->features); | ||
681 | |||
682 | /* Enable Receive queue */ | ||
683 | + memset(&rq_cfg, 0, sizeof(struct rq_cfg)); | ||
684 | rq_cfg.ena = 1; | ||
685 | rq_cfg.tcp_ena = 0; | ||
686 | nicvf_queue_reg_write(nic, NIC_QSET_RQ_0_7_CFG, qidx, *(u64 *)&rq_cfg); | ||
687 | @@ -582,6 +583,7 @@ void nicvf_cmp_queue_config(struct nicvf *nic, struct queue_set *qs, | ||
688 | qidx, (u64)(cq->dmem.phys_base)); | ||
689 | |||
690 | /* Enable Completion queue */ | ||
691 | + memset(&cq_cfg, 0, sizeof(struct cq_cfg)); | ||
692 | cq_cfg.ena = 1; | ||
693 | cq_cfg.reset = 0; | ||
694 | cq_cfg.caching = 0; | ||
695 | @@ -630,6 +632,7 @@ static void nicvf_snd_queue_config(struct nicvf *nic, struct queue_set *qs, | ||
696 | qidx, (u64)(sq->dmem.phys_base)); | ||
697 | |||
698 | /* Enable send queue & set queue size */ | ||
699 | + memset(&sq_cfg, 0, sizeof(struct sq_cfg)); | ||
700 | sq_cfg.ena = 1; | ||
701 | sq_cfg.reset = 0; | ||
702 | sq_cfg.ldwb = 0; | ||
703 | @@ -666,6 +669,7 @@ static void nicvf_rbdr_config(struct nicvf *nic, struct queue_set *qs, | ||
704 | |||
705 | /* Enable RBDR & set queue size */ | ||
706 | /* Buffer size should be in multiples of 128 bytes */ | ||
707 | + memset(&rbdr_cfg, 0, sizeof(struct rbdr_cfg)); | ||
708 | rbdr_cfg.ena = 1; | ||
709 | rbdr_cfg.reset = 0; | ||
710 | rbdr_cfg.ldwb = 0; | ||
711 | diff --git a/drivers/net/ethernet/freescale/fec_main.c b/drivers/net/ethernet/freescale/fec_main.c | ||
712 | index b2a32209ffbf..f6147ffc7fbc 100644 | ||
713 | --- a/drivers/net/ethernet/freescale/fec_main.c | ||
714 | +++ b/drivers/net/ethernet/freescale/fec_main.c | ||
715 | @@ -1557,9 +1557,15 @@ fec_enet_rx(struct net_device *ndev, int budget) | ||
716 | struct fec_enet_private *fep = netdev_priv(ndev); | ||
717 | |||
718 | for_each_set_bit(queue_id, &fep->work_rx, FEC_ENET_MAX_RX_QS) { | ||
719 | - clear_bit(queue_id, &fep->work_rx); | ||
720 | - pkt_received += fec_enet_rx_queue(ndev, | ||
721 | + int ret; | ||
722 | + | ||
723 | + ret = fec_enet_rx_queue(ndev, | ||
724 | budget - pkt_received, queue_id); | ||
725 | + | ||
726 | + if (ret < budget - pkt_received) | ||
727 | + clear_bit(queue_id, &fep->work_rx); | ||
728 | + | ||
729 | + pkt_received += ret; | ||
730 | } | ||
731 | return pkt_received; | ||
732 | } | ||
733 | diff --git a/drivers/net/ethernet/mellanox/mlx4/en_rx.c b/drivers/net/ethernet/mellanox/mlx4/en_rx.c | ||
734 | index e7a5000aa12c..bbff8ec6713e 100644 | ||
735 | --- a/drivers/net/ethernet/mellanox/mlx4/en_rx.c | ||
736 | +++ b/drivers/net/ethernet/mellanox/mlx4/en_rx.c | ||
737 | @@ -704,7 +704,7 @@ static int get_fixed_ipv6_csum(__wsum hw_checksum, struct sk_buff *skb, | ||
738 | |||
739 | if (ipv6h->nexthdr == IPPROTO_FRAGMENT || ipv6h->nexthdr == IPPROTO_HOPOPTS) | ||
740 | return -1; | ||
741 | - hw_checksum = csum_add(hw_checksum, (__force __wsum)(ipv6h->nexthdr << 8)); | ||
742 | + hw_checksum = csum_add(hw_checksum, (__force __wsum)htons(ipv6h->nexthdr)); | ||
743 | |||
744 | csum_pseudo_hdr = csum_partial(&ipv6h->saddr, | ||
745 | sizeof(ipv6h->saddr) + sizeof(ipv6h->daddr), 0); | ||
746 | diff --git a/drivers/net/ethernet/mellanox/mlx4/en_tx.c b/drivers/net/ethernet/mellanox/mlx4/en_tx.c | ||
747 | index 4421bf5463f6..e4019a803a9c 100644 | ||
748 | --- a/drivers/net/ethernet/mellanox/mlx4/en_tx.c | ||
749 | +++ b/drivers/net/ethernet/mellanox/mlx4/en_tx.c | ||
750 | @@ -400,7 +400,6 @@ static bool mlx4_en_process_tx_cq(struct net_device *dev, | ||
751 | u32 packets = 0; | ||
752 | u32 bytes = 0; | ||
753 | int factor = priv->cqe_factor; | ||
754 | - u64 timestamp = 0; | ||
755 | int done = 0; | ||
756 | int budget = priv->tx_work_limit; | ||
757 | u32 last_nr_txbb; | ||
758 | @@ -440,9 +439,12 @@ static bool mlx4_en_process_tx_cq(struct net_device *dev, | ||
759 | new_index = be16_to_cpu(cqe->wqe_index) & size_mask; | ||
760 | |||
761 | do { | ||
762 | + u64 timestamp = 0; | ||
763 | + | ||
764 | txbbs_skipped += last_nr_txbb; | ||
765 | ring_index = (ring_index + last_nr_txbb) & size_mask; | ||
766 | - if (ring->tx_info[ring_index].ts_requested) | ||
767 | + | ||
768 | + if (unlikely(ring->tx_info[ring_index].ts_requested)) | ||
769 | timestamp = mlx4_en_get_cqe_ts(cqe); | ||
770 | |||
771 | /* free next descriptor */ | ||
772 | diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_main.c b/drivers/net/ethernet/mellanox/mlx5/core/en_main.c | ||
773 | index 1203d892e842..cbd17e25beeb 100644 | ||
774 | --- a/drivers/net/ethernet/mellanox/mlx5/core/en_main.c | ||
775 | +++ b/drivers/net/ethernet/mellanox/mlx5/core/en_main.c | ||
776 | @@ -1372,7 +1372,7 @@ static int mlx5e_set_dev_port_mtu(struct net_device *netdev) | ||
777 | { | ||
778 | struct mlx5e_priv *priv = netdev_priv(netdev); | ||
779 | struct mlx5_core_dev *mdev = priv->mdev; | ||
780 | - int hw_mtu; | ||
781 | + u16 hw_mtu; | ||
782 | int err; | ||
783 | |||
784 | err = mlx5_set_port_mtu(mdev, MLX5E_SW2HW_MTU(netdev->mtu), 1); | ||
785 | @@ -1891,22 +1891,27 @@ static int mlx5e_set_features(struct net_device *netdev, | ||
786 | return err; | ||
787 | } | ||
788 | |||
789 | +#define MXL5_HW_MIN_MTU 64 | ||
790 | +#define MXL5E_MIN_MTU (MXL5_HW_MIN_MTU + ETH_FCS_LEN) | ||
791 | + | ||
792 | static int mlx5e_change_mtu(struct net_device *netdev, int new_mtu) | ||
793 | { | ||
794 | struct mlx5e_priv *priv = netdev_priv(netdev); | ||
795 | struct mlx5_core_dev *mdev = priv->mdev; | ||
796 | bool was_opened; | ||
797 | - int max_mtu; | ||
798 | + u16 max_mtu; | ||
799 | + u16 min_mtu; | ||
800 | int err = 0; | ||
801 | |||
802 | mlx5_query_port_max_mtu(mdev, &max_mtu, 1); | ||
803 | |||
804 | max_mtu = MLX5E_HW2SW_MTU(max_mtu); | ||
805 | + min_mtu = MLX5E_HW2SW_MTU(MXL5E_MIN_MTU); | ||
806 | |||
807 | - if (new_mtu > max_mtu) { | ||
808 | + if (new_mtu > max_mtu || new_mtu < min_mtu) { | ||
809 | netdev_err(netdev, | ||
810 | - "%s: Bad MTU (%d) > (%d) Max\n", | ||
811 | - __func__, new_mtu, max_mtu); | ||
812 | + "%s: Bad MTU (%d), valid range is: [%d..%d]\n", | ||
813 | + __func__, new_mtu, min_mtu, max_mtu); | ||
814 | return -EINVAL; | ||
815 | } | ||
816 | |||
817 | diff --git a/drivers/net/ethernet/mellanox/mlx5/core/port.c b/drivers/net/ethernet/mellanox/mlx5/core/port.c | ||
818 | index a87e773e93f3..53a793bc2e3d 100644 | ||
819 | --- a/drivers/net/ethernet/mellanox/mlx5/core/port.c | ||
820 | +++ b/drivers/net/ethernet/mellanox/mlx5/core/port.c | ||
821 | @@ -246,8 +246,8 @@ int mlx5_query_port_admin_status(struct mlx5_core_dev *dev, | ||
822 | } | ||
823 | EXPORT_SYMBOL_GPL(mlx5_query_port_admin_status); | ||
824 | |||
825 | -static void mlx5_query_port_mtu(struct mlx5_core_dev *dev, int *admin_mtu, | ||
826 | - int *max_mtu, int *oper_mtu, u8 port) | ||
827 | +static void mlx5_query_port_mtu(struct mlx5_core_dev *dev, u16 *admin_mtu, | ||
828 | + u16 *max_mtu, u16 *oper_mtu, u8 port) | ||
829 | { | ||
830 | u32 in[MLX5_ST_SZ_DW(pmtu_reg)]; | ||
831 | u32 out[MLX5_ST_SZ_DW(pmtu_reg)]; | ||
832 | @@ -267,7 +267,7 @@ static void mlx5_query_port_mtu(struct mlx5_core_dev *dev, int *admin_mtu, | ||
833 | *admin_mtu = MLX5_GET(pmtu_reg, out, admin_mtu); | ||
834 | } | ||
835 | |||
836 | -int mlx5_set_port_mtu(struct mlx5_core_dev *dev, int mtu, u8 port) | ||
837 | +int mlx5_set_port_mtu(struct mlx5_core_dev *dev, u16 mtu, u8 port) | ||
838 | { | ||
839 | u32 in[MLX5_ST_SZ_DW(pmtu_reg)]; | ||
840 | u32 out[MLX5_ST_SZ_DW(pmtu_reg)]; | ||
841 | @@ -282,14 +282,14 @@ int mlx5_set_port_mtu(struct mlx5_core_dev *dev, int mtu, u8 port) | ||
842 | } | ||
843 | EXPORT_SYMBOL_GPL(mlx5_set_port_mtu); | ||
844 | |||
845 | -void mlx5_query_port_max_mtu(struct mlx5_core_dev *dev, int *max_mtu, | ||
846 | +void mlx5_query_port_max_mtu(struct mlx5_core_dev *dev, u16 *max_mtu, | ||
847 | u8 port) | ||
848 | { | ||
849 | mlx5_query_port_mtu(dev, NULL, max_mtu, NULL, port); | ||
850 | } | ||
851 | EXPORT_SYMBOL_GPL(mlx5_query_port_max_mtu); | ||
852 | |||
853 | -void mlx5_query_port_oper_mtu(struct mlx5_core_dev *dev, int *oper_mtu, | ||
854 | +void mlx5_query_port_oper_mtu(struct mlx5_core_dev *dev, u16 *oper_mtu, | ||
855 | u8 port) | ||
856 | { | ||
857 | mlx5_query_port_mtu(dev, NULL, NULL, oper_mtu, port); | ||
858 | diff --git a/drivers/net/usb/cdc_mbim.c b/drivers/net/usb/cdc_mbim.c | ||
859 | index bdd83d95ec0a..96a5028621c8 100644 | ||
860 | --- a/drivers/net/usb/cdc_mbim.c | ||
861 | +++ b/drivers/net/usb/cdc_mbim.c | ||
862 | @@ -617,8 +617,13 @@ static const struct usb_device_id mbim_devs[] = { | ||
863 | { USB_VENDOR_AND_INTERFACE_INFO(0x0bdb, USB_CLASS_COMM, USB_CDC_SUBCLASS_MBIM, USB_CDC_PROTO_NONE), | ||
864 | .driver_info = (unsigned long)&cdc_mbim_info, | ||
865 | }, | ||
866 | - /* Huawei E3372 fails unless NDP comes after the IP packets */ | ||
867 | - { USB_DEVICE_AND_INTERFACE_INFO(0x12d1, 0x157d, USB_CLASS_COMM, USB_CDC_SUBCLASS_MBIM, USB_CDC_PROTO_NONE), | ||
868 | + | ||
869 | + /* Some Huawei devices, ME906s-158 (12d1:15c1) and E3372 | ||
870 | + * (12d1:157d), are known to fail unless the NDP is placed | ||
871 | + * after the IP packets. Applying the quirk to all Huawei | ||
872 | + * devices is broader than necessary, but harmless. | ||
873 | + */ | ||
874 | + { USB_VENDOR_AND_INTERFACE_INFO(0x12d1, USB_CLASS_COMM, USB_CDC_SUBCLASS_MBIM, USB_CDC_PROTO_NONE), | ||
875 | .driver_info = (unsigned long)&cdc_mbim_info_ndp_to_end, | ||
876 | }, | ||
877 | /* default entry */ | ||
878 | diff --git a/drivers/pinctrl/pinctrl-at91-pio4.c b/drivers/pinctrl/pinctrl-at91-pio4.c | ||
879 | index 33edd07d9149..b3235fd2950c 100644 | ||
880 | --- a/drivers/pinctrl/pinctrl-at91-pio4.c | ||
881 | +++ b/drivers/pinctrl/pinctrl-at91-pio4.c | ||
882 | @@ -717,9 +717,11 @@ static int atmel_conf_pin_config_group_set(struct pinctrl_dev *pctldev, | ||
883 | break; | ||
884 | case PIN_CONFIG_BIAS_PULL_UP: | ||
885 | conf |= ATMEL_PIO_PUEN_MASK; | ||
886 | + conf &= (~ATMEL_PIO_PDEN_MASK); | ||
887 | break; | ||
888 | case PIN_CONFIG_BIAS_PULL_DOWN: | ||
889 | conf |= ATMEL_PIO_PDEN_MASK; | ||
890 | + conf &= (~ATMEL_PIO_PUEN_MASK); | ||
891 | break; | ||
892 | case PIN_CONFIG_DRIVE_OPEN_DRAIN: | ||
893 | if (arg == 0) | ||
894 | diff --git a/drivers/regulator/axp20x-regulator.c b/drivers/regulator/axp20x-regulator.c | ||
895 | index f2e1a39ce0f3..5cf4a97e0304 100644 | ||
896 | --- a/drivers/regulator/axp20x-regulator.c | ||
897 | +++ b/drivers/regulator/axp20x-regulator.c | ||
898 | @@ -221,10 +221,10 @@ static const struct regulator_desc axp22x_regulators[] = { | ||
899 | AXP22X_ELDO2_V_OUT, 0x1f, AXP22X_PWR_OUT_CTRL2, BIT(1)), | ||
900 | AXP_DESC(AXP22X, ELDO3, "eldo3", "eldoin", 700, 3300, 100, | ||
901 | AXP22X_ELDO3_V_OUT, 0x1f, AXP22X_PWR_OUT_CTRL2, BIT(2)), | ||
902 | - AXP_DESC_IO(AXP22X, LDO_IO0, "ldo_io0", "ips", 1800, 3300, 100, | ||
903 | + AXP_DESC_IO(AXP22X, LDO_IO0, "ldo_io0", "ips", 700, 3300, 100, | ||
904 | AXP22X_LDO_IO0_V_OUT, 0x1f, AXP20X_GPIO0_CTRL, 0x07, | ||
905 | AXP22X_IO_ENABLED, AXP22X_IO_DISABLED), | ||
906 | - AXP_DESC_IO(AXP22X, LDO_IO1, "ldo_io1", "ips", 1800, 3300, 100, | ||
907 | + AXP_DESC_IO(AXP22X, LDO_IO1, "ldo_io1", "ips", 700, 3300, 100, | ||
908 | AXP22X_LDO_IO1_V_OUT, 0x1f, AXP20X_GPIO1_CTRL, 0x07, | ||
909 | AXP22X_IO_ENABLED, AXP22X_IO_DISABLED), | ||
910 | AXP_DESC_FIXED(AXP22X, RTC_LDO, "rtc_ldo", "ips", 3000), | ||
911 | diff --git a/drivers/regulator/s2mps11.c b/drivers/regulator/s2mps11.c | ||
912 | index 72fc3c32db49..b6d831b84e1d 100644 | ||
913 | --- a/drivers/regulator/s2mps11.c | ||
914 | +++ b/drivers/regulator/s2mps11.c | ||
915 | @@ -305,7 +305,7 @@ static struct regulator_ops s2mps11_buck_ops = { | ||
916 | .enable_mask = S2MPS11_ENABLE_MASK \ | ||
917 | } | ||
918 | |||
919 | -#define regulator_desc_s2mps11_buck6_10(num, min, step) { \ | ||
920 | +#define regulator_desc_s2mps11_buck67810(num, min, step) { \ | ||
921 | .name = "BUCK"#num, \ | ||
922 | .id = S2MPS11_BUCK##num, \ | ||
923 | .ops = &s2mps11_buck_ops, \ | ||
924 | @@ -321,6 +321,22 @@ static struct regulator_ops s2mps11_buck_ops = { | ||
925 | .enable_mask = S2MPS11_ENABLE_MASK \ | ||
926 | } | ||
927 | |||
928 | +#define regulator_desc_s2mps11_buck9 { \ | ||
929 | + .name = "BUCK9", \ | ||
930 | + .id = S2MPS11_BUCK9, \ | ||
931 | + .ops = &s2mps11_buck_ops, \ | ||
932 | + .type = REGULATOR_VOLTAGE, \ | ||
933 | + .owner = THIS_MODULE, \ | ||
934 | + .min_uV = MIN_3000_MV, \ | ||
935 | + .uV_step = STEP_25_MV, \ | ||
936 | + .n_voltages = S2MPS11_BUCK9_N_VOLTAGES, \ | ||
937 | + .ramp_delay = S2MPS11_RAMP_DELAY, \ | ||
938 | + .vsel_reg = S2MPS11_REG_B9CTRL2, \ | ||
939 | + .vsel_mask = S2MPS11_BUCK9_VSEL_MASK, \ | ||
940 | + .enable_reg = S2MPS11_REG_B9CTRL1, \ | ||
941 | + .enable_mask = S2MPS11_ENABLE_MASK \ | ||
942 | +} | ||
943 | + | ||
944 | static const struct regulator_desc s2mps11_regulators[] = { | ||
945 | regulator_desc_s2mps11_ldo(1, STEP_25_MV), | ||
946 | regulator_desc_s2mps11_ldo(2, STEP_50_MV), | ||
947 | @@ -365,11 +381,11 @@ static const struct regulator_desc s2mps11_regulators[] = { | ||
948 | regulator_desc_s2mps11_buck1_4(3), | ||
949 | regulator_desc_s2mps11_buck1_4(4), | ||
950 | regulator_desc_s2mps11_buck5, | ||
951 | - regulator_desc_s2mps11_buck6_10(6, MIN_600_MV, STEP_6_25_MV), | ||
952 | - regulator_desc_s2mps11_buck6_10(7, MIN_600_MV, STEP_6_25_MV), | ||
953 | - regulator_desc_s2mps11_buck6_10(8, MIN_600_MV, STEP_6_25_MV), | ||
954 | - regulator_desc_s2mps11_buck6_10(9, MIN_3000_MV, STEP_25_MV), | ||
955 | - regulator_desc_s2mps11_buck6_10(10, MIN_750_MV, STEP_12_5_MV), | ||
956 | + regulator_desc_s2mps11_buck67810(6, MIN_600_MV, STEP_6_25_MV), | ||
957 | + regulator_desc_s2mps11_buck67810(7, MIN_600_MV, STEP_6_25_MV), | ||
958 | + regulator_desc_s2mps11_buck67810(8, MIN_600_MV, STEP_6_25_MV), | ||
959 | + regulator_desc_s2mps11_buck9, | ||
960 | + regulator_desc_s2mps11_buck67810(10, MIN_750_MV, STEP_12_5_MV), | ||
961 | }; | ||
962 | |||
963 | static struct regulator_ops s2mps14_reg_ops; | ||
964 | diff --git a/drivers/scsi/qla1280.c b/drivers/scsi/qla1280.c | ||
965 | index 5d0ec42a9317..634254a52301 100644 | ||
966 | --- a/drivers/scsi/qla1280.c | ||
967 | +++ b/drivers/scsi/qla1280.c | ||
968 | @@ -4214,7 +4214,7 @@ static struct scsi_host_template qla1280_driver_template = { | ||
969 | .eh_bus_reset_handler = qla1280_eh_bus_reset, | ||
970 | .eh_host_reset_handler = qla1280_eh_adapter_reset, | ||
971 | .bios_param = qla1280_biosparam, | ||
972 | - .can_queue = 0xfffff, | ||
973 | + .can_queue = MAX_OUTSTANDING_COMMANDS, | ||
974 | .this_id = -1, | ||
975 | .sg_tablesize = SG_ALL, | ||
976 | .use_clustering = ENABLE_CLUSTERING, | ||
977 | diff --git a/drivers/spi/spi-pxa2xx.c b/drivers/spi/spi-pxa2xx.c | ||
978 | index b25dc71b0ea9..73c8ea0b1360 100644 | ||
979 | --- a/drivers/spi/spi-pxa2xx.c | ||
980 | +++ b/drivers/spi/spi-pxa2xx.c | ||
981 | @@ -111,7 +111,7 @@ static const struct lpss_config lpss_platforms[] = { | ||
982 | .reg_general = -1, | ||
983 | .reg_ssp = 0x20, | ||
984 | .reg_cs_ctrl = 0x24, | ||
985 | - .reg_capabilities = 0xfc, | ||
986 | + .reg_capabilities = -1, | ||
987 | .rx_threshold = 1, | ||
988 | .tx_threshold_lo = 32, | ||
989 | .tx_threshold_hi = 56, | ||
990 | diff --git a/drivers/spi/spi-ti-qspi.c b/drivers/spi/spi-ti-qspi.c | ||
991 | index 64318fcfacf2..5044c6198332 100644 | ||
992 | --- a/drivers/spi/spi-ti-qspi.c | ||
993 | +++ b/drivers/spi/spi-ti-qspi.c | ||
994 | @@ -94,6 +94,7 @@ struct ti_qspi { | ||
995 | #define QSPI_FLEN(n) ((n - 1) << 0) | ||
996 | #define QSPI_WLEN_MAX_BITS 128 | ||
997 | #define QSPI_WLEN_MAX_BYTES 16 | ||
998 | +#define QSPI_WLEN_MASK QSPI_WLEN(QSPI_WLEN_MAX_BITS) | ||
999 | |||
1000 | /* STATUS REGISTER */ | ||
1001 | #define BUSY 0x01 | ||
1002 | @@ -224,16 +225,16 @@ static inline int ti_qspi_poll_wc(struct ti_qspi *qspi) | ||
1003 | return -ETIMEDOUT; | ||
1004 | } | ||
1005 | |||
1006 | -static int qspi_write_msg(struct ti_qspi *qspi, struct spi_transfer *t) | ||
1007 | +static int qspi_write_msg(struct ti_qspi *qspi, struct spi_transfer *t, | ||
1008 | + int count) | ||
1009 | { | ||
1010 | - int wlen, count, xfer_len; | ||
1011 | + int wlen, xfer_len; | ||
1012 | unsigned int cmd; | ||
1013 | const u8 *txbuf; | ||
1014 | u32 data; | ||
1015 | |||
1016 | txbuf = t->tx_buf; | ||
1017 | cmd = qspi->cmd | QSPI_WR_SNGL; | ||
1018 | - count = t->len; | ||
1019 | wlen = t->bits_per_word >> 3; /* in bytes */ | ||
1020 | xfer_len = wlen; | ||
1021 | |||
1022 | @@ -293,9 +294,10 @@ static int qspi_write_msg(struct ti_qspi *qspi, struct spi_transfer *t) | ||
1023 | return 0; | ||
1024 | } | ||
1025 | |||
1026 | -static int qspi_read_msg(struct ti_qspi *qspi, struct spi_transfer *t) | ||
1027 | +static int qspi_read_msg(struct ti_qspi *qspi, struct spi_transfer *t, | ||
1028 | + int count) | ||
1029 | { | ||
1030 | - int wlen, count; | ||
1031 | + int wlen; | ||
1032 | unsigned int cmd; | ||
1033 | u8 *rxbuf; | ||
1034 | |||
1035 | @@ -312,7 +314,6 @@ static int qspi_read_msg(struct ti_qspi *qspi, struct spi_transfer *t) | ||
1036 | cmd |= QSPI_RD_SNGL; | ||
1037 | break; | ||
1038 | } | ||
1039 | - count = t->len; | ||
1040 | wlen = t->bits_per_word >> 3; /* in bytes */ | ||
1041 | |||
1042 | while (count) { | ||
1043 | @@ -343,12 +344,13 @@ static int qspi_read_msg(struct ti_qspi *qspi, struct spi_transfer *t) | ||
1044 | return 0; | ||
1045 | } | ||
1046 | |||
1047 | -static int qspi_transfer_msg(struct ti_qspi *qspi, struct spi_transfer *t) | ||
1048 | +static int qspi_transfer_msg(struct ti_qspi *qspi, struct spi_transfer *t, | ||
1049 | + int count) | ||
1050 | { | ||
1051 | int ret; | ||
1052 | |||
1053 | if (t->tx_buf) { | ||
1054 | - ret = qspi_write_msg(qspi, t); | ||
1055 | + ret = qspi_write_msg(qspi, t, count); | ||
1056 | if (ret) { | ||
1057 | dev_dbg(qspi->dev, "Error while writing\n"); | ||
1058 | return ret; | ||
1059 | @@ -356,7 +358,7 @@ static int qspi_transfer_msg(struct ti_qspi *qspi, struct spi_transfer *t) | ||
1060 | } | ||
1061 | |||
1062 | if (t->rx_buf) { | ||
1063 | - ret = qspi_read_msg(qspi, t); | ||
1064 | + ret = qspi_read_msg(qspi, t, count); | ||
1065 | if (ret) { | ||
1066 | dev_dbg(qspi->dev, "Error while reading\n"); | ||
1067 | return ret; | ||
1068 | @@ -373,7 +375,8 @@ static int ti_qspi_start_transfer_one(struct spi_master *master, | ||
1069 | struct spi_device *spi = m->spi; | ||
1070 | struct spi_transfer *t; | ||
1071 | int status = 0, ret; | ||
1072 | - int frame_length; | ||
1073 | + unsigned int frame_len_words, transfer_len_words; | ||
1074 | + int wlen; | ||
1075 | |||
1076 | /* setup device control reg */ | ||
1077 | qspi->dc = 0; | ||
1078 | @@ -385,30 +388,38 @@ static int ti_qspi_start_transfer_one(struct spi_master *master, | ||
1079 | if (spi->mode & SPI_CS_HIGH) | ||
1080 | qspi->dc |= QSPI_CSPOL(spi->chip_select); | ||
1081 | |||
1082 | - frame_length = (m->frame_length << 3) / spi->bits_per_word; | ||
1083 | - | ||
1084 | - frame_length = clamp(frame_length, 0, QSPI_FRAME); | ||
1085 | + frame_len_words = 0; | ||
1086 | + list_for_each_entry(t, &m->transfers, transfer_list) | ||
1087 | + frame_len_words += t->len / (t->bits_per_word >> 3); | ||
1088 | + frame_len_words = min_t(unsigned int, frame_len_words, QSPI_FRAME); | ||
1089 | |||
1090 | /* setup command reg */ | ||
1091 | qspi->cmd = 0; | ||
1092 | qspi->cmd |= QSPI_EN_CS(spi->chip_select); | ||
1093 | - qspi->cmd |= QSPI_FLEN(frame_length); | ||
1094 | + qspi->cmd |= QSPI_FLEN(frame_len_words); | ||
1095 | |||
1096 | ti_qspi_write(qspi, qspi->dc, QSPI_SPI_DC_REG); | ||
1097 | |||
1098 | mutex_lock(&qspi->list_lock); | ||
1099 | |||
1100 | list_for_each_entry(t, &m->transfers, transfer_list) { | ||
1101 | - qspi->cmd |= QSPI_WLEN(t->bits_per_word); | ||
1102 | + qspi->cmd = ((qspi->cmd & ~QSPI_WLEN_MASK) | | ||
1103 | + QSPI_WLEN(t->bits_per_word)); | ||
1104 | + | ||
1105 | + wlen = t->bits_per_word >> 3; | ||
1106 | + transfer_len_words = min(t->len / wlen, frame_len_words); | ||
1107 | |||
1108 | - ret = qspi_transfer_msg(qspi, t); | ||
1109 | + ret = qspi_transfer_msg(qspi, t, transfer_len_words * wlen); | ||
1110 | if (ret) { | ||
1111 | dev_dbg(qspi->dev, "transfer message failed\n"); | ||
1112 | mutex_unlock(&qspi->list_lock); | ||
1113 | return -EINVAL; | ||
1114 | } | ||
1115 | |||
1116 | - m->actual_length += t->len; | ||
1117 | + m->actual_length += transfer_len_words * wlen; | ||
1118 | + frame_len_words -= transfer_len_words; | ||
1119 | + if (frame_len_words == 0) | ||
1120 | + break; | ||
1121 | } | ||
1122 | |||
1123 | mutex_unlock(&qspi->list_lock); | ||
1124 | diff --git a/fs/isofs/rock.c b/fs/isofs/rock.c | ||
1125 | index 735d7522a3a9..204659a5f6db 100644 | ||
1126 | --- a/fs/isofs/rock.c | ||
1127 | +++ b/fs/isofs/rock.c | ||
1128 | @@ -203,6 +203,8 @@ int get_rock_ridge_filename(struct iso_directory_record *de, | ||
1129 | int retnamlen = 0; | ||
1130 | int truncate = 0; | ||
1131 | int ret = 0; | ||
1132 | + char *p; | ||
1133 | + int len; | ||
1134 | |||
1135 | if (!ISOFS_SB(inode->i_sb)->s_rock) | ||
1136 | return 0; | ||
1137 | @@ -267,12 +269,17 @@ repeat: | ||
1138 | rr->u.NM.flags); | ||
1139 | break; | ||
1140 | } | ||
1141 | - if ((strlen(retname) + rr->len - 5) >= 254) { | ||
1142 | + len = rr->len - 5; | ||
1143 | + if (retnamlen + len >= 254) { | ||
1144 | truncate = 1; | ||
1145 | break; | ||
1146 | } | ||
1147 | - strncat(retname, rr->u.NM.name, rr->len - 5); | ||
1148 | - retnamlen += rr->len - 5; | ||
1149 | + p = memchr(rr->u.NM.name, '\0', len); | ||
1150 | + if (unlikely(p)) | ||
1151 | + len = p - rr->u.NM.name; | ||
1152 | + memcpy(retname + retnamlen, rr->u.NM.name, len); | ||
1153 | + retnamlen += len; | ||
1154 | + retname[retnamlen] = '\0'; | ||
1155 | break; | ||
1156 | case SIG('R', 'E'): | ||
1157 | kfree(rs.buffer); | ||
1158 | diff --git a/fs/namei.c b/fs/namei.c | ||
1159 | index d8ee4da93650..209ca7737cb2 100644 | ||
1160 | --- a/fs/namei.c | ||
1161 | +++ b/fs/namei.c | ||
1162 | @@ -2906,22 +2906,10 @@ no_open: | ||
1163 | dentry = lookup_real(dir, dentry, nd->flags); | ||
1164 | if (IS_ERR(dentry)) | ||
1165 | return PTR_ERR(dentry); | ||
1166 | - | ||
1167 | - if (create_error) { | ||
1168 | - int open_flag = op->open_flag; | ||
1169 | - | ||
1170 | - error = create_error; | ||
1171 | - if ((open_flag & O_EXCL)) { | ||
1172 | - if (!dentry->d_inode) | ||
1173 | - goto out; | ||
1174 | - } else if (!dentry->d_inode) { | ||
1175 | - goto out; | ||
1176 | - } else if ((open_flag & O_TRUNC) && | ||
1177 | - d_is_reg(dentry)) { | ||
1178 | - goto out; | ||
1179 | - } | ||
1180 | - /* will fail later, go on to get the right error */ | ||
1181 | - } | ||
1182 | + } | ||
1183 | + if (create_error && !dentry->d_inode) { | ||
1184 | + error = create_error; | ||
1185 | + goto out; | ||
1186 | } | ||
1187 | looked_up: | ||
1188 | path->dentry = dentry; | ||
1189 | @@ -4195,7 +4183,11 @@ int vfs_rename(struct inode *old_dir, struct dentry *old_dentry, | ||
1190 | bool new_is_dir = false; | ||
1191 | unsigned max_links = new_dir->i_sb->s_max_links; | ||
1192 | |||
1193 | - if (source == target) | ||
1194 | + /* | ||
1195 | + * Check source == target. | ||
1196 | + * On overlayfs need to look at underlying inodes. | ||
1197 | + */ | ||
1198 | + if (vfs_select_inode(old_dentry, 0) == vfs_select_inode(new_dentry, 0)) | ||
1199 | return 0; | ||
1200 | |||
1201 | error = may_delete(old_dir, old_dentry, is_dir); | ||
1202 | diff --git a/fs/ocfs2/acl.c b/fs/ocfs2/acl.c | ||
1203 | index 0cdf497c91ef..2162434728c0 100644 | ||
1204 | --- a/fs/ocfs2/acl.c | ||
1205 | +++ b/fs/ocfs2/acl.c | ||
1206 | @@ -322,3 +322,90 @@ struct posix_acl *ocfs2_iop_get_acl(struct inode *inode, int type) | ||
1207 | brelse(di_bh); | ||
1208 | return acl; | ||
1209 | } | ||
1210 | + | ||
1211 | +int ocfs2_acl_chmod(struct inode *inode, struct buffer_head *bh) | ||
1212 | +{ | ||
1213 | + struct ocfs2_super *osb = OCFS2_SB(inode->i_sb); | ||
1214 | + struct posix_acl *acl; | ||
1215 | + int ret; | ||
1216 | + | ||
1217 | + if (S_ISLNK(inode->i_mode)) | ||
1218 | + return -EOPNOTSUPP; | ||
1219 | + | ||
1220 | + if (!(osb->s_mount_opt & OCFS2_MOUNT_POSIX_ACL)) | ||
1221 | + return 0; | ||
1222 | + | ||
1223 | + acl = ocfs2_get_acl_nolock(inode, ACL_TYPE_ACCESS, bh); | ||
1224 | + if (IS_ERR(acl) || !acl) | ||
1225 | + return PTR_ERR(acl); | ||
1226 | + ret = __posix_acl_chmod(&acl, GFP_KERNEL, inode->i_mode); | ||
1227 | + if (ret) | ||
1228 | + return ret; | ||
1229 | + ret = ocfs2_set_acl(NULL, inode, NULL, ACL_TYPE_ACCESS, | ||
1230 | + acl, NULL, NULL); | ||
1231 | + posix_acl_release(acl); | ||
1232 | + return ret; | ||
1233 | +} | ||
1234 | + | ||
1235 | +/* | ||
1236 | + * Initialize the ACLs of a new inode. If parent directory has default ACL, | ||
1237 | + * then clone to new inode. Called from ocfs2_mknod. | ||
1238 | + */ | ||
1239 | +int ocfs2_init_acl(handle_t *handle, | ||
1240 | + struct inode *inode, | ||
1241 | + struct inode *dir, | ||
1242 | + struct buffer_head *di_bh, | ||
1243 | + struct buffer_head *dir_bh, | ||
1244 | + struct ocfs2_alloc_context *meta_ac, | ||
1245 | + struct ocfs2_alloc_context *data_ac) | ||
1246 | +{ | ||
1247 | + struct ocfs2_super *osb = OCFS2_SB(inode->i_sb); | ||
1248 | + struct posix_acl *acl = NULL; | ||
1249 | + int ret = 0, ret2; | ||
1250 | + umode_t mode; | ||
1251 | + | ||
1252 | + if (!S_ISLNK(inode->i_mode)) { | ||
1253 | + if (osb->s_mount_opt & OCFS2_MOUNT_POSIX_ACL) { | ||
1254 | + acl = ocfs2_get_acl_nolock(dir, ACL_TYPE_DEFAULT, | ||
1255 | + dir_bh); | ||
1256 | + if (IS_ERR(acl)) | ||
1257 | + return PTR_ERR(acl); | ||
1258 | + } | ||
1259 | + if (!acl) { | ||
1260 | + mode = inode->i_mode & ~current_umask(); | ||
1261 | + ret = ocfs2_acl_set_mode(inode, di_bh, handle, mode); | ||
1262 | + if (ret) { | ||
1263 | + mlog_errno(ret); | ||
1264 | + goto cleanup; | ||
1265 | + } | ||
1266 | + } | ||
1267 | + } | ||
1268 | + if ((osb->s_mount_opt & OCFS2_MOUNT_POSIX_ACL) && acl) { | ||
1269 | + if (S_ISDIR(inode->i_mode)) { | ||
1270 | + ret = ocfs2_set_acl(handle, inode, di_bh, | ||
1271 | + ACL_TYPE_DEFAULT, acl, | ||
1272 | + meta_ac, data_ac); | ||
1273 | + if (ret) | ||
1274 | + goto cleanup; | ||
1275 | + } | ||
1276 | + mode = inode->i_mode; | ||
1277 | + ret = __posix_acl_create(&acl, GFP_NOFS, &mode); | ||
1278 | + if (ret < 0) | ||
1279 | + return ret; | ||
1280 | + | ||
1281 | + ret2 = ocfs2_acl_set_mode(inode, di_bh, handle, mode); | ||
1282 | + if (ret2) { | ||
1283 | + mlog_errno(ret2); | ||
1284 | + ret = ret2; | ||
1285 | + goto cleanup; | ||
1286 | + } | ||
1287 | + if (ret > 0) { | ||
1288 | + ret = ocfs2_set_acl(handle, inode, | ||
1289 | + di_bh, ACL_TYPE_ACCESS, | ||
1290 | + acl, meta_ac, data_ac); | ||
1291 | + } | ||
1292 | + } | ||
1293 | +cleanup: | ||
1294 | + posix_acl_release(acl); | ||
1295 | + return ret; | ||
1296 | +} | ||
1297 | diff --git a/fs/ocfs2/acl.h b/fs/ocfs2/acl.h | ||
1298 | index 3fce68d08625..2783a75b3999 100644 | ||
1299 | --- a/fs/ocfs2/acl.h | ||
1300 | +++ b/fs/ocfs2/acl.h | ||
1301 | @@ -35,5 +35,10 @@ int ocfs2_set_acl(handle_t *handle, | ||
1302 | struct posix_acl *acl, | ||
1303 | struct ocfs2_alloc_context *meta_ac, | ||
1304 | struct ocfs2_alloc_context *data_ac); | ||
1305 | +extern int ocfs2_acl_chmod(struct inode *, struct buffer_head *); | ||
1306 | +extern int ocfs2_init_acl(handle_t *, struct inode *, struct inode *, | ||
1307 | + struct buffer_head *, struct buffer_head *, | ||
1308 | + struct ocfs2_alloc_context *, | ||
1309 | + struct ocfs2_alloc_context *); | ||
1310 | |||
1311 | #endif /* OCFS2_ACL_H */ | ||
1312 | diff --git a/fs/ocfs2/file.c b/fs/ocfs2/file.c | ||
1313 | index 0e5b4515f92e..77d30cbd944d 100644 | ||
1314 | --- a/fs/ocfs2/file.c | ||
1315 | +++ b/fs/ocfs2/file.c | ||
1316 | @@ -1268,20 +1268,20 @@ bail_unlock_rw: | ||
1317 | if (size_change) | ||
1318 | ocfs2_rw_unlock(inode, 1); | ||
1319 | bail: | ||
1320 | - brelse(bh); | ||
1321 | |||
1322 | /* Release quota pointers in case we acquired them */ | ||
1323 | for (qtype = 0; qtype < OCFS2_MAXQUOTAS; qtype++) | ||
1324 | dqput(transfer_to[qtype]); | ||
1325 | |||
1326 | if (!status && attr->ia_valid & ATTR_MODE) { | ||
1327 | - status = posix_acl_chmod(inode, inode->i_mode); | ||
1328 | + status = ocfs2_acl_chmod(inode, bh); | ||
1329 | if (status < 0) | ||
1330 | mlog_errno(status); | ||
1331 | } | ||
1332 | if (inode_locked) | ||
1333 | ocfs2_inode_unlock(inode, 1); | ||
1334 | |||
1335 | + brelse(bh); | ||
1336 | return status; | ||
1337 | } | ||
1338 | |||
1339 | diff --git a/fs/ocfs2/namei.c b/fs/ocfs2/namei.c | ||
1340 | index 3123408da935..62af9554541d 100644 | ||
1341 | --- a/fs/ocfs2/namei.c | ||
1342 | +++ b/fs/ocfs2/namei.c | ||
1343 | @@ -259,7 +259,6 @@ static int ocfs2_mknod(struct inode *dir, | ||
1344 | struct ocfs2_dir_lookup_result lookup = { NULL, }; | ||
1345 | sigset_t oldset; | ||
1346 | int did_block_signals = 0; | ||
1347 | - struct posix_acl *default_acl = NULL, *acl = NULL; | ||
1348 | struct ocfs2_dentry_lock *dl = NULL; | ||
1349 | |||
1350 | trace_ocfs2_mknod(dir, dentry, dentry->d_name.len, dentry->d_name.name, | ||
1351 | @@ -367,12 +366,6 @@ static int ocfs2_mknod(struct inode *dir, | ||
1352 | goto leave; | ||
1353 | } | ||
1354 | |||
1355 | - status = posix_acl_create(dir, &inode->i_mode, &default_acl, &acl); | ||
1356 | - if (status) { | ||
1357 | - mlog_errno(status); | ||
1358 | - goto leave; | ||
1359 | - } | ||
1360 | - | ||
1361 | handle = ocfs2_start_trans(osb, ocfs2_mknod_credits(osb->sb, | ||
1362 | S_ISDIR(mode), | ||
1363 | xattr_credits)); | ||
1364 | @@ -421,16 +414,8 @@ static int ocfs2_mknod(struct inode *dir, | ||
1365 | inc_nlink(dir); | ||
1366 | } | ||
1367 | |||
1368 | - if (default_acl) { | ||
1369 | - status = ocfs2_set_acl(handle, inode, new_fe_bh, | ||
1370 | - ACL_TYPE_DEFAULT, default_acl, | ||
1371 | - meta_ac, data_ac); | ||
1372 | - } | ||
1373 | - if (!status && acl) { | ||
1374 | - status = ocfs2_set_acl(handle, inode, new_fe_bh, | ||
1375 | - ACL_TYPE_ACCESS, acl, | ||
1376 | - meta_ac, data_ac); | ||
1377 | - } | ||
1378 | + status = ocfs2_init_acl(handle, inode, dir, new_fe_bh, parent_fe_bh, | ||
1379 | + meta_ac, data_ac); | ||
1380 | |||
1381 | if (status < 0) { | ||
1382 | mlog_errno(status); | ||
1383 | @@ -472,10 +457,6 @@ static int ocfs2_mknod(struct inode *dir, | ||
1384 | d_instantiate(dentry, inode); | ||
1385 | status = 0; | ||
1386 | leave: | ||
1387 | - if (default_acl) | ||
1388 | - posix_acl_release(default_acl); | ||
1389 | - if (acl) | ||
1390 | - posix_acl_release(acl); | ||
1391 | if (status < 0 && did_quota_inode) | ||
1392 | dquot_free_inode(inode); | ||
1393 | if (handle) | ||
1394 | diff --git a/fs/ocfs2/refcounttree.c b/fs/ocfs2/refcounttree.c | ||
1395 | index 252119860e6c..6a0c55d7dff0 100644 | ||
1396 | --- a/fs/ocfs2/refcounttree.c | ||
1397 | +++ b/fs/ocfs2/refcounttree.c | ||
1398 | @@ -4248,20 +4248,12 @@ static int ocfs2_reflink(struct dentry *old_dentry, struct inode *dir, | ||
1399 | struct inode *inode = d_inode(old_dentry); | ||
1400 | struct buffer_head *old_bh = NULL; | ||
1401 | struct inode *new_orphan_inode = NULL; | ||
1402 | - struct posix_acl *default_acl, *acl; | ||
1403 | - umode_t mode; | ||
1404 | |||
1405 | if (!ocfs2_refcount_tree(OCFS2_SB(inode->i_sb))) | ||
1406 | return -EOPNOTSUPP; | ||
1407 | |||
1408 | - mode = inode->i_mode; | ||
1409 | - error = posix_acl_create(dir, &mode, &default_acl, &acl); | ||
1410 | - if (error) { | ||
1411 | - mlog_errno(error); | ||
1412 | - return error; | ||
1413 | - } | ||
1414 | |||
1415 | - error = ocfs2_create_inode_in_orphan(dir, mode, | ||
1416 | + error = ocfs2_create_inode_in_orphan(dir, inode->i_mode, | ||
1417 | &new_orphan_inode); | ||
1418 | if (error) { | ||
1419 | mlog_errno(error); | ||
1420 | @@ -4300,16 +4292,11 @@ static int ocfs2_reflink(struct dentry *old_dentry, struct inode *dir, | ||
1421 | /* If the security isn't preserved, we need to re-initialize them. */ | ||
1422 | if (!preserve) { | ||
1423 | error = ocfs2_init_security_and_acl(dir, new_orphan_inode, | ||
1424 | - &new_dentry->d_name, | ||
1425 | - default_acl, acl); | ||
1426 | + &new_dentry->d_name); | ||
1427 | if (error) | ||
1428 | mlog_errno(error); | ||
1429 | } | ||
1430 | out: | ||
1431 | - if (default_acl) | ||
1432 | - posix_acl_release(default_acl); | ||
1433 | - if (acl) | ||
1434 | - posix_acl_release(acl); | ||
1435 | if (!error) { | ||
1436 | error = ocfs2_mv_orphaned_inode_to_new(dir, new_orphan_inode, | ||
1437 | new_dentry); | ||
1438 | diff --git a/fs/ocfs2/xattr.c b/fs/ocfs2/xattr.c | ||
1439 | index e9164f09841b..877830b05e12 100644 | ||
1440 | --- a/fs/ocfs2/xattr.c | ||
1441 | +++ b/fs/ocfs2/xattr.c | ||
1442 | @@ -7197,12 +7197,10 @@ out: | ||
1443 | */ | ||
1444 | int ocfs2_init_security_and_acl(struct inode *dir, | ||
1445 | struct inode *inode, | ||
1446 | - const struct qstr *qstr, | ||
1447 | - struct posix_acl *default_acl, | ||
1448 | - struct posix_acl *acl) | ||
1449 | + const struct qstr *qstr) | ||
1450 | { | ||
1451 | - struct buffer_head *dir_bh = NULL; | ||
1452 | int ret = 0; | ||
1453 | + struct buffer_head *dir_bh = NULL; | ||
1454 | |||
1455 | ret = ocfs2_init_security_get(inode, dir, qstr, NULL); | ||
1456 | if (ret) { | ||
1457 | @@ -7215,11 +7213,9 @@ int ocfs2_init_security_and_acl(struct inode *dir, | ||
1458 | mlog_errno(ret); | ||
1459 | goto leave; | ||
1460 | } | ||
1461 | - | ||
1462 | - if (!ret && default_acl) | ||
1463 | - ret = ocfs2_iop_set_acl(inode, default_acl, ACL_TYPE_DEFAULT); | ||
1464 | - if (!ret && acl) | ||
1465 | - ret = ocfs2_iop_set_acl(inode, acl, ACL_TYPE_ACCESS); | ||
1466 | + ret = ocfs2_init_acl(NULL, inode, dir, NULL, dir_bh, NULL, NULL); | ||
1467 | + if (ret) | ||
1468 | + mlog_errno(ret); | ||
1469 | |||
1470 | ocfs2_inode_unlock(dir, 0); | ||
1471 | brelse(dir_bh); | ||
1472 | diff --git a/fs/ocfs2/xattr.h b/fs/ocfs2/xattr.h | ||
1473 | index f10d5b93c366..1633cc15ea1f 100644 | ||
1474 | --- a/fs/ocfs2/xattr.h | ||
1475 | +++ b/fs/ocfs2/xattr.h | ||
1476 | @@ -94,7 +94,5 @@ int ocfs2_reflink_xattrs(struct inode *old_inode, | ||
1477 | bool preserve_security); | ||
1478 | int ocfs2_init_security_and_acl(struct inode *dir, | ||
1479 | struct inode *inode, | ||
1480 | - const struct qstr *qstr, | ||
1481 | - struct posix_acl *default_acl, | ||
1482 | - struct posix_acl *acl); | ||
1483 | + const struct qstr *qstr); | ||
1484 | #endif /* OCFS2_XATTR_H */ | ||
1485 | diff --git a/fs/open.c b/fs/open.c | ||
1486 | index 6a24f988d253..157b9940dd73 100644 | ||
1487 | --- a/fs/open.c | ||
1488 | +++ b/fs/open.c | ||
1489 | @@ -840,16 +840,12 @@ EXPORT_SYMBOL(file_path); | ||
1490 | int vfs_open(const struct path *path, struct file *file, | ||
1491 | const struct cred *cred) | ||
1492 | { | ||
1493 | - struct dentry *dentry = path->dentry; | ||
1494 | - struct inode *inode = dentry->d_inode; | ||
1495 | + struct inode *inode = vfs_select_inode(path->dentry, file->f_flags); | ||
1496 | |||
1497 | - file->f_path = *path; | ||
1498 | - if (dentry->d_flags & DCACHE_OP_SELECT_INODE) { | ||
1499 | - inode = dentry->d_op->d_select_inode(dentry, file->f_flags); | ||
1500 | - if (IS_ERR(inode)) | ||
1501 | - return PTR_ERR(inode); | ||
1502 | - } | ||
1503 | + if (IS_ERR(inode)) | ||
1504 | + return PTR_ERR(inode); | ||
1505 | |||
1506 | + file->f_path = *path; | ||
1507 | return do_dentry_open(file, inode, NULL, cred); | ||
1508 | } | ||
1509 | |||
1510 | diff --git a/include/linux/bpf.h b/include/linux/bpf.h | ||
1511 | index 83d1926c61e4..67bc2da5d233 100644 | ||
1512 | --- a/include/linux/bpf.h | ||
1513 | +++ b/include/linux/bpf.h | ||
1514 | @@ -165,12 +165,13 @@ void bpf_register_prog_type(struct bpf_prog_type_list *tl); | ||
1515 | void bpf_register_map_type(struct bpf_map_type_list *tl); | ||
1516 | |||
1517 | struct bpf_prog *bpf_prog_get(u32 ufd); | ||
1518 | +struct bpf_prog *bpf_prog_inc(struct bpf_prog *prog); | ||
1519 | void bpf_prog_put(struct bpf_prog *prog); | ||
1520 | void bpf_prog_put_rcu(struct bpf_prog *prog); | ||
1521 | |||
1522 | struct bpf_map *bpf_map_get_with_uref(u32 ufd); | ||
1523 | struct bpf_map *__bpf_map_get(struct fd f); | ||
1524 | -void bpf_map_inc(struct bpf_map *map, bool uref); | ||
1525 | +struct bpf_map *bpf_map_inc(struct bpf_map *map, bool uref); | ||
1526 | void bpf_map_put_with_uref(struct bpf_map *map); | ||
1527 | void bpf_map_put(struct bpf_map *map); | ||
1528 | |||
1529 | diff --git a/include/linux/dcache.h b/include/linux/dcache.h | ||
1530 | index f513dd855cb2..d81746d3b2da 100644 | ||
1531 | --- a/include/linux/dcache.h | ||
1532 | +++ b/include/linux/dcache.h | ||
1533 | @@ -592,4 +592,16 @@ static inline struct dentry *d_real(struct dentry *dentry) | ||
1534 | return dentry; | ||
1535 | } | ||
1536 | |||
1537 | +static inline struct inode *vfs_select_inode(struct dentry *dentry, | ||
1538 | + unsigned open_flags) | ||
1539 | +{ | ||
1540 | + struct inode *inode = d_inode(dentry); | ||
1541 | + | ||
1542 | + if (inode && unlikely(dentry->d_flags & DCACHE_OP_SELECT_INODE)) | ||
1543 | + inode = dentry->d_op->d_select_inode(dentry, open_flags); | ||
1544 | + | ||
1545 | + return inode; | ||
1546 | +} | ||
1547 | + | ||
1548 | + | ||
1549 | #endif /* __LINUX_DCACHE_H */ | ||
1550 | diff --git a/include/linux/mfd/samsung/s2mps11.h b/include/linux/mfd/samsung/s2mps11.h | ||
1551 | index b288965e8101..2c14eeca46f0 100644 | ||
1552 | --- a/include/linux/mfd/samsung/s2mps11.h | ||
1553 | +++ b/include/linux/mfd/samsung/s2mps11.h | ||
1554 | @@ -173,10 +173,12 @@ enum s2mps11_regulators { | ||
1555 | |||
1556 | #define S2MPS11_LDO_VSEL_MASK 0x3F | ||
1557 | #define S2MPS11_BUCK_VSEL_MASK 0xFF | ||
1558 | +#define S2MPS11_BUCK9_VSEL_MASK 0x1F | ||
1559 | #define S2MPS11_ENABLE_MASK (0x03 << S2MPS11_ENABLE_SHIFT) | ||
1560 | #define S2MPS11_ENABLE_SHIFT 0x06 | ||
1561 | #define S2MPS11_LDO_N_VOLTAGES (S2MPS11_LDO_VSEL_MASK + 1) | ||
1562 | #define S2MPS11_BUCK_N_VOLTAGES (S2MPS11_BUCK_VSEL_MASK + 1) | ||
1563 | +#define S2MPS11_BUCK9_N_VOLTAGES (S2MPS11_BUCK9_VSEL_MASK + 1) | ||
1564 | #define S2MPS11_RAMP_DELAY 25000 /* uV/us */ | ||
1565 | |||
1566 | #define S2MPS11_CTRL1_PWRHOLD_MASK BIT(4) | ||
1567 | diff --git a/include/linux/mlx5/driver.h b/include/linux/mlx5/driver.h | ||
1568 | index af3efd9157f0..412aa988c6ad 100644 | ||
1569 | --- a/include/linux/mlx5/driver.h | ||
1570 | +++ b/include/linux/mlx5/driver.h | ||
1571 | @@ -792,9 +792,9 @@ int mlx5_set_port_admin_status(struct mlx5_core_dev *dev, | ||
1572 | int mlx5_query_port_admin_status(struct mlx5_core_dev *dev, | ||
1573 | enum mlx5_port_status *status); | ||
1574 | |||
1575 | -int mlx5_set_port_mtu(struct mlx5_core_dev *dev, int mtu, u8 port); | ||
1576 | -void mlx5_query_port_max_mtu(struct mlx5_core_dev *dev, int *max_mtu, u8 port); | ||
1577 | -void mlx5_query_port_oper_mtu(struct mlx5_core_dev *dev, int *oper_mtu, | ||
1578 | +int mlx5_set_port_mtu(struct mlx5_core_dev *dev, u16 mtu, u8 port); | ||
1579 | +void mlx5_query_port_max_mtu(struct mlx5_core_dev *dev, u16 *max_mtu, u8 port); | ||
1580 | +void mlx5_query_port_oper_mtu(struct mlx5_core_dev *dev, u16 *oper_mtu, | ||
1581 | u8 port); | ||
1582 | |||
1583 | int mlx5_query_port_vl_hw_cap(struct mlx5_core_dev *dev, | ||
1584 | diff --git a/include/linux/net.h b/include/linux/net.h | ||
1585 | index 0b4ac7da583a..25ef630f1bd6 100644 | ||
1586 | --- a/include/linux/net.h | ||
1587 | +++ b/include/linux/net.h | ||
1588 | @@ -245,7 +245,15 @@ do { \ | ||
1589 | net_ratelimited_function(pr_warn, fmt, ##__VA_ARGS__) | ||
1590 | #define net_info_ratelimited(fmt, ...) \ | ||
1591 | net_ratelimited_function(pr_info, fmt, ##__VA_ARGS__) | ||
1592 | -#if defined(DEBUG) | ||
1593 | +#if defined(CONFIG_DYNAMIC_DEBUG) | ||
1594 | +#define net_dbg_ratelimited(fmt, ...) \ | ||
1595 | +do { \ | ||
1596 | + DEFINE_DYNAMIC_DEBUG_METADATA(descriptor, fmt); \ | ||
1597 | + if (unlikely(descriptor.flags & _DPRINTK_FLAGS_PRINT) && \ | ||
1598 | + net_ratelimit()) \ | ||
1599 | + __dynamic_pr_debug(&descriptor, fmt, ##__VA_ARGS__); \ | ||
1600 | +} while (0) | ||
1601 | +#elif defined(DEBUG) | ||
1602 | #define net_dbg_ratelimited(fmt, ...) \ | ||
1603 | net_ratelimited_function(pr_debug, fmt, ##__VA_ARGS__) | ||
1604 | #else | ||
1605 | diff --git a/include/net/codel.h b/include/net/codel.h | ||
1606 | index 267e70210061..d168aca115cc 100644 | ||
1607 | --- a/include/net/codel.h | ||
1608 | +++ b/include/net/codel.h | ||
1609 | @@ -162,12 +162,14 @@ struct codel_vars { | ||
1610 | * struct codel_stats - contains codel shared variables and stats | ||
1611 | * @maxpacket: largest packet we've seen so far | ||
1612 | * @drop_count: temp count of dropped packets in dequeue() | ||
1613 | + * @drop_len: bytes of dropped packets in dequeue() | ||
1614 | * ecn_mark: number of packets we ECN marked instead of dropping | ||
1615 | * ce_mark: number of packets CE marked because sojourn time was above ce_threshold | ||
1616 | */ | ||
1617 | struct codel_stats { | ||
1618 | u32 maxpacket; | ||
1619 | u32 drop_count; | ||
1620 | + u32 drop_len; | ||
1621 | u32 ecn_mark; | ||
1622 | u32 ce_mark; | ||
1623 | }; | ||
1624 | @@ -308,6 +310,7 @@ static struct sk_buff *codel_dequeue(struct Qdisc *sch, | ||
1625 | vars->rec_inv_sqrt); | ||
1626 | goto end; | ||
1627 | } | ||
1628 | + stats->drop_len += qdisc_pkt_len(skb); | ||
1629 | qdisc_drop(skb, sch); | ||
1630 | stats->drop_count++; | ||
1631 | skb = dequeue_func(vars, sch); | ||
1632 | @@ -330,6 +333,7 @@ static struct sk_buff *codel_dequeue(struct Qdisc *sch, | ||
1633 | if (params->ecn && INET_ECN_set_ce(skb)) { | ||
1634 | stats->ecn_mark++; | ||
1635 | } else { | ||
1636 | + stats->drop_len += qdisc_pkt_len(skb); | ||
1637 | qdisc_drop(skb, sch); | ||
1638 | stats->drop_count++; | ||
1639 | |||
1640 | diff --git a/include/net/sch_generic.h b/include/net/sch_generic.h | ||
1641 | index b2a8e6338576..86df0835f6b5 100644 | ||
1642 | --- a/include/net/sch_generic.h | ||
1643 | +++ b/include/net/sch_generic.h | ||
1644 | @@ -396,7 +396,8 @@ struct Qdisc *dev_graft_qdisc(struct netdev_queue *dev_queue, | ||
1645 | struct Qdisc *qdisc); | ||
1646 | void qdisc_reset(struct Qdisc *qdisc); | ||
1647 | void qdisc_destroy(struct Qdisc *qdisc); | ||
1648 | -void qdisc_tree_decrease_qlen(struct Qdisc *qdisc, unsigned int n); | ||
1649 | +void qdisc_tree_reduce_backlog(struct Qdisc *qdisc, unsigned int n, | ||
1650 | + unsigned int len); | ||
1651 | struct Qdisc *qdisc_alloc(struct netdev_queue *dev_queue, | ||
1652 | const struct Qdisc_ops *ops); | ||
1653 | struct Qdisc *qdisc_create_dflt(struct netdev_queue *dev_queue, | ||
1654 | @@ -698,6 +699,23 @@ static inline void qdisc_reset_queue(struct Qdisc *sch) | ||
1655 | sch->qstats.backlog = 0; | ||
1656 | } | ||
1657 | |||
1658 | +static inline struct Qdisc *qdisc_replace(struct Qdisc *sch, struct Qdisc *new, | ||
1659 | + struct Qdisc **pold) | ||
1660 | +{ | ||
1661 | + struct Qdisc *old; | ||
1662 | + | ||
1663 | + sch_tree_lock(sch); | ||
1664 | + old = *pold; | ||
1665 | + *pold = new; | ||
1666 | + if (old != NULL) { | ||
1667 | + qdisc_tree_reduce_backlog(old, old->q.qlen, old->qstats.backlog); | ||
1668 | + qdisc_reset(old); | ||
1669 | + } | ||
1670 | + sch_tree_unlock(sch); | ||
1671 | + | ||
1672 | + return old; | ||
1673 | +} | ||
1674 | + | ||
1675 | static inline unsigned int __qdisc_queue_drop(struct Qdisc *sch, | ||
1676 | struct sk_buff_head *list) | ||
1677 | { | ||
1678 | diff --git a/include/uapi/linux/if.h b/include/uapi/linux/if.h | ||
1679 | index 9cf2394f0bcf..752f5dc040a5 100644 | ||
1680 | --- a/include/uapi/linux/if.h | ||
1681 | +++ b/include/uapi/linux/if.h | ||
1682 | @@ -19,14 +19,20 @@ | ||
1683 | #ifndef _LINUX_IF_H | ||
1684 | #define _LINUX_IF_H | ||
1685 | |||
1686 | +#include <linux/libc-compat.h> /* for compatibility with glibc */ | ||
1687 | #include <linux/types.h> /* for "__kernel_caddr_t" et al */ | ||
1688 | #include <linux/socket.h> /* for "struct sockaddr" et al */ | ||
1689 | #include <linux/compiler.h> /* for "__user" et al */ | ||
1690 | |||
1691 | +#if __UAPI_DEF_IF_IFNAMSIZ | ||
1692 | #define IFNAMSIZ 16 | ||
1693 | +#endif /* __UAPI_DEF_IF_IFNAMSIZ */ | ||
1694 | #define IFALIASZ 256 | ||
1695 | #include <linux/hdlc/ioctl.h> | ||
1696 | |||
1697 | +/* For glibc compatibility. An empty enum does not compile. */ | ||
1698 | +#if __UAPI_DEF_IF_NET_DEVICE_FLAGS_LOWER_UP_DORMANT_ECHO != 0 && \ | ||
1699 | + __UAPI_DEF_IF_NET_DEVICE_FLAGS != 0 | ||
1700 | /** | ||
1701 | * enum net_device_flags - &struct net_device flags | ||
1702 | * | ||
1703 | @@ -68,6 +74,8 @@ | ||
1704 | * @IFF_ECHO: echo sent packets. Volatile. | ||
1705 | */ | ||
1706 | enum net_device_flags { | ||
1707 | +/* for compatibility with glibc net/if.h */ | ||
1708 | +#if __UAPI_DEF_IF_NET_DEVICE_FLAGS | ||
1709 | IFF_UP = 1<<0, /* sysfs */ | ||
1710 | IFF_BROADCAST = 1<<1, /* volatile */ | ||
1711 | IFF_DEBUG = 1<<2, /* sysfs */ | ||
1712 | @@ -84,11 +92,17 @@ enum net_device_flags { | ||
1713 | IFF_PORTSEL = 1<<13, /* sysfs */ | ||
1714 | IFF_AUTOMEDIA = 1<<14, /* sysfs */ | ||
1715 | IFF_DYNAMIC = 1<<15, /* sysfs */ | ||
1716 | +#endif /* __UAPI_DEF_IF_NET_DEVICE_FLAGS */ | ||
1717 | +#if __UAPI_DEF_IF_NET_DEVICE_FLAGS_LOWER_UP_DORMANT_ECHO | ||
1718 | IFF_LOWER_UP = 1<<16, /* volatile */ | ||
1719 | IFF_DORMANT = 1<<17, /* volatile */ | ||
1720 | IFF_ECHO = 1<<18, /* volatile */ | ||
1721 | +#endif /* __UAPI_DEF_IF_NET_DEVICE_FLAGS_LOWER_UP_DORMANT_ECHO */ | ||
1722 | }; | ||
1723 | +#endif /* __UAPI_DEF_IF_NET_DEVICE_FLAGS_LOWER_UP_DORMANT_ECHO != 0 && __UAPI_DEF_IF_NET_DEVICE_FLAGS != 0 */ | ||
1724 | |||
1725 | +/* for compatibility with glibc net/if.h */ | ||
1726 | +#if __UAPI_DEF_IF_NET_DEVICE_FLAGS | ||
1727 | #define IFF_UP IFF_UP | ||
1728 | #define IFF_BROADCAST IFF_BROADCAST | ||
1729 | #define IFF_DEBUG IFF_DEBUG | ||
1730 | @@ -105,9 +119,13 @@ enum net_device_flags { | ||
1731 | #define IFF_PORTSEL IFF_PORTSEL | ||
1732 | #define IFF_AUTOMEDIA IFF_AUTOMEDIA | ||
1733 | #define IFF_DYNAMIC IFF_DYNAMIC | ||
1734 | +#endif /* __UAPI_DEF_IF_NET_DEVICE_FLAGS */ | ||
1735 | + | ||
1736 | +#if __UAPI_DEF_IF_NET_DEVICE_FLAGS_LOWER_UP_DORMANT_ECHO | ||
1737 | #define IFF_LOWER_UP IFF_LOWER_UP | ||
1738 | #define IFF_DORMANT IFF_DORMANT | ||
1739 | #define IFF_ECHO IFF_ECHO | ||
1740 | +#endif /* __UAPI_DEF_IF_NET_DEVICE_FLAGS_LOWER_UP_DORMANT_ECHO */ | ||
1741 | |||
1742 | #define IFF_VOLATILE (IFF_LOOPBACK|IFF_POINTOPOINT|IFF_BROADCAST|IFF_ECHO|\ | ||
1743 | IFF_MASTER|IFF_SLAVE|IFF_RUNNING|IFF_LOWER_UP|IFF_DORMANT) | ||
1744 | @@ -166,6 +184,8 @@ enum { | ||
1745 | * being very small might be worth keeping for clean configuration. | ||
1746 | */ | ||
1747 | |||
1748 | +/* for compatibility with glibc net/if.h */ | ||
1749 | +#if __UAPI_DEF_IF_IFMAP | ||
1750 | struct ifmap { | ||
1751 | unsigned long mem_start; | ||
1752 | unsigned long mem_end; | ||
1753 | @@ -175,6 +195,7 @@ struct ifmap { | ||
1754 | unsigned char port; | ||
1755 | /* 3 bytes spare */ | ||
1756 | }; | ||
1757 | +#endif /* __UAPI_DEF_IF_IFMAP */ | ||
1758 | |||
1759 | struct if_settings { | ||
1760 | unsigned int type; /* Type of physical device or protocol */ | ||
1761 | @@ -200,6 +221,8 @@ struct if_settings { | ||
1762 | * remainder may be interface specific. | ||
1763 | */ | ||
1764 | |||
1765 | +/* for compatibility with glibc net/if.h */ | ||
1766 | +#if __UAPI_DEF_IF_IFREQ | ||
1767 | struct ifreq { | ||
1768 | #define IFHWADDRLEN 6 | ||
1769 | union | ||
1770 | @@ -223,6 +246,7 @@ struct ifreq { | ||
1771 | struct if_settings ifru_settings; | ||
1772 | } ifr_ifru; | ||
1773 | }; | ||
1774 | +#endif /* __UAPI_DEF_IF_IFREQ */ | ||
1775 | |||
1776 | #define ifr_name ifr_ifrn.ifrn_name /* interface name */ | ||
1777 | #define ifr_hwaddr ifr_ifru.ifru_hwaddr /* MAC address */ | ||
1778 | @@ -249,6 +273,8 @@ struct ifreq { | ||
1779 | * must know all networks accessible). | ||
1780 | */ | ||
1781 | |||
1782 | +/* for compatibility with glibc net/if.h */ | ||
1783 | +#if __UAPI_DEF_IF_IFCONF | ||
1784 | struct ifconf { | ||
1785 | int ifc_len; /* size of buffer */ | ||
1786 | union { | ||
1787 | @@ -256,6 +282,8 @@ struct ifconf { | ||
1788 | struct ifreq __user *ifcu_req; | ||
1789 | } ifc_ifcu; | ||
1790 | }; | ||
1791 | +#endif /* __UAPI_DEF_IF_IFCONF */ | ||
1792 | + | ||
1793 | #define ifc_buf ifc_ifcu.ifcu_buf /* buffer address */ | ||
1794 | #define ifc_req ifc_ifcu.ifcu_req /* array of structures */ | ||
1795 | |||
1796 | diff --git a/include/uapi/linux/libc-compat.h b/include/uapi/linux/libc-compat.h | ||
1797 | index 7d024ceb075d..d5e38c73377c 100644 | ||
1798 | --- a/include/uapi/linux/libc-compat.h | ||
1799 | +++ b/include/uapi/linux/libc-compat.h | ||
1800 | @@ -51,6 +51,40 @@ | ||
1801 | /* We have included glibc headers... */ | ||
1802 | #if defined(__GLIBC__) | ||
1803 | |||
1804 | +/* Coordinate with glibc net/if.h header. */ | ||
1805 | +#if defined(_NET_IF_H) | ||
1806 | + | ||
1807 | +/* GLIBC headers included first so don't define anything | ||
1808 | + * that would already be defined. */ | ||
1809 | + | ||
1810 | +#define __UAPI_DEF_IF_IFCONF 0 | ||
1811 | +#define __UAPI_DEF_IF_IFMAP 0 | ||
1812 | +#define __UAPI_DEF_IF_IFNAMSIZ 0 | ||
1813 | +#define __UAPI_DEF_IF_IFREQ 0 | ||
1814 | +/* Everything up to IFF_DYNAMIC, matches net/if.h until glibc 2.23 */ | ||
1815 | +#define __UAPI_DEF_IF_NET_DEVICE_FLAGS 0 | ||
1816 | +/* For the future if glibc adds IFF_LOWER_UP, IFF_DORMANT and IFF_ECHO */ | ||
1817 | +#ifndef __UAPI_DEF_IF_NET_DEVICE_FLAGS_LOWER_UP_DORMANT_ECHO | ||
1818 | +#define __UAPI_DEF_IF_NET_DEVICE_FLAGS_LOWER_UP_DORMANT_ECHO 1 | ||
1819 | +#endif /* __UAPI_DEF_IF_NET_DEVICE_FLAGS_LOWER_UP_DORMANT_ECHO */ | ||
1820 | + | ||
1821 | +#else /* _NET_IF_H */ | ||
1822 | + | ||
1823 | +/* Linux headers included first, and we must define everything | ||
1824 | + * we need. The expectation is that glibc will check the | ||
1825 | + * __UAPI_DEF_* defines and adjust appropriately. */ | ||
1826 | + | ||
1827 | +#define __UAPI_DEF_IF_IFCONF 1 | ||
1828 | +#define __UAPI_DEF_IF_IFMAP 1 | ||
1829 | +#define __UAPI_DEF_IF_IFNAMSIZ 1 | ||
1830 | +#define __UAPI_DEF_IF_IFREQ 1 | ||
1831 | +/* Everything up to IFF_DYNAMIC, matches net/if.h until glibc 2.23 */ | ||
1832 | +#define __UAPI_DEF_IF_NET_DEVICE_FLAGS 1 | ||
1833 | +/* For the future if glibc adds IFF_LOWER_UP, IFF_DORMANT and IFF_ECHO */ | ||
1834 | +#define __UAPI_DEF_IF_NET_DEVICE_FLAGS_LOWER_UP_DORMANT_ECHO 1 | ||
1835 | + | ||
1836 | +#endif /* _NET_IF_H */ | ||
1837 | + | ||
1838 | /* Coordinate with glibc netinet/in.h header. */ | ||
1839 | #if defined(_NETINET_IN_H) | ||
1840 | |||
1841 | @@ -117,6 +151,16 @@ | ||
1842 | * that we need. */ | ||
1843 | #else /* !defined(__GLIBC__) */ | ||
1844 | |||
1845 | +/* Definitions for if.h */ | ||
1846 | +#define __UAPI_DEF_IF_IFCONF 1 | ||
1847 | +#define __UAPI_DEF_IF_IFMAP 1 | ||
1848 | +#define __UAPI_DEF_IF_IFNAMSIZ 1 | ||
1849 | +#define __UAPI_DEF_IF_IFREQ 1 | ||
1850 | +/* Everything up to IFF_DYNAMIC, matches net/if.h until glibc 2.23 */ | ||
1851 | +#define __UAPI_DEF_IF_NET_DEVICE_FLAGS 1 | ||
1852 | +/* For the future if glibc adds IFF_LOWER_UP, IFF_DORMANT and IFF_ECHO */ | ||
1853 | +#define __UAPI_DEF_IF_NET_DEVICE_FLAGS_LOWER_UP_DORMANT_ECHO 1 | ||
1854 | + | ||
1855 | /* Definitions for in.h */ | ||
1856 | #define __UAPI_DEF_IN_ADDR 1 | ||
1857 | #define __UAPI_DEF_IN_IPPROTO 1 | ||
1858 | diff --git a/kernel/bpf/inode.c b/kernel/bpf/inode.c | ||
1859 | index 5a8a797d50b7..d1a7646f79c5 100644 | ||
1860 | --- a/kernel/bpf/inode.c | ||
1861 | +++ b/kernel/bpf/inode.c | ||
1862 | @@ -31,10 +31,10 @@ static void *bpf_any_get(void *raw, enum bpf_type type) | ||
1863 | { | ||
1864 | switch (type) { | ||
1865 | case BPF_TYPE_PROG: | ||
1866 | - atomic_inc(&((struct bpf_prog *)raw)->aux->refcnt); | ||
1867 | + raw = bpf_prog_inc(raw); | ||
1868 | break; | ||
1869 | case BPF_TYPE_MAP: | ||
1870 | - bpf_map_inc(raw, true); | ||
1871 | + raw = bpf_map_inc(raw, true); | ||
1872 | break; | ||
1873 | default: | ||
1874 | WARN_ON_ONCE(1); | ||
1875 | @@ -277,7 +277,8 @@ static void *bpf_obj_do_get(const struct filename *pathname, | ||
1876 | goto out; | ||
1877 | |||
1878 | raw = bpf_any_get(inode->i_private, *type); | ||
1879 | - touch_atime(&path); | ||
1880 | + if (!IS_ERR(raw)) | ||
1881 | + touch_atime(&path); | ||
1882 | |||
1883 | path_put(&path); | ||
1884 | return raw; | ||
1885 | diff --git a/kernel/bpf/syscall.c b/kernel/bpf/syscall.c | ||
1886 | index 3b39550d8485..4e32cc94edd9 100644 | ||
1887 | --- a/kernel/bpf/syscall.c | ||
1888 | +++ b/kernel/bpf/syscall.c | ||
1889 | @@ -181,11 +181,18 @@ struct bpf_map *__bpf_map_get(struct fd f) | ||
1890 | return f.file->private_data; | ||
1891 | } | ||
1892 | |||
1893 | -void bpf_map_inc(struct bpf_map *map, bool uref) | ||
1894 | +/* prog's and map's refcnt limit */ | ||
1895 | +#define BPF_MAX_REFCNT 32768 | ||
1896 | + | ||
1897 | +struct bpf_map *bpf_map_inc(struct bpf_map *map, bool uref) | ||
1898 | { | ||
1899 | - atomic_inc(&map->refcnt); | ||
1900 | + if (atomic_inc_return(&map->refcnt) > BPF_MAX_REFCNT) { | ||
1901 | + atomic_dec(&map->refcnt); | ||
1902 | + return ERR_PTR(-EBUSY); | ||
1903 | + } | ||
1904 | if (uref) | ||
1905 | atomic_inc(&map->usercnt); | ||
1906 | + return map; | ||
1907 | } | ||
1908 | |||
1909 | struct bpf_map *bpf_map_get_with_uref(u32 ufd) | ||
1910 | @@ -197,7 +204,7 @@ struct bpf_map *bpf_map_get_with_uref(u32 ufd) | ||
1911 | if (IS_ERR(map)) | ||
1912 | return map; | ||
1913 | |||
1914 | - bpf_map_inc(map, true); | ||
1915 | + map = bpf_map_inc(map, true); | ||
1916 | fdput(f); | ||
1917 | |||
1918 | return map; | ||
1919 | @@ -580,6 +587,15 @@ static struct bpf_prog *__bpf_prog_get(struct fd f) | ||
1920 | return f.file->private_data; | ||
1921 | } | ||
1922 | |||
1923 | +struct bpf_prog *bpf_prog_inc(struct bpf_prog *prog) | ||
1924 | +{ | ||
1925 | + if (atomic_inc_return(&prog->aux->refcnt) > BPF_MAX_REFCNT) { | ||
1926 | + atomic_dec(&prog->aux->refcnt); | ||
1927 | + return ERR_PTR(-EBUSY); | ||
1928 | + } | ||
1929 | + return prog; | ||
1930 | +} | ||
1931 | + | ||
1932 | /* called by sockets/tracing/seccomp before attaching program to an event | ||
1933 | * pairs with bpf_prog_put() | ||
1934 | */ | ||
1935 | @@ -592,7 +608,7 @@ struct bpf_prog *bpf_prog_get(u32 ufd) | ||
1936 | if (IS_ERR(prog)) | ||
1937 | return prog; | ||
1938 | |||
1939 | - atomic_inc(&prog->aux->refcnt); | ||
1940 | + prog = bpf_prog_inc(prog); | ||
1941 | fdput(f); | ||
1942 | |||
1943 | return prog; | ||
1944 | diff --git a/kernel/bpf/verifier.c b/kernel/bpf/verifier.c | ||
1945 | index 2e7f7ab739e4..2cbfba78d3db 100644 | ||
1946 | --- a/kernel/bpf/verifier.c | ||
1947 | +++ b/kernel/bpf/verifier.c | ||
1948 | @@ -239,15 +239,6 @@ static const char * const reg_type_str[] = { | ||
1949 | [CONST_IMM] = "imm", | ||
1950 | }; | ||
1951 | |||
1952 | -static const struct { | ||
1953 | - int map_type; | ||
1954 | - int func_id; | ||
1955 | -} func_limit[] = { | ||
1956 | - {BPF_MAP_TYPE_PROG_ARRAY, BPF_FUNC_tail_call}, | ||
1957 | - {BPF_MAP_TYPE_PERF_EVENT_ARRAY, BPF_FUNC_perf_event_read}, | ||
1958 | - {BPF_MAP_TYPE_PERF_EVENT_ARRAY, BPF_FUNC_perf_event_output}, | ||
1959 | -}; | ||
1960 | - | ||
1961 | static void print_verifier_state(struct verifier_env *env) | ||
1962 | { | ||
1963 | enum bpf_reg_type t; | ||
1964 | @@ -898,24 +889,44 @@ static int check_func_arg(struct verifier_env *env, u32 regno, | ||
1965 | |||
1966 | static int check_map_func_compatibility(struct bpf_map *map, int func_id) | ||
1967 | { | ||
1968 | - bool bool_map, bool_func; | ||
1969 | - int i; | ||
1970 | - | ||
1971 | if (!map) | ||
1972 | return 0; | ||
1973 | |||
1974 | - for (i = 0; i < ARRAY_SIZE(func_limit); i++) { | ||
1975 | - bool_map = (map->map_type == func_limit[i].map_type); | ||
1976 | - bool_func = (func_id == func_limit[i].func_id); | ||
1977 | - /* only when map & func pair match it can continue. | ||
1978 | - * don't allow any other map type to be passed into | ||
1979 | - * the special func; | ||
1980 | - */ | ||
1981 | - if (bool_func && bool_map != bool_func) | ||
1982 | - return -EINVAL; | ||
1983 | + /* We need a two way check, first is from map perspective ... */ | ||
1984 | + switch (map->map_type) { | ||
1985 | + case BPF_MAP_TYPE_PROG_ARRAY: | ||
1986 | + if (func_id != BPF_FUNC_tail_call) | ||
1987 | + goto error; | ||
1988 | + break; | ||
1989 | + case BPF_MAP_TYPE_PERF_EVENT_ARRAY: | ||
1990 | + if (func_id != BPF_FUNC_perf_event_read && | ||
1991 | + func_id != BPF_FUNC_perf_event_output) | ||
1992 | + goto error; | ||
1993 | + break; | ||
1994 | + default: | ||
1995 | + break; | ||
1996 | + } | ||
1997 | + | ||
1998 | + /* ... and second from the function itself. */ | ||
1999 | + switch (func_id) { | ||
2000 | + case BPF_FUNC_tail_call: | ||
2001 | + if (map->map_type != BPF_MAP_TYPE_PROG_ARRAY) | ||
2002 | + goto error; | ||
2003 | + break; | ||
2004 | + case BPF_FUNC_perf_event_read: | ||
2005 | + case BPF_FUNC_perf_event_output: | ||
2006 | + if (map->map_type != BPF_MAP_TYPE_PERF_EVENT_ARRAY) | ||
2007 | + goto error; | ||
2008 | + break; | ||
2009 | + default: | ||
2010 | + break; | ||
2011 | } | ||
2012 | |||
2013 | return 0; | ||
2014 | +error: | ||
2015 | + verbose("cannot pass map_type %d into func %d\n", | ||
2016 | + map->map_type, func_id); | ||
2017 | + return -EINVAL; | ||
2018 | } | ||
2019 | |||
2020 | static int check_call(struct verifier_env *env, int func_id) | ||
2021 | @@ -1348,6 +1359,7 @@ static int check_ld_abs(struct verifier_env *env, struct bpf_insn *insn) | ||
2022 | } | ||
2023 | |||
2024 | if (insn->dst_reg != BPF_REG_0 || insn->off != 0 || | ||
2025 | + BPF_SIZE(insn->code) == BPF_DW || | ||
2026 | (mode == BPF_ABS && insn->src_reg != BPF_REG_0)) { | ||
2027 | verbose("BPF_LD_ABS uses reserved fields\n"); | ||
2028 | return -EINVAL; | ||
2029 | @@ -2003,7 +2015,6 @@ static int replace_map_fd_with_map_ptr(struct verifier_env *env) | ||
2030 | if (IS_ERR(map)) { | ||
2031 | verbose("fd %d is not pointing to valid bpf_map\n", | ||
2032 | insn->imm); | ||
2033 | - fdput(f); | ||
2034 | return PTR_ERR(map); | ||
2035 | } | ||
2036 | |||
2037 | @@ -2023,15 +2034,18 @@ static int replace_map_fd_with_map_ptr(struct verifier_env *env) | ||
2038 | return -E2BIG; | ||
2039 | } | ||
2040 | |||
2041 | - /* remember this map */ | ||
2042 | - env->used_maps[env->used_map_cnt++] = map; | ||
2043 | - | ||
2044 | /* hold the map. If the program is rejected by verifier, | ||
2045 | * the map will be released by release_maps() or it | ||
2046 | * will be used by the valid program until it's unloaded | ||
2047 | * and all maps are released in free_bpf_prog_info() | ||
2048 | */ | ||
2049 | - bpf_map_inc(map, false); | ||
2050 | + map = bpf_map_inc(map, false); | ||
2051 | + if (IS_ERR(map)) { | ||
2052 | + fdput(f); | ||
2053 | + return PTR_ERR(map); | ||
2054 | + } | ||
2055 | + env->used_maps[env->used_map_cnt++] = map; | ||
2056 | + | ||
2057 | fdput(f); | ||
2058 | next_insn: | ||
2059 | insn++; | ||
2060 | diff --git a/kernel/events/ring_buffer.c b/kernel/events/ring_buffer.c | ||
2061 | index adfdc0536117..014b69528194 100644 | ||
2062 | --- a/kernel/events/ring_buffer.c | ||
2063 | +++ b/kernel/events/ring_buffer.c | ||
2064 | @@ -347,6 +347,7 @@ void perf_aux_output_end(struct perf_output_handle *handle, unsigned long size, | ||
2065 | bool truncated) | ||
2066 | { | ||
2067 | struct ring_buffer *rb = handle->rb; | ||
2068 | + bool wakeup = truncated; | ||
2069 | unsigned long aux_head; | ||
2070 | u64 flags = 0; | ||
2071 | |||
2072 | @@ -375,9 +376,16 @@ void perf_aux_output_end(struct perf_output_handle *handle, unsigned long size, | ||
2073 | aux_head = rb->user_page->aux_head = local_read(&rb->aux_head); | ||
2074 | |||
2075 | if (aux_head - local_read(&rb->aux_wakeup) >= rb->aux_watermark) { | ||
2076 | - perf_output_wakeup(handle); | ||
2077 | + wakeup = true; | ||
2078 | local_add(rb->aux_watermark, &rb->aux_wakeup); | ||
2079 | } | ||
2080 | + | ||
2081 | + if (wakeup) { | ||
2082 | + if (truncated) | ||
2083 | + handle->event->pending_disable = 1; | ||
2084 | + perf_output_wakeup(handle); | ||
2085 | + } | ||
2086 | + | ||
2087 | handle->event = NULL; | ||
2088 | |||
2089 | local_set(&rb->aux_nest, 0); | ||
2090 | diff --git a/kernel/workqueue.c b/kernel/workqueue.c | ||
2091 | index 0ec05948a97b..2c2f971f3e75 100644 | ||
2092 | --- a/kernel/workqueue.c | ||
2093 | +++ b/kernel/workqueue.c | ||
2094 | @@ -4457,6 +4457,17 @@ static void rebind_workers(struct worker_pool *pool) | ||
2095 | pool->attrs->cpumask) < 0); | ||
2096 | |||
2097 | spin_lock_irq(&pool->lock); | ||
2098 | + | ||
2099 | + /* | ||
2100 | + * XXX: CPU hotplug notifiers are weird and can call DOWN_FAILED | ||
2101 | + * w/o preceding DOWN_PREPARE. Work around it. CPU hotplug is | ||
2102 | + * being reworked and this can go away in time. | ||
2103 | + */ | ||
2104 | + if (!(pool->flags & POOL_DISASSOCIATED)) { | ||
2105 | + spin_unlock_irq(&pool->lock); | ||
2106 | + return; | ||
2107 | + } | ||
2108 | + | ||
2109 | pool->flags &= ~POOL_DISASSOCIATED; | ||
2110 | |||
2111 | for_each_pool_worker(worker, pool) { | ||
2112 | diff --git a/mm/zsmalloc.c b/mm/zsmalloc.c | ||
2113 | index fc083996e40a..c1ea19478119 100644 | ||
2114 | --- a/mm/zsmalloc.c | ||
2115 | +++ b/mm/zsmalloc.c | ||
2116 | @@ -1732,10 +1732,13 @@ static struct page *isolate_source_page(struct size_class *class) | ||
2117 | static unsigned long zs_can_compact(struct size_class *class) | ||
2118 | { | ||
2119 | unsigned long obj_wasted; | ||
2120 | + unsigned long obj_allocated = zs_stat_get(class, OBJ_ALLOCATED); | ||
2121 | + unsigned long obj_used = zs_stat_get(class, OBJ_USED); | ||
2122 | |||
2123 | - obj_wasted = zs_stat_get(class, OBJ_ALLOCATED) - | ||
2124 | - zs_stat_get(class, OBJ_USED); | ||
2125 | + if (obj_allocated <= obj_used) | ||
2126 | + return 0; | ||
2127 | |||
2128 | + obj_wasted = obj_allocated - obj_used; | ||
2129 | obj_wasted /= get_maxobj_per_zspage(class->size, | ||
2130 | class->pages_per_zspage); | ||
2131 | |||
2132 | diff --git a/net/bridge/br_ioctl.c b/net/bridge/br_ioctl.c | ||
2133 | index 263b4de4de57..60a3dbfca8a1 100644 | ||
2134 | --- a/net/bridge/br_ioctl.c | ||
2135 | +++ b/net/bridge/br_ioctl.c | ||
2136 | @@ -21,18 +21,19 @@ | ||
2137 | #include <asm/uaccess.h> | ||
2138 | #include "br_private.h" | ||
2139 | |||
2140 | -/* called with RTNL */ | ||
2141 | static int get_bridge_ifindices(struct net *net, int *indices, int num) | ||
2142 | { | ||
2143 | struct net_device *dev; | ||
2144 | int i = 0; | ||
2145 | |||
2146 | - for_each_netdev(net, dev) { | ||
2147 | + rcu_read_lock(); | ||
2148 | + for_each_netdev_rcu(net, dev) { | ||
2149 | if (i >= num) | ||
2150 | break; | ||
2151 | if (dev->priv_flags & IFF_EBRIDGE) | ||
2152 | indices[i++] = dev->ifindex; | ||
2153 | } | ||
2154 | + rcu_read_unlock(); | ||
2155 | |||
2156 | return i; | ||
2157 | } | ||
2158 | diff --git a/net/bridge/br_multicast.c b/net/bridge/br_multicast.c | ||
2159 | index 03661d97463c..ea9893743a0f 100644 | ||
2160 | --- a/net/bridge/br_multicast.c | ||
2161 | +++ b/net/bridge/br_multicast.c | ||
2162 | @@ -1270,6 +1270,7 @@ static int br_ip4_multicast_query(struct net_bridge *br, | ||
2163 | struct br_ip saddr; | ||
2164 | unsigned long max_delay; | ||
2165 | unsigned long now = jiffies; | ||
2166 | + unsigned int offset = skb_transport_offset(skb); | ||
2167 | __be32 group; | ||
2168 | int err = 0; | ||
2169 | |||
2170 | @@ -1280,14 +1281,14 @@ static int br_ip4_multicast_query(struct net_bridge *br, | ||
2171 | |||
2172 | group = ih->group; | ||
2173 | |||
2174 | - if (skb->len == sizeof(*ih)) { | ||
2175 | + if (skb->len == offset + sizeof(*ih)) { | ||
2176 | max_delay = ih->code * (HZ / IGMP_TIMER_SCALE); | ||
2177 | |||
2178 | if (!max_delay) { | ||
2179 | max_delay = 10 * HZ; | ||
2180 | group = 0; | ||
2181 | } | ||
2182 | - } else if (skb->len >= sizeof(*ih3)) { | ||
2183 | + } else if (skb->len >= offset + sizeof(*ih3)) { | ||
2184 | ih3 = igmpv3_query_hdr(skb); | ||
2185 | if (ih3->nsrcs) | ||
2186 | goto out; | ||
2187 | @@ -1348,6 +1349,7 @@ static int br_ip6_multicast_query(struct net_bridge *br, | ||
2188 | struct br_ip saddr; | ||
2189 | unsigned long max_delay; | ||
2190 | unsigned long now = jiffies; | ||
2191 | + unsigned int offset = skb_transport_offset(skb); | ||
2192 | const struct in6_addr *group = NULL; | ||
2193 | bool is_general_query; | ||
2194 | int err = 0; | ||
2195 | @@ -1357,8 +1359,8 @@ static int br_ip6_multicast_query(struct net_bridge *br, | ||
2196 | (port && port->state == BR_STATE_DISABLED)) | ||
2197 | goto out; | ||
2198 | |||
2199 | - if (skb->len == sizeof(*mld)) { | ||
2200 | - if (!pskb_may_pull(skb, sizeof(*mld))) { | ||
2201 | + if (skb->len == offset + sizeof(*mld)) { | ||
2202 | + if (!pskb_may_pull(skb, offset + sizeof(*mld))) { | ||
2203 | err = -EINVAL; | ||
2204 | goto out; | ||
2205 | } | ||
2206 | @@ -1367,7 +1369,7 @@ static int br_ip6_multicast_query(struct net_bridge *br, | ||
2207 | if (max_delay) | ||
2208 | group = &mld->mld_mca; | ||
2209 | } else { | ||
2210 | - if (!pskb_may_pull(skb, sizeof(*mld2q))) { | ||
2211 | + if (!pskb_may_pull(skb, offset + sizeof(*mld2q))) { | ||
2212 | err = -EINVAL; | ||
2213 | goto out; | ||
2214 | } | ||
2215 | diff --git a/net/core/rtnetlink.c b/net/core/rtnetlink.c | ||
2216 | index ca966f7de351..87b91ffbdec3 100644 | ||
2217 | --- a/net/core/rtnetlink.c | ||
2218 | +++ b/net/core/rtnetlink.c | ||
2219 | @@ -1175,14 +1175,16 @@ static noinline_for_stack int rtnl_fill_vfinfo(struct sk_buff *skb, | ||
2220 | |||
2221 | static int rtnl_fill_link_ifmap(struct sk_buff *skb, struct net_device *dev) | ||
2222 | { | ||
2223 | - struct rtnl_link_ifmap map = { | ||
2224 | - .mem_start = dev->mem_start, | ||
2225 | - .mem_end = dev->mem_end, | ||
2226 | - .base_addr = dev->base_addr, | ||
2227 | - .irq = dev->irq, | ||
2228 | - .dma = dev->dma, | ||
2229 | - .port = dev->if_port, | ||
2230 | - }; | ||
2231 | + struct rtnl_link_ifmap map; | ||
2232 | + | ||
2233 | + memset(&map, 0, sizeof(map)); | ||
2234 | + map.mem_start = dev->mem_start; | ||
2235 | + map.mem_end = dev->mem_end; | ||
2236 | + map.base_addr = dev->base_addr; | ||
2237 | + map.irq = dev->irq; | ||
2238 | + map.dma = dev->dma; | ||
2239 | + map.port = dev->if_port; | ||
2240 | + | ||
2241 | if (nla_put(skb, IFLA_MAP, sizeof(map), &map)) | ||
2242 | return -EMSGSIZE; | ||
2243 | |||
2244 | diff --git a/net/core/skbuff.c b/net/core/skbuff.c | ||
2245 | index 8616d1147c93..9835d9a8a7a4 100644 | ||
2246 | --- a/net/core/skbuff.c | ||
2247 | +++ b/net/core/skbuff.c | ||
2248 | @@ -4427,15 +4427,16 @@ int skb_vlan_push(struct sk_buff *skb, __be16 vlan_proto, u16 vlan_tci) | ||
2249 | __skb_push(skb, offset); | ||
2250 | err = __vlan_insert_tag(skb, skb->vlan_proto, | ||
2251 | skb_vlan_tag_get(skb)); | ||
2252 | - if (err) | ||
2253 | + if (err) { | ||
2254 | + __skb_pull(skb, offset); | ||
2255 | return err; | ||
2256 | + } | ||
2257 | + | ||
2258 | skb->protocol = skb->vlan_proto; | ||
2259 | skb->mac_len += VLAN_HLEN; | ||
2260 | - __skb_pull(skb, offset); | ||
2261 | |||
2262 | - if (skb->ip_summed == CHECKSUM_COMPLETE) | ||
2263 | - skb->csum = csum_add(skb->csum, csum_partial(skb->data | ||
2264 | - + (2 * ETH_ALEN), VLAN_HLEN, 0)); | ||
2265 | + skb_postpush_rcsum(skb, skb->data + (2 * ETH_ALEN), VLAN_HLEN); | ||
2266 | + __skb_pull(skb, offset); | ||
2267 | } | ||
2268 | __vlan_hwaccel_put_tag(skb, vlan_proto, vlan_tci); | ||
2269 | return 0; | ||
2270 | diff --git a/net/decnet/dn_route.c b/net/decnet/dn_route.c | ||
2271 | index 607a14f20d88..b1dc096d22f8 100644 | ||
2272 | --- a/net/decnet/dn_route.c | ||
2273 | +++ b/net/decnet/dn_route.c | ||
2274 | @@ -1034,10 +1034,13 @@ source_ok: | ||
2275 | if (!fld.daddr) { | ||
2276 | fld.daddr = fld.saddr; | ||
2277 | |||
2278 | - err = -EADDRNOTAVAIL; | ||
2279 | if (dev_out) | ||
2280 | dev_put(dev_out); | ||
2281 | + err = -EINVAL; | ||
2282 | dev_out = init_net.loopback_dev; | ||
2283 | + if (!dev_out->dn_ptr) | ||
2284 | + goto out; | ||
2285 | + err = -EADDRNOTAVAIL; | ||
2286 | dev_hold(dev_out); | ||
2287 | if (!fld.daddr) { | ||
2288 | fld.daddr = | ||
2289 | @@ -1110,6 +1113,8 @@ source_ok: | ||
2290 | if (dev_out == NULL) | ||
2291 | goto out; | ||
2292 | dn_db = rcu_dereference_raw(dev_out->dn_ptr); | ||
2293 | + if (!dn_db) | ||
2294 | + goto e_inval; | ||
2295 | /* Possible improvement - check all devices for local addr */ | ||
2296 | if (dn_dev_islocal(dev_out, fld.daddr)) { | ||
2297 | dev_put(dev_out); | ||
2298 | @@ -1151,6 +1156,8 @@ select_source: | ||
2299 | dev_put(dev_out); | ||
2300 | dev_out = init_net.loopback_dev; | ||
2301 | dev_hold(dev_out); | ||
2302 | + if (!dev_out->dn_ptr) | ||
2303 | + goto e_inval; | ||
2304 | fld.flowidn_oif = dev_out->ifindex; | ||
2305 | if (res.fi) | ||
2306 | dn_fib_info_put(res.fi); | ||
2307 | diff --git a/net/ipv4/fib_frontend.c b/net/ipv4/fib_frontend.c | ||
2308 | index 8a9246deccfe..63566ec54794 100644 | ||
2309 | --- a/net/ipv4/fib_frontend.c | ||
2310 | +++ b/net/ipv4/fib_frontend.c | ||
2311 | @@ -904,7 +904,11 @@ void fib_del_ifaddr(struct in_ifaddr *ifa, struct in_ifaddr *iprim) | ||
2312 | if (ifa->ifa_flags & IFA_F_SECONDARY) { | ||
2313 | prim = inet_ifa_byprefix(in_dev, any, ifa->ifa_mask); | ||
2314 | if (!prim) { | ||
2315 | - pr_warn("%s: bug: prim == NULL\n", __func__); | ||
2316 | + /* if the device has been deleted, we don't perform | ||
2317 | + * address promotion | ||
2318 | + */ | ||
2319 | + if (!in_dev->dead) | ||
2320 | + pr_warn("%s: bug: prim == NULL\n", __func__); | ||
2321 | return; | ||
2322 | } | ||
2323 | if (iprim && iprim != prim) { | ||
2324 | diff --git a/net/ipv4/fib_semantics.c b/net/ipv4/fib_semantics.c | ||
2325 | index d97268e8ff10..2b68418c7198 100644 | ||
2326 | --- a/net/ipv4/fib_semantics.c | ||
2327 | +++ b/net/ipv4/fib_semantics.c | ||
2328 | @@ -975,6 +975,8 @@ fib_convert_metrics(struct fib_info *fi, const struct fib_config *cfg) | ||
2329 | val = 65535 - 40; | ||
2330 | if (type == RTAX_MTU && val > 65535 - 15) | ||
2331 | val = 65535 - 15; | ||
2332 | + if (type == RTAX_HOPLIMIT && val > 255) | ||
2333 | + val = 255; | ||
2334 | if (type == RTAX_FEATURES && (val & ~RTAX_FEATURE_MASK)) | ||
2335 | return -EINVAL; | ||
2336 | fi->fib_metrics[type - 1] = val; | ||
2337 | diff --git a/net/ipv4/ip_gre.c b/net/ipv4/ip_gre.c | ||
2338 | index 614521437e30..7dc962b89fa1 100644 | ||
2339 | --- a/net/ipv4/ip_gre.c | ||
2340 | +++ b/net/ipv4/ip_gre.c | ||
2341 | @@ -180,6 +180,7 @@ static __be16 tnl_flags_to_gre_flags(__be16 tflags) | ||
2342 | return flags; | ||
2343 | } | ||
2344 | |||
2345 | +/* Fills in tpi and returns header length to be pulled. */ | ||
2346 | static int parse_gre_header(struct sk_buff *skb, struct tnl_ptk_info *tpi, | ||
2347 | bool *csum_err) | ||
2348 | { | ||
2349 | @@ -239,7 +240,7 @@ static int parse_gre_header(struct sk_buff *skb, struct tnl_ptk_info *tpi, | ||
2350 | return -EINVAL; | ||
2351 | } | ||
2352 | } | ||
2353 | - return iptunnel_pull_header(skb, hdr_len, tpi->proto); | ||
2354 | + return hdr_len; | ||
2355 | } | ||
2356 | |||
2357 | static void ipgre_err(struct sk_buff *skb, u32 info, | ||
2358 | @@ -342,7 +343,7 @@ static void gre_err(struct sk_buff *skb, u32 info) | ||
2359 | struct tnl_ptk_info tpi; | ||
2360 | bool csum_err = false; | ||
2361 | |||
2362 | - if (parse_gre_header(skb, &tpi, &csum_err)) { | ||
2363 | + if (parse_gre_header(skb, &tpi, &csum_err) < 0) { | ||
2364 | if (!csum_err) /* ignore csum errors. */ | ||
2365 | return; | ||
2366 | } | ||
2367 | @@ -420,6 +421,7 @@ static int gre_rcv(struct sk_buff *skb) | ||
2368 | { | ||
2369 | struct tnl_ptk_info tpi; | ||
2370 | bool csum_err = false; | ||
2371 | + int hdr_len; | ||
2372 | |||
2373 | #ifdef CONFIG_NET_IPGRE_BROADCAST | ||
2374 | if (ipv4_is_multicast(ip_hdr(skb)->daddr)) { | ||
2375 | @@ -429,7 +431,10 @@ static int gre_rcv(struct sk_buff *skb) | ||
2376 | } | ||
2377 | #endif | ||
2378 | |||
2379 | - if (parse_gre_header(skb, &tpi, &csum_err) < 0) | ||
2380 | + hdr_len = parse_gre_header(skb, &tpi, &csum_err); | ||
2381 | + if (hdr_len < 0) | ||
2382 | + goto drop; | ||
2383 | + if (iptunnel_pull_header(skb, hdr_len, tpi.proto) < 0) | ||
2384 | goto drop; | ||
2385 | |||
2386 | if (ipgre_rcv(skb, &tpi) == PACKET_RCVD) | ||
2387 | diff --git a/net/ipv4/route.c b/net/ipv4/route.c | ||
2388 | index 02c62299d717..b050cf980a57 100644 | ||
2389 | --- a/net/ipv4/route.c | ||
2390 | +++ b/net/ipv4/route.c | ||
2391 | @@ -2045,6 +2045,18 @@ static struct rtable *__mkroute_output(const struct fib_result *res, | ||
2392 | */ | ||
2393 | if (fi && res->prefixlen < 4) | ||
2394 | fi = NULL; | ||
2395 | + } else if ((type == RTN_LOCAL) && (orig_oif != 0) && | ||
2396 | + (orig_oif != dev_out->ifindex)) { | ||
2397 | + /* For local routes that require a particular output interface | ||
2398 | + * we do not want to cache the result. Caching the result | ||
2399 | + * causes incorrect behaviour when there are multiple source | ||
2400 | + * addresses on the interface, the end result being that if the | ||
2401 | + * intended recipient is waiting on that interface for the | ||
2402 | + * packet he won't receive it because it will be delivered on | ||
2403 | + * the loopback interface and the IP_PKTINFO ipi_ifindex will | ||
2404 | + * be set to the loopback interface as well. | ||
2405 | + */ | ||
2406 | + fi = NULL; | ||
2407 | } | ||
2408 | |||
2409 | fnhe = NULL; | ||
2410 | diff --git a/net/ipv4/tcp_output.c b/net/ipv4/tcp_output.c | ||
2411 | index 9bfc39ff2285..7c9883ab56e5 100644 | ||
2412 | --- a/net/ipv4/tcp_output.c | ||
2413 | +++ b/net/ipv4/tcp_output.c | ||
2414 | @@ -2625,8 +2625,10 @@ int __tcp_retransmit_skb(struct sock *sk, struct sk_buff *skb) | ||
2415 | */ | ||
2416 | if (unlikely((NET_IP_ALIGN && ((unsigned long)skb->data & 3)) || | ||
2417 | skb_headroom(skb) >= 0xFFFF)) { | ||
2418 | - struct sk_buff *nskb = __pskb_copy(skb, MAX_TCP_HEADER, | ||
2419 | - GFP_ATOMIC); | ||
2420 | + struct sk_buff *nskb; | ||
2421 | + | ||
2422 | + skb_mstamp_get(&skb->skb_mstamp); | ||
2423 | + nskb = __pskb_copy(skb, MAX_TCP_HEADER, GFP_ATOMIC); | ||
2424 | err = nskb ? tcp_transmit_skb(sk, nskb, 0, GFP_ATOMIC) : | ||
2425 | -ENOBUFS; | ||
2426 | } else { | ||
2427 | diff --git a/net/ipv6/reassembly.c b/net/ipv6/reassembly.c | ||
2428 | index 45f5ae51de65..a234552a7e3d 100644 | ||
2429 | --- a/net/ipv6/reassembly.c | ||
2430 | +++ b/net/ipv6/reassembly.c | ||
2431 | @@ -496,10 +496,8 @@ static int ip6_frag_reasm(struct frag_queue *fq, struct sk_buff *prev, | ||
2432 | IP6CB(head)->flags |= IP6SKB_FRAGMENTED; | ||
2433 | |||
2434 | /* Yes, and fold redundant checksum back. 8) */ | ||
2435 | - if (head->ip_summed == CHECKSUM_COMPLETE) | ||
2436 | - head->csum = csum_partial(skb_network_header(head), | ||
2437 | - skb_network_header_len(head), | ||
2438 | - head->csum); | ||
2439 | + skb_postpush_rcsum(head, skb_network_header(head), | ||
2440 | + skb_network_header_len(head)); | ||
2441 | |||
2442 | rcu_read_lock(); | ||
2443 | IP6_INC_STATS_BH(net, __in6_dev_get(dev), IPSTATS_MIB_REASMOKS); | ||
2444 | diff --git a/net/ipv6/route.c b/net/ipv6/route.c | ||
2445 | index 3f164d3aaee2..5af2cca0a46d 100644 | ||
2446 | --- a/net/ipv6/route.c | ||
2447 | +++ b/net/ipv6/route.c | ||
2448 | @@ -1727,6 +1727,8 @@ static int ip6_convert_metrics(struct mx6_config *mxc, | ||
2449 | } else { | ||
2450 | val = nla_get_u32(nla); | ||
2451 | } | ||
2452 | + if (type == RTAX_HOPLIMIT && val > 255) | ||
2453 | + val = 255; | ||
2454 | if (type == RTAX_FEATURES && (val & ~RTAX_FEATURE_MASK)) | ||
2455 | goto err; | ||
2456 | |||
2457 | diff --git a/net/llc/af_llc.c b/net/llc/af_llc.c | ||
2458 | index 8dab4e569571..bb8edb9ef506 100644 | ||
2459 | --- a/net/llc/af_llc.c | ||
2460 | +++ b/net/llc/af_llc.c | ||
2461 | @@ -626,6 +626,7 @@ static void llc_cmsg_rcv(struct msghdr *msg, struct sk_buff *skb) | ||
2462 | if (llc->cmsg_flags & LLC_CMSG_PKTINFO) { | ||
2463 | struct llc_pktinfo info; | ||
2464 | |||
2465 | + memset(&info, 0, sizeof(info)); | ||
2466 | info.lpi_ifindex = llc_sk(skb->sk)->dev->ifindex; | ||
2467 | llc_pdu_decode_dsap(skb, &info.lpi_sap); | ||
2468 | llc_pdu_decode_da(skb, info.lpi_mac); | ||
2469 | diff --git a/net/netfilter/nf_conntrack_core.c b/net/netfilter/nf_conntrack_core.c | ||
2470 | index 3cb3cb831591..86a3c6f0c871 100644 | ||
2471 | --- a/net/netfilter/nf_conntrack_core.c | ||
2472 | +++ b/net/netfilter/nf_conntrack_core.c | ||
2473 | @@ -1757,6 +1757,7 @@ void nf_conntrack_init_end(void) | ||
2474 | |||
2475 | int nf_conntrack_init_net(struct net *net) | ||
2476 | { | ||
2477 | + static atomic64_t unique_id; | ||
2478 | int ret = -ENOMEM; | ||
2479 | int cpu; | ||
2480 | |||
2481 | @@ -1779,7 +1780,8 @@ int nf_conntrack_init_net(struct net *net) | ||
2482 | if (!net->ct.stat) | ||
2483 | goto err_pcpu_lists; | ||
2484 | |||
2485 | - net->ct.slabname = kasprintf(GFP_KERNEL, "nf_conntrack_%p", net); | ||
2486 | + net->ct.slabname = kasprintf(GFP_KERNEL, "nf_conntrack_%llu", | ||
2487 | + (u64)atomic64_inc_return(&unique_id)); | ||
2488 | if (!net->ct.slabname) | ||
2489 | goto err_slabname; | ||
2490 | |||
2491 | diff --git a/net/openvswitch/actions.c b/net/openvswitch/actions.c | ||
2492 | index c88d0f2d3e01..7cb8184ac165 100644 | ||
2493 | --- a/net/openvswitch/actions.c | ||
2494 | +++ b/net/openvswitch/actions.c | ||
2495 | @@ -158,9 +158,7 @@ static int push_mpls(struct sk_buff *skb, struct sw_flow_key *key, | ||
2496 | new_mpls_lse = (__be32 *)skb_mpls_header(skb); | ||
2497 | *new_mpls_lse = mpls->mpls_lse; | ||
2498 | |||
2499 | - if (skb->ip_summed == CHECKSUM_COMPLETE) | ||
2500 | - skb->csum = csum_add(skb->csum, csum_partial(new_mpls_lse, | ||
2501 | - MPLS_HLEN, 0)); | ||
2502 | + skb_postpush_rcsum(skb, new_mpls_lse, MPLS_HLEN); | ||
2503 | |||
2504 | hdr = eth_hdr(skb); | ||
2505 | hdr->h_proto = mpls->mpls_ethertype; | ||
2506 | @@ -280,7 +278,7 @@ static int set_eth_addr(struct sk_buff *skb, struct sw_flow_key *flow_key, | ||
2507 | ether_addr_copy_masked(eth_hdr(skb)->h_dest, key->eth_dst, | ||
2508 | mask->eth_dst); | ||
2509 | |||
2510 | - ovs_skb_postpush_rcsum(skb, eth_hdr(skb), ETH_ALEN * 2); | ||
2511 | + skb_postpush_rcsum(skb, eth_hdr(skb), ETH_ALEN * 2); | ||
2512 | |||
2513 | ether_addr_copy(flow_key->eth.src, eth_hdr(skb)->h_source); | ||
2514 | ether_addr_copy(flow_key->eth.dst, eth_hdr(skb)->h_dest); | ||
2515 | @@ -463,7 +461,7 @@ static int set_ipv6(struct sk_buff *skb, struct sw_flow_key *flow_key, | ||
2516 | mask_ipv6_addr(saddr, key->ipv6_src, mask->ipv6_src, masked); | ||
2517 | |||
2518 | if (unlikely(memcmp(saddr, masked, sizeof(masked)))) { | ||
2519 | - set_ipv6_addr(skb, key->ipv6_proto, saddr, masked, | ||
2520 | + set_ipv6_addr(skb, flow_key->ip.proto, saddr, masked, | ||
2521 | true); | ||
2522 | memcpy(&flow_key->ipv6.addr.src, masked, | ||
2523 | sizeof(flow_key->ipv6.addr.src)); | ||
2524 | @@ -485,7 +483,7 @@ static int set_ipv6(struct sk_buff *skb, struct sw_flow_key *flow_key, | ||
2525 | NULL, &flags) | ||
2526 | != NEXTHDR_ROUTING); | ||
2527 | |||
2528 | - set_ipv6_addr(skb, key->ipv6_proto, daddr, masked, | ||
2529 | + set_ipv6_addr(skb, flow_key->ip.proto, daddr, masked, | ||
2530 | recalc_csum); | ||
2531 | memcpy(&flow_key->ipv6.addr.dst, masked, | ||
2532 | sizeof(flow_key->ipv6.addr.dst)); | ||
2533 | @@ -639,7 +637,7 @@ static int ovs_vport_output(struct net *net, struct sock *sk, struct sk_buff *sk | ||
2534 | /* Reconstruct the MAC header. */ | ||
2535 | skb_push(skb, data->l2_len); | ||
2536 | memcpy(skb->data, &data->l2_data, data->l2_len); | ||
2537 | - ovs_skb_postpush_rcsum(skb, skb->data, data->l2_len); | ||
2538 | + skb_postpush_rcsum(skb, skb->data, data->l2_len); | ||
2539 | skb_reset_mac_header(skb); | ||
2540 | |||
2541 | ovs_vport_send(vport, skb); | ||
2542 | diff --git a/net/openvswitch/vport-netdev.c b/net/openvswitch/vport-netdev.c | ||
2543 | index 6b0190b987ec..76fcaf1fd2a9 100644 | ||
2544 | --- a/net/openvswitch/vport-netdev.c | ||
2545 | +++ b/net/openvswitch/vport-netdev.c | ||
2546 | @@ -58,7 +58,7 @@ static void netdev_port_receive(struct sk_buff *skb) | ||
2547 | return; | ||
2548 | |||
2549 | skb_push(skb, ETH_HLEN); | ||
2550 | - ovs_skb_postpush_rcsum(skb, skb->data, ETH_HLEN); | ||
2551 | + skb_postpush_rcsum(skb, skb->data, ETH_HLEN); | ||
2552 | ovs_vport_receive(vport, skb, skb_tunnel_info(skb)); | ||
2553 | return; | ||
2554 | error: | ||
2555 | diff --git a/net/openvswitch/vport.h b/net/openvswitch/vport.h | ||
2556 | index 8ea3a96980ac..6e2b62f9d595 100644 | ||
2557 | --- a/net/openvswitch/vport.h | ||
2558 | +++ b/net/openvswitch/vport.h | ||
2559 | @@ -184,13 +184,6 @@ static inline struct vport *vport_from_priv(void *priv) | ||
2560 | int ovs_vport_receive(struct vport *, struct sk_buff *, | ||
2561 | const struct ip_tunnel_info *); | ||
2562 | |||
2563 | -static inline void ovs_skb_postpush_rcsum(struct sk_buff *skb, | ||
2564 | - const void *start, unsigned int len) | ||
2565 | -{ | ||
2566 | - if (skb->ip_summed == CHECKSUM_COMPLETE) | ||
2567 | - skb->csum = csum_add(skb->csum, csum_partial(start, len, 0)); | ||
2568 | -} | ||
2569 | - | ||
2570 | static inline const char *ovs_vport_name(struct vport *vport) | ||
2571 | { | ||
2572 | return vport->dev->name; | ||
2573 | diff --git a/net/packet/af_packet.c b/net/packet/af_packet.c | ||
2574 | index da1ae0e13cb5..9cc7b512b472 100644 | ||
2575 | --- a/net/packet/af_packet.c | ||
2576 | +++ b/net/packet/af_packet.c | ||
2577 | @@ -3436,6 +3436,7 @@ static int packet_mc_add(struct sock *sk, struct packet_mreq_max *mreq) | ||
2578 | i->ifindex = mreq->mr_ifindex; | ||
2579 | i->alen = mreq->mr_alen; | ||
2580 | memcpy(i->addr, mreq->mr_address, i->alen); | ||
2581 | + memset(i->addr + i->alen, 0, sizeof(i->addr) - i->alen); | ||
2582 | i->count = 1; | ||
2583 | i->next = po->mclist; | ||
2584 | po->mclist = i; | ||
2585 | diff --git a/net/sched/sch_api.c b/net/sched/sch_api.c | ||
2586 | index af1acf009866..95b560f0b253 100644 | ||
2587 | --- a/net/sched/sch_api.c | ||
2588 | +++ b/net/sched/sch_api.c | ||
2589 | @@ -744,14 +744,15 @@ static u32 qdisc_alloc_handle(struct net_device *dev) | ||
2590 | return 0; | ||
2591 | } | ||
2592 | |||
2593 | -void qdisc_tree_decrease_qlen(struct Qdisc *sch, unsigned int n) | ||
2594 | +void qdisc_tree_reduce_backlog(struct Qdisc *sch, unsigned int n, | ||
2595 | + unsigned int len) | ||
2596 | { | ||
2597 | const struct Qdisc_class_ops *cops; | ||
2598 | unsigned long cl; | ||
2599 | u32 parentid; | ||
2600 | int drops; | ||
2601 | |||
2602 | - if (n == 0) | ||
2603 | + if (n == 0 && len == 0) | ||
2604 | return; | ||
2605 | drops = max_t(int, n, 0); | ||
2606 | rcu_read_lock(); | ||
2607 | @@ -774,11 +775,12 @@ void qdisc_tree_decrease_qlen(struct Qdisc *sch, unsigned int n) | ||
2608 | cops->put(sch, cl); | ||
2609 | } | ||
2610 | sch->q.qlen -= n; | ||
2611 | + sch->qstats.backlog -= len; | ||
2612 | __qdisc_qstats_drop(sch, drops); | ||
2613 | } | ||
2614 | rcu_read_unlock(); | ||
2615 | } | ||
2616 | -EXPORT_SYMBOL(qdisc_tree_decrease_qlen); | ||
2617 | +EXPORT_SYMBOL(qdisc_tree_reduce_backlog); | ||
2618 | |||
2619 | static void notify_and_destroy(struct net *net, struct sk_buff *skb, | ||
2620 | struct nlmsghdr *n, u32 clid, | ||
2621 | diff --git a/net/sched/sch_cbq.c b/net/sched/sch_cbq.c | ||
2622 | index c538d9e4a8f6..baafddf229ce 100644 | ||
2623 | --- a/net/sched/sch_cbq.c | ||
2624 | +++ b/net/sched/sch_cbq.c | ||
2625 | @@ -1624,13 +1624,8 @@ static int cbq_graft(struct Qdisc *sch, unsigned long arg, struct Qdisc *new, | ||
2626 | new->reshape_fail = cbq_reshape_fail; | ||
2627 | #endif | ||
2628 | } | ||
2629 | - sch_tree_lock(sch); | ||
2630 | - *old = cl->q; | ||
2631 | - cl->q = new; | ||
2632 | - qdisc_tree_decrease_qlen(*old, (*old)->q.qlen); | ||
2633 | - qdisc_reset(*old); | ||
2634 | - sch_tree_unlock(sch); | ||
2635 | |||
2636 | + *old = qdisc_replace(sch, new, &cl->q); | ||
2637 | return 0; | ||
2638 | } | ||
2639 | |||
2640 | @@ -1914,7 +1909,7 @@ static int cbq_delete(struct Qdisc *sch, unsigned long arg) | ||
2641 | { | ||
2642 | struct cbq_sched_data *q = qdisc_priv(sch); | ||
2643 | struct cbq_class *cl = (struct cbq_class *)arg; | ||
2644 | - unsigned int qlen; | ||
2645 | + unsigned int qlen, backlog; | ||
2646 | |||
2647 | if (cl->filters || cl->children || cl == &q->link) | ||
2648 | return -EBUSY; | ||
2649 | @@ -1922,8 +1917,9 @@ static int cbq_delete(struct Qdisc *sch, unsigned long arg) | ||
2650 | sch_tree_lock(sch); | ||
2651 | |||
2652 | qlen = cl->q->q.qlen; | ||
2653 | + backlog = cl->q->qstats.backlog; | ||
2654 | qdisc_reset(cl->q); | ||
2655 | - qdisc_tree_decrease_qlen(cl->q, qlen); | ||
2656 | + qdisc_tree_reduce_backlog(cl->q, qlen, backlog); | ||
2657 | |||
2658 | if (cl->next_alive) | ||
2659 | cbq_deactivate_class(cl); | ||
2660 | diff --git a/net/sched/sch_choke.c b/net/sched/sch_choke.c | ||
2661 | index 5ffb8b8337c7..0a08c860eee4 100644 | ||
2662 | --- a/net/sched/sch_choke.c | ||
2663 | +++ b/net/sched/sch_choke.c | ||
2664 | @@ -128,8 +128,8 @@ static void choke_drop_by_idx(struct Qdisc *sch, unsigned int idx) | ||
2665 | choke_zap_tail_holes(q); | ||
2666 | |||
2667 | qdisc_qstats_backlog_dec(sch, skb); | ||
2668 | + qdisc_tree_reduce_backlog(sch, 1, qdisc_pkt_len(skb)); | ||
2669 | qdisc_drop(skb, sch); | ||
2670 | - qdisc_tree_decrease_qlen(sch, 1); | ||
2671 | --sch->q.qlen; | ||
2672 | } | ||
2673 | |||
2674 | @@ -456,6 +456,7 @@ static int choke_change(struct Qdisc *sch, struct nlattr *opt) | ||
2675 | old = q->tab; | ||
2676 | if (old) { | ||
2677 | unsigned int oqlen = sch->q.qlen, tail = 0; | ||
2678 | + unsigned dropped = 0; | ||
2679 | |||
2680 | while (q->head != q->tail) { | ||
2681 | struct sk_buff *skb = q->tab[q->head]; | ||
2682 | @@ -467,11 +468,12 @@ static int choke_change(struct Qdisc *sch, struct nlattr *opt) | ||
2683 | ntab[tail++] = skb; | ||
2684 | continue; | ||
2685 | } | ||
2686 | + dropped += qdisc_pkt_len(skb); | ||
2687 | qdisc_qstats_backlog_dec(sch, skb); | ||
2688 | --sch->q.qlen; | ||
2689 | qdisc_drop(skb, sch); | ||
2690 | } | ||
2691 | - qdisc_tree_decrease_qlen(sch, oqlen - sch->q.qlen); | ||
2692 | + qdisc_tree_reduce_backlog(sch, oqlen - sch->q.qlen, dropped); | ||
2693 | q->head = 0; | ||
2694 | q->tail = tail; | ||
2695 | } | ||
2696 | diff --git a/net/sched/sch_codel.c b/net/sched/sch_codel.c | ||
2697 | index 535007d5f0b5..9b7e2980ee5c 100644 | ||
2698 | --- a/net/sched/sch_codel.c | ||
2699 | +++ b/net/sched/sch_codel.c | ||
2700 | @@ -79,12 +79,13 @@ static struct sk_buff *codel_qdisc_dequeue(struct Qdisc *sch) | ||
2701 | |||
2702 | skb = codel_dequeue(sch, &q->params, &q->vars, &q->stats, dequeue); | ||
2703 | |||
2704 | - /* We cant call qdisc_tree_decrease_qlen() if our qlen is 0, | ||
2705 | + /* We cant call qdisc_tree_reduce_backlog() if our qlen is 0, | ||
2706 | * or HTB crashes. Defer it for next round. | ||
2707 | */ | ||
2708 | if (q->stats.drop_count && sch->q.qlen) { | ||
2709 | - qdisc_tree_decrease_qlen(sch, q->stats.drop_count); | ||
2710 | + qdisc_tree_reduce_backlog(sch, q->stats.drop_count, q->stats.drop_len); | ||
2711 | q->stats.drop_count = 0; | ||
2712 | + q->stats.drop_len = 0; | ||
2713 | } | ||
2714 | if (skb) | ||
2715 | qdisc_bstats_update(sch, skb); | ||
2716 | @@ -116,7 +117,7 @@ static int codel_change(struct Qdisc *sch, struct nlattr *opt) | ||
2717 | { | ||
2718 | struct codel_sched_data *q = qdisc_priv(sch); | ||
2719 | struct nlattr *tb[TCA_CODEL_MAX + 1]; | ||
2720 | - unsigned int qlen; | ||
2721 | + unsigned int qlen, dropped = 0; | ||
2722 | int err; | ||
2723 | |||
2724 | if (!opt) | ||
2725 | @@ -156,10 +157,11 @@ static int codel_change(struct Qdisc *sch, struct nlattr *opt) | ||
2726 | while (sch->q.qlen > sch->limit) { | ||
2727 | struct sk_buff *skb = __skb_dequeue(&sch->q); | ||
2728 | |||
2729 | + dropped += qdisc_pkt_len(skb); | ||
2730 | qdisc_qstats_backlog_dec(sch, skb); | ||
2731 | qdisc_drop(skb, sch); | ||
2732 | } | ||
2733 | - qdisc_tree_decrease_qlen(sch, qlen - sch->q.qlen); | ||
2734 | + qdisc_tree_reduce_backlog(sch, qlen - sch->q.qlen, dropped); | ||
2735 | |||
2736 | sch_tree_unlock(sch); | ||
2737 | return 0; | ||
2738 | diff --git a/net/sched/sch_drr.c b/net/sched/sch_drr.c | ||
2739 | index f26bdea875c1..d6e3ad43cecb 100644 | ||
2740 | --- a/net/sched/sch_drr.c | ||
2741 | +++ b/net/sched/sch_drr.c | ||
2742 | @@ -53,9 +53,10 @@ static struct drr_class *drr_find_class(struct Qdisc *sch, u32 classid) | ||
2743 | static void drr_purge_queue(struct drr_class *cl) | ||
2744 | { | ||
2745 | unsigned int len = cl->qdisc->q.qlen; | ||
2746 | + unsigned int backlog = cl->qdisc->qstats.backlog; | ||
2747 | |||
2748 | qdisc_reset(cl->qdisc); | ||
2749 | - qdisc_tree_decrease_qlen(cl->qdisc, len); | ||
2750 | + qdisc_tree_reduce_backlog(cl->qdisc, len, backlog); | ||
2751 | } | ||
2752 | |||
2753 | static const struct nla_policy drr_policy[TCA_DRR_MAX + 1] = { | ||
2754 | @@ -226,11 +227,7 @@ static int drr_graft_class(struct Qdisc *sch, unsigned long arg, | ||
2755 | new = &noop_qdisc; | ||
2756 | } | ||
2757 | |||
2758 | - sch_tree_lock(sch); | ||
2759 | - drr_purge_queue(cl); | ||
2760 | - *old = cl->qdisc; | ||
2761 | - cl->qdisc = new; | ||
2762 | - sch_tree_unlock(sch); | ||
2763 | + *old = qdisc_replace(sch, new, &cl->qdisc); | ||
2764 | return 0; | ||
2765 | } | ||
2766 | |||
2767 | diff --git a/net/sched/sch_dsmark.c b/net/sched/sch_dsmark.c | ||
2768 | index f357f34d02d2..d0dff0cd8186 100644 | ||
2769 | --- a/net/sched/sch_dsmark.c | ||
2770 | +++ b/net/sched/sch_dsmark.c | ||
2771 | @@ -73,13 +73,7 @@ static int dsmark_graft(struct Qdisc *sch, unsigned long arg, | ||
2772 | new = &noop_qdisc; | ||
2773 | } | ||
2774 | |||
2775 | - sch_tree_lock(sch); | ||
2776 | - *old = p->q; | ||
2777 | - p->q = new; | ||
2778 | - qdisc_tree_decrease_qlen(*old, (*old)->q.qlen); | ||
2779 | - qdisc_reset(*old); | ||
2780 | - sch_tree_unlock(sch); | ||
2781 | - | ||
2782 | + *old = qdisc_replace(sch, new, &p->q); | ||
2783 | return 0; | ||
2784 | } | ||
2785 | |||
2786 | @@ -264,6 +258,7 @@ static int dsmark_enqueue(struct sk_buff *skb, struct Qdisc *sch) | ||
2787 | return err; | ||
2788 | } | ||
2789 | |||
2790 | + qdisc_qstats_backlog_inc(sch, skb); | ||
2791 | sch->q.qlen++; | ||
2792 | |||
2793 | return NET_XMIT_SUCCESS; | ||
2794 | @@ -286,6 +281,7 @@ static struct sk_buff *dsmark_dequeue(struct Qdisc *sch) | ||
2795 | return NULL; | ||
2796 | |||
2797 | qdisc_bstats_update(sch, skb); | ||
2798 | + qdisc_qstats_backlog_dec(sch, skb); | ||
2799 | sch->q.qlen--; | ||
2800 | |||
2801 | index = skb->tc_index & (p->indices - 1); | ||
2802 | @@ -401,6 +397,7 @@ static void dsmark_reset(struct Qdisc *sch) | ||
2803 | |||
2804 | pr_debug("%s(sch %p,[qdisc %p])\n", __func__, sch, p); | ||
2805 | qdisc_reset(p->q); | ||
2806 | + sch->qstats.backlog = 0; | ||
2807 | sch->q.qlen = 0; | ||
2808 | } | ||
2809 | |||
2810 | diff --git a/net/sched/sch_fq.c b/net/sched/sch_fq.c | ||
2811 | index 109b2322778f..3c6a47d66a04 100644 | ||
2812 | --- a/net/sched/sch_fq.c | ||
2813 | +++ b/net/sched/sch_fq.c | ||
2814 | @@ -662,6 +662,7 @@ static int fq_change(struct Qdisc *sch, struct nlattr *opt) | ||
2815 | struct fq_sched_data *q = qdisc_priv(sch); | ||
2816 | struct nlattr *tb[TCA_FQ_MAX + 1]; | ||
2817 | int err, drop_count = 0; | ||
2818 | + unsigned drop_len = 0; | ||
2819 | u32 fq_log; | ||
2820 | |||
2821 | if (!opt) | ||
2822 | @@ -736,10 +737,11 @@ static int fq_change(struct Qdisc *sch, struct nlattr *opt) | ||
2823 | |||
2824 | if (!skb) | ||
2825 | break; | ||
2826 | + drop_len += qdisc_pkt_len(skb); | ||
2827 | kfree_skb(skb); | ||
2828 | drop_count++; | ||
2829 | } | ||
2830 | - qdisc_tree_decrease_qlen(sch, drop_count); | ||
2831 | + qdisc_tree_reduce_backlog(sch, drop_count, drop_len); | ||
2832 | |||
2833 | sch_tree_unlock(sch); | ||
2834 | return err; | ||
2835 | diff --git a/net/sched/sch_fq_codel.c b/net/sched/sch_fq_codel.c | ||
2836 | index 4c834e93dafb..d3fc8f9dd3d4 100644 | ||
2837 | --- a/net/sched/sch_fq_codel.c | ||
2838 | +++ b/net/sched/sch_fq_codel.c | ||
2839 | @@ -175,7 +175,7 @@ static unsigned int fq_codel_qdisc_drop(struct Qdisc *sch) | ||
2840 | static int fq_codel_enqueue(struct sk_buff *skb, struct Qdisc *sch) | ||
2841 | { | ||
2842 | struct fq_codel_sched_data *q = qdisc_priv(sch); | ||
2843 | - unsigned int idx; | ||
2844 | + unsigned int idx, prev_backlog; | ||
2845 | struct fq_codel_flow *flow; | ||
2846 | int uninitialized_var(ret); | ||
2847 | |||
2848 | @@ -203,6 +203,7 @@ static int fq_codel_enqueue(struct sk_buff *skb, struct Qdisc *sch) | ||
2849 | if (++sch->q.qlen <= sch->limit) | ||
2850 | return NET_XMIT_SUCCESS; | ||
2851 | |||
2852 | + prev_backlog = sch->qstats.backlog; | ||
2853 | q->drop_overlimit++; | ||
2854 | /* Return Congestion Notification only if we dropped a packet | ||
2855 | * from this flow. | ||
2856 | @@ -211,7 +212,7 @@ static int fq_codel_enqueue(struct sk_buff *skb, struct Qdisc *sch) | ||
2857 | return NET_XMIT_CN; | ||
2858 | |||
2859 | /* As we dropped a packet, better let upper stack know this */ | ||
2860 | - qdisc_tree_decrease_qlen(sch, 1); | ||
2861 | + qdisc_tree_reduce_backlog(sch, 1, prev_backlog - sch->qstats.backlog); | ||
2862 | return NET_XMIT_SUCCESS; | ||
2863 | } | ||
2864 | |||
2865 | @@ -241,6 +242,7 @@ static struct sk_buff *fq_codel_dequeue(struct Qdisc *sch) | ||
2866 | struct fq_codel_flow *flow; | ||
2867 | struct list_head *head; | ||
2868 | u32 prev_drop_count, prev_ecn_mark; | ||
2869 | + unsigned int prev_backlog; | ||
2870 | |||
2871 | begin: | ||
2872 | head = &q->new_flows; | ||
2873 | @@ -259,6 +261,7 @@ begin: | ||
2874 | |||
2875 | prev_drop_count = q->cstats.drop_count; | ||
2876 | prev_ecn_mark = q->cstats.ecn_mark; | ||
2877 | + prev_backlog = sch->qstats.backlog; | ||
2878 | |||
2879 | skb = codel_dequeue(sch, &q->cparams, &flow->cvars, &q->cstats, | ||
2880 | dequeue); | ||
2881 | @@ -276,12 +279,14 @@ begin: | ||
2882 | } | ||
2883 | qdisc_bstats_update(sch, skb); | ||
2884 | flow->deficit -= qdisc_pkt_len(skb); | ||
2885 | - /* We cant call qdisc_tree_decrease_qlen() if our qlen is 0, | ||
2886 | + /* We cant call qdisc_tree_reduce_backlog() if our qlen is 0, | ||
2887 | * or HTB crashes. Defer it for next round. | ||
2888 | */ | ||
2889 | if (q->cstats.drop_count && sch->q.qlen) { | ||
2890 | - qdisc_tree_decrease_qlen(sch, q->cstats.drop_count); | ||
2891 | + qdisc_tree_reduce_backlog(sch, q->cstats.drop_count, | ||
2892 | + q->cstats.drop_len); | ||
2893 | q->cstats.drop_count = 0; | ||
2894 | + q->cstats.drop_len = 0; | ||
2895 | } | ||
2896 | return skb; | ||
2897 | } | ||
2898 | @@ -372,11 +377,13 @@ static int fq_codel_change(struct Qdisc *sch, struct nlattr *opt) | ||
2899 | while (sch->q.qlen > sch->limit) { | ||
2900 | struct sk_buff *skb = fq_codel_dequeue(sch); | ||
2901 | |||
2902 | + q->cstats.drop_len += qdisc_pkt_len(skb); | ||
2903 | kfree_skb(skb); | ||
2904 | q->cstats.drop_count++; | ||
2905 | } | ||
2906 | - qdisc_tree_decrease_qlen(sch, q->cstats.drop_count); | ||
2907 | + qdisc_tree_reduce_backlog(sch, q->cstats.drop_count, q->cstats.drop_len); | ||
2908 | q->cstats.drop_count = 0; | ||
2909 | + q->cstats.drop_len = 0; | ||
2910 | |||
2911 | sch_tree_unlock(sch); | ||
2912 | return 0; | ||
2913 | diff --git a/net/sched/sch_generic.c b/net/sched/sch_generic.c | ||
2914 | index 16bc83b2842a..aa4725038f94 100644 | ||
2915 | --- a/net/sched/sch_generic.c | ||
2916 | +++ b/net/sched/sch_generic.c | ||
2917 | @@ -159,12 +159,15 @@ int sch_direct_xmit(struct sk_buff *skb, struct Qdisc *q, | ||
2918 | if (validate) | ||
2919 | skb = validate_xmit_skb_list(skb, dev); | ||
2920 | |||
2921 | - if (skb) { | ||
2922 | + if (likely(skb)) { | ||
2923 | HARD_TX_LOCK(dev, txq, smp_processor_id()); | ||
2924 | if (!netif_xmit_frozen_or_stopped(txq)) | ||
2925 | skb = dev_hard_start_xmit(skb, dev, txq, &ret); | ||
2926 | |||
2927 | HARD_TX_UNLOCK(dev, txq); | ||
2928 | + } else { | ||
2929 | + spin_lock(root_lock); | ||
2930 | + return qdisc_qlen(q); | ||
2931 | } | ||
2932 | spin_lock(root_lock); | ||
2933 | |||
2934 | diff --git a/net/sched/sch_hfsc.c b/net/sched/sch_hfsc.c | ||
2935 | index b7ebe2c87586..d783d7cc3348 100644 | ||
2936 | --- a/net/sched/sch_hfsc.c | ||
2937 | +++ b/net/sched/sch_hfsc.c | ||
2938 | @@ -895,9 +895,10 @@ static void | ||
2939 | hfsc_purge_queue(struct Qdisc *sch, struct hfsc_class *cl) | ||
2940 | { | ||
2941 | unsigned int len = cl->qdisc->q.qlen; | ||
2942 | + unsigned int backlog = cl->qdisc->qstats.backlog; | ||
2943 | |||
2944 | qdisc_reset(cl->qdisc); | ||
2945 | - qdisc_tree_decrease_qlen(cl->qdisc, len); | ||
2946 | + qdisc_tree_reduce_backlog(cl->qdisc, len, backlog); | ||
2947 | } | ||
2948 | |||
2949 | static void | ||
2950 | @@ -1215,11 +1216,7 @@ hfsc_graft_class(struct Qdisc *sch, unsigned long arg, struct Qdisc *new, | ||
2951 | new = &noop_qdisc; | ||
2952 | } | ||
2953 | |||
2954 | - sch_tree_lock(sch); | ||
2955 | - hfsc_purge_queue(sch, cl); | ||
2956 | - *old = cl->qdisc; | ||
2957 | - cl->qdisc = new; | ||
2958 | - sch_tree_unlock(sch); | ||
2959 | + *old = qdisc_replace(sch, new, &cl->qdisc); | ||
2960 | return 0; | ||
2961 | } | ||
2962 | |||
2963 | diff --git a/net/sched/sch_hhf.c b/net/sched/sch_hhf.c | ||
2964 | index 86b04e31e60b..13d6f83ec491 100644 | ||
2965 | --- a/net/sched/sch_hhf.c | ||
2966 | +++ b/net/sched/sch_hhf.c | ||
2967 | @@ -382,6 +382,7 @@ static int hhf_enqueue(struct sk_buff *skb, struct Qdisc *sch) | ||
2968 | struct hhf_sched_data *q = qdisc_priv(sch); | ||
2969 | enum wdrr_bucket_idx idx; | ||
2970 | struct wdrr_bucket *bucket; | ||
2971 | + unsigned int prev_backlog; | ||
2972 | |||
2973 | idx = hhf_classify(skb, sch); | ||
2974 | |||
2975 | @@ -409,6 +410,7 @@ static int hhf_enqueue(struct sk_buff *skb, struct Qdisc *sch) | ||
2976 | if (++sch->q.qlen <= sch->limit) | ||
2977 | return NET_XMIT_SUCCESS; | ||
2978 | |||
2979 | + prev_backlog = sch->qstats.backlog; | ||
2980 | q->drop_overlimit++; | ||
2981 | /* Return Congestion Notification only if we dropped a packet from this | ||
2982 | * bucket. | ||
2983 | @@ -417,7 +419,7 @@ static int hhf_enqueue(struct sk_buff *skb, struct Qdisc *sch) | ||
2984 | return NET_XMIT_CN; | ||
2985 | |||
2986 | /* As we dropped a packet, better let upper stack know this. */ | ||
2987 | - qdisc_tree_decrease_qlen(sch, 1); | ||
2988 | + qdisc_tree_reduce_backlog(sch, 1, prev_backlog - sch->qstats.backlog); | ||
2989 | return NET_XMIT_SUCCESS; | ||
2990 | } | ||
2991 | |||
2992 | @@ -527,7 +529,7 @@ static int hhf_change(struct Qdisc *sch, struct nlattr *opt) | ||
2993 | { | ||
2994 | struct hhf_sched_data *q = qdisc_priv(sch); | ||
2995 | struct nlattr *tb[TCA_HHF_MAX + 1]; | ||
2996 | - unsigned int qlen; | ||
2997 | + unsigned int qlen, prev_backlog; | ||
2998 | int err; | ||
2999 | u64 non_hh_quantum; | ||
3000 | u32 new_quantum = q->quantum; | ||
3001 | @@ -577,12 +579,14 @@ static int hhf_change(struct Qdisc *sch, struct nlattr *opt) | ||
3002 | } | ||
3003 | |||
3004 | qlen = sch->q.qlen; | ||
3005 | + prev_backlog = sch->qstats.backlog; | ||
3006 | while (sch->q.qlen > sch->limit) { | ||
3007 | struct sk_buff *skb = hhf_dequeue(sch); | ||
3008 | |||
3009 | kfree_skb(skb); | ||
3010 | } | ||
3011 | - qdisc_tree_decrease_qlen(sch, qlen - sch->q.qlen); | ||
3012 | + qdisc_tree_reduce_backlog(sch, qlen - sch->q.qlen, | ||
3013 | + prev_backlog - sch->qstats.backlog); | ||
3014 | |||
3015 | sch_tree_unlock(sch); | ||
3016 | return 0; | ||
3017 | diff --git a/net/sched/sch_htb.c b/net/sched/sch_htb.c | ||
3018 | index 15ccd7f8fb2a..87b02ed3d5f2 100644 | ||
3019 | --- a/net/sched/sch_htb.c | ||
3020 | +++ b/net/sched/sch_htb.c | ||
3021 | @@ -600,6 +600,7 @@ static int htb_enqueue(struct sk_buff *skb, struct Qdisc *sch) | ||
3022 | htb_activate(q, cl); | ||
3023 | } | ||
3024 | |||
3025 | + qdisc_qstats_backlog_inc(sch, skb); | ||
3026 | sch->q.qlen++; | ||
3027 | return NET_XMIT_SUCCESS; | ||
3028 | } | ||
3029 | @@ -889,6 +890,7 @@ static struct sk_buff *htb_dequeue(struct Qdisc *sch) | ||
3030 | ok: | ||
3031 | qdisc_bstats_update(sch, skb); | ||
3032 | qdisc_unthrottled(sch); | ||
3033 | + qdisc_qstats_backlog_dec(sch, skb); | ||
3034 | sch->q.qlen--; | ||
3035 | return skb; | ||
3036 | } | ||
3037 | @@ -955,6 +957,7 @@ static unsigned int htb_drop(struct Qdisc *sch) | ||
3038 | unsigned int len; | ||
3039 | if (cl->un.leaf.q->ops->drop && | ||
3040 | (len = cl->un.leaf.q->ops->drop(cl->un.leaf.q))) { | ||
3041 | + sch->qstats.backlog -= len; | ||
3042 | sch->q.qlen--; | ||
3043 | if (!cl->un.leaf.q->q.qlen) | ||
3044 | htb_deactivate(q, cl); | ||
3045 | @@ -984,12 +987,12 @@ static void htb_reset(struct Qdisc *sch) | ||
3046 | } | ||
3047 | cl->prio_activity = 0; | ||
3048 | cl->cmode = HTB_CAN_SEND; | ||
3049 | - | ||
3050 | } | ||
3051 | } | ||
3052 | qdisc_watchdog_cancel(&q->watchdog); | ||
3053 | __skb_queue_purge(&q->direct_queue); | ||
3054 | sch->q.qlen = 0; | ||
3055 | + sch->qstats.backlog = 0; | ||
3056 | memset(q->hlevel, 0, sizeof(q->hlevel)); | ||
3057 | memset(q->row_mask, 0, sizeof(q->row_mask)); | ||
3058 | for (i = 0; i < TC_HTB_NUMPRIO; i++) | ||
3059 | @@ -1163,14 +1166,7 @@ static int htb_graft(struct Qdisc *sch, unsigned long arg, struct Qdisc *new, | ||
3060 | cl->common.classid)) == NULL) | ||
3061 | return -ENOBUFS; | ||
3062 | |||
3063 | - sch_tree_lock(sch); | ||
3064 | - *old = cl->un.leaf.q; | ||
3065 | - cl->un.leaf.q = new; | ||
3066 | - if (*old != NULL) { | ||
3067 | - qdisc_tree_decrease_qlen(*old, (*old)->q.qlen); | ||
3068 | - qdisc_reset(*old); | ||
3069 | - } | ||
3070 | - sch_tree_unlock(sch); | ||
3071 | + *old = qdisc_replace(sch, new, &cl->un.leaf.q); | ||
3072 | return 0; | ||
3073 | } | ||
3074 | |||
3075 | @@ -1272,7 +1268,6 @@ static int htb_delete(struct Qdisc *sch, unsigned long arg) | ||
3076 | { | ||
3077 | struct htb_sched *q = qdisc_priv(sch); | ||
3078 | struct htb_class *cl = (struct htb_class *)arg; | ||
3079 | - unsigned int qlen; | ||
3080 | struct Qdisc *new_q = NULL; | ||
3081 | int last_child = 0; | ||
3082 | |||
3083 | @@ -1292,9 +1287,11 @@ static int htb_delete(struct Qdisc *sch, unsigned long arg) | ||
3084 | sch_tree_lock(sch); | ||
3085 | |||
3086 | if (!cl->level) { | ||
3087 | - qlen = cl->un.leaf.q->q.qlen; | ||
3088 | + unsigned int qlen = cl->un.leaf.q->q.qlen; | ||
3089 | + unsigned int backlog = cl->un.leaf.q->qstats.backlog; | ||
3090 | + | ||
3091 | qdisc_reset(cl->un.leaf.q); | ||
3092 | - qdisc_tree_decrease_qlen(cl->un.leaf.q, qlen); | ||
3093 | + qdisc_tree_reduce_backlog(cl->un.leaf.q, qlen, backlog); | ||
3094 | } | ||
3095 | |||
3096 | /* delete from hash and active; remainder in destroy_class */ | ||
3097 | @@ -1428,10 +1425,11 @@ static int htb_change_class(struct Qdisc *sch, u32 classid, | ||
3098 | sch_tree_lock(sch); | ||
3099 | if (parent && !parent->level) { | ||
3100 | unsigned int qlen = parent->un.leaf.q->q.qlen; | ||
3101 | + unsigned int backlog = parent->un.leaf.q->qstats.backlog; | ||
3102 | |||
3103 | /* turn parent into inner node */ | ||
3104 | qdisc_reset(parent->un.leaf.q); | ||
3105 | - qdisc_tree_decrease_qlen(parent->un.leaf.q, qlen); | ||
3106 | + qdisc_tree_reduce_backlog(parent->un.leaf.q, qlen, backlog); | ||
3107 | qdisc_destroy(parent->un.leaf.q); | ||
3108 | if (parent->prio_activity) | ||
3109 | htb_deactivate(q, parent); | ||
3110 | diff --git a/net/sched/sch_multiq.c b/net/sched/sch_multiq.c | ||
3111 | index 4e904ca0af9d..bcdd54bb101c 100644 | ||
3112 | --- a/net/sched/sch_multiq.c | ||
3113 | +++ b/net/sched/sch_multiq.c | ||
3114 | @@ -218,7 +218,8 @@ static int multiq_tune(struct Qdisc *sch, struct nlattr *opt) | ||
3115 | if (q->queues[i] != &noop_qdisc) { | ||
3116 | struct Qdisc *child = q->queues[i]; | ||
3117 | q->queues[i] = &noop_qdisc; | ||
3118 | - qdisc_tree_decrease_qlen(child, child->q.qlen); | ||
3119 | + qdisc_tree_reduce_backlog(child, child->q.qlen, | ||
3120 | + child->qstats.backlog); | ||
3121 | qdisc_destroy(child); | ||
3122 | } | ||
3123 | } | ||
3124 | @@ -238,8 +239,9 @@ static int multiq_tune(struct Qdisc *sch, struct nlattr *opt) | ||
3125 | q->queues[i] = child; | ||
3126 | |||
3127 | if (old != &noop_qdisc) { | ||
3128 | - qdisc_tree_decrease_qlen(old, | ||
3129 | - old->q.qlen); | ||
3130 | + qdisc_tree_reduce_backlog(old, | ||
3131 | + old->q.qlen, | ||
3132 | + old->qstats.backlog); | ||
3133 | qdisc_destroy(old); | ||
3134 | } | ||
3135 | sch_tree_unlock(sch); | ||
3136 | @@ -303,13 +305,7 @@ static int multiq_graft(struct Qdisc *sch, unsigned long arg, struct Qdisc *new, | ||
3137 | if (new == NULL) | ||
3138 | new = &noop_qdisc; | ||
3139 | |||
3140 | - sch_tree_lock(sch); | ||
3141 | - *old = q->queues[band]; | ||
3142 | - q->queues[band] = new; | ||
3143 | - qdisc_tree_decrease_qlen(*old, (*old)->q.qlen); | ||
3144 | - qdisc_reset(*old); | ||
3145 | - sch_tree_unlock(sch); | ||
3146 | - | ||
3147 | + *old = qdisc_replace(sch, new, &q->queues[band]); | ||
3148 | return 0; | ||
3149 | } | ||
3150 | |||
3151 | diff --git a/net/sched/sch_netem.c b/net/sched/sch_netem.c | ||
3152 | index 5abd1d9de989..4befe97a9034 100644 | ||
3153 | --- a/net/sched/sch_netem.c | ||
3154 | +++ b/net/sched/sch_netem.c | ||
3155 | @@ -395,6 +395,25 @@ static void tfifo_enqueue(struct sk_buff *nskb, struct Qdisc *sch) | ||
3156 | sch->q.qlen++; | ||
3157 | } | ||
3158 | |||
3159 | +/* netem can't properly corrupt a megapacket (like we get from GSO), so instead | ||
3160 | + * when we statistically choose to corrupt one, we instead segment it, returning | ||
3161 | + * the first packet to be corrupted, and re-enqueue the remaining frames | ||
3162 | + */ | ||
3163 | +static struct sk_buff *netem_segment(struct sk_buff *skb, struct Qdisc *sch) | ||
3164 | +{ | ||
3165 | + struct sk_buff *segs; | ||
3166 | + netdev_features_t features = netif_skb_features(skb); | ||
3167 | + | ||
3168 | + segs = skb_gso_segment(skb, features & ~NETIF_F_GSO_MASK); | ||
3169 | + | ||
3170 | + if (IS_ERR_OR_NULL(segs)) { | ||
3171 | + qdisc_reshape_fail(skb, sch); | ||
3172 | + return NULL; | ||
3173 | + } | ||
3174 | + consume_skb(skb); | ||
3175 | + return segs; | ||
3176 | +} | ||
3177 | + | ||
3178 | /* | ||
3179 | * Insert one skb into qdisc. | ||
3180 | * Note: parent depends on return value to account for queue length. | ||
3181 | @@ -407,7 +426,11 @@ static int netem_enqueue(struct sk_buff *skb, struct Qdisc *sch) | ||
3182 | /* We don't fill cb now as skb_unshare() may invalidate it */ | ||
3183 | struct netem_skb_cb *cb; | ||
3184 | struct sk_buff *skb2; | ||
3185 | + struct sk_buff *segs = NULL; | ||
3186 | + unsigned int len = 0, last_len, prev_len = qdisc_pkt_len(skb); | ||
3187 | + int nb = 0; | ||
3188 | int count = 1; | ||
3189 | + int rc = NET_XMIT_SUCCESS; | ||
3190 | |||
3191 | /* Random duplication */ | ||
3192 | if (q->duplicate && q->duplicate >= get_crandom(&q->dup_cor)) | ||
3193 | @@ -453,10 +476,23 @@ static int netem_enqueue(struct sk_buff *skb, struct Qdisc *sch) | ||
3194 | * do it now in software before we mangle it. | ||
3195 | */ | ||
3196 | if (q->corrupt && q->corrupt >= get_crandom(&q->corrupt_cor)) { | ||
3197 | + if (skb_is_gso(skb)) { | ||
3198 | + segs = netem_segment(skb, sch); | ||
3199 | + if (!segs) | ||
3200 | + return NET_XMIT_DROP; | ||
3201 | + } else { | ||
3202 | + segs = skb; | ||
3203 | + } | ||
3204 | + | ||
3205 | + skb = segs; | ||
3206 | + segs = segs->next; | ||
3207 | + | ||
3208 | if (!(skb = skb_unshare(skb, GFP_ATOMIC)) || | ||
3209 | (skb->ip_summed == CHECKSUM_PARTIAL && | ||
3210 | - skb_checksum_help(skb))) | ||
3211 | - return qdisc_drop(skb, sch); | ||
3212 | + skb_checksum_help(skb))) { | ||
3213 | + rc = qdisc_drop(skb, sch); | ||
3214 | + goto finish_segs; | ||
3215 | + } | ||
3216 | |||
3217 | skb->data[prandom_u32() % skb_headlen(skb)] ^= | ||
3218 | 1<<(prandom_u32() % 8); | ||
3219 | @@ -516,6 +552,27 @@ static int netem_enqueue(struct sk_buff *skb, struct Qdisc *sch) | ||
3220 | sch->qstats.requeues++; | ||
3221 | } | ||
3222 | |||
3223 | +finish_segs: | ||
3224 | + if (segs) { | ||
3225 | + while (segs) { | ||
3226 | + skb2 = segs->next; | ||
3227 | + segs->next = NULL; | ||
3228 | + qdisc_skb_cb(segs)->pkt_len = segs->len; | ||
3229 | + last_len = segs->len; | ||
3230 | + rc = qdisc_enqueue(segs, sch); | ||
3231 | + if (rc != NET_XMIT_SUCCESS) { | ||
3232 | + if (net_xmit_drop_count(rc)) | ||
3233 | + qdisc_qstats_drop(sch); | ||
3234 | + } else { | ||
3235 | + nb++; | ||
3236 | + len += last_len; | ||
3237 | + } | ||
3238 | + segs = skb2; | ||
3239 | + } | ||
3240 | + sch->q.qlen += nb; | ||
3241 | + if (nb > 1) | ||
3242 | + qdisc_tree_reduce_backlog(sch, 1 - nb, prev_len - len); | ||
3243 | + } | ||
3244 | return NET_XMIT_SUCCESS; | ||
3245 | } | ||
3246 | |||
3247 | @@ -598,7 +655,8 @@ deliver: | ||
3248 | if (unlikely(err != NET_XMIT_SUCCESS)) { | ||
3249 | if (net_xmit_drop_count(err)) { | ||
3250 | qdisc_qstats_drop(sch); | ||
3251 | - qdisc_tree_decrease_qlen(sch, 1); | ||
3252 | + qdisc_tree_reduce_backlog(sch, 1, | ||
3253 | + qdisc_pkt_len(skb)); | ||
3254 | } | ||
3255 | } | ||
3256 | goto tfifo_dequeue; | ||
3257 | @@ -1037,15 +1095,7 @@ static int netem_graft(struct Qdisc *sch, unsigned long arg, struct Qdisc *new, | ||
3258 | { | ||
3259 | struct netem_sched_data *q = qdisc_priv(sch); | ||
3260 | |||
3261 | - sch_tree_lock(sch); | ||
3262 | - *old = q->qdisc; | ||
3263 | - q->qdisc = new; | ||
3264 | - if (*old) { | ||
3265 | - qdisc_tree_decrease_qlen(*old, (*old)->q.qlen); | ||
3266 | - qdisc_reset(*old); | ||
3267 | - } | ||
3268 | - sch_tree_unlock(sch); | ||
3269 | - | ||
3270 | + *old = qdisc_replace(sch, new, &q->qdisc); | ||
3271 | return 0; | ||
3272 | } | ||
3273 | |||
3274 | diff --git a/net/sched/sch_pie.c b/net/sched/sch_pie.c | ||
3275 | index b783a446d884..71ae3b9629f9 100644 | ||
3276 | --- a/net/sched/sch_pie.c | ||
3277 | +++ b/net/sched/sch_pie.c | ||
3278 | @@ -183,7 +183,7 @@ static int pie_change(struct Qdisc *sch, struct nlattr *opt) | ||
3279 | { | ||
3280 | struct pie_sched_data *q = qdisc_priv(sch); | ||
3281 | struct nlattr *tb[TCA_PIE_MAX + 1]; | ||
3282 | - unsigned int qlen; | ||
3283 | + unsigned int qlen, dropped = 0; | ||
3284 | int err; | ||
3285 | |||
3286 | if (!opt) | ||
3287 | @@ -232,10 +232,11 @@ static int pie_change(struct Qdisc *sch, struct nlattr *opt) | ||
3288 | while (sch->q.qlen > sch->limit) { | ||
3289 | struct sk_buff *skb = __skb_dequeue(&sch->q); | ||
3290 | |||
3291 | + dropped += qdisc_pkt_len(skb); | ||
3292 | qdisc_qstats_backlog_dec(sch, skb); | ||
3293 | qdisc_drop(skb, sch); | ||
3294 | } | ||
3295 | - qdisc_tree_decrease_qlen(sch, qlen - sch->q.qlen); | ||
3296 | + qdisc_tree_reduce_backlog(sch, qlen - sch->q.qlen, dropped); | ||
3297 | |||
3298 | sch_tree_unlock(sch); | ||
3299 | return 0; | ||
3300 | diff --git a/net/sched/sch_prio.c b/net/sched/sch_prio.c | ||
3301 | index ba6487f2741f..fee1b15506b2 100644 | ||
3302 | --- a/net/sched/sch_prio.c | ||
3303 | +++ b/net/sched/sch_prio.c | ||
3304 | @@ -191,7 +191,7 @@ static int prio_tune(struct Qdisc *sch, struct nlattr *opt) | ||
3305 | struct Qdisc *child = q->queues[i]; | ||
3306 | q->queues[i] = &noop_qdisc; | ||
3307 | if (child != &noop_qdisc) { | ||
3308 | - qdisc_tree_decrease_qlen(child, child->q.qlen); | ||
3309 | + qdisc_tree_reduce_backlog(child, child->q.qlen, child->qstats.backlog); | ||
3310 | qdisc_destroy(child); | ||
3311 | } | ||
3312 | } | ||
3313 | @@ -210,8 +210,9 @@ static int prio_tune(struct Qdisc *sch, struct nlattr *opt) | ||
3314 | q->queues[i] = child; | ||
3315 | |||
3316 | if (old != &noop_qdisc) { | ||
3317 | - qdisc_tree_decrease_qlen(old, | ||
3318 | - old->q.qlen); | ||
3319 | + qdisc_tree_reduce_backlog(old, | ||
3320 | + old->q.qlen, | ||
3321 | + old->qstats.backlog); | ||
3322 | qdisc_destroy(old); | ||
3323 | } | ||
3324 | sch_tree_unlock(sch); | ||
3325 | @@ -268,13 +269,7 @@ static int prio_graft(struct Qdisc *sch, unsigned long arg, struct Qdisc *new, | ||
3326 | if (new == NULL) | ||
3327 | new = &noop_qdisc; | ||
3328 | |||
3329 | - sch_tree_lock(sch); | ||
3330 | - *old = q->queues[band]; | ||
3331 | - q->queues[band] = new; | ||
3332 | - qdisc_tree_decrease_qlen(*old, (*old)->q.qlen); | ||
3333 | - qdisc_reset(*old); | ||
3334 | - sch_tree_unlock(sch); | ||
3335 | - | ||
3336 | + *old = qdisc_replace(sch, new, &q->queues[band]); | ||
3337 | return 0; | ||
3338 | } | ||
3339 | |||
3340 | diff --git a/net/sched/sch_qfq.c b/net/sched/sch_qfq.c | ||
3341 | index 3dc3a6e56052..8d2d8d953432 100644 | ||
3342 | --- a/net/sched/sch_qfq.c | ||
3343 | +++ b/net/sched/sch_qfq.c | ||
3344 | @@ -220,9 +220,10 @@ static struct qfq_class *qfq_find_class(struct Qdisc *sch, u32 classid) | ||
3345 | static void qfq_purge_queue(struct qfq_class *cl) | ||
3346 | { | ||
3347 | unsigned int len = cl->qdisc->q.qlen; | ||
3348 | + unsigned int backlog = cl->qdisc->qstats.backlog; | ||
3349 | |||
3350 | qdisc_reset(cl->qdisc); | ||
3351 | - qdisc_tree_decrease_qlen(cl->qdisc, len); | ||
3352 | + qdisc_tree_reduce_backlog(cl->qdisc, len, backlog); | ||
3353 | } | ||
3354 | |||
3355 | static const struct nla_policy qfq_policy[TCA_QFQ_MAX + 1] = { | ||
3356 | @@ -617,11 +618,7 @@ static int qfq_graft_class(struct Qdisc *sch, unsigned long arg, | ||
3357 | new = &noop_qdisc; | ||
3358 | } | ||
3359 | |||
3360 | - sch_tree_lock(sch); | ||
3361 | - qfq_purge_queue(cl); | ||
3362 | - *old = cl->qdisc; | ||
3363 | - cl->qdisc = new; | ||
3364 | - sch_tree_unlock(sch); | ||
3365 | + *old = qdisc_replace(sch, new, &cl->qdisc); | ||
3366 | return 0; | ||
3367 | } | ||
3368 | |||
3369 | diff --git a/net/sched/sch_red.c b/net/sched/sch_red.c | ||
3370 | index 6c0534cc7758..8c0508c0e287 100644 | ||
3371 | --- a/net/sched/sch_red.c | ||
3372 | +++ b/net/sched/sch_red.c | ||
3373 | @@ -210,7 +210,8 @@ static int red_change(struct Qdisc *sch, struct nlattr *opt) | ||
3374 | q->flags = ctl->flags; | ||
3375 | q->limit = ctl->limit; | ||
3376 | if (child) { | ||
3377 | - qdisc_tree_decrease_qlen(q->qdisc, q->qdisc->q.qlen); | ||
3378 | + qdisc_tree_reduce_backlog(q->qdisc, q->qdisc->q.qlen, | ||
3379 | + q->qdisc->qstats.backlog); | ||
3380 | qdisc_destroy(q->qdisc); | ||
3381 | q->qdisc = child; | ||
3382 | } | ||
3383 | @@ -313,12 +314,7 @@ static int red_graft(struct Qdisc *sch, unsigned long arg, struct Qdisc *new, | ||
3384 | if (new == NULL) | ||
3385 | new = &noop_qdisc; | ||
3386 | |||
3387 | - sch_tree_lock(sch); | ||
3388 | - *old = q->qdisc; | ||
3389 | - q->qdisc = new; | ||
3390 | - qdisc_tree_decrease_qlen(*old, (*old)->q.qlen); | ||
3391 | - qdisc_reset(*old); | ||
3392 | - sch_tree_unlock(sch); | ||
3393 | + *old = qdisc_replace(sch, new, &q->qdisc); | ||
3394 | return 0; | ||
3395 | } | ||
3396 | |||
3397 | diff --git a/net/sched/sch_sfb.c b/net/sched/sch_sfb.c | ||
3398 | index 5bbb6332ec57..c69611640fa5 100644 | ||
3399 | --- a/net/sched/sch_sfb.c | ||
3400 | +++ b/net/sched/sch_sfb.c | ||
3401 | @@ -510,7 +510,8 @@ static int sfb_change(struct Qdisc *sch, struct nlattr *opt) | ||
3402 | |||
3403 | sch_tree_lock(sch); | ||
3404 | |||
3405 | - qdisc_tree_decrease_qlen(q->qdisc, q->qdisc->q.qlen); | ||
3406 | + qdisc_tree_reduce_backlog(q->qdisc, q->qdisc->q.qlen, | ||
3407 | + q->qdisc->qstats.backlog); | ||
3408 | qdisc_destroy(q->qdisc); | ||
3409 | q->qdisc = child; | ||
3410 | |||
3411 | @@ -606,12 +607,7 @@ static int sfb_graft(struct Qdisc *sch, unsigned long arg, struct Qdisc *new, | ||
3412 | if (new == NULL) | ||
3413 | new = &noop_qdisc; | ||
3414 | |||
3415 | - sch_tree_lock(sch); | ||
3416 | - *old = q->qdisc; | ||
3417 | - q->qdisc = new; | ||
3418 | - qdisc_tree_decrease_qlen(*old, (*old)->q.qlen); | ||
3419 | - qdisc_reset(*old); | ||
3420 | - sch_tree_unlock(sch); | ||
3421 | + *old = qdisc_replace(sch, new, &q->qdisc); | ||
3422 | return 0; | ||
3423 | } | ||
3424 | |||
3425 | diff --git a/net/sched/sch_sfq.c b/net/sched/sch_sfq.c | ||
3426 | index 3abab534eb5c..498f0a2cb47f 100644 | ||
3427 | --- a/net/sched/sch_sfq.c | ||
3428 | +++ b/net/sched/sch_sfq.c | ||
3429 | @@ -346,7 +346,7 @@ static int | ||
3430 | sfq_enqueue(struct sk_buff *skb, struct Qdisc *sch) | ||
3431 | { | ||
3432 | struct sfq_sched_data *q = qdisc_priv(sch); | ||
3433 | - unsigned int hash; | ||
3434 | + unsigned int hash, dropped; | ||
3435 | sfq_index x, qlen; | ||
3436 | struct sfq_slot *slot; | ||
3437 | int uninitialized_var(ret); | ||
3438 | @@ -461,7 +461,7 @@ enqueue: | ||
3439 | return NET_XMIT_SUCCESS; | ||
3440 | |||
3441 | qlen = slot->qlen; | ||
3442 | - sfq_drop(sch); | ||
3443 | + dropped = sfq_drop(sch); | ||
3444 | /* Return Congestion Notification only if we dropped a packet | ||
3445 | * from this flow. | ||
3446 | */ | ||
3447 | @@ -469,7 +469,7 @@ enqueue: | ||
3448 | return NET_XMIT_CN; | ||
3449 | |||
3450 | /* As we dropped a packet, better let upper stack know this */ | ||
3451 | - qdisc_tree_decrease_qlen(sch, 1); | ||
3452 | + qdisc_tree_reduce_backlog(sch, 1, dropped); | ||
3453 | return NET_XMIT_SUCCESS; | ||
3454 | } | ||
3455 | |||
3456 | @@ -537,6 +537,7 @@ static void sfq_rehash(struct Qdisc *sch) | ||
3457 | struct sfq_slot *slot; | ||
3458 | struct sk_buff_head list; | ||
3459 | int dropped = 0; | ||
3460 | + unsigned int drop_len = 0; | ||
3461 | |||
3462 | __skb_queue_head_init(&list); | ||
3463 | |||
3464 | @@ -565,6 +566,7 @@ static void sfq_rehash(struct Qdisc *sch) | ||
3465 | if (x >= SFQ_MAX_FLOWS) { | ||
3466 | drop: | ||
3467 | qdisc_qstats_backlog_dec(sch, skb); | ||
3468 | + drop_len += qdisc_pkt_len(skb); | ||
3469 | kfree_skb(skb); | ||
3470 | dropped++; | ||
3471 | continue; | ||
3472 | @@ -594,7 +596,7 @@ drop: | ||
3473 | } | ||
3474 | } | ||
3475 | sch->q.qlen -= dropped; | ||
3476 | - qdisc_tree_decrease_qlen(sch, dropped); | ||
3477 | + qdisc_tree_reduce_backlog(sch, dropped, drop_len); | ||
3478 | } | ||
3479 | |||
3480 | static void sfq_perturbation(unsigned long arg) | ||
3481 | @@ -618,7 +620,7 @@ static int sfq_change(struct Qdisc *sch, struct nlattr *opt) | ||
3482 | struct sfq_sched_data *q = qdisc_priv(sch); | ||
3483 | struct tc_sfq_qopt *ctl = nla_data(opt); | ||
3484 | struct tc_sfq_qopt_v1 *ctl_v1 = NULL; | ||
3485 | - unsigned int qlen; | ||
3486 | + unsigned int qlen, dropped = 0; | ||
3487 | struct red_parms *p = NULL; | ||
3488 | |||
3489 | if (opt->nla_len < nla_attr_size(sizeof(*ctl))) | ||
3490 | @@ -667,8 +669,8 @@ static int sfq_change(struct Qdisc *sch, struct nlattr *opt) | ||
3491 | |||
3492 | qlen = sch->q.qlen; | ||
3493 | while (sch->q.qlen > q->limit) | ||
3494 | - sfq_drop(sch); | ||
3495 | - qdisc_tree_decrease_qlen(sch, qlen - sch->q.qlen); | ||
3496 | + dropped += sfq_drop(sch); | ||
3497 | + qdisc_tree_reduce_backlog(sch, qlen - sch->q.qlen, dropped); | ||
3498 | |||
3499 | del_timer(&q->perturb_timer); | ||
3500 | if (q->perturb_period) { | ||
3501 | diff --git a/net/sched/sch_tbf.c b/net/sched/sch_tbf.c | ||
3502 | index a4afde14e865..c2fbde742f37 100644 | ||
3503 | --- a/net/sched/sch_tbf.c | ||
3504 | +++ b/net/sched/sch_tbf.c | ||
3505 | @@ -160,6 +160,7 @@ static int tbf_segment(struct sk_buff *skb, struct Qdisc *sch) | ||
3506 | struct tbf_sched_data *q = qdisc_priv(sch); | ||
3507 | struct sk_buff *segs, *nskb; | ||
3508 | netdev_features_t features = netif_skb_features(skb); | ||
3509 | + unsigned int len = 0, prev_len = qdisc_pkt_len(skb); | ||
3510 | int ret, nb; | ||
3511 | |||
3512 | segs = skb_gso_segment(skb, features & ~NETIF_F_GSO_MASK); | ||
3513 | @@ -172,6 +173,7 @@ static int tbf_segment(struct sk_buff *skb, struct Qdisc *sch) | ||
3514 | nskb = segs->next; | ||
3515 | segs->next = NULL; | ||
3516 | qdisc_skb_cb(segs)->pkt_len = segs->len; | ||
3517 | + len += segs->len; | ||
3518 | ret = qdisc_enqueue(segs, q->qdisc); | ||
3519 | if (ret != NET_XMIT_SUCCESS) { | ||
3520 | if (net_xmit_drop_count(ret)) | ||
3521 | @@ -183,7 +185,7 @@ static int tbf_segment(struct sk_buff *skb, struct Qdisc *sch) | ||
3522 | } | ||
3523 | sch->q.qlen += nb; | ||
3524 | if (nb > 1) | ||
3525 | - qdisc_tree_decrease_qlen(sch, 1 - nb); | ||
3526 | + qdisc_tree_reduce_backlog(sch, 1 - nb, prev_len - len); | ||
3527 | consume_skb(skb); | ||
3528 | return nb > 0 ? NET_XMIT_SUCCESS : NET_XMIT_DROP; | ||
3529 | } | ||
3530 | @@ -399,7 +401,8 @@ static int tbf_change(struct Qdisc *sch, struct nlattr *opt) | ||
3531 | |||
3532 | sch_tree_lock(sch); | ||
3533 | if (child) { | ||
3534 | - qdisc_tree_decrease_qlen(q->qdisc, q->qdisc->q.qlen); | ||
3535 | + qdisc_tree_reduce_backlog(q->qdisc, q->qdisc->q.qlen, | ||
3536 | + q->qdisc->qstats.backlog); | ||
3537 | qdisc_destroy(q->qdisc); | ||
3538 | q->qdisc = child; | ||
3539 | } | ||
3540 | @@ -502,13 +505,7 @@ static int tbf_graft(struct Qdisc *sch, unsigned long arg, struct Qdisc *new, | ||
3541 | if (new == NULL) | ||
3542 | new = &noop_qdisc; | ||
3543 | |||
3544 | - sch_tree_lock(sch); | ||
3545 | - *old = q->qdisc; | ||
3546 | - q->qdisc = new; | ||
3547 | - qdisc_tree_decrease_qlen(*old, (*old)->q.qlen); | ||
3548 | - qdisc_reset(*old); | ||
3549 | - sch_tree_unlock(sch); | ||
3550 | - | ||
3551 | + *old = qdisc_replace(sch, new, &q->qdisc); | ||
3552 | return 0; | ||
3553 | } | ||
3554 | |||
3555 | diff --git a/net/vmw_vsock/af_vsock.c b/net/vmw_vsock/af_vsock.c | ||
3556 | index 7fd1220fbfa0..9b5bd6d142dc 100644 | ||
3557 | --- a/net/vmw_vsock/af_vsock.c | ||
3558 | +++ b/net/vmw_vsock/af_vsock.c | ||
3559 | @@ -1794,27 +1794,8 @@ vsock_stream_recvmsg(struct socket *sock, struct msghdr *msg, size_t len, | ||
3560 | else if (sk->sk_shutdown & RCV_SHUTDOWN) | ||
3561 | err = 0; | ||
3562 | |||
3563 | - if (copied > 0) { | ||
3564 | - /* We only do these additional bookkeeping/notification steps | ||
3565 | - * if we actually copied something out of the queue pair | ||
3566 | - * instead of just peeking ahead. | ||
3567 | - */ | ||
3568 | - | ||
3569 | - if (!(flags & MSG_PEEK)) { | ||
3570 | - /* If the other side has shutdown for sending and there | ||
3571 | - * is nothing more to read, then modify the socket | ||
3572 | - * state. | ||
3573 | - */ | ||
3574 | - if (vsk->peer_shutdown & SEND_SHUTDOWN) { | ||
3575 | - if (vsock_stream_has_data(vsk) <= 0) { | ||
3576 | - sk->sk_state = SS_UNCONNECTED; | ||
3577 | - sock_set_flag(sk, SOCK_DONE); | ||
3578 | - sk->sk_state_change(sk); | ||
3579 | - } | ||
3580 | - } | ||
3581 | - } | ||
3582 | + if (copied > 0) | ||
3583 | err = copied; | ||
3584 | - } | ||
3585 | |||
3586 | out_wait: | ||
3587 | finish_wait(sk_sleep(sk), &wait); | ||
3588 | diff --git a/net/x25/x25_facilities.c b/net/x25/x25_facilities.c | ||
3589 | index 7ecd04c21360..997ff7b2509b 100644 | ||
3590 | --- a/net/x25/x25_facilities.c | ||
3591 | +++ b/net/x25/x25_facilities.c | ||
3592 | @@ -277,6 +277,7 @@ int x25_negotiate_facilities(struct sk_buff *skb, struct sock *sk, | ||
3593 | |||
3594 | memset(&theirs, 0, sizeof(theirs)); | ||
3595 | memcpy(new, ours, sizeof(*new)); | ||
3596 | + memset(dte, 0, sizeof(*dte)); | ||
3597 | |||
3598 | len = x25_parse_facilities(skb, &theirs, dte, &x25->vc_facil_mask); | ||
3599 | if (len < 0) | ||
3600 | diff --git a/samples/bpf/trace_output_kern.c b/samples/bpf/trace_output_kern.c | ||
3601 | index 8d8d1ec429eb..9b96f4fb8cea 100644 | ||
3602 | --- a/samples/bpf/trace_output_kern.c | ||
3603 | +++ b/samples/bpf/trace_output_kern.c | ||
3604 | @@ -18,7 +18,6 @@ int bpf_prog1(struct pt_regs *ctx) | ||
3605 | u64 cookie; | ||
3606 | } data; | ||
3607 | |||
3608 | - memset(&data, 0, sizeof(data)); | ||
3609 | data.pid = bpf_get_current_pid_tgid(); | ||
3610 | data.cookie = 0x12345678; | ||
3611 | |||
3612 | diff --git a/sound/pci/hda/hda_sysfs.c b/sound/pci/hda/hda_sysfs.c | ||
3613 | index 64e0d1d81ca5..9739fce9e032 100644 | ||
3614 | --- a/sound/pci/hda/hda_sysfs.c | ||
3615 | +++ b/sound/pci/hda/hda_sysfs.c | ||
3616 | @@ -141,14 +141,6 @@ static int reconfig_codec(struct hda_codec *codec) | ||
3617 | err = snd_hda_codec_configure(codec); | ||
3618 | if (err < 0) | ||
3619 | goto error; | ||
3620 | - /* rebuild PCMs */ | ||
3621 | - err = snd_hda_codec_build_pcms(codec); | ||
3622 | - if (err < 0) | ||
3623 | - goto error; | ||
3624 | - /* rebuild mixers */ | ||
3625 | - err = snd_hda_codec_build_controls(codec); | ||
3626 | - if (err < 0) | ||
3627 | - goto error; | ||
3628 | err = snd_card_register(codec->card); | ||
3629 | error: | ||
3630 | snd_hda_power_down(codec); | ||
3631 | diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c | ||
3632 | index ac4490a96863..4918ffa5ba68 100644 | ||
3633 | --- a/sound/pci/hda/patch_realtek.c | ||
3634 | +++ b/sound/pci/hda/patch_realtek.c | ||
3635 | @@ -6426,6 +6426,7 @@ enum { | ||
3636 | ALC668_FIXUP_DELL_DISABLE_AAMIX, | ||
3637 | ALC668_FIXUP_DELL_XPS13, | ||
3638 | ALC662_FIXUP_ASUS_Nx50, | ||
3639 | + ALC668_FIXUP_ASUS_Nx51, | ||
3640 | }; | ||
3641 | |||
3642 | static const struct hda_fixup alc662_fixups[] = { | ||
3643 | @@ -6672,6 +6673,15 @@ static const struct hda_fixup alc662_fixups[] = { | ||
3644 | .chained = true, | ||
3645 | .chain_id = ALC662_FIXUP_BASS_1A | ||
3646 | }, | ||
3647 | + [ALC668_FIXUP_ASUS_Nx51] = { | ||
3648 | + .type = HDA_FIXUP_PINS, | ||
3649 | + .v.pins = (const struct hda_pintbl[]) { | ||
3650 | + {0x1a, 0x90170151}, /* bass speaker */ | ||
3651 | + {} | ||
3652 | + }, | ||
3653 | + .chained = true, | ||
3654 | + .chain_id = ALC662_FIXUP_BASS_CHMAP, | ||
3655 | + }, | ||
3656 | }; | ||
3657 | |||
3658 | static const struct snd_pci_quirk alc662_fixup_tbl[] = { | ||
3659 | @@ -6694,11 +6704,14 @@ static const struct snd_pci_quirk alc662_fixup_tbl[] = { | ||
3660 | SND_PCI_QUIRK(0x1028, 0x0698, "Dell", ALC668_FIXUP_DELL_MIC_NO_PRESENCE), | ||
3661 | SND_PCI_QUIRK(0x1028, 0x069f, "Dell", ALC668_FIXUP_DELL_MIC_NO_PRESENCE), | ||
3662 | SND_PCI_QUIRK(0x103c, 0x1632, "HP RP5800", ALC662_FIXUP_HP_RP5800), | ||
3663 | + SND_PCI_QUIRK(0x1043, 0x1080, "Asus UX501VW", ALC668_FIXUP_HEADSET_MODE), | ||
3664 | SND_PCI_QUIRK(0x1043, 0x11cd, "Asus N550", ALC662_FIXUP_ASUS_Nx50), | ||
3665 | SND_PCI_QUIRK(0x1043, 0x13df, "Asus N550JX", ALC662_FIXUP_BASS_1A), | ||
3666 | SND_PCI_QUIRK(0x1043, 0x129d, "Asus N750", ALC662_FIXUP_ASUS_Nx50), | ||
3667 | SND_PCI_QUIRK(0x1043, 0x1477, "ASUS N56VZ", ALC662_FIXUP_BASS_MODE4_CHMAP), | ||
3668 | SND_PCI_QUIRK(0x1043, 0x15a7, "ASUS UX51VZH", ALC662_FIXUP_BASS_16), | ||
3669 | + SND_PCI_QUIRK(0x1043, 0x177d, "ASUS N551", ALC668_FIXUP_ASUS_Nx51), | ||
3670 | + SND_PCI_QUIRK(0x1043, 0x17bd, "ASUS N751", ALC668_FIXUP_ASUS_Nx51), | ||
3671 | SND_PCI_QUIRK(0x1043, 0x1b73, "ASUS N55SF", ALC662_FIXUP_BASS_16), | ||
3672 | SND_PCI_QUIRK(0x1043, 0x1bf3, "ASUS N76VZ", ALC662_FIXUP_BASS_MODE4_CHMAP), | ||
3673 | SND_PCI_QUIRK(0x1043, 0x8469, "ASUS mobo", ALC662_FIXUP_NO_JACK_DETECT), | ||
3674 | diff --git a/sound/usb/quirks.c b/sound/usb/quirks.c | ||
3675 | index 001fb4dc0722..db11ecf0b74d 100644 | ||
3676 | --- a/sound/usb/quirks.c | ||
3677 | +++ b/sound/usb/quirks.c | ||
3678 | @@ -1138,8 +1138,11 @@ bool snd_usb_get_sample_rate_quirk(struct snd_usb_audio *chip) | ||
3679 | case USB_ID(0x047F, 0x0415): /* Plantronics BT-300 */ | ||
3680 | case USB_ID(0x047F, 0xAA05): /* Plantronics DA45 */ | ||
3681 | case USB_ID(0x04D8, 0xFEEA): /* Benchmark DAC1 Pre */ | ||
3682 | + case USB_ID(0x0556, 0x0014): /* Phoenix Audio TMX320VC */ | ||
3683 | case USB_ID(0x074D, 0x3553): /* Outlaw RR2150 (Micronas UAC3553B) */ | ||
3684 | + case USB_ID(0x1de7, 0x0013): /* Phoenix Audio MT202exe */ | ||
3685 | case USB_ID(0x1de7, 0x0014): /* Phoenix Audio TMX320 */ | ||
3686 | + case USB_ID(0x1de7, 0x0114): /* Phoenix Audio MT202pcs */ | ||
3687 | case USB_ID(0x21B4, 0x0081): /* AudioQuest DragonFly */ | ||
3688 | return true; | ||
3689 | } | ||
3690 | diff --git a/tools/lib/traceevent/parse-filter.c b/tools/lib/traceevent/parse-filter.c | ||
3691 | index 0144b3d1bb77..88cccea3ca99 100644 | ||
3692 | --- a/tools/lib/traceevent/parse-filter.c | ||
3693 | +++ b/tools/lib/traceevent/parse-filter.c | ||
3694 | @@ -1164,11 +1164,11 @@ process_filter(struct event_format *event, struct filter_arg **parg, | ||
3695 | current_op = current_exp; | ||
3696 | |||
3697 | ret = collapse_tree(current_op, parg, error_str); | ||
3698 | + /* collapse_tree() may free current_op, and updates parg accordingly */ | ||
3699 | + current_op = NULL; | ||
3700 | if (ret < 0) | ||
3701 | goto fail; | ||
3702 | |||
3703 | - *parg = current_op; | ||
3704 | - | ||
3705 | free(token); | ||
3706 | return 0; | ||
3707 |